Skip to content

Commit 1298f71

Browse files
authored
Merge pull request swiftlang#33922 from slavapestov/sil-parser-overhaul
SILParser: Fix for removal of parse-time name lookup
2 parents 7257627 + dbdbbff commit 1298f71

File tree

12 files changed

+399
-282
lines changed

12 files changed

+399
-282
lines changed

include/swift/AST/Decl.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1332,6 +1332,12 @@ class GenericParamList final :
13321332

13331333
void print(raw_ostream &OS) const;
13341334
SWIFT_DEBUG_DUMP;
1335+
1336+
bool walk(ASTWalker &walker);
1337+
1338+
/// Finds a generic parameter declaration by name. This should only
1339+
/// be used from the SIL parser.
1340+
GenericTypeParamDecl *lookUpGenericParam(Identifier name) const;
13351341
};
13361342

13371343
/// A trailing where clause.

include/swift/AST/TypeCheckRequests.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2519,7 +2519,8 @@ class HasImplementationOnlyImportsRequest
25192519

25202520
class ResolveTypeRequest
25212521
: public SimpleRequest<ResolveTypeRequest,
2522-
Type(const TypeResolution *, TypeRepr *),
2522+
Type(const TypeResolution *, TypeRepr *,
2523+
GenericParamList *),
25232524
RequestFlags::Uncached> {
25242525
public:
25252526
using SimpleRequest::SimpleRequest;
@@ -2533,7 +2534,7 @@ class ResolveTypeRequest
25332534

25342535
// Evaluation.
25352536
Type evaluate(Evaluator &evaluator, const TypeResolution *resolution,
2536-
TypeRepr *repr) const;
2537+
TypeRepr *repr, GenericParamList *silParams) const;
25372538
};
25382539

25392540
void simple_display(llvm::raw_ostream &out, const TypeResolution *resolution);

include/swift/AST/TypeCheckerTypeIDZone.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ SWIFT_REQUEST(TypeChecker, ResolveTypeEraserTypeRequest,
245245
Type(ProtocolDecl *, TypeEraserAttr *),
246246
SeparatelyCached, NoLocationInfo)
247247
SWIFT_REQUEST(TypeChecker, ResolveTypeRequest,
248-
Type (const TypeResolution *, TypeRepr *),
248+
Type (const TypeResolution *, TypeRepr *, GenericParamList *),
249249
Uncached, NoLocationInfo)
250250
SWIFT_REQUEST(TypeChecker, SPIGroupsRequest,
251251
llvm::ArrayRef<Identifier>(Decl *),

include/swift/Subsystems.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,9 @@ namespace swift {
149149
///
150150
/// \returns A well-formed type on success, or an \c ErrorType.
151151
Type performTypeResolution(TypeRepr *TyR, ASTContext &Ctx, bool isSILMode,
152-
bool isSILType, GenericEnvironment *GenericEnv,
152+
bool isSILType,
153+
GenericEnvironment *GenericEnv,
154+
GenericParamList *GenericParams,
153155
DeclContext *DC, bool ProduceDiagnostics = true);
154156

155157
/// Expose TypeChecker's handling of GenericParamList to SIL parsing.

lib/AST/ASTWalker.cpp

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ class Traversal : public ASTVisitor<Traversal, Expr*, Stmt*,
130130
// Must check this first in case extensions have not been bound yet
131131
if (Walker.shouldWalkIntoGenericParams()) {
132132
if (auto *params = GC->getParsedGenericParams()) {
133-
visitGenericParamList(params);
133+
doIt(params);
134134
}
135135
return true;
136136
}
@@ -252,7 +252,7 @@ class Traversal : public ASTVisitor<Traversal, Expr*, Stmt*,
252252

253253
bool visitOpaqueTypeDecl(OpaqueTypeDecl *OTD) {
254254
if (Walker.shouldWalkIntoGenericParams() && OTD->getGenericParams()) {
255-
if (visitGenericParamList(OTD->getGenericParams()))
255+
if (doIt(OTD->getGenericParams()))
256256
return true;
257257
}
258258
return false;
@@ -439,22 +439,6 @@ class Traversal : public ASTVisitor<Traversal, Expr*, Stmt*,
439439
return false;
440440
}
441441

442-
bool visitGenericParamList(GenericParamList *GPL) {
443-
// Visit generic params
444-
for (auto &P : GPL->getParams()) {
445-
if (doIt(P))
446-
return true;
447-
}
448-
449-
// Visit param conformance
450-
for (auto Req : GPL->getRequirements()) {
451-
if (doIt(Req))
452-
return true;
453-
}
454-
455-
return false;
456-
}
457-
458442
//===--------------------------------------------------------------------===//
459443
// Exprs
460444
//===--------------------------------------------------------------------===//
@@ -1342,12 +1326,28 @@ class Traversal : public ASTVisitor<Traversal, Expr*, Stmt*,
13421326
return true;
13431327
break;
13441328
case RequirementReprKind::LayoutConstraint:
1345-
if (doIt(Req.getFirstTypeRepr()))
1329+
if (doIt(Req.getSubjectRepr()))
13461330
return true;
13471331
break;
13481332
}
13491333
return false;
13501334
}
1335+
1336+
bool doIt(GenericParamList *GPL) {
1337+
// Visit generic params
1338+
for (auto &P : GPL->getParams()) {
1339+
if (doIt(P))
1340+
return true;
1341+
}
1342+
1343+
// Visit param conformance
1344+
for (auto Req : GPL->getRequirements()) {
1345+
if (doIt(Req))
1346+
return true;
1347+
}
1348+
1349+
return false;
1350+
}
13511351
};
13521352

