mirror of
https://we.phorge.it/source/arcanist.git
synced 2024-11-22 14:52:40 +01:00
Fix a prefix/suffix counting issue in Arcanist lint rendering
Summary: Ref T9846. See PHI48. For replacing text in the form "ABC" with "ABBC", the trimmer had a bug. Test Plan: Added failing tests, fixed 'em. Reviewers: chad Reviewed By: chad Maniphest Tasks: T9846 Differential Revision: https://secure.phabricator.com/D18538
This commit is contained in:
parent
d9cb5b18fb
commit
7371277d20
5 changed files with 56 additions and 3 deletions
|
@ -302,8 +302,13 @@ final class ArcanistLintMessage extends Phobject {
|
||||||
// "patchable" if they are, so we don't need a special check for the case
|
// "patchable" if they are, so we don't need a special check for the case
|
||||||
// where the entire string is a shared prefix.
|
// where the entire string is a shared prefix.
|
||||||
|
|
||||||
|
// However, if the two strings are in the form "ABC" and "ABBC", we may
|
||||||
|
// find a prefix and a suffix with a combined length greater than the
|
||||||
|
// total size of the smaller string if we don't limit the search.
|
||||||
|
$max_suffix = ($minimum_length - $prefix_length);
|
||||||
|
|
||||||
$suffix_length = 0;
|
$suffix_length = 0;
|
||||||
for ($ii = 1; $ii <= $minimum_length; $ii++) {
|
for ($ii = 1; $ii <= $max_suffix; $ii++) {
|
||||||
$original_char = $original[$original_length - $ii];
|
$original_char = $original[$original_length - $ii];
|
||||||
$replacement_char = $replacement[$replacement_length - $ii];
|
$replacement_char = $replacement[$replacement_length - $ii];
|
||||||
if ($original_char !== $replacement_char) {
|
if ($original_char !== $replacement_char) {
|
||||||
|
@ -323,8 +328,11 @@ final class ArcanistLintMessage extends Phobject {
|
||||||
if ($prefix_length) {
|
if ($prefix_length) {
|
||||||
$prefix = substr($original, 0, $prefix_length);
|
$prefix = substr($original, 0, $prefix_length);
|
||||||
|
|
||||||
$original = substr($original, $prefix_length);
|
// NOTE: Prior to PHP7, `substr("a", 1)` returned false instead of
|
||||||
$replacement = substr($replacement, $prefix_length);
|
// the empty string. Cast these to force the PHP7-ish behavior we
|
||||||
|
// expect.
|
||||||
|
$original = (string)substr($original, $prefix_length);
|
||||||
|
$replacement = (string)substr($replacement, $prefix_length);
|
||||||
|
|
||||||
// If we've removed a prefix, we need to push the character and line
|
// If we've removed a prefix, we need to push the character and line
|
||||||
// number for the warning forward to account for the characters we threw
|
// number for the warning forward to account for the characters we threw
|
||||||
|
|
|
@ -45,6 +45,14 @@ final class ArcanistLintMessageTestCase
|
||||||
'line' => 2,
|
'line' => 2,
|
||||||
'char' => 5,
|
'char' => 5,
|
||||||
),
|
),
|
||||||
|
'mid-newline' => array(
|
||||||
|
'old' => 'ABA',
|
||||||
|
'new' => 'ABBA',
|
||||||
|
'old.expect' => '',
|
||||||
|
'new.expect' => 'B',
|
||||||
|
'line' => 1,
|
||||||
|
'char' => 3,
|
||||||
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
foreach ($map as $key => $test_case) {
|
foreach ($map as $key => $test_case) {
|
||||||
|
|
|
@ -4,6 +4,21 @@ final class ArcanistConsoleLintRendererTestCase
|
||||||
extends PhutilTestCase {
|
extends PhutilTestCase {
|
||||||
|
|
||||||
public function testRendering() {
|
public function testRendering() {
|
||||||
|
$midline_original = <<<EOTEXT
|
||||||
|
import apple;
|
||||||
|
import banana;
|
||||||
|
import cat;
|
||||||
|
import dog;
|
||||||
|
EOTEXT;
|
||||||
|
|
||||||
|
$midline_replacement = <<<EOTEXT
|
||||||
|
import apple;
|
||||||
|
import banana;
|
||||||
|
|
||||||
|
import cat;
|
||||||
|
import dog;
|
||||||
|
EOTEXT;
|
||||||
|
|
||||||
$map = array(
|
$map = array(
|
||||||
'simple' => array(
|
'simple' => array(
|
||||||
'line' => 1,
|
'line' => 1,
|
||||||
|
@ -67,6 +82,13 @@ final class ArcanistConsoleLintRendererTestCase
|
||||||
'char' => 4,
|
'char' => 4,
|
||||||
'original' => 'should of',
|
'original' => 'should of',
|
||||||
),
|
),
|
||||||
|
|
||||||
|
'midline' => array(
|
||||||
|
'line' => 1,
|
||||||
|
'char' => 1,
|
||||||
|
'original' => $midline_original,
|
||||||
|
'replacement' => $midline_replacement,
|
||||||
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
$defaults = array(
|
$defaults = array(
|
||||||
|
|
11
src/lint/renderer/__tests__/data/midline.expect
Normal file
11
src/lint/renderer/__tests__/data/midline.expect
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
>>> Lint for path/to/example.c:
|
||||||
|
|
||||||
|
|
||||||
|
Warning (WARN123) Lint Warning
|
||||||
|
Consider this.
|
||||||
|
|
||||||
|
1 import apple;
|
||||||
|
2 import banana;
|
||||||
|
>>> + ~
|
||||||
|
3 import cat;
|
||||||
|
4 import dog;
|
4
src/lint/renderer/__tests__/data/midline.txt
Normal file
4
src/lint/renderer/__tests__/data/midline.txt
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
import apple;
|
||||||
|
import banana;
|
||||||
|
import cat;
|
||||||
|
import dog;
|
Loading…
Reference in a new issue