Skip to content

Commit 8619d09

Browse files
committed
Add diagnostic for @\nAttribute typo (WIP)
1 parent db8ec26 commit 8619d09

2 files changed

Lines changed: 43 additions & 23 deletions

File tree

Sources/SwiftParser/Attributes.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ extension Parser {
169169
var (unexpectedBeforeAtSign, atSign) = self.expect(.atSign)
170170
let attributeName = self.parseType()
171171

172-
if !atSign.trailingTriviaPieces.isEmpty {
172+
if atSign.trailingTriviaByteLength != 0 {
173173
unexpectedBeforeAtSign = RawUnexpectedNodesSyntax(
174174
combining: unexpectedBeforeAtSign, atSign,
175175
arena: self.arena
@@ -181,11 +181,12 @@ extension Parser {
181181
presence: .missing,
182182
arena: self.arena
183183
)
184-
} else if let attributeTokenView = attributeName.raw.tokenView, attributeTokenView.leadingRawTriviaPieces.isEmpty {
184+
} else if attributeName.raw.leadingTriviaByteLength != 0 {
185185
unexpectedBeforeAtSign = RawUnexpectedNodesSyntax(
186186
combining: unexpectedBeforeAtSign, attributeName.as(RawTokenSyntax.self),
187187
arena: self.arena
188188
)
189+
// TODO: Synthesize fixed attributeName (RawTypeSyntax)
189190
}
190191

191192
let shouldParseArgument: Bool

Sources/SwiftParserDiagnostics/ParseDiagnosticsGenerator.swift

Lines changed: 40 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -459,28 +459,47 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
459459
}
460460
if node.hasError,
461461
let unexpectedBeforeAtSignTokens = node.unexpectedBeforeAtSignToken,
462-
let unexpectedBeforeAtSign = unexpectedBeforeAtSignTokens.lastToken(viewMode: .sourceAccurate),
463-
unexpectedBeforeAtSign.tokenKind == .atSign,
464-
!unexpectedBeforeAtSign.trailingTrivia.isEmpty {
462+
let unexpectedBeforeAtSign = unexpectedBeforeAtSignTokens.lastToken(viewMode: .sourceAccurate) {
465463
let tokensToDiscard = unexpectedBeforeAtSignTokens.compactMap { $0.as(TokenSyntax.self) }
466-
addDiagnostic(
467-
unexpectedBeforeAtSign,
468-
StaticParserError.invalidWhitespaceBetweenAttributeAtSignAndIdentifier,
469-
fixIts: [
470-
FixIt(
471-
message: StaticParserFixIt.removeExtraneousWhitespace,
472-
changes: [
473-
.makeMissing(tokensToDiscard, transferTrivia: false),
474-
.makePresent(node.atSignToken),
475-
]
476-
)
477-
],
478-
handledNodes: [
479-
node.id,
480-
unexpectedBeforeAtSignTokens.id,
481-
node.atSignToken.id
482-
]
483-
)
464+
if unexpectedBeforeAtSign.tokenKind == .atSign, !unexpectedBeforeAtSign.trailingTrivia.isEmpty {
465+
addDiagnostic(
466+
unexpectedBeforeAtSign,
467+
StaticParserError.invalidWhitespaceBetweenAttributeAtSignAndIdentifier,
468+
fixIts: [
469+
FixIt(
470+
message: StaticParserFixIt.removeExtraneousWhitespace,
471+
changes: [
472+
.makeMissing(tokensToDiscard, transferTrivia: false),
473+
.makePresent(node.atSignToken),
474+
]
475+
)
476+
],
477+
handledNodes: [
478+
node.id,
479+
unexpectedBeforeAtSignTokens.id,
480+
node.atSignToken.id
481+
]
482+
)
483+
} else if unexpectedBeforeAtSign.tokenKind == .identifier(unexpectedBeforeAtSign.text) {
484+
addDiagnostic(
485+
unexpectedBeforeAtSign,
486+
StaticParserError.invalidWhitespaceBetweenAttributeAtSignAndIdentifier,
487+
fixIts: [
488+
FixIt(
489+
message: StaticParserFixIt.removeExtraneousWhitespace,
490+
changes: [
491+
.makeMissing(tokensToDiscard, transferTrivia: false),
492+
.makePresent(node.attributeName), // TODO: Provide synthesized attributeName as a replacement.
493+
]
494+
)
495+
],
496+
handledNodes: [
497+
node.id,
498+
unexpectedBeforeAtSignTokens.id,
499+
node.attributeName.id
500+
]
501+
)
502+
}
484503
}
485504
return .visitChildren
486505
}

0 commit comments

Comments
 (0)