1
1
#include " swift/Parse/SyntaxParsingCache.h"
2
2
#include " gtest/gtest.h"
3
3
4
+ #include < iostream>
5
+
4
6
using namespace swift ;
5
7
using namespace llvm ;
6
8
9
+
10
+ namespace llvm {
11
+ template <typename T>
12
+ void PrintTo (const Optional<T> &optVal, ::std::ostream *os) {
13
+ if (optVal.hasValue ())
14
+ *os << *optVal;
15
+ else
16
+ *os << " None" ;
17
+ }
18
+ } // namespace llvm
19
+
20
+ void check (ArrayRef<SourceEdit> Edits, ArrayRef<Optional<size_t >> expected) {
21
+ for (size_t Pos = 0 ; Pos != expected.size (); ++Pos) {
22
+ Optional<size_t > PrePos =
23
+ SyntaxParsingCache::translateToPreEditPosition (Pos, Edits);
24
+ EXPECT_EQ (PrePos, expected[Pos]) << " At post-edit position " << Pos;
25
+ }
26
+ }
27
+
7
28
class TranslateToPreEditPositionTest : public ::testing::Test {};
8
29
9
- TEST_F (TranslateToPreEditPositionTest, SingleEditBefore ) {
30
+ TEST_F (TranslateToPreEditPositionTest, SingleEdit1 ) {
10
31
// Old: ab_xy
11
- // New: a1b_xy
12
- //
13
- // Edits:
14
- // (1) 1-2: a -> a1
15
- //
16
- // Lookup for _ at new position 4
32
+ // New: c_xy
17
33
18
34
llvm::SmallVector<SourceEdit, 4 > Edits = {
19
- {1 , 2 , 2 }
35
+ {0 , 2 , 1 } // ab -> c
20
36
};
21
37
22
- size_t PreEditPos = SyntaxParsingCache::translateToPreEditPosition ( 4 , Edits);
23
- EXPECT_EQ (PreEditPos, 3u );
38
+ // c _ x y
39
+ check (Edits, {None, 2 , 3 , 4 } );
24
40
}
25
41
26
- TEST_F (TranslateToPreEditPositionTest, SingleEditDirectlyBefore ) {
42
+ TEST_F (TranslateToPreEditPositionTest, SingleEdit ) {
27
43
// Old: ab_xy
28
44
// New: ablah_xy
29
- //
30
- // Edits:
31
- // (1) 2-3: b -> blah
32
- //
33
- // Lookup for _ at new position 6
34
45
35
46
llvm::SmallVector<SourceEdit, 4 > Edits = {
36
- {2 , 3 , 4 }
47
+ {1 , 2 , 4 } // b -> blah
37
48
};
38
49
39
- size_t PreEditPos = SyntaxParsingCache::translateToPreEditPosition ( 6 , Edits);
40
- EXPECT_EQ (PreEditPos, 3u );
50
+ // a b l a h _ x y
51
+ check (Edits, { 0 , None, None, None, None, 2 , 3 , 4 } );
41
52
}
42
53
43
- TEST_F (TranslateToPreEditPositionTest, SingleMultiCharacterEdit ) {
54
+ TEST_F (TranslateToPreEditPositionTest, SingleInsert ) {
44
55
// Old: ab_xy
45
- // New: abcdef_xy
46
- //
47
- // Edits:
48
- // (1) 1-3: ab -> abcdef
49
- //
50
- // Lookup for _ at new position 7
56
+ // New: 0123ab_xy
51
57
52
58
llvm::SmallVector<SourceEdit, 4 > Edits = {
53
- {1 , 3 , 6 }
59
+ {0 , 0 , 4 } // '' -> 0123
54
60
};
55
61
56
- size_t PreEditPos = SyntaxParsingCache::translateToPreEditPosition ( 7 , Edits);
57
- EXPECT_EQ (PreEditPos, 3u );
62
+ // 0 1 2 3 a b _ x y
63
+ check (Edits, { None, None, None, None, 0 , 1 , 2 , 3 , 4 } );
58
64
}
59
65
60
- TEST_F (TranslateToPreEditPositionTest, EditAfterLookup) {
61
- // Old: ab_xy
62
- // New: ab_xyz
63
- //
64
- // Edits:
65
- // (1) 4-6: xy -> xyz
66
- //
67
- // Lookup for _ at new position 3
66
+ TEST_F (TranslateToPreEditPositionTest, SingleDelete) {
67
+ // Old: ab_xyz
68
+ // New: ab_z
68
69
69
- llvm::SmallVector<SourceEdit, 4 > Edits = {{4 , 6 , 4 }};
70
+ llvm::SmallVector<SourceEdit, 4 > Edits = {
71
+ {3 , 5 , 0 } // xy -> ''
72
+ };
70
73
71
- size_t PreEditPos = SyntaxParsingCache::translateToPreEditPosition ( 3 , Edits);
72
- EXPECT_EQ (PreEditPos, 3u );
74
+ // a b _ z
75
+ check (Edits, { 0 , 1 , 2 , 5 } );
73
76
}
74
77
75
78
TEST_F (TranslateToPreEditPositionTest, SimpleMultiEdit) {
76
- // Old: ab_xy
77
- // New: a1b2_x3y4
78
- //
79
- // Edits:
80
- // (1) 1-2: a -> a1
81
- // (2) 2-3: b -> b2
82
- // (3) 4-5: x -> x3
83
- // (4) 5-6: y -> y4
84
- //
85
- // Lookup for _ at new position 5
79
+ // Old: _ab_xy
80
+ // New: _a1b2_x3y4
86
81
87
82
llvm::SmallVector<SourceEdit, 4 > Edits = {
88
- {1 , 2 , 2 },
89
- {2 , 3 , 2 },
90
- {4 , 5 , 2 },
91
- {5 , 6 , 2 },
83
+ {1 , 2 , 2 }, // a -> a1
84
+ {2 , 3 , 2 }, // b -> b2
85
+ {4 , 5 , 2 }, // x -> x3
86
+ {5 , 6 , 2 }, // y -> y4
92
87
};
93
88
94
- size_t PreEditPos = SyntaxParsingCache::translateToPreEditPosition ( 5 , Edits);
95
- EXPECT_EQ (PreEditPos, 3u );
89
+ // _ a 1 b 1 _ x 3 y 4
90
+ check (Edits, { 0 , None, None, None, None, 3 , None, None, None, None} );
96
91
}
97
92
98
- TEST_F (TranslateToPreEditPositionTest, LongMultiEdit) {
99
- // Old: ab_xy
100
- // New: a11111b2_x3y4
101
- //
102
- // Edits:
103
- // (1) 1-2: a -> a11111
104
- // (2) 2-3: b -> b2
105
- // (3) 4-5: x -> x3
106
- // (4) 5-6: y -> y4
107
- //
108
- // Lookup for _ at new position
93
+ TEST_F (TranslateToPreEditPositionTest, ComplexMultiEdit) {
94
+ // Old: foo_bar_baz
95
+ // New: xx_edits_baz
109
96
110
97
llvm::SmallVector<SourceEdit, 4 > Edits = {
111
- {1 , 2 , 6 },
112
- {2 , 3 , 2 },
113
- {4 , 5 , 2 },
114
- {5 , 6 , 2 },
98
+ {0 , 3 , 2 }, // foo -> xx
99
+ {4 , 7 , 0 }, // bar -> ''
100
+ {7 , 7 , 5 }, // '' -> edits
115
101
};
116
102
117
- size_t PreEditPos = SyntaxParsingCache::translateToPreEditPosition ( 9 , Edits);
118
- EXPECT_EQ (PreEditPos, 3u );
119
- }
103
+ // x x _ e d i t s _ b a z
104
+ check (Edits, {None, None, 3 , None, None, None, None, None, 7 , 8 , 9 , 10 } );
105
+ }
0 commit comments