Skip to content

Commit b6137dd

Browse files
authored
Merge pull request #70387 from rintaro/astgen-pattern
[ASTGen] Implement Patterns
2 parents d038fa7 + eb46b6f commit b6137dd

File tree

3 files changed

+176
-13
lines changed

3 files changed

+176
-13
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1111,12 +1111,54 @@ void BridgedTypeRepr_dump(BridgedTypeRepr type);
11111111
// MARK: Patterns
11121112
//===----------------------------------------------------------------------===//
11131113

1114+
SWIFT_NAME("BridgedAnyPattern.createParsed(_:loc:)")
1115+
BridgedAnyPattern BridgedAnyPattern_createParsed(BridgedASTContext cContext,
1116+
BridgedSourceLoc cLoc);
1117+
1118+
SWIFT_NAME("BridgedBindingPattern.createParsed(_:keywordLoc:isLet:subPattern:)")
1119+
BridgedBindingPattern
1120+
BridgedBindingPattern_createParsed(BridgedASTContext cContext,
1121+
BridgedSourceLoc cKeywordLoc, bool isLet,
1122+
BridgedPattern cSubPattern);
1123+
1124+
SWIFT_NAME("BridgedExprPattern.createParsed(_:expr:)")
1125+
BridgedExprPattern
1126+
BridgedExprPattern_createParsed(BridgedDeclContext cDeclContext,
1127+
BridgedExpr cExpr);
1128+
1129+
SWIFT_NAME("BridgedIsPattern.createParsed(_:isLoc:typeExpr:)")
1130+
BridgedIsPattern BridgedIsPattern_createParsed(BridgedASTContext cContext,
1131+
BridgedSourceLoc cIsLoc,
1132+
BridgedTypeExpr cTypeExpr);
1133+
11141134
SWIFT_NAME("BridgedNamedPattern.createParsed(_:declContext:name:loc:)")
11151135
BridgedNamedPattern
11161136
BridgedNamedPattern_createParsed(BridgedASTContext astContext,
11171137
BridgedDeclContext declContext,
11181138
BridgedIdentifier name, BridgedSourceLoc cLoc);
11191139

1140+
SWIFT_NAME(
1141+
"BridgedParenPattern.createParsed(_:lParenLoc:subPattern:rParenLoc:)")
1142+
BridgedParenPattern BridgedParenPattern_createParsed(
1143+
BridgedASTContext cContext, BridgedSourceLoc cLParenLoc,
1144+
BridgedPattern cSubPattern, BridgedSourceLoc cRParenLoc);
1145+
1146+
struct BridgedTuplePatternElt {
1147+
BridgedIdentifier Label;
1148+
BridgedSourceLoc LabelLoc;
1149+
BridgedPattern ThePattern;
1150+
};
1151+
1152+
SWIFT_NAME("BridgedTuplePattern.createParsed(_:lParenLoc:elements:rParenLoc:)")
1153+
BridgedTuplePattern BridgedTuplePattern_createParsed(
1154+
BridgedASTContext cContext, BridgedSourceLoc cLParenLoc,
1155+
BridgedArrayRef cElements, BridgedSourceLoc cRParenLoc);
1156+
1157+
SWIFT_NAME("BridgedTypedPattern.createParsed(_:pattern:type:)")
1158+
BridgedTypedPattern BridgedTypedPattern_createParsed(BridgedASTContext cContext,
1159+
BridgedPattern cPattern,
1160+
BridgedTypeRepr cType);
1161+
11201162
//===----------------------------------------------------------------------===//
11211163
// MARK: Misc
11221164
//===----------------------------------------------------------------------===//

