@@ -105,4 +105,36 @@ public class SyntaxTrackingTests: XCTestCase {
105
105
106
106
XCTAssertEqual ( codeBlockItemList. last? . item. originalNode ( in: originalFunction) ? . id, originalFunction. id)
107
107
}
108
+
109
+ func testTwoLayerModification( ) throws {
110
+ let originalFunction = try FunctionDeclSyntax ( " func foo() {} " ) . tracked
111
+ let modifiedFunction = originalFunction. with ( \. name, " bar " )
112
+ let secondModification = modifiedFunction. with ( \. body, nil )
113
+
114
+ XCTAssertEqual ( secondModification. funcKeyword. originalNode ( in: originalFunction) ? . id, originalFunction. funcKeyword. id)
115
+ XCTAssertNil ( secondModification. name. originalNode ( in: originalFunction) )
116
+ XCTAssertNil ( secondModification. name. originalNode ( in: modifiedFunction) )
117
+ }
118
+
119
+ func testEditAndThenCreation( ) throws {
120
+ let originalFunction = try FunctionDeclSyntax ( " func foo() {} " ) . tracked
121
+ let modifiedFunction = originalFunction. with ( \. name, " bar " )
122
+
123
+ let codeBlockItem = CodeBlockItemSyntax ( item: . decl( DeclSyntax ( modifiedFunction) ) )
124
+
125
+ XCTAssertEqual ( codeBlockItem. item. as ( FunctionDeclSyntax . self) ? . funcKeyword. originalNode ( in: originalFunction) ? . id, originalFunction. funcKeyword. id)
126
+ XCTAssertNil ( codeBlockItem. item. as ( FunctionDeclSyntax . self) ? . name. originalNode ( in: originalFunction) ? . id)
127
+ XCTAssertNil ( codeBlockItem. item. as ( FunctionDeclSyntax . self) ? . name. originalNode ( in: modifiedFunction) ? . id)
128
+ }
129
+
130
+ func testStartTrackingModifiedNode( ) throws {
131
+ let originalFunction = try FunctionDeclSyntax ( " func foo() {} " ) . tracked
132
+ let modifiedFunction = originalFunction. with ( \. name, " bar " ) . tracked
133
+ let secondModification = modifiedFunction. with ( \. body, nil )
134
+
135
+ XCTAssertNil ( secondModification. funcKeyword. originalNode ( in: originalFunction) )
136
+ XCTAssertEqual ( secondModification. funcKeyword. originalNode ( in: modifiedFunction) ? . id, modifiedFunction. funcKeyword. id)
137
+ XCTAssertNil ( secondModification. name. originalNode ( in: originalFunction) )
138
+ XCTAssertEqual ( secondModification. name. originalNode ( in: modifiedFunction) ? . id, modifiedFunction. name. id)
139
+ }
108
140
}
0 commit comments