Skip to content

Commit 607d122

Browse files
committed
[ASTGen] Handle several missing syntax
* MissingExpr: Generate ErrorExpr with previous token location * MissingType: Generate ErrorTypeRepr with previous token location * MissingPattern: Generate implicit '_' pattern for recovery
1 parent ddd5b12 commit 607d122

File tree

6 files changed

+36
-4
lines changed

6 files changed

+36
-4
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2790,6 +2790,9 @@ SWIFT_NAME("BridgedAnyPattern.createParsed(_:loc:)")
27902790
BridgedAnyPattern BridgedAnyPattern_createParsed(BridgedASTContext cContext,
27912791
BridgedSourceLoc cLoc);
27922792

2793+
SWIFT_NAME("BridgedAnyPattern.createImplicit(_:)")
2794+
BridgedAnyPattern BridgedAnyPattern_createImplicit(BridgedASTContext cContext);
2795+
27932796
SWIFT_NAME("BridgedBindingPattern.createParsed(_:keywordLoc:isLet:subPattern:)")
27942797
BridgedBindingPattern
27952798
BridgedBindingPattern_createParsed(BridgedASTContext cContext,

lib/AST/Bridging/PatternBridging.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ BridgedAnyPattern BridgedAnyPattern_createParsed(BridgedASTContext cContext,
4242
return new (cContext.unbridged()) AnyPattern(cLoc.unbridged());
4343
}
4444

45+
BridgedAnyPattern BridgedAnyPattern_createImplicit(BridgedASTContext cContext) {
46+
return AnyPattern::createImplicit(cContext.unbridged());
47+
}
48+
4549
BridgedBindingPattern
4650
BridgedBindingPattern_createParsed(BridgedASTContext cContext,
4751
BridgedSourceLoc cKeywordLoc, bool isLet,

lib/ASTGen/Sources/ASTGen/Exprs.swift

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ extension ASTGenVisitor {
7474
return self.generate(macroExpansionExpr: node)
7575
case .memberAccessExpr(let node):
7676
return self.generate(memberAccessExpr: node)
77-
case .missingExpr:
78-
fatalError("unimplemented")
77+
case .missingExpr(let node):
78+
return self.generate(missingExpr: node)
7979
case .nilLiteralExpr(let node):
8080
return self.generate(nilLiteralExpr: node).asExpr
8181
case .optionalChainingExpr(let node):
@@ -931,6 +931,14 @@ extension ASTGenVisitor {
931931
}
932932
}
933933

934+
func generate(missingExpr node: MissingExprSyntax) -> BridgedExpr {
935+
let loc = self.generateSourceLoc(node.previousToken(viewMode: .sourceAccurate))
936+
return BridgedErrorExpr.create(
937+
self.ctx,
938+
loc: BridgedSourceRange(start: loc, end: loc)
939+
).asExpr
940+
}
941+
934942
func generate(genericSpecializationExpr node: GenericSpecializationExprSyntax) -> BridgedUnresolvedSpecializeExpr {
935943
let base = self.generate(expr: node.expression)
936944
let generics = node.genericArgumentClause

lib/ASTGen/Sources/ASTGen/Patterns.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ extension ASTGenVisitor {
7777
}
7878

7979
func generate(missingPattern node: MissingPatternSyntax) -> BridgedPattern {
80-
fatalError("unimplemented")
80+
// Recover by creating implicit '_' pattern.
81+
return BridgedAnyPattern.createImplicit(self.ctx).asPattern
8182
}
8283

8384
func generate(tuplePattern node: TuplePatternSyntax) -> BridgedPattern {

lib/ASTGen/Sources/ASTGen/Types.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,9 +176,10 @@ extension ASTGenVisitor {
176176
}
177177

178178
func generate(missingType node: MissingTypeSyntax) -> BridgedTypeRepr {
179+
let loc = self.generateSourceLoc(node.previousToken(viewMode: .sourceAccurate))
179180
return BridgedErrorTypeRepr.create(
180181
self.ctx,
181-
range: self.generateSourceRange(node)
182+
range: BridgedSourceRange(start: loc, end: loc)
182183
).asTypeRepr
183184
}
184185

test/ASTGen/diagnostics.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,18 @@ class TestDiagnosticInNominalTy {
5151
#if FLAG_NOT_ENABLED
5252
#error("error in inactive") // no diagnostis
5353
#endif
54+
55+
func misisngExprTest() {
56+
func fn(x: Int, y: Int) {}
57+
fn(x: 1, y:) // expected-error {{expected value in function call}}
58+
// expected-note@-1 {{insert value}} {{14-14= <#expression#>}}
59+
}
60+
61+
func misisngTypeTest() {
62+
func fn() -> {} // expected-error {{expected return type in function signature}}
63+
// expected-note@-1 {{insert return type}} {{16-16=<#type#> }}
64+
}
65+
func misisngPatternTest(arr: [Int]) {
66+
for {} // expected-error {{expected pattern, 'in', and expression in 'for' statement}}
67+
// expected-note@-1 {{insert pattern, 'in', and expression}} {{7-7=<#pattern#> }} {{7-7=in }} {{7-7=<#expression#> }}
68+
}

0 commit comments

Comments
 (0)