Skip to content

[ASTGen] Implement Patterns #70387

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Dec 12, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions include/swift/AST/ASTBridging.h
Original file line number Diff line number Diff line change
Expand Up @@ -1111,12 +1111,54 @@ void BridgedTypeRepr_dump(BridgedTypeRepr type);
// MARK: Patterns
//===----------------------------------------------------------------------===//

SWIFT_NAME("BridgedAnyPattern.createParsed(_:loc:)")
BridgedAnyPattern BridgedAnyPattern_createParsed(BridgedASTContext cContext,
BridgedSourceLoc cLoc);

SWIFT_NAME("BridgedBindingPattern.createParsed(_:keywordLoc:isLet:subPattern:)")
BridgedBindingPattern
BridgedBindingPattern_createParsed(BridgedASTContext cContext,
BridgedSourceLoc cKeywordLoc, bool isLet,
BridgedPattern cSubPattern);

SWIFT_NAME("BridgedExprPattern.createParsed(_:expr:)")
BridgedExprPattern
BridgedExprPattern_createParsed(BridgedDeclContext cDeclContext,
BridgedExpr cExpr);

SWIFT_NAME("BridgedIsPattern.createParsed(_:isLoc:typeExpr:)")
BridgedIsPattern BridgedIsPattern_createParsed(BridgedASTContext cContext,
BridgedSourceLoc cIsLoc,
BridgedTypeExpr cTypeExpr);

SWIFT_NAME("BridgedNamedPattern.createParsed(_:declContext:name:loc:)")
BridgedNamedPattern
BridgedNamedPattern_createParsed(BridgedASTContext astContext,
BridgedDeclContext declContext,
BridgedIdentifier name, BridgedSourceLoc cLoc);

SWIFT_NAME(
"BridgedParenPattern.createParsed(_:lParenLoc:subPattern:rParenLoc:)")
BridgedParenPattern BridgedParenPattern_createParsed(
BridgedASTContext cContext, BridgedSourceLoc cLParenLoc,
BridgedPattern cSubPattern, BridgedSourceLoc cRParenLoc);

struct BridgedTuplePatternElt {
BridgedIdentifier Label;
BridgedSourceLoc LabelLoc;
BridgedPattern ThePattern;
Comment on lines +1147 to +1149
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lowercase?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We are inconsistent. Let's clean them up later.

};

SWIFT_NAME("BridgedTuplePattern.createParsed(_:lParenLoc:elements:rParenLoc:)")
BridgedTuplePattern BridgedTuplePattern_createParsed(
BridgedASTContext cContext, BridgedSourceLoc cLParenLoc,
BridgedArrayRef cElements, BridgedSourceLoc cRParenLoc);

SWIFT_NAME("BridgedTypedPattern.createParsed(_:pattern:type:)")
BridgedTypedPattern BridgedTypedPattern_createParsed(BridgedASTContext cContext,
BridgedPattern cPattern,
BridgedTypeRepr cType);

