Skip to content

Commit 0c614e0

Browse files
committedMar 19, 2025
[Expr/AST] Add unresolvedApply component to handle method arguments.
1 parent 0af27a6 commit 0c614e0

File tree

8 files changed

+81
-14
lines changed

8 files changed

+81
-14
lines changed
 

‎include/swift/AST/Expr.h

+59-8
Original file line numberDiff line numberDiff line change
@@ -5889,6 +5889,7 @@ class KeyPathExpr : public Expr {
58895889
public:
58905890
enum class Kind : unsigned {
58915891
Invalid,
5892+
UnresolvedApply,
58925893
UnresolvedMember,
58935894
UnresolvedSubscript,
58945895
Member,
@@ -5914,13 +5915,15 @@ class KeyPathExpr : public Expr {
59145915

59155916
ArgumentList *ArgList;
59165917
const ProtocolConformanceRef *HashableConformancesData;
5918+
std::optional<FunctionRefInfo> ComponentFuncRefKind;
59175919

59185920
unsigned TupleIndex;
59195921
Kind KindValue;
59205922
Type ComponentType;
59215923
SourceLoc Loc;
59225924

5923-
// Private constructor for subscript component.
5925+
// Private constructor for unresolvedSubscript, subscript and
5926+
// unresolvedApply component.
59245927
explicit Component(DeclNameOrRef decl, ArgumentList *argList,
59255928
ArrayRef<ProtocolConformanceRef> indexHashables,
59265929
Kind kind, Type type, SourceLoc loc);
@@ -5933,6 +5936,14 @@ class KeyPathExpr : public Expr {
59335936
Decl = decl;
59345937
}
59355938

5939+
// Private constructor for an unresolvedMember or member kind.
5940+
explicit Component(DeclNameOrRef decl, Kind kind, Type type,
5941+
FunctionRefInfo funcRefKind, SourceLoc loc)
5942+
: Decl(decl), ComponentFuncRefKind(funcRefKind), KindValue(kind),
5943+
ComponentType(type), Loc(loc) {
5944+
assert(kind == Kind::Member || kind == Kind::UnresolvedMember);
5945+
}
5946+
59365947
// Private constructor for tuple element kind.
59375948
explicit Component(unsigned tupleIndex, Type elementType, SourceLoc loc)
59385949
: Component(Kind::TupleElement, elementType, loc) {
@@ -5941,15 +5952,25 @@ class KeyPathExpr : public Expr {
59415952

59425953
// Private constructor for basic components with no additional information.
59435954
explicit Component(Kind kind, Type type, SourceLoc loc)
5944-
: Decl(), KindValue(kind), ComponentType(type), Loc(loc) {}
5955+
: Decl(), ComponentFuncRefKind(std::nullopt), KindValue(kind),
5956+
ComponentType(type), Loc(loc) {}
59455957

59465958
public:
59475959
Component() : Component(Kind::Invalid, Type(), SourceLoc()) {}
59485960

5949-
/// Create an unresolved component for a member.
5961+
/// Create an unresolved component for an unresolved apply.
5962+
static Component forUnresolvedApply(ASTContext &ctx,
5963+
ArgumentList *argList) {
5964+
return Component({}, argList, {}, Kind::UnresolvedApply, Type(),
5965+
argList->getLParenLoc());
5966+
};
5967+
5968+
/// Create an unresolved component for an unresolved member.
59505969
static Component forUnresolvedMember(DeclNameRef UnresolvedName,
5951-
SourceLoc Loc) {
5952-
return Component(UnresolvedName, Kind::UnresolvedMember, Type(), Loc);
5970+
FunctionRefInfo funcRefKind,
5971+
SourceLoc loc) {
5972+
return Component(UnresolvedName, Kind::UnresolvedMember, Type(),
5973+
funcRefKind, loc);
59535974
}
59545975

59555976
/// Create an unresolved component for a subscript.
@@ -5967,9 +5988,8 @@ class KeyPathExpr : public Expr {
59675988
}
59685989

59695990
/// Create a component for a property.
5970-
static Component forProperty(ConcreteDeclRef property,
5971-
Type propertyType,
5972-
SourceLoc loc) {
5991+
static Component forMember(ConcreteDeclRef property, Type propertyType,
5992+
SourceLoc loc) {
59735993
return Component(property, Kind::Member, propertyType, loc);
59745994
}
59755995

@@ -6054,6 +6074,7 @@ class KeyPathExpr : public Expr {
60546074

60556075
case Kind::UnresolvedSubscript:
60566076
case Kind::UnresolvedMember:
6077+
case Kind::UnresolvedApply:
60576078
case Kind::Invalid:
60586079
case Kind::CodeCompletion:
60596080
return false;
@@ -6065,6 +6086,7 @@ class KeyPathExpr : public Expr {
60656086
switch (getKind()) {
60666087
case Kind::Subscript:
60676088
case Kind::UnresolvedSubscript:
6089+
case Kind::UnresolvedApply:
60686090
return ArgList;
60696091

60706092
case Kind::Invalid:
@@ -6099,6 +6121,7 @@ class KeyPathExpr : public Expr {
60996121
case Kind::OptionalChain:
61006122
case Kind::OptionalWrap:
61016123
case Kind::OptionalForce:
6124+
case Kind::UnresolvedApply:
61026125
case Kind::UnresolvedMember:
61036126
case Kind::Member:
61046127
case Kind::Identity:
@@ -6122,6 +6145,7 @@ class KeyPathExpr : public Expr {
61226145
case Kind::OptionalChain:
61236146
case Kind::OptionalWrap:
61246147
case Kind::OptionalForce:
6148+
case Kind::UnresolvedApply:
61256149
case Kind::Member:
61266150
case Kind::Identity:
61276151
case Kind::TupleElement:
@@ -6140,6 +6164,7 @@ class KeyPathExpr : public Expr {
61406164
case Kind::Invalid:
61416165
case Kind::UnresolvedMember:
61426166
case Kind::UnresolvedSubscript:
6167+
case Kind::UnresolvedApply:
61436168
case Kind::OptionalChain:
61446169
case Kind::OptionalWrap:
61456170
case Kind::OptionalForce:
@@ -6161,6 +6186,7 @@ class KeyPathExpr : public Expr {
61616186
case Kind::Invalid:
61626187
case Kind::UnresolvedMember:
61636188
case Kind::UnresolvedSubscript:
6189+
case Kind::UnresolvedApply:
61646190
case Kind::OptionalChain:
61656191
case Kind::OptionalWrap:
61666192
case Kind::OptionalForce:
@@ -6181,6 +6207,7 @@ class KeyPathExpr : public Expr {
61816207
case Kind::Invalid:
61826208
case Kind::UnresolvedMember:
61836209
case Kind::UnresolvedSubscript:
6210+
case Kind::UnresolvedApply:
61846211
case Kind::OptionalChain:
61856212
case Kind::OptionalWrap:
61866213
case Kind::OptionalForce:
@@ -6194,6 +6221,30 @@ class KeyPathExpr : public Expr {
61946221
llvm_unreachable("unhandled kind");
61956222
}
61966223

6224+
FunctionRefInfo getFunctionRefInfo() const {
6225+
switch (getKind()) {
6226+
case Kind::UnresolvedMember:
6227+
assert(ComponentFuncRefKind &&
6228+
"FunctionRefInfo should not be nullopt for UnresolvedMember");
6229+
return *ComponentFuncRefKind;
6230+
6231+
case Kind::Member:
6232+
case Kind::Subscript:
6233+
case Kind::Invalid:
6234+
case Kind::UnresolvedSubscript:
6235+
case Kind::OptionalChain:
6236+
case Kind::OptionalWrap:
6237+
case Kind::OptionalForce:
6238+
case Kind::Identity:
6239+
case Kind::TupleElement:
6240+
case Kind::DictionaryKey:
6241+
case Kind::CodeCompletion:
6242+
case Kind::UnresolvedApply:
6243+
llvm_unreachable("no function ref kind for this kind");
6244+
}
6245+
llvm_unreachable("unhandled kind");
6246+
}
6247+
61976248
Type getComponentType() const {
61986249
return ComponentType;
61996250
}

‎lib/AST/ASTDumper.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -4309,6 +4309,9 @@ class PrintExpr : public ExprVisitor<PrintExpr, void, Label>,
43094309
case KeyPathExpr::Component::Kind::CodeCompletion:
43104310
printHead("completion", ASTNodeColor, label);
43114311
break;
4312+
case KeyPathExpr::Component::Kind::UnresolvedApply:
4313+
printHead("unresolved_apply", ASTNodeColor, label);
4314+
break;
43124315
}
43134316
printTypeField(GetTypeOfKeyPathComponent(E, i), Label::always("type"));
43144317
if (auto *args = component.getArgs()) {

‎lib/AST/ASTPrinter.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -5118,6 +5118,11 @@ void PrintAST::printKeyPathComponents(KeyPathExpr *expr, ArrayRef<KeyPathExpr::C
51185118
case ComponentKind::CodeCompletion: {
51195119
break;
51205120
}
5121+
case ComponentKind::UnresolvedApply: {
5122+
auto args = component.getArgs();
5123+
printArgumentList(args, /*forSubscript*/ false);
5124+
break;
5125+
}
51215126
}
51225127
}
51235128
} else {

‎lib/AST/ASTWalker.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -1278,15 +1278,16 @@ class Traversal : public ASTVisitor<Traversal, Expr*, Stmt*,
12781278
auto component = origComponent;
12791279
switch (component.getKind()) {
12801280
case KeyPathExpr::Component::Kind::Subscript:
1281-
case KeyPathExpr::Component::Kind::UnresolvedSubscript: {
1281+
case KeyPathExpr::Component::Kind::UnresolvedSubscript:
1282+
case KeyPathExpr::Component::Kind::UnresolvedApply: {
12821283
if (auto *newArgs = doIt(component.getArgs())) {
12831284
component.setArgs(newArgs);
12841285
} else {
12851286
return nullptr;
12861287
}
12871288
break;
12881289
}
1289-
1290+
12901291
case KeyPathExpr::Component::Kind::OptionalChain:
12911292
case KeyPathExpr::Component::Kind::OptionalWrap:
12921293
case KeyPathExpr::Component::Kind::OptionalForce:

‎lib/AST/Expr.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -2556,7 +2556,8 @@ KeyPathExpr::Component::Component(
25562556
SourceLoc loc)
25572557
: Decl(decl), ArgList(argList), KindValue(kind), ComponentType(type),
25582558
Loc(loc) {
2559-
assert(kind == Kind::Subscript || kind == Kind::UnresolvedSubscript);
2559+
assert(kind == Kind::Subscript || kind == Kind::UnresolvedSubscript ||
2560+
kind == Kind::UnresolvedApply);
25602561
assert(argList);
25612562
assert(argList->size() == indexHashables.size() || indexHashables.empty());
25622563
HashableConformancesData =

‎lib/IDE/SourceEntityWalker.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,7 @@ ASTWalker::PreWalkResult<Expr *> SemaAnnotator::walkToExprPre(Expr *E) {
485485
case KeyPathExpr::Component::Kind::Invalid:
486486
case KeyPathExpr::Component::Kind::UnresolvedMember:
487487
case KeyPathExpr::Component::Kind::UnresolvedSubscript:
488+
case KeyPathExpr::Component::Kind::UnresolvedApply:
488489
case KeyPathExpr::Component::Kind::OptionalChain:
489490
case KeyPathExpr::Component::Kind::OptionalWrap:
490491
case KeyPathExpr::Component::Kind::OptionalForce:

‎lib/Parse/ParseExpr.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -851,7 +851,7 @@ ParserResult<Expr> Parser::parseExprKeyPathObjC() {
851851

852852
// Record the name we parsed.
853853
auto component = KeyPathExpr::Component::forUnresolvedMember(
854-
name, nameLoc.getBaseNameLoc());
854+
name, FunctionRefInfo::unappliedBaseName(), nameLoc.getBaseNameLoc());
855855
components.push_back(component);
856856

857857
// After the first component, we can start parsing keywords.

‎lib/Sema/PreCheckTarget.cpp

+7-2
Original file line numberDiff line numberDiff line change
@@ -2454,9 +2454,9 @@ void PreCheckTarget::resolveKeyPathExpr(KeyPathExpr *KPE) {
24542454
SE->getSelfLoc()));
24552455
expr = SE->getSubExpr();
24562456
} else if (auto UDE = dyn_cast<UnresolvedDotExpr>(expr)) {
2457-
// .foo
2457+
// .foo, .foo() or .foo(val value: Int)
24582458
components.push_back(KeyPathExpr::Component::forUnresolvedMember(
2459-
UDE->getName(), UDE->getLoc()));
2459+
UDE->getName(), UDE->getFunctionRefInfo(), UDE->getLoc()));
24602460

24612461
expr = UDE->getBase();
24622462
} else if (auto CCE = dyn_cast<CodeCompletionExpr>(expr)) {
@@ -2492,6 +2492,11 @@ void PreCheckTarget::resolveKeyPathExpr(KeyPathExpr *KPE) {
24922492
(void)outermostExpr;
24932493
assert(OEE == outermostExpr);
24942494
expr = OEE->getSubExpr();
2495+
} else if (auto AE = dyn_cast<ApplyExpr>(expr)) {
2496+
// foo(), foo(val value: Int) or unapplied foo
2497+
components.push_back(KeyPathExpr::Component::forUnresolvedApply(
2498+
getASTContext(), AE->getArgs()));
2499+
expr = AE->getFn();
24952500
} else {
24962501
if (emitErrors) {
24972502
// \(<expr>) may be an attempt to write a string interpolation outside

0 commit comments

Comments
 (0)