17
17
#include " swift/AST/NameLookup.h"
18
18
#include " swift/AST/ASTContext.h"
19
19
#include " swift/AST/ASTVisitor.h"
20
+ #include " swift/AST/ASTWalker.h"
20
21
#include " swift/AST/ClangModuleLoader.h"
21
22
#include " swift/AST/DebuggerClient.h"
22
23
#include " swift/AST/ExistentialLayout.h"
@@ -2796,11 +2797,53 @@ createExtensionGenericParams(ASTContext &ctx,
2796
2797
return toParams;
2797
2798
}
2798
2799
2800
+ CollectedOpaqueReprs swift::collectOpaqueReturnTypeReprs (TypeRepr *r) {
2801
+ class Walker : public ASTWalker {
2802
+ CollectedOpaqueReprs &Reprs;
2803
+
2804
+ public:
2805
+ explicit Walker (CollectedOpaqueReprs &reprs) : Reprs(reprs) {}
2806
+
2807
+ bool walkToTypeReprPre (TypeRepr *repr) override {
2808
+ if (auto opaqueRepr = dyn_cast<OpaqueReturnTypeRepr>(repr))
2809
+ Reprs.push_back (opaqueRepr);
2810
+ return true ;
2811
+ }
2812
+ };
2813
+
2814
+ CollectedOpaqueReprs reprs;
2815
+ r->walk (Walker (reprs));
2816
+ return reprs;
2817
+ }
2818
+
2819
+ CollectedOpaqueReprs swift::collectTypeReprs (TypeRepr *r) {
2820
+ class Walker : public ASTWalker {
2821
+ CollectedOpaqueReprs &Reprs;
2822
+
2823
+ public:
2824
+ explicit Walker (CollectedOpaqueReprs &reprs) : Reprs(reprs) {}
2825
+
2826
+ bool walkToTypeReprPre (TypeRepr *repr) override {
2827
+ if (auto opaqueRepr = dyn_cast<OpaqueReturnTypeRepr>(repr)){
2828
+ Reprs.push_back (opaqueRepr);
2829
+ } else if (auto compositionRepr = dyn_cast<CompositionTypeRepr>(repr)){
2830
+ Reprs.push_back (compositionRepr);
2831
+ } else if (auto identRepr = dyn_cast<IdentTypeRepr>(repr)){
2832
+ Reprs.push_back (identRepr);
2833
+ }
2834
+ return true ;
2835
+ }
2836
+ };
2837
+
2838
+ CollectedOpaqueReprs reprs;
2839
+ r->walk (Walker (reprs));
2840
+ return reprs;
2841
+ }
2842
+
2799
2843
// / If there are opaque parameters in the given declaration, create the
2800
2844
// / generic parameters associated with them.
2801
2845
static SmallVector<GenericTypeParamDecl *, 2 >
2802
- createOpaqueParameterGenericParams (
2803
- GenericContext *genericContext, GenericParamList *parsedGenericParams) {
2846
+ createOpaqueParameterGenericParams (Evaluator &evaluator,GenericContext *genericContext, GenericParamList *parsedGenericParams) {
2804
2847
ASTContext &ctx = genericContext->getASTContext ();
2805
2848
2806
2849
auto value = dyn_cast_or_null<ValueDecl>(genericContext->getAsDecl ());
@@ -2828,14 +2871,14 @@ createOpaqueParameterGenericParams(
2828
2871
// Plain protocols should imply 'some' with experimetal feature
2829
2872
CollectedOpaqueReprs typeReprs;
2830
2873
if (ctx.LangOpts .hasFeature (Feature::ImplicitSome)) {
2831
- typeReprs = typeRepr-> collectTypeReprs ();
2832
- } else { typeReprs = typeRepr-> collectOpaqueReturnTypeReprs (); }
2874
+ typeReprs = collectTypeReprs (typeRepr );
2875
+ } else { typeReprs = collectOpaqueReturnTypeReprs (typeRepr ); }
2833
2876
2834
2877
for (auto repr : typeReprs) {
2878
+
2835
2879
if (isa<IdentTypeRepr>(repr)){
2836
- DirectlyReferencedTypeDecls d = directReferencesForTypeRepr (ctx.evaluator , ctx, repr, dc, true );
2837
- if (!declsAreProtocols (d))
2838
- continue ;
2880
+ if (!isProtocol (evaluator,repr, ctx, dc))
2881
+ continue ;
2839
2882
}
2840
2883
// Allocate a new generic parameter to represent this opaque type.
2841
2884
auto gp = GenericTypeParamDecl::create (
@@ -2859,6 +2902,14 @@ createOpaqueParameterGenericParams(
2859
2902
return implicitGenericParams;
2860
2903
}
2861
2904
2905
+
2906
+ bool swift::isProtocol ( Evaluator &evaluator, TypeRepr *r, ASTContext &ctx, DeclContext *dc) {
2907
+ DirectlyReferencedTypeDecls d = directReferencesForTypeRepr (evaluator, ctx, r, dc);
2908
+ if (declsAreProtocols (d)){
2909
+ return true ;
2910
+ } else { return false ; }
2911
+ }
2912
+
2862
2913
GenericParamList *
2863
2914
GenericParamListRequest::evaluate (Evaluator &evaluator, GenericContext *value) const {
2864
2915
if (auto *tupleDecl = dyn_cast<BuiltinTupleDecl>(value)) {
@@ -2929,7 +2980,7 @@ GenericParamListRequest::evaluate(Evaluator &evaluator, GenericContext *value) c
2929
2980
// Create implicit generic parameters due to opaque parameters, if we need
2930
2981
// them.
2931
2982
auto implicitGenericParams =
2932
- createOpaqueParameterGenericParams (value, parsedGenericParams);
2983
+ createOpaqueParameterGenericParams (evaluator, value, parsedGenericParams);
2933
2984
if (implicitGenericParams.empty ())
2934
2985
return parsedGenericParams;
2935
2986
0 commit comments