@@ -117,4 +117,45 @@ public class SyntaxTrackingTests: XCTestCase {
117
117
118
118
XCTAssertEqual ( codeBlockItemList. last? . item. originalNode ( in: originalFunction) ? . id, originalFunction. id)
119
119
}
120
+
121
+ func testTwoLayerModification( ) throws {
122
+ let originalFunction = try FunctionDeclSyntax ( " func foo() {} " ) . tracked
123
+ let modifiedFunction = originalFunction. with ( \. name, " bar " )
124
+ let secondModification = modifiedFunction. with ( \. body, nil )
125
+
126
+ XCTAssertEqual (
127
+ secondModification. funcKeyword. originalNode ( in: originalFunction) ? . id,
128
+ originalFunction. funcKeyword. id
129
+ )
130
+ XCTAssertNil ( secondModification. name. originalNode ( in: originalFunction) )
131
+ XCTAssertNil ( secondModification. name. originalNode ( in: modifiedFunction) )
132
+ }
133
+
134
+ func testEditAndThenCreation( ) throws {
135
+ let originalFunction = try FunctionDeclSyntax ( " func foo() {} " ) . tracked
136
+ let modifiedFunction = originalFunction. with ( \. name, " bar " )
137
+
138
+ let codeBlockItem = CodeBlockItemSyntax ( item: . decl( DeclSyntax ( modifiedFunction) ) )
139
+
140
+ XCTAssertEqual (
141
+ codeBlockItem. item. as ( FunctionDeclSyntax . self) ? . funcKeyword. originalNode ( in: originalFunction) ? . id,
142
+ originalFunction. funcKeyword. id
143
+ )
144
+ XCTAssertNil ( codeBlockItem. item. as ( FunctionDeclSyntax . self) ? . name. originalNode ( in: originalFunction) ? . id)
145
+ XCTAssertNil ( codeBlockItem. item. as ( FunctionDeclSyntax . self) ? . name. originalNode ( in: modifiedFunction) ? . id)
146
+ }
147
+
148
+ func testStartTrackingModifiedNode( ) throws {
149
+ let originalFunction = try FunctionDeclSyntax ( " func foo() {} " ) . tracked
150
+ let modifiedFunction = originalFunction. with ( \. name, " bar " ) . tracked
151
+ let secondModification = modifiedFunction. with ( \. body, nil )
152
+
153
+ XCTAssertNil ( secondModification. funcKeyword. originalNode ( in: originalFunction) )
154
+ XCTAssertEqual (
155
+ secondModification. funcKeyword. originalNode ( in: modifiedFunction) ? . id,
156
+ modifiedFunction. funcKeyword. id
157
+ )
158
+ XCTAssertNil ( secondModification. name. originalNode ( in: originalFunction) )
159
+ XCTAssertEqual ( secondModification. name. originalNode ( in: modifiedFunction) ? . id, modifiedFunction. name. id)
160
+ }
120
161
}
0 commit comments