Skip to content

Commit 6e31834

Browse files
committed
Fix it to emit a single diagnostic when both open and close quote are missing
1 parent 4c0ad1b commit 6e31834

File tree

3 files changed

+20
-26
lines changed

3 files changed

+20
-26
lines changed

Sources/SwiftParserDiagnostics/MissingNodesError.swift

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,12 @@ public struct MissingNodesError: ParserError {
281281
return nil
282282
}
283283

284+
if missingNodes.count == 2,
285+
missingNodes.allSatisfy({ $0.as(TokenSyntax.self)?.tokenKind == .stringQuote })
286+
{
287+
return "in \(anchorTypeName)"
288+
}
289+
284290
let isFirstTokenStartMarker = missingNodes.first?.as(TokenSyntax.self)?.tokenKind.isStartMarker ?? false
285291
let isLastTokenEndMarker = missingNodes.last?.as(TokenSyntax.self)?.tokenKind.isEndMarker ?? false
286292
switch (isFirstTokenStartMarker, isLastTokenEndMarker) {
@@ -364,7 +370,10 @@ extension ParseDiagnosticsGenerator {
364370
missingNodes += [sibling]
365371
} else if sibling.isMissingAllTokens && sibling.hasTokens {
366372
missingNodes += [sibling]
367-
} else if sibling.kind.isSyntaxCollection && sibling.children(viewMode: .sourceAccurate).count == 0 {
373+
} else if sibling.kind.isSyntaxCollection
374+
&& (sibling.children(viewMode: .sourceAccurate).count == 0
375+
|| sibling.children(viewMode: .sourceAccurate).only?.kind == .stringSegment)
376+
{
368377
// Skip over any syntax collections without any elements while looking ahead for further missing nodes.
369378
} else {
370379
// Otherwise we have found a present node, so stop looking ahead.

Tests/SwiftParserTest/AttributeTests.swift

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -454,19 +454,14 @@ final class AttributeTests: XCTestCase {
454454

455455
assertParse(
456456
"""
457-
@_expose(Cxx, 1️⃣baz2️⃣) func foo() {}
457+
@_expose(Cxx, 1️⃣baz) func foo() {}
458458
""",
459459
diagnostics: [
460460
DiagnosticSpec(
461461
locationMarker: "1️⃣",
462-
message: #"expected '"' in string literal"#,
463-
fixIts: [#"insert '"'"#]
464-
),
465-
DiagnosticSpec(
466-
locationMarker: "2️⃣",
467-
message: #"expected '"' to end string literal"#,
468-
fixIts: [#"insert '"'"#]
469-
),
462+
message: #"expected '""' in string literal"#,
463+
fixIts: [#"insert '""'"#]
464+
)
470465
],
471466
fixedSource: """
472467
@_expose(Cxx, "baz") func foo() {}
@@ -543,20 +538,15 @@ final class AttributeTests: XCTestCase {
543538

544539
assertParse(
545540
"""
546-
@_unavailableFromAsync(message: 1️⃣abc2️⃣)
541+
@_unavailableFromAsync(message: 1️⃣abc)
547542
func foo() {}
548543
""",
549544
diagnostics: [
550545
DiagnosticSpec(
551546
locationMarker: "1️⃣",
552-
message: #"expected '"' in string literal"#,
553-
fixIts: [#"insert '"'"#]
554-
),
555-
DiagnosticSpec(
556-
locationMarker: "2️⃣",
557-
message: #"expected '"' to end string literal"#,
558-
fixIts: [#"insert '"'"#]
559-
),
547+
message: #"expected '""' in string literal"#,
548+
fixIts: [#"insert '""'"#]
549+
)
560550
],
561551
fixedSource: """
562552
@_unavailableFromAsync(message: "abc")

Tests/SwiftParserTest/translated/OriginalDefinedInAttrTests.swift

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -86,13 +86,8 @@ final class OriginalDefinedInAttrTests: XCTestCase {
8686
),
8787
DiagnosticSpec(
8888
locationMarker: "1️⃣",
89-
message: #"expected '"' in string literal"#,
90-
fixIts: [#"insert '"'"#]
91-
),
92-
DiagnosticSpec(
93-
locationMarker: "2️⃣",
94-
message: #"expected '"' to end string literal"#,
95-
fixIts: [#"insert '"'"#]
89+
message: #"expected '""' in string literal"#,
90+
fixIts: [#"insert '""'"#]
9691
),
9792
DiagnosticSpec(
9893
locationMarker: "2️⃣",

0 commit comments

Comments
 (0)