diff --git a/src/lint/ArcanistLintMessage.php b/src/lint/ArcanistLintMessage.php --- a/src/lint/ArcanistLintMessage.php +++ b/src/lint/ArcanistLintMessage.php @@ -72,24 +72,7 @@ } public function setLine($line) { - if ($line === null) { - // This just means that we don't have any line information. - } else { - // For compatibility, accept digit strings since a lot of linters pass - // line numbers that they have parsed from command output or XML, which - // won't be properly typed. - if (is_string($line) && preg_match('/^\d+\z/', $line)) { - $line = (int)$line; - } - - if (!is_int($line)) { - throw new Exception( - pht( - 'Parameter passed to setLine() must be an integer.')); - } - } - - $this->line = $line; + $this->line = $this->validateInteger($line, 'setLine'); return $this; } @@ -98,7 +81,7 @@ } public function setChar($char) { - $this->char = $char; + $this->char = $this->validateInteger($char, 'setChar'); return $this; } @@ -242,4 +225,35 @@ return $this->bypassChangedLineFiltering; } + /** + * Validate an integer-like value, returning a strict integer. + * + * Further on, the pipeline is strict about types. We want to be a little + * less strict in linters themselves, since they often parse command line + * output or XML and will end up with string representations of numbers. + * + * @param mixed Integer or digit string. + * @return int Integer. + */ + private function validateInteger($value, $caller) { + if ($value === null) { + // This just means that we don't have any information. + return null; + } + + // Strings like "234" are fine, coerce them to integers. + if (is_string($value) && preg_match('/^\d+\z/', $value)) { + $value = (int)$value; + } + + if (!is_int($value)) { + throw new Exception( + pht( + 'Parameter passed to "%s" must be an integer.', + $caller.'()')); + } + + return $value; + } + }