Skip to content

Commit 9cbfdee

Browse files
committed
Simplify signature of makeMissing and makePresent
1 parent 583e3d8 commit 9cbfdee

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
@@ -29,12 +29,12 @@ extension FixIt {
2929

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

3636
/// Replace present tokens with missing tokens
37-
static func makeMissing(tokens: [TokenSyntax]) -> Self {
37+
static func makeMissing(_ tokens: [TokenSyntax]) -> Self {
3838
assert(!tokens.isEmpty)
3939
assert(tokens.allSatisfy({ $0.presence == .present }))
4040
var changes = tokens.map {
@@ -52,33 +52,16 @@ extension FixIt.Changes {
5252
return FixIt.Changes(changes: changes)
5353
}
5454

55-
static func makeMissing<SyntaxType: SyntaxProtocol>(node: SyntaxType) -> Self {
55+
static func makeMissing<SyntaxType: SyntaxProtocol>(_ node: SyntaxType) -> Self {
5656
return FixIt.Changes(changes: [
5757
.replace(oldNode: Syntax(node), newNode: MissingMaker().visit(Syntax(node)))
5858
])
5959
}
6060

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

9881
/// Makes the `token` present, moving it in front of the previous token's trivia.
99-
static func makePresentBeforeTrivia(token: TokenSyntax) -> Self {
82+
static func makePresentBeforeTrivia(_ token: TokenSyntax) -> Self {
10083
if let previousToken = token.previousToken(viewMode: .sourceAccurate) {
10184
var presentToken = PresentMaker().visit(token).as(TokenSyntax.self)!
10285
if !previousToken.trailingTrivia.isEmpty {
@@ -107,7 +90,7 @@ extension FixIt.Changes {
10790
.replace(oldNode: Syntax(token), newNode: Syntax(presentToken)),
10891
]
10992
} else {
110-
return .makePresent(node: token)
93+
return .makePresent(token)
11194
}
11295
}
11396
}

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
@@ -122,13 +122,13 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
122122
if misplacedTokens.count == 1, let misplacedToken = misplacedTokens.first,
123123
misplacedToken.nextToken(viewMode: .all) == correctToken || misplacedToken.previousToken(viewMode: .all) == correctToken {
124124
changes.append(FixIt.Changes.makePresent(
125-
node: correctToken,
125+
correctToken,
126126
leadingTrivia: misplacedToken.leadingTrivia,
127127
trailingTrivia: misplacedToken.trailingTrivia
128128
))
129129
} else {
130130
changes.append(FixIt.Changes.makePresent(
131-
node: correctToken,
131+
correctToken,
132132
leadingTrivia: nil,
133133
trailingTrivia: nil
134134
))
@@ -161,7 +161,7 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
161161
}
162162
let fixit = FixIt(
163163
message: RemoveNodesFixIt(unexpected),
164-
changes: [.remove(unexpected: unexpected)]
164+
changes: .makeMissing(unexpected)
165165
)
166166
addDiagnostic(
167167
unexpected, message(misplacedToken), fixIts: [fixit],
@@ -205,14 +205,14 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
205205
var fixIts: [FixIt] = [
206206
FixIt(message: .joinIdentifiers, changes: [
207207
[.replace(oldNode: Syntax(previousToken), newNode: Syntax(TokenSyntax(.identifier(joined), presence: .present)))],
208-
.makeMissing(tokens: tokens)
208+
.makeMissing(tokens)
209209
])
210210
]
211211
if tokens.contains(where: { $0.text.first?.isUppercase == false }) {
212212
let joinedUsingCamelCase = previousToken.text + tokens.map({ $0.text.withFirstLetterUppercased() }).joined()
213213
fixIts.append(FixIt(message: .joinIdentifiersWithCamelCase, changes: [
214214
[.replace(oldNode: Syntax(previousToken), newNode: Syntax(TokenSyntax(.identifier(joinedUsingCamelCase), presence: .present)))],
215-
.makeMissing(tokens: tokens)
215+
.makeMissing(tokens)
216216
]))
217217
}
218218
addDiagnostic(node, SpaceSeparatedIdentifiersError(firstToken: previousToken, additionalTokens: tokens), fixIts: fixIts)
@@ -281,17 +281,15 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
281281
// If the item contains errors, the root cause is most likely something different and not the missing semicolon.
282282
let position = semicolon.previousToken(viewMode: .sourceAccurate)?.endPositionBeforeTrailingTrivia
283283
addDiagnostic(semicolon, position: position, .consecutiveStatementsOnSameLine, fixIts: [
284-
FixIt(message: .insertSemicolon, changes: .makePresentBeforeTrivia(token: semicolon))
284+
FixIt(message: .insertSemicolon, changes: .makePresentBeforeTrivia(semicolon))
285285
], handledNodes: [semicolon.id])
286286
} else {
287287
handledNodes.append(semicolon.id)
288288
}
289289
}
290290
if let semicolon = node.semicolon, semicolon.presence == .present, node.item.isMissingAllTokens {
291291
addDiagnostic(node, .standaloneSemicolonStatement, fixIts: [
292-
FixIt(message: RemoveNodesFixIt(semicolon), changes: [
293-
.makeMissing(tokens: [semicolon])
294-
])
292+
FixIt(message: RemoveNodesFixIt(semicolon), changes: .makeMissing(semicolon))
295293
], handledNodes: [node.item.id])
296294
}
297295
if let switchCase = node.unexpectedBeforeItem?.only?.as(SwitchCaseSyntax.self) {
@@ -312,9 +310,7 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
312310
if let unexpected = node.unexpectedAfterOperatorPrecedenceAndTypes,
313311
unexpected.contains(where: { $0.is(PrecedenceGroupAttributeListSyntax.self) }) == true {
314312
addDiagnostic(unexpected, .operatorShouldBeDeclaredWithoutBody, fixIts: [
315-
FixIt(message: .removeOperatorBody, changes: [
316-
.remove(unexpected: unexpected)
317-
])
313+
FixIt(message: .removeOperatorBody, changes: .makeMissing(unexpected))
318314
], handledNodes: [unexpected.id])
319315
}
320316

@@ -333,9 +329,7 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
333329
if let message = message {
334330
let fixIts: [FixIt]
335331
if node.identifier.presence == .present {
336-
fixIts = [
337-
FixIt(message: RemoveNodesFixIt(unexpected), changes: .remove(unexpected: unexpected))
338-
]
332+
fixIts = [FixIt(message: RemoveNodesFixIt(unexpected), changes: .makeMissing(unexpected))]
339333
} else {
340334
fixIts = []
341335
}
@@ -356,13 +350,13 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
356350
if let unexpected = node.unexpectedBetweenSubscriptKeywordAndGenericParameterClause,
357351
let nameTokens = unexpected.onlyTokens(satisfying: { !$0.tokenKind.isKeyword }) {
358352
addDiagnostic(unexpected, .subscriptsCannotHaveNames, fixIts: [
359-
FixIt(message: RemoveNodesFixIt(nameTokens), changes: .makeMissing(tokens: nameTokens))
353+
FixIt(message: RemoveNodesFixIt(nameTokens), changes: .makeMissing(nameTokens))
360354
], handledNodes: [unexpected.id])
361355
}
362356
if let unexpected = node.indices.unexpectedBeforeLeftParen,
363357
let nameTokens = unexpected.onlyTokens(satisfying: { !$0.tokenKind.isKeyword }) {
364358
addDiagnostic(unexpected, .subscriptsCannotHaveNames, fixIts: [
365-
FixIt(message: RemoveNodesFixIt(nameTokens), changes: .makeMissing(tokens: nameTokens))
359+
FixIt(message: RemoveNodesFixIt(nameTokens), changes: .makeMissing(nameTokens))
366360
], handledNodes: [unexpected.id])
367361
}
368362
return .visitChildren
@@ -388,7 +382,7 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
388382
// If the decl contains errors, the root cause is most likely something different and not the missing semicolon.
389383
let position = semicolon.previousToken(viewMode: .sourceAccurate)?.endPositionBeforeTrailingTrivia
390384
addDiagnostic(semicolon, position: position, .consecutiveDeclarationsOnSameLine, fixIts: [
391-
FixIt(message: .insertSemicolon, changes: .makePresentBeforeTrivia(token: semicolon))
385+
FixIt(message: .insertSemicolon, changes: .makePresentBeforeTrivia(semicolon))
392386
], handledNodes: [semicolon.id])
393387
} else {
394388
handledNodes.append(semicolon.id)
@@ -427,9 +421,7 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
427421
}
428422
if let argument = node.argument, argument.isMissingAllTokens {
429423
addDiagnostic(argument, MissingAttributeArgument(attributeName: node.attributeName), fixIts: [
430-
FixIt(message: .insertAttributeArguments, changes: [
431-
.makePresent(node: argument)
432-
])
424+
FixIt(message: .insertAttributeArguments, changes: .makePresent(argument))
433425
], handledNodes: [argument.id])
434426
return .visitChildren
435427
}
@@ -457,13 +449,13 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
457449
if let unexpected = node.unexpectedBetweenDeinitKeywordAndBody,
458450
let name = unexpected.filter({ $0.as(TokenSyntax.self)?.tokenKind.isIdentifier == true }).only?.as(TokenSyntax.self) {
459451
addDiagnostic(name, .deinitCannotHaveName, fixIts: [
460-
FixIt(message: RemoveNodesFixIt(name), changes: .makeMissing(token: name))
452+
FixIt(message: RemoveNodesFixIt(name), changes: .makeMissing(name))
461453
], handledNodes: [name.id])
462454
}
463455
if let unexpected = node.unexpectedBetweenDeinitKeywordAndBody,
464456
let signature = unexpected.compactMap({ $0.as(FunctionSignatureSyntax.self) }).only {
465457
addDiagnostic(signature, .deinitCannotHaveParameters, fixIts: [
466-
FixIt(message: RemoveNodesFixIt(signature), changes: .makeMissing(node: signature))
458+
FixIt(message: RemoveNodesFixIt(signature), changes: .makeMissing(signature))
467459
], handledNodes: [signature.id])
468460
}
469461

@@ -600,9 +592,7 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
600592
}
601593
if node.unknownAttr?.isMissingAllTokens != false && node.label.isMissingAllTokens {
602594
addDiagnostic(node.statements, .allStatmentsInSwitchMustBeCoveredByCase, fixIts: [
603-
FixIt(message: InsertTokenFixIt(missingNodes: [node.label]), changes: [
604-
.makePresent(node: node.label, leadingTrivia: .newline)
605-
])
595+
FixIt(message: InsertTokenFixIt(missingNodes: [node.label]), changes: .makePresent(node.label, leadingTrivia: .newline))
606596
], handledNodes: [node.label.id])
607597
}
608598
return .visitChildren
@@ -628,9 +618,7 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
628618
}
629619
if node.expression.is(MissingExprSyntax.self) {
630620
addDiagnostic(node.expression, .expectedExpressionAfterTry, fixIts: [
631-
FixIt(message: InsertTokenFixIt(missingNodes: [Syntax(node.expression)]), changes: [
632-
.makePresent(node: node.expression)
633-
])
621+
FixIt(message: InsertTokenFixIt(missingNodes: [Syntax(node.expression)]), changes: .makePresent(node.expression))
634622
], handledNodes: [node.expression.id])
635623
}
636624
return .visitChildren
@@ -677,15 +665,13 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
677665
nextSibling.is(MissingExprSyntax.self) {
678666
addDiagnostic(node.colonMark, .missingColonAndExprInTernaryExpr, fixIts: [
679667
FixIt(message: InsertTokenFixIt(missingNodes: [Syntax(node.colonMark), Syntax(nextSibling)]), changes: [
680-
.makePresent(node: node.colonMark),
681-
.makePresent(node: nextSibling),
668+
.makePresent(node.colonMark),
669+
.makePresent(nextSibling),
682670
])
683671
], handledNodes: [node.colonMark.id, nextSibling.id])
684672
} else {
685673
addDiagnostic(node.colonMark, .missingColonInTernaryExpr, fixIts: [
686-
FixIt(message: InsertTokenFixIt(missingNodes: [Syntax(node.colonMark)]), changes: [
687-
.makePresent(node: node.colonMark),
688-
])
674+
FixIt(message: InsertTokenFixIt(missingNodes: [Syntax(node.colonMark)]), changes: .makePresent(node.colonMark))
689675
], handledNodes: [node.colonMark.id])
690676
}
691677
}

0 commit comments

Comments
 (0)