Skip to content

Commit a7171c0

Browse files
committed
[AST] Add new ASTWalker actions to opaque type repr walker
1 parent 410fa12 commit a7171c0

File tree

2 files changed

+20
-60
lines changed

2 files changed

+20
-60
lines changed

lib/AST/NameLookup.cpp

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2806,41 +2806,49 @@ CollectedOpaqueReprs swift::collectOpaqueReturnTypeReprs(TypeRepr *r, ASTContext
28062806
public:
28072807
explicit Walker(CollectedOpaqueReprs &reprs, ASTContext &ctx, DeclContext *d) : Reprs(reprs), Ctx(ctx), dc(d) {}
28082808

2809-
bool walkToTypeReprPre(TypeRepr *repr) override {
2810-
if (auto existential = dyn_cast<ExistentialTypeRepr>(repr)) {
2811-
auto generic = dyn_cast<GenericIdentTypeRepr>(existential->getConstraint());
2812-
if(generic)
2813-
Reprs.push_back(existential);
2814-
auto meta = dyn_cast<MetatypeTypeRepr>(existential->getConstraint());
2815-
return meta || generic? true : false;
2816-
}
2809+
PreWalkAction walkToTypeReprPre(TypeRepr *repr) override {
2810+
2811+
// Don't allow variadic opaque parameter or return types.
2812+
if (isa<PackExpansionTypeRepr>(repr))
2813+
return Action::SkipChildren();
28172814

28182815
if (auto opaqueRepr = dyn_cast<OpaqueReturnTypeRepr>(repr)) {
28192816
Reprs.push_back(opaqueRepr);
28202817
if (Ctx.LangOpts.hasFeature(Feature::ImplicitSome))
2821-
return false;
2818+
return Action::SkipChildren();
28222819
}
28232820

28242821
if (Ctx.LangOpts.hasFeature(Feature::ImplicitSome)) {
2822+
2823+
if (auto existential = dyn_cast<ExistentialTypeRepr>(repr)) {
2824+
auto generic = dyn_cast<GenericIdentTypeRepr>(existential->getConstraint());
2825+
if(generic)
2826+
Reprs.push_back(existential);
2827+
auto meta = dyn_cast<MetatypeTypeRepr>(existential->getConstraint());
2828+
Action::VisitChildrenIf(meta || generic);
2829+
}
2830+
28252831
if (auto compositionRepr = dyn_cast<CompositionTypeRepr>(repr)) {
28262832
if (!compositionRepr->isTypeReprAny())
28272833
Reprs.push_back(compositionRepr);
2828-
return false;
2834+
return Action::SkipChildren();
28292835
} else if (auto generic = dyn_cast<GenericIdentTypeRepr>(repr)) {
28302836
if (!Reprs.empty()){
28312837
if(isa<ExistentialTypeRepr>(Reprs.front())){
28322838
Reprs.clear();
2833-
return true;
2839+
Action::Continue();
28342840
}
28352841
}
28362842
Reprs.push_back(generic);
28372843
} else if (auto identRepr = dyn_cast<IdentTypeRepr>(repr)) {
28382844
if (identRepr->isProtocol(dc))
28392845
Reprs.push_back(identRepr);
28402846
}
2847+
28412848
}
2842-
return true;
2849+
return Action::Continue();
28432850
}
2851+
28442852
};
28452853

28462854
CollectedOpaqueReprs reprs;

lib/AST/TypeRepr.cpp

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
#include "llvm/Support/ErrorHandling.h"
3030
#include "llvm/Support/raw_ostream.h"
3131
using namespace swift;
32-
//using namespace swift::namelookup;
3332

3433
#define TYPEREPR(Id, _) \
3534
static_assert(IsTriviallyDestructible<Id##TypeRepr>::value, \
@@ -115,53 +114,6 @@ TypeRepr *TypeRepr::getWithoutParens() const {
115114
return repr;
116115
}
117116

118-
CollectedOpaqueReprs TypeRepr::collectOpaqueReturnTypeReprs() {
119-
class Walker : public ASTWalker {
120-
CollectedOpaqueReprs &Reprs;
121-
122-
public:
123-
explicit Walker(CollectedOpaqueReprs &reprs) : Reprs(reprs) {}
124-
125-
PreWalkAction walkToTypeReprPre(TypeRepr *repr) override {
126-
// Don't allow variadic opaque parameter or return types.
127-
if (isa<PackExpansionTypeRepr>(repr))
128-
return Action::SkipChildren();
129-
130-
if (auto opaqueRepr = dyn_cast<OpaqueReturnTypeRepr>(repr))
131-
Reprs.push_back(opaqueRepr);
132-
return Action::Continue();
133-
}
134-
};
135-
136-
CollectedOpaqueReprs reprs;
137-
walk(Walker(reprs));
138-
return reprs;
139-
}
140-
141-
CollectedOpaqueReprs TypeRepr::collectTypeReprs() {
142-
class Walker : public ASTWalker {
143-
CollectedOpaqueReprs &Reprs;
144-
145-
public:
146-
explicit Walker(CollectedOpaqueReprs &reprs) : Reprs(reprs) {}
147-
148-
bool walkToTypeReprPre(TypeRepr *repr) override {
149-
if (auto opaqueRepr = dyn_cast<OpaqueReturnTypeRepr>(repr)){
150-
Reprs.push_back(opaqueRepr);
151-
} else if (auto compositionRepr = dyn_cast<CompositionTypeRepr>(repr)){
152-
Reprs.push_back(compositionRepr);
153-
} else if (auto identRepr = dyn_cast<IdentTypeRepr>(repr)){
154-
Reprs.push_back(identRepr);
155-
}
156-
return true;
157-
}
158-
};
159-
160-
CollectedOpaqueReprs reprs;
161-
walk(Walker(reprs));
162-
return reprs;
163-
}
164-
165117
SourceLoc TypeRepr::findUncheckedAttrLoc() const {
166118
auto typeRepr = this;
167119
while (auto attrTypeRepr = dyn_cast<AttributedTypeRepr>(typeRepr)) {

0 commit comments

Comments
 (0)