@@ -178,7 +178,7 @@ static unsigned getGenericRequirementKind(TypeResolutionOptions options) {
178
178
179
179
Type TypeResolution::resolveDependentMemberType (Type baseTy, DeclContext *DC,
180
180
SourceRange baseRange,
181
- IdentTypeRepr *repr) const {
181
+ MemberTypeRepr *repr) const {
182
182
// FIXME(ModQual): Reject qualified names immediately; they cannot be
183
183
// dependent member types.
184
184
Identifier refIdentifier = repr->getNameRef ().getBaseIdentifier ();
@@ -675,7 +675,7 @@ void swift::diagnoseInvalidGenericArguments(SourceLoc loc,
675
675
unsigned argCount,
676
676
unsigned paramCount,
677
677
bool hasParameterPack,
678
- GenericIdentTypeRepr *generic ) {
678
+ SourceRange angleBrackets ) {
679
679
auto &ctx = decl->getASTContext ();
680
680
auto &diags = ctx.Diags ;
681
681
@@ -687,27 +687,27 @@ void swift::diagnoseInvalidGenericArguments(SourceLoc loc,
687
687
auto diag = diags
688
688
.diagnose (loc, diag::too_few_generic_arguments, decl->getBaseIdentifier (),
689
689
argCount, paramCount);
690
- if (generic )
691
- diag.highlight (generic-> getAngleBrackets () );
690
+ if (angleBrackets. isValid () )
691
+ diag.highlight (angleBrackets );
692
692
} else {
693
693
auto diag = diags
694
694
.diagnose (loc, diag::too_many_generic_arguments, decl->getBaseIdentifier (),
695
695
argCount, paramCount);
696
- if (generic )
697
- diag.highlight (generic-> getAngleBrackets () );
696
+ if (angleBrackets. isValid () )
697
+ diag.highlight (angleBrackets );
698
698
}
699
699
} else {
700
700
if (argCount < paramCount - 1 ) {
701
701
auto diag = diags
702
702
.diagnose (loc, diag::too_few_generic_arguments_pack, decl->getBaseIdentifier (),
703
703
argCount, paramCount - 1 );
704
- if (generic )
705
- diag.highlight (generic-> getAngleBrackets () );
704
+ if (angleBrackets. isValid () )
705
+ diag.highlight (angleBrackets );
706
706
} else {
707
707
auto diag = diags
708
708
.diagnose (loc, diag::generic_argument_pack_mismatch, decl->getBaseIdentifier ());
709
- if (generic )
710
- diag.highlight (generic-> getAngleBrackets () );
709
+ if (angleBrackets. isValid () )
710
+ diag.highlight (angleBrackets );
711
711
}
712
712
}
713
713
@@ -727,22 +727,20 @@ void swift::diagnoseInvalidGenericArguments(SourceLoc loc,
727
727
// / \param type The generic type to which to apply arguments.
728
728
// / \param resolution The type resolution to perform.
729
729
// / \param silContext Used to look up generic parameters in SIL mode.
730
- // / \param repr The arguments to apply with the angle bracket range for
731
- // / diagnostics.
732
- // /
730
+ // / \param repr The syntactic representation of \p type, with a possible
731
+ // / generic argument list to apply.
733
732
// / \returns A BoundGenericType bound to the given arguments, or null on
734
733
// / error.
735
734
// /
736
735
// / \see TypeResolution::applyUnboundGenericArguments
737
736
static Type applyGenericArguments (Type type, TypeResolution resolution,
738
737
SILTypeResolutionContext *silContext,
739
- IdentTypeRepr *repr) {
738
+ DeclRefTypeRepr *repr) {
740
739
auto options = resolution.getOptions ();
741
740
auto dc = resolution.getDeclContext ();
742
741
auto loc = repr->getNameLoc ().getBaseNameLoc ();
743
742
744
- auto *generic = dyn_cast<GenericIdentTypeRepr>(repr);
745
- if (!generic) {
743
+ if (!repr->hasGenericArgList ()) {
746
744
if (auto *const unboundTy = type->getAs <UnboundGenericType>()) {
747
745
if (!options.is (TypeResolverContext::TypeAliasDecl) &&
748
746
!options.is (TypeResolverContext::ExtensionBinding)) {
@@ -786,14 +784,14 @@ static Type applyGenericArguments(Type type, TypeResolution resolution,
786
784
}
787
785
788
786
if (type->hasError ()) {
789
- generic ->setInvalid ();
787
+ repr ->setInvalid ();
790
788
return type;
791
789
}
792
790
793
791
auto &ctx = dc->getASTContext ();
794
792
auto &diags = ctx.Diags ;
795
793
796
- auto genericArgs = generic ->getGenericArgs ();
794
+ const auto genericArgs = repr ->getGenericArgs ();
797
795
798
796
// Parameterized protocol types have their own code path.
799
797
if (auto *protoType = type->getAs <ProtocolType>()) {
@@ -803,7 +801,7 @@ static Type applyGenericArguments(Type type, TypeResolution resolution,
803
801
if (assocTypes.empty ()) {
804
802
diags.diagnose (loc, diag::protocol_does_not_have_primary_assoc_type,
805
803
protoType)
806
- .fixItRemove (generic ->getAngleBrackets ());
804
+ .fixItRemove (repr ->getAngleBrackets ());
807
805
if (!protoDecl->isImplicit ()) {
808
806
diags.diagnose (protoDecl, diag::decl_declared_here, protoDecl);
809
807
}
@@ -862,12 +860,12 @@ static Type applyGenericArguments(Type type, TypeResolution resolution,
862
860
if (!type->is <ModuleType>()) {
863
861
// When turning a SourceRange into CharSourceRange the closing angle
864
862
// brackets on nested generics are lexed as one token.
865
- SourceRange angles = generic ->getAngleBrackets ();
863
+ SourceRange angles = repr ->getAngleBrackets ();
866
864
diag.fixItRemoveChars (angles.Start ,
867
865
angles.End .getAdvancedLocOrInvalid (1 ));
868
866
}
869
867
870
- generic ->setInvalid ();
868
+ repr ->setInvalid ();
871
869
}
872
870
return ErrorType::get (ctx);
873
871
}
@@ -920,7 +918,7 @@ static Type applyGenericArguments(Type type, TypeResolution resolution,
920
918
if (!options.contains (TypeResolutionFlags::SilenceErrors)) {
921
919
diagnoseInvalidGenericArguments (
922
920
loc, decl, genericArgs.size (), genericParams->size (),
923
- /* hasParameterPack=*/ false , generic );
921
+ /* hasParameterPack=*/ false , repr-> getAngleBrackets () );
924
922
}
925
923
return ErrorType::get (ctx);
926
924
}
@@ -942,7 +940,7 @@ static Type applyGenericArguments(Type type, TypeResolution resolution,
942
940
if (!options.contains (TypeResolutionFlags::SilenceErrors)) {
943
941
diagnoseInvalidGenericArguments (
944
942
loc, decl, genericArgs.size (), genericParams->size (),
945
- /* hasParameterPack=*/ true , generic );
943
+ /* hasParameterPack=*/ true , repr-> getAngleBrackets () );
946
944
}
947
945
return ErrorType::get (ctx);
948
946
}
@@ -987,17 +985,17 @@ static Type applyGenericArguments(Type type, TypeResolution resolution,
987
985
if (isPointerToVoid (dc->getASTContext (), result, isMutablePointer)) {
988
986
if (isMutablePointer)
989
987
diags.diagnose (loc, diag::use_of_void_pointer, " Mutable" ).
990
- fixItReplace (generic ->getSourceRange (), " UnsafeMutableRawPointer" );
988
+ fixItReplace (repr ->getSourceRange (), " UnsafeMutableRawPointer" );
991
989
else
992
990
diags.diagnose (loc, diag::use_of_void_pointer, " " ).
993
- fixItReplace (generic ->getSourceRange (), " UnsafeRawPointer" );
991
+ fixItReplace (repr ->getSourceRange (), " UnsafeRawPointer" );
994
992
}
995
993
996
994
if (auto clangDecl = decl->getClangDecl ()) {
997
995
if (auto classTemplateDecl =
998
996
dyn_cast<clang::ClassTemplateDecl>(clangDecl)) {
999
997
SmallVector<Type, 2 > typesOfGenericArgs;
1000
- for (auto typeRepr : generic-> getGenericArgs () ) {
998
+ for (auto typeRepr : genericArgs ) {
1001
999
typesOfGenericArgs.push_back (resolution.resolveType (typeRepr));
1002
1000
}
1003
1001
@@ -1284,7 +1282,7 @@ static Type resolveTypeDecl(TypeDecl *typeDecl, DeclContext *foundDC,
1284
1282
// Resolve the type declaration to a specific type. How this occurs
1285
1283
// depends on the current context and where the type was found.
1286
1284
Type type = resolution.resolveTypeInContext (typeDecl, foundDC,
1287
- isa<GenericIdentTypeRepr>(repr ));
1285
+ repr-> hasGenericArgList ( ));
1288
1286
1289
1287
if (type->hasError () && foundDC &&
1290
1288
(isa<AssociatedTypeDecl>(typeDecl) || isa<TypeAliasDecl>(typeDecl))) {
@@ -1338,8 +1336,10 @@ static std::string getDeclNameFromContext(DeclContext *dc,
1338
1336
static Type diagnoseUnknownType (TypeResolution resolution,
1339
1337
Type parentType,
1340
1338
SourceRange parentRange,
1341
- IdentTypeRepr *repr,
1339
+ DeclRefTypeRepr *repr,
1342
1340
NameLookupOptions lookupOptions) {
1341
+ assert (parentType || isa<IdentTypeRepr>(repr));
1342
+
1343
1343
auto dc = resolution.getDeclContext ();
1344
1344
ASTContext &ctx = dc->getASTContext ();
1345
1345
auto &diags = ctx.Diags ;
@@ -1742,7 +1742,7 @@ static Type resolveUnqualifiedIdentTypeRepr(TypeResolution resolution,
1742
1742
1743
1743
// We don't allow generic arguments on 'Self'.
1744
1744
if (selfTypeKind != SelfTypeKind::InvalidSelf &&
1745
- isa<GenericIdentTypeRepr>(repr )) {
1745
+ repr-> hasGenericArgList ( )) {
1746
1746
diagnoseGenericArgumentsOnSelf (resolution, repr, typeDC);
1747
1747
}
1748
1748
@@ -1790,13 +1790,12 @@ static void diagnoseAmbiguousMemberType(Type baseTy, SourceRange baseRange,
1790
1790
// / \param silContext Used to look up generic parameters in SIL mode.
1791
1791
static Type resolveQualifiedIdentTypeRepr (TypeResolution resolution,
1792
1792
SILTypeResolutionContext *silContext,
1793
- Type parentTy,
1794
- SourceRange parentRange,
1795
- IdentTypeRepr *repr) {
1793
+ Type parentTy, MemberTypeRepr *repr) {
1796
1794
const auto options = resolution.getOptions ();
1797
1795
auto DC = resolution.getDeclContext ();
1798
1796
auto &ctx = DC->getASTContext ();
1799
1797
auto &diags = ctx.Diags ;
1798
+ const auto parentRange = repr->getBase ()->getSourceRange ();
1800
1799
auto isExtensionBinding = options.is (TypeResolverContext::ExtensionBinding);
1801
1800
1802
1801
auto maybeDiagnoseBadMemberType = [&](TypeDecl *member, Type memberType,
@@ -2157,6 +2156,8 @@ namespace {
2157
2156
SmallVectorImpl<SILYieldInfo> &yields,
2158
2157
SmallVectorImpl<SILResultInfo> &results,
2159
2158
llvm::Optional<SILResultInfo> &errorResult);
2159
+ NeverNullType resolveDeclRefTypeReprRec (DeclRefTypeRepr *repr,
2160
+ TypeResolutionOptions options);
2160
2161
NeverNullType resolveDeclRefTypeRepr (DeclRefTypeRepr *repr,
2161
2162
TypeResolutionOptions options);
2162
2163
NeverNullType resolveOwnershipTypeRepr (OwnershipTypeRepr *repr,
@@ -4636,15 +4637,16 @@ bool TypeResolver::resolveSILResults(
4636
4637
}
4637
4638
4638
4639
NeverNullType
4639
- TypeResolver::resolveDeclRefTypeRepr (DeclRefTypeRepr *repr,
4640
- TypeResolutionOptions options) {
4640
+ TypeResolver::resolveDeclRefTypeReprRec (DeclRefTypeRepr *repr,
4641
+ TypeResolutionOptions options) {
4642
+ auto &ctx = getASTContext ();
4643
+
4641
4644
Type result;
4642
4645
4643
- auto *rootComp = repr->getRoot ();
4644
- if (auto *identBase = dyn_cast<IdentTypeRepr>(rootComp)) {
4646
+ if (auto *identTR = dyn_cast<IdentTypeRepr>(repr)) {
4645
4647
// The base component uses unqualified lookup.
4646
4648
result = resolveUnqualifiedIdentTypeRepr (resolution.withOptions (options),
4647
- silContext, identBase );
4649
+ silContext, identTR );
4648
4650
4649
4651
if (result && result->isParameterPack () &&
4650
4652
// Workaround to allow 'shape' type checking of SIL.
@@ -4667,31 +4669,34 @@ TypeResolver::resolveDeclRefTypeRepr(DeclRefTypeRepr *repr,
4667
4669
}
4668
4670
}
4669
4671
} else {
4670
- result = resolveType (rootComp, options);
4671
- }
4672
-
4673
- if (result->hasError ())
4674
- return ErrorType::get (result->getASTContext ());
4672
+ auto *qualIdentTR = cast<MemberTypeRepr>(repr);
4673
+ auto *baseTR = qualIdentTR->getBase ();
4675
4674
4676
- // Remaining components are resolved via iterated qualified lookups.
4677
- if (auto *memberTR = dyn_cast<MemberTypeRepr>(repr)) {
4678
- SourceRange parentRange = rootComp->getSourceRange ();
4679
- for (auto *nestedComp : memberTR->getMemberComponents ()) {
4680
- result = resolveQualifiedIdentTypeRepr (resolution.withOptions (options),
4681
- silContext, result, parentRange,
4682
- nestedComp);
4683
- if (result->hasError ())
4684
- return ErrorType::get (result->getASTContext ());
4675
+ Type baseTy;
4676
+ if (auto *declRefBaseTR = dyn_cast<DeclRefTypeRepr>(baseTR)) {
4677
+ baseTy = resolveDeclRefTypeReprRec (declRefBaseTR, options);
4678
+ } else {
4679
+ baseTy = resolveType (baseTR, options);
4680
+ }
4685
4681
4686
- parentRange.End = nestedComp->getEndLoc ();
4682
+ if (baseTy->hasError ()) {
4683
+ return ErrorType::get (ctx);
4687
4684
}
4685
+
4686
+ result = resolveQualifiedIdentTypeRepr (resolution.withOptions (options),
4687
+ silContext, baseTy, qualIdentTR);
4688
4688
}
4689
4689
4690
- auto lastComp = repr->getLastComponent ();
4690
+ return result->hasError () ? ErrorType::get (ctx) : result;
4691
+ }
4692
+
4693
+ NeverNullType
4694
+ TypeResolver::resolveDeclRefTypeRepr (DeclRefTypeRepr *repr,
4695
+ TypeResolutionOptions options) {
4696
+ Type result = resolveDeclRefTypeReprRec (repr, options);
4691
4697
4692
- // Diagnose an error if the last component's generic arguments are missing.
4693
- if (result->is <UnboundGenericType>() &&
4694
- !isa<GenericIdentTypeRepr>(lastComp) &&
4698
+ // Diagnose an error if generic arguments are missing.
4699
+ if (result->is <UnboundGenericType>() && !repr->hasGenericArgList () &&
4695
4700
!resolution.getUnboundTypeOpener () &&
4696
4701
!options.is (TypeResolverContext::TypeAliasDecl) &&
4697
4702
!options.is (TypeResolverContext::ExtensionBinding)) {
@@ -4700,14 +4705,13 @@ TypeResolver::resolveDeclRefTypeRepr(DeclRefTypeRepr *repr,
4700
4705
// Tailored diagnostic for custom attributes.
4701
4706
if (options.is (TypeResolverContext::CustomAttr)) {
4702
4707
auto &ctx = resolution.getASTContext ();
4703
- ctx.Diags .diagnose (lastComp ->getNameLoc (), diag::unknown_attribute,
4704
- lastComp ->getNameRef ().getBaseIdentifier ().str ());
4708
+ ctx.Diags .diagnose (repr ->getNameLoc (), diag::unknown_attribute,
4709
+ repr ->getNameRef ().getBaseIdentifier ().str ());
4705
4710
4706
4711
return ErrorType::get (ctx);
4707
4712
}
4708
4713
4709
- diagnoseUnboundGenericType (result,
4710
- lastComp->getNameLoc ().getBaseNameLoc ());
4714
+ diagnoseUnboundGenericType (result, repr->getNameLoc ().getBaseNameLoc ());
4711
4715
}
4712
4716
4713
4717
return ErrorType::get (result->getASTContext ());
@@ -4720,11 +4724,11 @@ TypeResolver::resolveDeclRefTypeRepr(DeclRefTypeRepr *repr,
4720
4724
// Otherwise, emit an error.
4721
4725
if (!options.contains (TypeResolutionFlags::SilenceErrors)) {
4722
4726
auto moduleName = moduleTy->getModule ()->getName ();
4723
- diagnose (lastComp ->getNameLoc (), diag::cannot_find_type_in_scope,
4727
+ diagnose (repr ->getNameLoc (), diag::cannot_find_type_in_scope,
4724
4728
DeclNameRef (moduleName));
4725
- diagnose (lastComp ->getNameLoc (), diag::note_module_as_type, moduleName);
4729
+ diagnose (repr ->getNameLoc (), diag::note_module_as_type, moduleName);
4726
4730
}
4727
- lastComp ->setInvalid ();
4731
+ repr ->setInvalid ();
4728
4732
return ErrorType::get (getASTContext ());
4729
4733
}
4730
4734
0 commit comments