diff --git a/src/lint/renderer/ArcanistConsoleLintRenderer.php b/src/lint/renderer/ArcanistConsoleLintRenderer.php --- a/src/lint/renderer/ArcanistConsoleLintRenderer.php +++ b/src/lint/renderer/ArcanistConsoleLintRenderer.php @@ -122,6 +122,41 @@ $old_impact = substr_count($original, "\n") + 1; $start = $line; + // See PHI1782. If a linter raises a message at a line that does not + // exist, just render a warning message. + + // Linters are permitted to raise a warning at the very end of a file. + // For example, if a file is 13 lines long, it is valid to raise a message + // on line 14 as long as the character position is 1 or unspecified and + // there is no "original" text. + + $max_old = count($old_lines); + + $invalid_position = false; + if ($start > ($max_old + 1)) { + $invalid_position = true; + } else if ($start > $max_old) { + if (strlen($original)) { + $invalid_position = true; + } else if ($char !== null && $char !== 1) { + $invalid_position = true; + } + } + + if ($invalid_position) { + $warning = $this->renderLine( + $start, + pht( + '(This message was raised at line %s, but the file only has '. + '%s line(s).)', + new PhutilNumber($start), + new PhutilNumber($max_old)), + false, + '?'); + + return $warning."\n\n"; + } + if ($message->isPatchable()) { $patch_offset = $line_map[$line] + ($char - 1);