@@ -14,42 +14,72 @@ import SwiftDiagnostics
14
14
import SwiftSyntax
15
15
16
16
extension FixIt {
17
- init ( message: StaticParserFixIt , changes: [ Change ] ) {
17
+ init ( message: StaticParserFixIt , changes: Changes ) {
18
18
self . init ( message: message as FixItMessage , changes: changes)
19
19
}
20
+
21
+ public init ( message: FixItMessage , changes: [ Changes ] ) {
22
+ self . init ( message: message, changes: FixIt . Changes ( combining: changes) )
23
+ }
24
+
25
+ init ( message: StaticParserFixIt , changes: [ Changes ] ) {
26
+ self . init ( message: message as FixItMessage , changes: FixIt . Changes ( combining: changes) )
27
+ }
20
28
}
21
29
22
- extension FixIt . Change {
30
+ extension FixIt . Changes {
23
31
/// Replaced a present node with a missing node
24
- static func makeMissing( node: TokenSyntax ) -> FixIt . Change {
32
+ static func makeMissing( node: TokenSyntax ) -> Self {
25
33
assert ( node. presence == . present)
26
- return . replace(
27
- oldNode: Syntax ( node) ,
28
- newNode: Syntax ( TokenSyntax ( node. tokenKind, leadingTrivia: [ ] , trailingTrivia: [ ] , presence: . missing) )
29
- )
34
+ var changes = [
35
+ FixIt . Change. replace (
36
+ oldNode: Syntax ( node) ,
37
+ newNode: Syntax ( TokenSyntax ( node. tokenKind, leadingTrivia: [ ] , trailingTrivia: [ ] , presence: . missing) )
38
+ )
39
+ ]
40
+ if !node. leadingTrivia. isEmpty, let nextToken = node. nextToken ( viewMode: . sourceAccurate) {
41
+ changes. append ( . replaceLeadingTrivia( token: nextToken, newTrivia: node. leadingTrivia) )
42
+ }
43
+ return FixIt . Changes ( changes: changes)
30
44
}
31
45
32
- static func makePresent< T: SyntaxProtocol > ( node: T ) -> FixIt . Change {
33
- return . replace(
46
+ static func makePresent< T: SyntaxProtocol > ( node: T ) -> Self {
47
+ return [ . replace(
34
48
oldNode: Syntax ( node) ,
35
49
newNode: PresentMaker ( ) . visit ( Syntax ( node) )
36
- )
50
+ ) ]
51
+ }
52
+
53
+ /// Make a token present. If `leadingTrivia` or `trailingTrivia` is specified,
54
+ /// override the default leading/trailing trivia inferred from `BasicFormat`.
55
+ static func makePresent(
56
+ node: TokenSyntax ,
57
+ leadingTrivia: Trivia ? = nil ,
58
+ trailingTrivia: Trivia ? = nil
59
+ ) -> Self {
60
+ var presentNode = PresentMaker ( ) . visit ( Syntax ( node) ) . as ( TokenSyntax . self) !
61
+ if let leadingTrivia = leadingTrivia {
62
+ presentNode. leadingTrivia = leadingTrivia
63
+ }
64
+ if let trailingTrivia = trailingTrivia {
65
+ presentNode. trailingTrivia = trailingTrivia
66
+ }
67
+ return [ . replace(
68
+ oldNode: Syntax ( node) ,
69
+ newNode: Syntax ( presentNode)
70
+ ) ]
37
71
}
38
- }
39
72
40
- extension Array where Element == FixIt . Change {
41
73
/// Makes the `token` present, moving it in front of the previous token's trivia.
42
- static func makePresentBeforeTrivia( token: TokenSyntax ) -> [ FixIt . Change ] {
74
+ static func makePresentBeforeTrivia( token: TokenSyntax ) -> Self {
43
75
if let previousToken = token. previousToken ( viewMode: . sourceAccurate) {
44
76
let presentToken = PresentMaker ( ) . visit ( token) . withTrailingTrivia ( previousToken. trailingTrivia)
45
77
return [
46
- . removeTrailingTrivia ( previousToken) ,
78
+ . replaceTrailingTrivia ( token : previousToken, newTrivia : [ ] ) ,
47
79
. replace( oldNode: Syntax ( token) , newNode: presentToken) ,
48
80
]
49
81
} else {
50
- return [
51
- . makePresent( node: token)
52
- ]
82
+ return . makePresent( node: token)
53
83
}
54
84
}
55
85
}
0 commit comments