lib/AST/ASTBridging.cpp

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1538,6 +1538,37 @@ BridgedExistentialTypeRepr_createParsed(BridgedASTContext cContext,
15381538
// MARK: Patterns
15391539
//===----------------------------------------------------------------------===//
15401540

1541+
BridgedAnyPattern BridgedAnyPattern_createParsed(BridgedASTContext cContext,
1542+
BridgedSourceLoc cLoc) {
1543+
return new (cContext.unbridged()) AnyPattern(cLoc.unbridged());
1544+
}
1545+
1546+
BridgedBindingPattern
1547+
BridgedBindingPattern_createParsed(BridgedASTContext cContext,
1548+
BridgedSourceLoc cKeywordLoc, bool isLet,
1549+
BridgedPattern cSubPattern) {
1550+
VarDecl::Introducer introducer =
1551+
isLet ? VarDecl::Introducer::Let : VarDecl::Introducer::Var;
1552+
return new (cContext.unbridged()) BindingPattern(
1553+
cKeywordLoc.unbridged(), introducer, cSubPattern.unbridged());
1554+
}
1555+
1556+
BridgedExprPattern
1557+
BridgedExprPattern_createParsed(BridgedDeclContext cDeclContext,
1558+
BridgedExpr cExpr) {
1559+
auto *DC = cDeclContext.unbridged();
1560+
auto &context = DC->getASTContext();
1561+
return ExprPattern::createParsed(context, cExpr.unbridged(), DC);
1562+
}
1563+
1564+
BridgedIsPattern BridgedIsPattern_createParsed(BridgedASTContext cContext,
1565+
BridgedSourceLoc cIsLoc,
1566+
BridgedTypeExpr cTypeExpr) {
1567+
return new (cContext.unbridged())
1568+
IsPattern(cIsLoc.unbridged(), cTypeExpr.unbridged(),
1569+
/*subPattern=*/nullptr, CheckedCastKind::Unresolved);
1570+
}
1571+
15411572
BridgedNamedPattern
15421573
BridgedNamedPattern_createParsed(BridgedASTContext cContext,
15431574
BridgedDeclContext cDeclContext,
@@ -1554,6 +1585,37 @@ BridgedNamedPattern_createParsed(BridgedASTContext cContext,
15541585
return pattern;
15551586
}
15561587

1588+
BridgedParenPattern BridgedParenPattern_createParsed(
1589+
BridgedASTContext cContext, BridgedSourceLoc cLParenLoc,
1590+
BridgedPattern cSubPattern, BridgedSourceLoc cRParenLoc) {
1591+
return new (cContext.unbridged()) ParenPattern(
1592+
cLParenLoc.unbridged(), cSubPattern.unbridged(), cRParenLoc.unbridged());
1593+
}
1594+
1595+
BridgedTuplePattern BridgedTuplePattern_createParsed(
1596+
BridgedASTContext cContext, BridgedSourceLoc cLParenLoc,
1597+
BridgedArrayRef cElements, BridgedSourceLoc cRParenLoc) {
1598+
ASTContext &context = cContext.unbridged();
1599+
llvm::SmallVector<TuplePatternElt, 4> elements;
1600+
elements.reserve(cElements.Length);
1601+
llvm::transform(cElements.unbridged<BridgedTuplePatternElt>(),
1602+
elements.begin(), [](const BridgedTuplePatternElt &elt) {
1603+
return TuplePatternElt(elt.Label.unbridged(),
1604+
elt.LabelLoc.unbridged(),
1605+
elt.ThePattern.unbridged());
1606+
});
1607+
1608+
return TuplePattern::create(context, cLParenLoc.unbridged(), elements,
1609+
cRParenLoc.unbridged());
1610+
}
1611+
1612+
BridgedTypedPattern BridgedTypedPattern_createParsed(BridgedASTContext cContext,
1613+
BridgedPattern cPattern,
1614+
BridgedTypeRepr cType) {
1615+
return new (cContext.unbridged())
1616+
TypedPattern(cPattern.unbridged(), cType.unbridged());
1617+
}
1618+
15571619
//===----------------------------------------------------------------------===//
15581620
// MARK: Misc
15591621
//===----------------------------------------------------------------------===//

lib/ASTGen/Sources/ASTGen/Patterns.swift

Lines changed: 72 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,23 +18,28 @@ import SwiftDiagnostics
1818
extension ASTGenVisitor {
1919
func generate(pattern node: PatternSyntax) -> BridgedPattern {
2020
switch node.as(PatternSyntaxEnum.self) {
21-
case .expressionPattern:
22-
break
21+
case .expressionPattern(let node):
22+
return self.generate(expressionPattern: node).asPattern
2323
case .identifierPattern(let node):
2424
return self.generate(identifierPattern: node).asPattern
25-
case .isTypePattern:
26-
break
27-
case .missingPattern:
28-
break
29-
case .tuplePattern:
30-
break
31-
case .valueBindingPattern:
32-
break
33-
case .wildcardPattern:
34-
break
25+
case .isTypePattern(let node):
26+
return self.generate(isTypePattern: node).asPattern
27+
case .missingPattern(let node):
28+
return self.generate(missingPattern: node)
29+
case .tuplePattern(let node):
30+
return self.generate(tuplePattern: node)
31+
case .valueBindingPattern(let node):
32+
return self.generate(valueBindingPattern: node).asPattern
33+
case .wildcardPattern(let node):
34+
return self.generate(wildcardPattern: node).asPattern
3535
}
36+
}
3637

37-
preconditionFailure("unimplemented")
38+
func generate(expressionPattern node: ExpressionPatternSyntax) -> BridgedExprPattern {
39+
return .createParsed(
40+
self.declContext,
41+
expr: self.generate(expr: node.expression)
42+
)
3843
}
3944

4045
func generate(identifierPattern node: IdentifierPatternSyntax) -> BridgedNamedPattern {
@@ -45,6 +50,60 @@ extension ASTGenVisitor {
4550
loc: nameLoc
4651
)
4752
}
53+
54+
func generate(isTypePattern node: IsTypePatternSyntax) -> BridgedIsPattern {
55+
return .createParsed(
56+
self.ctx,
57+
isLoc: self.generateSourceLoc(node.isKeyword),
58+
typeExpr: .createParsed(
59+
self.ctx,
60+
type: self.generate(type: node.type)
61+
)
62+
)
63+
}
64+
65+
func generate(missingPattern node: MissingPatternSyntax) -> BridgedPattern {
66+
fatalError("unimplemented")
67+
}
68+
69+
func generate(tuplePattern node: TuplePatternSyntax) -> BridgedPattern {
70+
if node.elements.count == 1, let firstElement = node.elements.first, firstElement.label == nil {
71+
return BridgedParenPattern.createParsed(
72+
self.ctx,
73+
lParenLoc: self.generateSourceLoc(node.leftParen),
74+
subPattern: self.generate(pattern: firstElement.pattern),
75+
rParenLoc: self.generateSourceLoc(node.rightParen)
76+
).asPattern
77+
}
78+
return BridgedTuplePattern.createParsed(
79+
self.ctx,
80+
lParenLoc: self.generateSourceLoc(node.leftParen),
81+
elements: node.elements.lazy.map {
82+
BridgedTuplePatternElt(
83+
Label: self.generateIdentifier($0.label),
84+
LabelLoc: self.generateSourceLoc($0.label),
85+
ThePattern: self.generate(pattern: $0.pattern)
86+
)
87+
}.bridgedArray(in: self),
88+
rParenLoc: self.generateSourceLoc(node.rightParen)
89+
).asPattern
90+
}
91+
92+
func generate(valueBindingPattern node: ValueBindingPatternSyntax) -> BridgedBindingPattern {
93+
return .createParsed(
94+
self.ctx,
95+
keywordLoc: self.generateSourceLoc(node.bindingSpecifier),
96+
isLet: node.bindingSpecifier.keywordKind == .let,
97+
subPattern: self.generate(pattern: node.pattern)
98+
)
99+
}
100+
101+
func generate(wildcardPattern node: WildcardPatternSyntax) -> BridgedAnyPattern {
102+
return .createParsed(
103+
self.ctx,
104+
loc: self.generateSourceLoc(node.wildcard)
105+
)
106+
}
48107
}
49108

50109

0 commit comments

Comments
 (0)