Skip to content

Commit 8b026f2

Browse files
committed
[ASTGen] Implement DotSelfExpr generation
1 parent 28e6369 commit 8b026f2

File tree

4 files changed

+43
-9
lines changed

4 files changed

+43
-9
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -661,6 +661,12 @@ BridgedCallExpr BridgedCallExpr_createParsed(BridgedASTContext cContext,
661661
BridgedExpr fn,
662662
BridgedTupleExpr args);
663663

664+
SWIFT_NAME("BridgedDotSelfExpr.createParsed(_:subExpr:dotLoc:selfLoc:)")
665+
BridgedDotSelfExpr BridgedDotSelfExpr_createParsed(BridgedASTContext cContext,
666+
BridgedExpr cSubExpr,
667+
BridgedSourceLoc cDotLoc,
668+
BridgedSourceLoc cSelfLoc);
669+
664670
SWIFT_NAME("BridgedClosureExpr.createParsed(_:declContext:body:)")
665671
BridgedClosureExpr
666672
BridgedClosureExpr_createParsed(BridgedASTContext cContext,

lib/AST/ASTBridging.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -925,6 +925,15 @@ BridgedForcedCheckedCastExpr BridgedForcedCheckedCastExpr_createParsed(
925925
cType.unbridged());
926926
}
927927

928+
BridgedDotSelfExpr BridgedDotSelfExpr_createParsed(BridgedASTContext cContext,
929+
BridgedExpr cSubExpr,
930+
BridgedSourceLoc cDotLoc,
931+
BridgedSourceLoc cSelfLoc) {
932+
933+
return new (cContext.unbridged()) DotSelfExpr(
934+
cSubExpr.unbridged(), cDotLoc.unbridged(), cSelfLoc.unbridged());
935+
}
936+
928937
BridgedIsExpr BridgedIsExpr_createParsed(BridgedASTContext cContext,
929938
BridgedSourceLoc cIsLoc,
930939
BridgedTypeRepr cType) {

lib/ASTGen/Sources/ASTGen/Exprs.swift

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -348,20 +348,33 @@ extension ASTGenVisitor {
348348
}
349349

350350
func generate(memberAccessExpr node: MemberAccessExprSyntax) -> BridgedExpr {
351+
let dotLoc = self.generateSourceLoc(node.period)
351352
let nameAndLoc = createDeclNameRef(declReferenceExpr: node.declName)
352353

353354
if let base = node.base {
354-
return BridgedUnresolvedDotExpr.createParsed(
355-
self.ctx,
356-
base: self.generate(expr: base),
357-
dotLoc: self.generateSourceLoc(node.period),
358-
name: nameAndLoc.name,
359-
nameLoc: nameAndLoc.loc
360-
).asExpr
355+
if node.declName.baseName.keywordKind == .`self` {
356+
// TODO: Diagnose if there's arguments
357+
assert(node.declName.argumentNames == nil)
358+
359+
return BridgedDotSelfExpr.createParsed(
360+
self.ctx,
361+
subExpr: self.generate(expr: base),
362+
dotLoc: dotLoc,
363+
selfLoc: self.generateSourceLoc(node.declName)
364+
).asExpr
365+
} else {
366+
return BridgedUnresolvedDotExpr.createParsed(
367+
self.ctx,
368+
base: self.generate(expr: base),
369+
dotLoc: dotLoc,
370+
name: nameAndLoc.name,
371+
nameLoc: nameAndLoc.loc
372+
).asExpr
373+
}
361374
} else {
362375
return BridgedUnresolvedMemberExpr.createParsed(
363376
self.ctx,
364-
dotLoc: self.generateSourceLoc(node.period),
377+
dotLoc: dotLoc,
365378
name: nameAndLoc.name,
366379
nameLoc: nameAndLoc.loc
367380
).asExpr

test/ASTGen/verify-parse.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,9 +207,15 @@ precedencegroup Precedence2 {
207207
struct TestStruct {
208208
func method(arg: Int, _ c: Int) {}
209209

210+
enum Ty {
211+
case `self`
212+
case `Self`
213+
}
214+
210215
func test() {
211216
_ = method(arg:_:)
212-
_ = self.method(arg:_:)
217+
_ = self.method(arg:_:).self
218+
_ = Ty.`Self` == Ty.`self`
213219
}
214220

215221
// FIXME: Compute 'static' location

0 commit comments

Comments
 (0)