Skip to content

Commit 8d5a984

Browse files
authored
Merge pull request #961 from ahoppen/ahoppen/simpify-make-signatures
Simplify signature of makeMissing and makePresent
2 parents 98a260b + 9cbfdee commit 8d5a984

File tree

3 files changed

+29
-60
lines changed

3 files changed

+29
-60
lines changed

Sources/SwiftParser/Diagnostics/DiagnosticExtensions.swift

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,12 @@ extension FixIt {
3333

3434
extension FixIt.Changes {
3535
/// Replaced a present token with a missing node
36-
static func makeMissing(token: TokenSyntax) -> Self {
37-
return makeMissing(tokens: [token])
36+
static func makeMissing(_ token: TokenSyntax) -> Self {
37+
return makeMissing([token])
3838
}
3939

4040
/// Replace present tokens with missing tokens
41-
static func makeMissing(tokens: [TokenSyntax]) -> Self {
41+
static func makeMissing(_ tokens: [TokenSyntax]) -> Self {
4242
assert(!tokens.isEmpty)
4343
assert(tokens.allSatisfy({ $0.presence == .present }))
4444
var changes = tokens.map {
@@ -56,33 +56,16 @@ extension FixIt.Changes {
5656
return FixIt.Changes(changes: changes)
5757
}
5858

59-
static func makeMissing<SyntaxType: SyntaxProtocol>(node: SyntaxType) -> Self {
59+
static func makeMissing<SyntaxType: SyntaxProtocol>(_ node: SyntaxType) -> Self {
6060
return FixIt.Changes(changes: [
6161
.replace(oldNode: Syntax(node), newNode: MissingMaker().visit(Syntax(node)))
6262
])
6363
}
6464

65-
/// Remove the nodes in `unexpected`.
66-
static func remove(unexpected: UnexpectedNodesSyntax) -> Self {
67-
var changes: [FixIt.Change] = [
68-
FixIt.Change.replace(
69-
oldNode: Syntax(unexpected),
70-
newNode: Syntax(UnexpectedNodesSyntax([]))
71-
)
72-
]
73-
if let firstToken = unexpected.firstToken(viewMode: .sourceAccurate),
74-
firstToken.leadingTrivia.isEmpty == false,
75-
let nextToken = unexpected.lastToken(viewMode: .sourceAccurate)?.nextToken(viewMode: .sourceAccurate),
76-
!nextToken.leadingTrivia.contains(where: { $0.isNewline }) {
77-
changes.append(.replaceLeadingTrivia(token: nextToken, newTrivia: firstToken.leadingTrivia))
78-
}
79-
return FixIt.Changes(changes: changes)
80-
}
81-
8265
/// Make a node present. If `leadingTrivia` or `trailingTrivia` is specified,
8366
/// override the default leading/trailing trivia inferred from `BasicFormat`.
8467
static func makePresent<T: SyntaxProtocol>(
85-
node: T,
68+
_ node: T,
8669
leadingTrivia: Trivia? = nil,
8770
trailingTrivia: Trivia? = nil
8871
) -> Self {
@@ -100,7 +83,7 @@ extension FixIt.Changes {
10083
}
10184

10285
/// Makes the `token` present, moving it in front of the previous token's trivia.
103-
static func makePresentBeforeTrivia(token: TokenSyntax) -> Self {
86+
static func makePresentBeforeTrivia(_ token: TokenSyntax) -> Self {
10487
if let previousToken = token.previousToken(viewMode: .sourceAccurate) {
10588
var presentToken = PresentMaker().visit(token).as(TokenSyntax.self)!
10689
if !previousToken.trailingTrivia.isEmpty {
@@ -111,7 +94,7 @@ extension FixIt.Changes {
11194
.replace(oldNode: Syntax(token), newNode: Syntax(presentToken)),
11295
]
11396
} else {
114-
return .makePresent(node: token)
97+
return .makePresent(token)
11598
}
11699
}
117100
}

Sources/SwiftParser/Diagnostics/MissingNodesError.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -317,9 +317,9 @@ extension ParseDiagnosticsGenerator {
317317

318318
let changes = missingNodes.enumerated().map { (index, missingNode) -> FixIt.Changes in
319319
if index == 0, let token = missingNode.as(TokenSyntax.self), token.tokenKind.isPunctuation == true, token.previousToken(viewMode: .sourceAccurate)?.tokenKind.isPunctuation == false {
320-
return .makePresentBeforeTrivia(token: token)
320+
return .makePresentBeforeTrivia(token)
321321
} else {
322-
return .makePresent(node: missingNode)
322+
return .makePresent(missingNode)
323323
}
324324
}
325325
let fixIt = FixIt(

Sources/SwiftParser/Diagnostics/ParseDiagnosticsGenerator.swift

Lines changed: 20 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -101,13 +101,13 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
101101
if misplacedTokens.count == 1, let misplacedToken = misplacedTokens.first,
102102
misplacedToken.nextToken(viewMode: .all) == correctToken || misplacedToken.previousToken(viewMode: .all) == correctToken {
103103
changes.append(FixIt.Changes.makePresent(
104-
node: correctToken,
104+
correctToken,
105105
leadingTrivia: misplacedToken.leadingTrivia,
106106
trailingTrivia: misplacedToken.trailingTrivia
107107
))
108108
} else {
109109
changes.append(FixIt.Changes.makePresent(
110-
node: correctToken,
110+
correctToken,
111111
leadingTrivia: nil,
112112
trailingTrivia: nil
113113
))
@@ -140,7 +140,7 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
140140
}
141141
let fixit = FixIt(
142142
message: RemoveNodesFixIt(unexpected),
143-
changes: [.remove(unexpected: unexpected)]
143+
changes: .makeMissing(unexpected)
144144
)
145145
addDiagnostic(
146146
unexpected, message(misplacedToken), fixIts: [fixit],
@@ -184,14 +184,14 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
184184
var fixIts: [FixIt] = [
185185
FixIt(message: .joinIdentifiers, changes: [
186186
[.replace(oldNode: Syntax(previousToken), newNode: Syntax(TokenSyntax(.identifier(joined), presence: .present)))],
187-
.makeMissing(tokens: tokens)
187+
.makeMissing(tokens)
188188
])
189189
]
190190
if tokens.contains(where: { $0.text.first?.isUppercase == false }) {
191191
let joinedUsingCamelCase = previousToken.text + tokens.map({ $0.text.withFirstLetterUppercased() }).joined()
192192
fixIts.append(FixIt(message: .joinIdentifiersWithCamelCase, changes: [
193193
[.replace(oldNode: Syntax(previousToken), newNode: Syntax(TokenSyntax(.identifier(joinedUsingCamelCase), presence: .present)))],
194-
.makeMissing(tokens: tokens)
194+
.makeMissing(tokens)
195195
]))
196196
}
197197
addDiagnostic(node, SpaceSeparatedIdentifiersError(firstToken: previousToken, additionalTokens: tokens), fixIts: fixIts)
@@ -260,17 +260,15 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
260260
// If the item contains errors, the root cause is most likely something different and not the missing semicolon.
261261
let position = semicolon.previousToken(viewMode: .sourceAccurate)?.endPositionBeforeTrailingTrivia
262262
addDiagnostic(semicolon, position: position, .consecutiveStatementsOnSameLine, fixIts: [
263-
FixIt(message: .insertSemicolon, changes: .makePresentBeforeTrivia(token: semicolon))
263+
FixIt(message: .insertSemicolon, changes: .makePresentBeforeTrivia(semicolon))
264264
], handledNodes: [semicolon.id])
265265
} else {
266266
handledNodes.append(semicolon.id)
267267
}
268268
}
269269
if let semicolon = node.semicolon, semicolon.presence == .present, node.item.isMissingAllTokens {
270270
addDiagnostic(node, .standaloneSemicolonStatement, fixIts: [
271-
FixIt(message: RemoveNodesFixIt(semicolon), changes: [
272-
.makeMissing(tokens: [semicolon])
273-
])
271+
FixIt(message: RemoveNodesFixIt(semicolon), changes: .makeMissing(semicolon))
274272
], handledNodes: [node.item.id])
275273
}
276274
if let switchCase = node.unexpectedBeforeItem?.only?.as(SwitchCaseSyntax.self) {
@@ -291,9 +289,7 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
291289
if let unexpected = node.unexpectedAfterOperatorPrecedenceAndTypes,
292290
unexpected.contains(where: { $0.is(PrecedenceGroupAttributeListSyntax.self) }) == true {
293291
addDiagnostic(unexpected, .operatorShouldBeDeclaredWithoutBody, fixIts: [
294-
FixIt(message: .removeOperatorBody, changes: [
295-
.remove(unexpected: unexpected)
296-
])
292+
FixIt(message: .removeOperatorBody, changes: .makeMissing(unexpected))
297293
], handledNodes: [unexpected.id])
298294
}
299295

@@ -312,9 +308,7 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
312308
if let message = message {
313309
let fixIts: [FixIt]
314310
if node.identifier.presence == .present {
315-
fixIts = [
316-
FixIt(message: RemoveNodesFixIt(unexpected), changes: .remove(unexpected: unexpected))
317-
]
311+
fixIts = [FixIt(message: RemoveNodesFixIt(unexpected), changes: .makeMissing(unexpected))]
318312
} else {
319313
fixIts = []
320314
}
@@ -335,13 +329,13 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
335329
if let unexpected = node.unexpectedBetweenSubscriptKeywordAndGenericParameterClause,
336330
let nameTokens = unexpected.onlyTokens(satisfying: { !$0.tokenKind.isKeyword }) {
337331
addDiagnostic(unexpected, .subscriptsCannotHaveNames, fixIts: [
338-
FixIt(message: RemoveNodesFixIt(nameTokens), changes: .makeMissing(tokens: nameTokens))
332+
FixIt(message: RemoveNodesFixIt(nameTokens), changes: .makeMissing(nameTokens))
339333
], handledNodes: [unexpected.id])
340334
}
341335
if let unexpected = node.indices.unexpectedBeforeLeftParen,
342336
let nameTokens = unexpected.onlyTokens(satisfying: { !$0.tokenKind.isKeyword }) {
343337
addDiagnostic(unexpected, .subscriptsCannotHaveNames, fixIts: [
344-
FixIt(message: RemoveNodesFixIt(nameTokens), changes: .makeMissing(tokens: nameTokens))
338+
FixIt(message: RemoveNodesFixIt(nameTokens), changes: .makeMissing(nameTokens))
345339
], handledNodes: [unexpected.id])
346340
}
347341
return .visitChildren
@@ -367,7 +361,7 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
367361
// If the decl contains errors, the root cause is most likely something different and not the missing semicolon.
368362
let position = semicolon.previousToken(viewMode: .sourceAccurate)?.endPositionBeforeTrailingTrivia
369363
addDiagnostic(semicolon, position: position, .consecutiveDeclarationsOnSameLine, fixIts: [
370-
FixIt(message: .insertSemicolon, changes: .makePresentBeforeTrivia(token: semicolon))
364+
FixIt(message: .insertSemicolon, changes: .makePresentBeforeTrivia(semicolon))
371365
], handledNodes: [semicolon.id])
372366
} else {
373367
handledNodes.append(semicolon.id)
@@ -406,9 +400,7 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
406400
}
407401
if let argument = node.argument, argument.isMissingAllTokens {
408402
addDiagnostic(argument, MissingAttributeArgument(attributeName: node.attributeName), fixIts: [
409-
FixIt(message: .insertAttributeArguments, changes: [
410-
.makePresent(node: argument)
411-
])
403+
FixIt(message: .insertAttributeArguments, changes: .makePresent(argument))
412404
], handledNodes: [argument.id])
413405
return .visitChildren
414406
}
@@ -436,13 +428,13 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
436428
if let unexpected = node.unexpectedBetweenDeinitKeywordAndBody,
437429
let name = unexpected.filter({ $0.as(TokenSyntax.self)?.tokenKind.isIdentifier == true }).only?.as(TokenSyntax.self) {
438430
addDiagnostic(name, .deinitCannotHaveName, fixIts: [
439-
FixIt(message: RemoveNodesFixIt(name), changes: .makeMissing(token: name))
431+
FixIt(message: RemoveNodesFixIt(name), changes: .makeMissing(name))
440432
], handledNodes: [name.id])
441433
}
442434
if let unexpected = node.unexpectedBetweenDeinitKeywordAndBody,
443435
let signature = unexpected.compactMap({ $0.as(FunctionSignatureSyntax.self) }).only {
444436
addDiagnostic(signature, .deinitCannotHaveParameters, fixIts: [
445-
FixIt(message: RemoveNodesFixIt(signature), changes: .makeMissing(node: signature))
437+
FixIt(message: RemoveNodesFixIt(signature), changes: .makeMissing(signature))
446438
], handledNodes: [signature.id])
447439
}
448440

@@ -579,9 +571,7 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
579571
}
580572
if node.unknownAttr?.isMissingAllTokens != false && node.label.isMissingAllTokens {
581573
addDiagnostic(node.statements, .allStatmentsInSwitchMustBeCoveredByCase, fixIts: [
582-
FixIt(message: InsertTokenFixIt(missingNodes: [node.label]), changes: [
583-
.makePresent(node: node.label, leadingTrivia: .newline)
584-
])
574+
FixIt(message: InsertTokenFixIt(missingNodes: [node.label]), changes: .makePresent(node.label, leadingTrivia: .newline))
585575
], handledNodes: [node.label.id])
586576
}
587577
return .visitChildren
@@ -607,9 +597,7 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
607597
}
608598
if node.expression.is(MissingExprSyntax.self) {
609599
addDiagnostic(node.expression, .expectedExpressionAfterTry, fixIts: [
610-
FixIt(message: InsertTokenFixIt(missingNodes: [Syntax(node.expression)]), changes: [
611-
.makePresent(node: node.expression)
612-
])
600+
FixIt(message: InsertTokenFixIt(missingNodes: [Syntax(node.expression)]), changes: .makePresent(node.expression))
613601
], handledNodes: [node.expression.id])
614602
}
615603
return .visitChildren
@@ -656,15 +644,13 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
656644
nextSibling.is(MissingExprSyntax.self) {
657645
addDiagnostic(node.colonMark, .missingColonAndExprInTernaryExpr, fixIts: [
658646
FixIt(message: InsertTokenFixIt(missingNodes: [Syntax(node.colonMark), Syntax(nextSibling)]), changes: [
659-
.makePresent(node: node.colonMark),
660-
.makePresent(node: nextSibling),
647+
.makePresent(node.colonMark),
648+
.makePresent(nextSibling),
661649
])
662650
], handledNodes: [node.colonMark.id, nextSibling.id])
663651
} else {
664652
addDiagnostic(node.colonMark, .missingColonInTernaryExpr, fixIts: [
665-
FixIt(message: InsertTokenFixIt(missingNodes: [Syntax(node.colonMark)]), changes: [
666-
.makePresent(node: node.colonMark),
667-
])
653+
FixIt(message: InsertTokenFixIt(missingNodes: [Syntax(node.colonMark)]), changes: .makePresent(node.colonMark))
668654
], handledNodes: [node.colonMark.id])
669655
}
670656
}

0 commit comments

Comments
 (0)