13531353
} // end anonymous namespace
@@ -1877,3 +1877,7 @@ StmtConditionElement *StmtConditionElement::walk(ASTWalker &walker) {
18771877
bool Decl::walk(ASTWalker &walker) {
18781878
return Traversal(walker).doIt(this);
18791879
}
1880+
1881+
bool GenericParamList::walk(ASTWalker &walker) {
1882+
return Traversal(walker).doIt(this);
1883+
}

lib/AST/Decl.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -960,6 +960,21 @@ void GenericParamList::setDeclContext(DeclContext *dc) {
960960
param->setDeclContext(dc);
961961
}
962962

963+
GenericTypeParamDecl *GenericParamList::lookUpGenericParam(
964+
Identifier name) const {
965+
for (const auto *innerParams = this;
966+
innerParams != nullptr;
967+
innerParams = innerParams->getOuterParameters()) {
968+
for (auto *paramDecl : *innerParams) {
969+
if (name == paramDecl->getName()) {
970+
return const_cast<GenericTypeParamDecl *>(paramDecl);
971+
}
972+
}
973+
}
974+
975+
return nullptr;
976+
}
977+
963978
TrailingWhereClause::TrailingWhereClause(
964979
SourceLoc whereLoc,
965980
ArrayRef<RequirementRepr> requirements)

lib/IDE/CodeCompletion.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1617,7 +1617,9 @@ class CodeCompletionCallbacksImpl : public CodeCompletionCallbacks {
16171617
const auto ty = swift::performTypeResolution(
16181618
ParsedTypeLoc.getTypeRepr(), P.Context,
16191619
/*isSILMode=*/false,
1620-
/*isSILType=*/false, CurDeclContext->getGenericEnvironmentOfContext(),
1620+
/*isSILType=*/false,
1621+
CurDeclContext->getGenericEnvironmentOfContext(),
1622+
/*GenericParams=*/nullptr,
16211623
CurDeclContext,
16221624
/*ProduceDiagnostics=*/false);
16231625
ParsedTypeLoc.setType(ty);

lib/IDE/ExprContextAnalysis.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ void swift::ide::collectPossibleReturnTypesFromContext(
336336
const auto type = swift::performTypeResolution(
337337
CE->getExplicitResultTypeRepr(), DC->getASTContext(),
338338
/*isSILMode=*/false, /*isSILType=*/false,
339-
DC->getGenericEnvironmentOfContext(),
339+
DC->getGenericEnvironmentOfContext(), /*GenericParams=*/nullptr,
340340
const_cast<DeclContext *>(DC), /*diagnostics=*/false);
341341

342342
if (!type->hasError()) {

0 commit comments

Comments
 (0)