Skip to content

Commit 28cfe4b

Browse files
committed
[ASTGen] Generate type annotations for bindings
Handle the wrapping of TypedPatterns when a type annotation is specified, and the implicit wrapping behavior for previously written NamedPatterns.
1 parent e1d35d9 commit 28cfe4b

File tree

4 files changed

+69
-1
lines changed

4 files changed

+69
-1
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1181,6 +1181,10 @@ BridgedTypedPattern BridgedTypedPattern_createParsed(BridgedASTContext cContext,
11811181
BridgedPattern cPattern,
11821182
BridgedTypeRepr cType);
11831183

1184+
SWIFT_NAME("BridgedTypedPattern.createPropagated(_:pattern:type:)")
1185+
BridgedTypedPattern BridgedTypedPattern_createPropagated(
1186+
BridgedASTContext cContext, BridgedPattern cPattern, BridgedTypeRepr cType);
1187+
11841188
//===----------------------------------------------------------------------===//
11851189
// MARK: Misc
11861190
//===----------------------------------------------------------------------===//

lib/AST/ASTBridging.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1648,6 +1648,14 @@ BridgedTypedPattern BridgedTypedPattern_createParsed(BridgedASTContext cContext,
16481648
TypedPattern(cPattern.unbridged(), cType.unbridged());
16491649
}
16501650

1651+
BridgedTypedPattern
1652+
BridgedTypedPattern_createPropagated(BridgedASTContext cContext,
1653+
BridgedPattern cPattern,
1654+
BridgedTypeRepr cType) {
1655+
return TypedPattern::createPropagated(
1656+
cContext.unbridged(), cPattern.unbridged(), cType.unbridged());
1657+
}
1658+
16511659
//===----------------------------------------------------------------------===//
16521660
// MARK: Misc
16531661
//===----------------------------------------------------------------------===//

lib/ASTGen/Sources/ASTGen/Decls.swift

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,46 @@ extension ASTGenVisitor {
313313
)
314314
}
315315

316+
private func generateBindingEntries(for node: VariableDeclSyntax) -> BridgedArrayRef {
317+
var propagatedType: BridgedTypeRepr?
318+
var entries: [BridgedPatternBindingEntry] = []
319+
320+
// Generate the bindings in reverse, keeping track of the TypeRepr to
321+
// propagate to earlier patterns if needed.
322+
for binding in node.bindings.reversed() {
323+
var entry = self.generate(patternBinding: binding)
324+
325+
// We can potentially propagate a type annotation back if we don't have an initializer, and are a bare NamedPattern.
326+
let canPropagateType = binding.initializer == nil && binding.pattern.is(IdentifierPatternSyntax.self)
327+
if !canPropagateType {
328+
propagatedType = nil
329+
}
330+
331+
// If we have a type annotation, wrap the pattern in it.
332+
if let typeAnnotation = binding.typeAnnotation {
333+
let typeRepr = self.generate(type: typeAnnotation.type)
334+
if canPropagateType {
335+
propagatedType = typeRepr
336+
}
337+
entry.pattern =
338+
BridgedTypedPattern.createParsed(
339+
self.ctx,
340+
pattern: entry.pattern,
341+
type: typeRepr
342+
).asPattern
343+
} else if let propagatedType = propagatedType {
344+
entry.pattern =
345+
BridgedTypedPattern.createPropagated(
346+
self.ctx,
347+
pattern: entry.pattern,
348+
type: propagatedType
349+
).asPattern
350+
}
351+
entries.append(entry)
352+
}
353+
return entries.reversed().bridgedArray(in: self)
354+
}
355+
316356
func generate(variableDecl node: VariableDeclSyntax) -> BridgedPatternBindingDecl {
317357
let isStatic = false // TODO: compute this
318358
let isLet = node.bindingSpecifier.keywordKind == .let
@@ -321,7 +361,7 @@ extension ASTGenVisitor {
321361
self.ctx,
322362
declContext: self.declContext,
323363
bindingKeywordLoc: self.generateSourceLoc(node.bindingSpecifier),
324-
entries: node.bindings.lazy.map(self.generate).bridgedArray(in: self),
364+
entries: self.generateBindingEntries(for: node),
325365
isStatic: isStatic,
326366
isLet: isLet
327367
)

test/ASTGen/verify-parse.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,22 @@ func test11() {
102102
var binding1 = 0, binding2 = ""
103103
}
104104

105+
func testVars() {
106+
var a = 0
107+
var b: Int = 0
108+
var c, d: Int
109+
var e, f: Int, g, h, i: String
110+
let j: Int = 0, k: String = ""
111+
}
112+
113+
struct TestVars {
114+
var a = 0
115+
var b: Int = 0
116+
var c, d: Int
117+
var e, f: Int, g, h, i: String
118+
let j: Int = 0, k: String = ""
119+
}
120+
105121
protocol Proto1 {}
106122
protocol Proto2 {}
107123

0 commit comments

Comments
 (0)