//===----------------------------------------------------------------------===//
// MARK: Misc
//===----------------------------------------------------------------------===//
Expand Down
62 changes: 62 additions & 0 deletions lib/AST/ASTBridging.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1538,6 +1538,37 @@ BridgedExistentialTypeRepr_createParsed(BridgedASTContext cContext,
// MARK: Patterns
//===----------------------------------------------------------------------===//

BridgedAnyPattern BridgedAnyPattern_createParsed(BridgedASTContext cContext,
BridgedSourceLoc cLoc) {
return new (cContext.unbridged()) AnyPattern(cLoc.unbridged());
}

BridgedBindingPattern
BridgedBindingPattern_createParsed(BridgedASTContext cContext,
BridgedSourceLoc cKeywordLoc, bool isLet,
BridgedPattern cSubPattern) {
VarDecl::Introducer introducer =
isLet ? VarDecl::Introducer::Let : VarDecl::Introducer::Var;
return new (cContext.unbridged()) BindingPattern(
cKeywordLoc.unbridged(), introducer, cSubPattern.unbridged());
}

BridgedExprPattern
BridgedExprPattern_createParsed(BridgedDeclContext cDeclContext,
BridgedExpr cExpr) {
auto *DC = cDeclContext.unbridged();
auto &context = DC->getASTContext();
return ExprPattern::createParsed(context, cExpr.unbridged(), DC);
}

BridgedIsPattern BridgedIsPattern_createParsed(BridgedASTContext cContext,
BridgedSourceLoc cIsLoc,
BridgedTypeExpr cTypeExpr) {
return new (cContext.unbridged())
IsPattern(cIsLoc.unbridged(), cTypeExpr.unbridged(),
/*subPattern=*/nullptr, CheckedCastKind::Unresolved);
}

BridgedNamedPattern
BridgedNamedPattern_createParsed(BridgedASTContext cContext,
BridgedDeclContext cDeclContext,
Expand All @@ -1554,6 +1585,37 @@ BridgedNamedPattern_createParsed(BridgedASTContext cContext,
return pattern;
}

BridgedParenPattern BridgedParenPattern_createParsed(
BridgedASTContext cContext, BridgedSourceLoc cLParenLoc,
BridgedPattern cSubPattern, BridgedSourceLoc cRParenLoc) {
return new (cContext.unbridged()) ParenPattern(
cLParenLoc.unbridged(), cSubPattern.unbridged(), cRParenLoc.unbridged());
}

BridgedTuplePattern BridgedTuplePattern_createParsed(
BridgedASTContext cContext, BridgedSourceLoc cLParenLoc,
BridgedArrayRef cElements, BridgedSourceLoc cRParenLoc) {
ASTContext &context = cContext.unbridged();
llvm::SmallVector<TuplePatternElt, 4> elements;
elements.reserve(cElements.Length);
llvm::transform(cElements.unbridged<BridgedTuplePatternElt>(),
elements.begin(), [](const BridgedTuplePatternElt &elt) {
return TuplePatternElt(elt.Label.unbridged(),
elt.LabelLoc.unbridged(),
elt.ThePattern.unbridged());
});

return TuplePattern::create(context, cLParenLoc.unbridged(), elements,
cRParenLoc.unbridged());
}

BridgedTypedPattern BridgedTypedPattern_createParsed(BridgedASTContext cContext,
BridgedPattern cPattern,
BridgedTypeRepr cType) {
return new (cContext.unbridged())
TypedPattern(cPattern.unbridged(), cType.unbridged());
}

//===----------------------------------------------------------------------===//
// MARK: Misc
//===----------------------------------------------------------------------===//
Expand Down
85 changes: 72 additions & 13 deletions lib/ASTGen/Sources/ASTGen/Patterns.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,23 +18,28 @@ import SwiftDiagnostics
extension ASTGenVisitor {
func generate(pattern node: PatternSyntax) -> BridgedPattern {
switch node.as(PatternSyntaxEnum.self) {
case .expressionPattern:
break
case .expressionPattern(let node):
return self.generate(expressionPattern: node).asPattern
case .identifierPattern(let node):
return self.generate(identifierPattern: node).asPattern
case .isTypePattern:
break
case .missingPattern:
break
case .tuplePattern:
break
case .valueBindingPattern:
break
case .wildcardPattern:
break
case .isTypePattern(let node):
return self.generate(isTypePattern: node).asPattern
case .missingPattern(let node):
return self.generate(missingPattern: node)
case .tuplePattern(let node):
return self.generate(tuplePattern: node)
case .valueBindingPattern(let node):
return self.generate(valueBindingPattern: node).asPattern
case .wildcardPattern(let node):
return self.generate(wildcardPattern: node).asPattern
}
}

preconditionFailure("unimplemented")
func generate(expressionPattern node: ExpressionPatternSyntax) -> BridgedExprPattern {
return .createParsed(
self.declContext,
expr: self.generate(expr: node.expression)
)
}

func generate(identifierPattern node: IdentifierPatternSyntax) -> BridgedNamedPattern {
Expand All @@ -45,6 +50,60 @@ extension ASTGenVisitor {
loc: nameLoc
)
}

func generate(isTypePattern node: IsTypePatternSyntax) -> BridgedIsPattern {
return .createParsed(
self.ctx,
isLoc: self.generateSourceLoc(node.isKeyword),
typeExpr: .createParsed(
self.ctx,
type: self.generate(type: node.type)
)
)
}

func generate(missingPattern node: MissingPatternSyntax) -> BridgedPattern {
fatalError("unimplemented")
}

func generate(tuplePattern node: TuplePatternSyntax) -> BridgedPattern {
if node.elements.count == 1, let firstElement = node.elements.first, firstElement.label == nil {
return BridgedParenPattern.createParsed(
self.ctx,
lParenLoc: self.generateSourceLoc(node.leftParen),
subPattern: self.generate(pattern: firstElement.pattern),
rParenLoc: self.generateSourceLoc(node.rightParen)
).asPattern
}
return BridgedTuplePattern.createParsed(
self.ctx,
lParenLoc: self.generateSourceLoc(node.leftParen),
elements: node.elements.lazy.map {
BridgedTuplePatternElt(
Label: self.generateIdentifier($0.label),
LabelLoc: self.generateSourceLoc($0.label),
ThePattern: self.generate(pattern: $0.pattern)
)
}.bridgedArray(in: self),
rParenLoc: self.generateSourceLoc(node.rightParen)
).asPattern
}

func generate(valueBindingPattern node: ValueBindingPatternSyntax) -> BridgedBindingPattern {
return .createParsed(
self.ctx,
keywordLoc: self.generateSourceLoc(node.bindingSpecifier),
isLet: node.bindingSpecifier.keywordKind == .let,
subPattern: self.generate(pattern: node.pattern)
)
}

func generate(wildcardPattern node: WildcardPatternSyntax) -> BridgedAnyPattern {
return .createParsed(
self.ctx,
loc: self.generateSourceLoc(node.wildcard)
)
}
}