diff --git a/lib/AST/LookupVisibleDecls.cpp b/lib/AST/LookupVisibleDecls.cpp index 8acde2c4fa488..c44676dee170b 100644 --- a/lib/AST/LookupVisibleDecls.cpp +++ b/lib/AST/LookupVisibleDecls.cpp @@ -230,27 +230,8 @@ static void lookupTypeMembers(Type BaseType, Type LookupType, NominalTypeDecl *D = LookupType->getAnyNominal(); assert(D && "should have a nominal type"); - bool LookupFromChildDeclContext = false; - const DeclContext *TempDC = CurrDC; - while (!TempDC->isModuleContext()) { - if (TempDC == D) { - LookupFromChildDeclContext = true; - break; - } - TempDC = TempDC->getParent(); - } - SmallVector FoundDecls; - if (LookupFromChildDeclContext) { - // Current decl context is contained inside 'D', so generic parameters - // are visible. - if (D->getGenericParams()) - for (auto Param : *D->getGenericParams()) - if (isDeclVisibleInLookupMode(Param, LS, CurrDC, TypeResolver)) - FoundDecls.push_back(Param); - } - for (Decl *Member : D->getMembers()) { if (auto *VD = dyn_cast(Member)) if (isDeclVisibleInLookupMode(VD, LS, CurrDC, TypeResolver)) @@ -471,92 +452,6 @@ lookupVisibleMemberDeclsImpl(Type BaseTy, VisibleDeclConsumer &Consumer, GenericSignatureBuilder *GSB, VisitedSet &Visited); -// Filters out restated declarations from a protocol hierarchy -// or equivalent requirements from protocol composition types. -class RestateFilteringConsumer : public VisibleDeclConsumer { - LazyResolver *resolver; - - using FoundDecl = std::pair; - using NameAndType = std::pair; - - llvm::DenseMap foundVars; - llvm::DenseMap foundFuncs; - llvm::MapVector declsToReport; - - template - void addDecl(llvm::DenseMap &Map, K Key, FoundDecl FD) { - // Add the declaration if we haven't found an equivalent yet, otherwise - // replace the equivalent if the found decl has a higher access level. - auto existingDecl = Map.find(Key); - - if ((existingDecl == Map.end()) || - (Map[Key].first->getFormalAccess() < FD.first->getFormalAccess())) { - if (existingDecl != Map.end()) - declsToReport.erase({existingDecl->getSecond().first}); - Map[Key] = FD; - declsToReport.insert(FD); - } - } - - CanType stripSelfRequirementsIfNeeded(ValueDecl *VD, - GenericFunctionType *GFT) const { - // Preserve the generic signature if this is a subscript, which are uncurried, - // or if we have generic params other than Self. Otherwise, use - // the resultType of the curried function type. - // When we keep the generic signature, we remove the requirements - // from Self to make sure they don't prevent us from recognizing restatements. - auto params = GFT->getGenericParams(); - if (params.size() == 1 && !isa(VD)) { - return GFT->getResult()->getCanonicalType(); - } - auto Self = VD->getDeclContext()->getSelfInterfaceType(); - SmallVector newReqs; - for (auto req: GFT->getRequirements()) { - if (!Self->isEqual(req.getFirstType())) - newReqs.push_back(req); - } - auto newSig = GenericSignature::get(params, newReqs, false); - - return GenericFunctionType::get(newSig, GFT->getParams(), - GFT->getResult(), GFT->getExtInfo()) - ->getCanonicalType(); - } - -public: - RestateFilteringConsumer(Type baseTy, const DeclContext *DC, - LazyResolver *resolver) - : resolver(resolver) { - assert(DC && baseTy && !baseTy->hasLValueType()); - } - - void foundDecl(ValueDecl *VD, DeclVisibilityKind Reason) override { - assert(VD); - // If this isn't a protocol context, don't look further into the decl. - if (!isa(VD->getDeclContext())) { - declsToReport.insert({VD, Reason}); - return; - } - if (resolver) - resolver->resolveDeclSignature(VD); - - if (!VD->hasInterfaceType()) { - declsToReport.insert({VD, Reason}); - return; - } - if (auto GFT = VD->getInterfaceType()->getAs()) { - auto type = stripSelfRequirementsIfNeeded(VD, GFT); - addDecl(foundFuncs, {VD->getFullName(), type}, {VD, Reason}); - return; - } - addDecl(foundVars, VD->getFullName(), {VD, Reason}); - } - - void feedResultsToConsumer(VisibleDeclConsumer &Consumer) const { - for (const auto entry: declsToReport) - Consumer.foundDecl(entry.first, entry.second); - } -}; - static void lookupVisibleProtocolMemberDecls(Type BaseTy, ProtocolType *PT, VisibleDeclConsumer &Consumer, @@ -642,12 +537,11 @@ static void lookupVisibleMemberDeclsImpl( for (auto Proto : Archetype->getConformsTo()) lookupVisibleProtocolMemberDecls( BaseTy, Proto->getDeclaredType(), Consumer, CurrDC, LS, - getReasonForSuper(Reason), TypeResolver, GSB, Visited); + Reason, TypeResolver, GSB, Visited); if (auto superclass = Archetype->getSuperclass()) lookupVisibleMemberDeclsImpl(superclass, Consumer, CurrDC, LS, - getReasonForSuper(Reason), TypeResolver, - GSB, Visited); + Reason, TypeResolver, GSB, Visited); return; } @@ -766,19 +660,25 @@ template <> struct DenseMapInfo { } // namespace llvm -namespace { - -/// Hack to guess at whether substituting into the type of a declaration will -/// be okay. -/// FIXME: This is awful. We should either have Type::subst() work for -/// GenericFunctionType, or we should kill it outright. -static bool shouldSubstIntoDeclType(Type type) { - auto genericFnType = type->getAs(); - if (!genericFnType) return true; +// If a class 'Base' conforms to 'Proto', and my base type is a subclass +// 'Derived' of 'Base', use 'Base' not 'Derived' as the 'Self' type in the +// substitution map. +static Type getBaseTypeForMember(ModuleDecl *M, ValueDecl *OtherVD, Type BaseTy) { + if (auto *Proto = OtherVD->getDeclContext()->getSelfProtocolDecl()) { + if (BaseTy->getClassOrBoundGenericClass()) { + if (auto Conformance = M->lookupConformance(BaseTy, Proto)) { + auto *Superclass = Conformance->getConcrete()->getRootConformance() + ->getType()->getClassOrBoundGenericClass(); + return BaseTy->getSuperclassForDecl(Superclass); + } + } + } - return false; + return BaseTy; } +namespace { + class OverrideFilteringConsumer : public VisibleDeclConsumer { public: std::set AllFoundDecls; @@ -787,16 +687,12 @@ class OverrideFilteringConsumer : public VisibleDeclConsumer { Type BaseTy; const DeclContext *DC; LazyResolver *TypeResolver; - bool IsTypeLookup = false; OverrideFilteringConsumer(Type BaseTy, const DeclContext *DC, LazyResolver *resolver) - : BaseTy(BaseTy), DC(DC), TypeResolver(resolver) { + : BaseTy(BaseTy->getMetatypeInstanceType()), + DC(DC), TypeResolver(resolver) { assert(!BaseTy->hasLValueType()); - if (auto *MetaTy = BaseTy->getAs()) { - BaseTy = MetaTy->getInstanceType(); - IsTypeLookup = true; - } assert(DC && BaseTy); } @@ -806,7 +702,9 @@ class OverrideFilteringConsumer : public VisibleDeclConsumer { // If this kind of declaration doesn't participate in overriding, there's // no filtering to do here. - if (!isa(VD) && !isa(VD)) { + if (!isa(VD) && + !isa(VD) && + !isa(VD)) { DeclsToReport.insert(FoundDeclTy(VD, Reason)); return; } @@ -857,7 +755,8 @@ class OverrideFilteringConsumer : public VisibleDeclConsumer { // don't substitute either. bool shouldSubst = (!BaseTy->isAnyObject() && !BaseTy->hasTypeVariable() && - BaseTy->getNominalOrBoundGenericNominal() && + (BaseTy->getNominalOrBoundGenericNominal() || + BaseTy->is()) && VD->getDeclContext()->isTypeContext()); ModuleDecl *M = DC->getParentModule(); @@ -870,8 +769,7 @@ class OverrideFilteringConsumer : public VisibleDeclConsumer { auto FoundSignature = VD->getOverloadSignature(); auto FoundSignatureType = VD->getOverloadSignatureType(); - if (FoundSignatureType && shouldSubst && - shouldSubstIntoDeclType(FoundSignatureType)) { + if (FoundSignatureType && shouldSubst) { auto subs = BaseTy->getMemberSubstitutionMap(M, VD); if (auto CT = FoundSignatureType.subst(subs)) FoundSignatureType = CT->getCanonicalType(); @@ -888,9 +786,9 @@ class OverrideFilteringConsumer : public VisibleDeclConsumer { auto OtherSignature = OtherVD->getOverloadSignature(); auto OtherSignatureType = OtherVD->getOverloadSignatureType(); - if (OtherSignatureType && shouldSubst && - shouldSubstIntoDeclType(OtherSignatureType)) { - auto subs = BaseTy->getMemberSubstitutionMap(M, OtherVD); + if (OtherSignatureType && shouldSubst) { + auto ActualBaseTy = getBaseTypeForMember(M, OtherVD, BaseTy); + auto subs = ActualBaseTy->getMemberSubstitutionMap(M, OtherVD); if (auto CT = OtherSignatureType.subst(subs)) OtherSignatureType = CT->getCanonicalType(); } @@ -931,13 +829,11 @@ static void lookupVisibleMemberDecls( LookupState LS, DeclVisibilityKind Reason, LazyResolver *TypeResolver, GenericSignatureBuilder *GSB) { OverrideFilteringConsumer overrideConsumer(BaseTy, CurrDC, TypeResolver); - RestateFilteringConsumer restateConsumer(BaseTy, CurrDC, TypeResolver); VisitedSet Visited; - lookupVisibleMemberDeclsImpl(BaseTy, restateConsumer, CurrDC, LS, Reason, + lookupVisibleMemberDeclsImpl(BaseTy, overrideConsumer, CurrDC, LS, Reason, TypeResolver, GSB, Visited); // Report the declarations we found to the real consumer. - restateConsumer.feedResultsToConsumer(overrideConsumer); for (const auto &DeclAndReason : overrideConsumer.DeclsToReport) Consumer.foundDecl(DeclAndReason.D, DeclAndReason.Reason); } @@ -953,7 +849,7 @@ static void lookupVisibleDeclsImpl(VisibleDeclConsumer &Consumer, // If we are inside of a method, check to see if there are any ivars in scope, // and if so, whether this is a reference to one of them. while (!DC->isModuleScopeContext()) { - const ValueDecl *BaseDecl = nullptr; + GenericParamList *GenericParams = nullptr; Type ExtendedType; auto LS = LookupState::makeUnqualified(); @@ -977,7 +873,6 @@ static void lookupVisibleDeclsImpl(VisibleDeclConsumer &Consumer, if (auto *SE = dyn_cast(DC)) { ExtendedType = SE->getDeclContext()->getSelfTypeInContext(); DC = DC->getParent(); - BaseDecl = DC->getSelfNominalTypeDecl(); } else if (auto *AFD = dyn_cast(DC)) { // Look for local variables; normally, the parser resolves these @@ -996,9 +891,10 @@ static void lookupVisibleDeclsImpl(VisibleDeclConsumer &Consumer, namelookup::FindLocalVal(SM, Loc, Consumer).checkParameterList( AFD->getParameters()); + GenericParams = AFD->getGenericParams(); + if (AFD->getDeclContext()->isTypeContext()) { ExtendedType = AFD->getDeclContext()->getSelfTypeInContext(); - BaseDecl = AFD->getImplicitSelfDecl(); DC = DC->getParent(); if (auto *FD = dyn_cast(AFD)) @@ -1014,14 +910,34 @@ static void lookupVisibleDeclsImpl(VisibleDeclConsumer &Consumer, } } else if (auto ED = dyn_cast(DC)) { ExtendedType = ED->getSelfTypeInContext(); - if (ExtendedType) - BaseDecl = ExtendedType->getNominalOrBoundGenericNominal(); } else if (auto ND = dyn_cast(DC)) { ExtendedType = ND->getSelfTypeInContext(); - BaseDecl = ND; } - if (BaseDecl && ExtendedType) + // If we're inside a function context, we've already moved to + // the parent DC, so we have to check the function's generic + // parameters first. + if (GenericParams) { + namelookup::FindLocalVal localVal(SM, Loc, Consumer); + localVal.checkGenericParams(GenericParams); + } + + // Check the generic parameters of our context. + GenericParamList *dcGenericParams = nullptr; + if (auto nominal = dyn_cast(DC)) + dcGenericParams = nominal->getGenericParams(); + else if (auto ext = dyn_cast(DC)) + dcGenericParams = ext->getGenericParams(); + else if (auto subscript = dyn_cast(DC)) + dcGenericParams = subscript->getGenericParams(); + + while (dcGenericParams) { + namelookup::FindLocalVal localVal(SM, Loc, Consumer); + localVal.checkGenericParams(dcGenericParams); + dcGenericParams = dcGenericParams->getOuterParameters(); + } + + if (ExtendedType) ::lookupVisibleMemberDecls(ExtendedType, Consumer, DC, LS, Reason, TypeResolver, nullptr); diff --git a/lib/AST/Type.cpp b/lib/AST/Type.cpp index 9406e4235abe0..414f006394acb 100644 --- a/lib/AST/Type.cpp +++ b/lib/AST/Type.cpp @@ -439,7 +439,7 @@ Type TypeBase::addCurriedSelfType(const DeclContext *dc) { genericFn->getExtInfo()); } - auto selfTy = dc->getDeclaredInterfaceType(); + auto selfTy = dc->getSelfInterfaceType(); auto selfParam = AnyFunctionType::Param(selfTy); if (sig) return GenericFunctionType::get(sig, {selfParam}, type); @@ -860,7 +860,6 @@ Type TypeBase::getMetatypeInstanceType() { if (auto metaTy = getAs()) return metaTy->getInstanceType(); - // For mutable value type methods, we need to dig through inout types. return this; } diff --git a/lib/IDE/CodeCompletion.cpp b/lib/IDE/CodeCompletion.cpp index 415e6c329f411..8bbc5c5bda04a 100644 --- a/lib/IDE/CodeCompletion.cpp +++ b/lib/IDE/CodeCompletion.cpp @@ -3179,20 +3179,26 @@ class CompletionLookup final : public swift::VisibleDeclConsumer { Kind = LookupKind::ValueExpr; NeedLeadingDot = !HaveDot; - // This is horrible ExprType = ExprType->getRValueType(); + assert(!ExprType->hasTypeParameter()); + this->ExprType = ExprType; - if (ExprType->hasTypeParameter()) { - DeclContext *DC = nullptr; - if (VD) - DC = VD->getInnermostDeclContext(); - else if (auto NTD = ExprType->getInOutObjectType() - ->getMetatypeInstanceType()->getAnyNominal()) - DC = NTD; - if (DC) - ExprType = DC->mapTypeIntoContext(ExprType); + + // Open existential types, so that lookupVisibleMemberDecls() can properly + // substitute them. + bool WasOptional = false; + if (auto OptionalType = ExprType->getOptionalObjectType()) { + ExprType = OptionalType; + WasOptional = true; } + if (!ExprType->getMetatypeInstanceType()->isAnyObject()) + if (ExprType->isAnyExistentialType()) + ExprType = ArchetypeType::getAnyOpened(ExprType); + + if (WasOptional) + ExprType = OptionalType::get(ExprType); + // Handle special cases bool isIUO = VD && VD->getAttrs() .hasAttribute(); @@ -4186,13 +4192,12 @@ class CompletionOverrideLookup : public swift::VisibleDeclConsumer { } } - void addDesignatedInitializers(Type CurrTy) { + void addDesignatedInitializers(NominalTypeDecl *NTD) { if (hasFuncIntroducer || hasVarIntroducer || hasTypealiasIntroducer || hasOverridabilityModifier) return; - assert(CurrTy); - const auto *CD = dyn_cast_or_null(CurrTy->getAnyNominal()); + const auto *CD = dyn_cast(NTD); if (!CD) return; if (!CD->hasSuperclass()) @@ -4209,14 +4214,12 @@ class CompletionOverrideLookup : public swift::VisibleDeclConsumer { } } - void addAssociatedTypes(Type CurrTy) { + void addAssociatedTypes(NominalTypeDecl *NTD) { if (!hasTypealiasIntroducer && (hasFuncIntroducer || hasVarIntroducer || hasInitializerModifier || hasOverride || hasOverridabilityModifier)) return; - NominalTypeDecl *NTD = CurrTy->getAnyNominal(); - for (auto Conformance : NTD->getAllConformances()) { auto Proto = Conformance->getProtocol(); if (!Proto->isAccessibleFrom(CurrDeclContext)) @@ -4242,13 +4245,14 @@ class CompletionOverrideLookup : public swift::VisibleDeclConsumer { if (isa(CurrDeclContext)) return; - Type CurrTy = CurrDeclContext->getDeclaredTypeInContext(); + Type CurrTy = CurrDeclContext->getSelfTypeInContext(); + auto *NTD = CurrDeclContext->getSelfNominalTypeDecl(); if (CurrTy && !CurrTy->is()) { lookupVisibleMemberDecls(*this, CurrTy, CurrDeclContext, TypeResolver, /*includeInstanceMembers=*/false); - addDesignatedInitializers(CurrTy); - addAssociatedTypes(CurrTy); + addDesignatedInitializers(NTD); + addAssociatedTypes(NTD); } } }; diff --git a/test/IDE/complete_crashes.swift b/test/IDE/complete_crashes.swift index dce4cfe8dc22a..b2711e2d0054c 100644 --- a/test/IDE/complete_crashes.swift +++ b/test/IDE/complete_crashes.swift @@ -68,7 +68,7 @@ while true { struct CustomGenericCollection : ExpressibleByDictionaryLiteral { // GENERIC_PARAM_AND_ASSOC_TYPE: Begin completions // GENERIC_PARAM_AND_ASSOC_TYPE-DAG: Decl[InstanceVar]/CurrNominal: count[#Int#]; name=count - // GENERIC_PARAM_AND_ASSOC_TYPE-DAG: Decl[GenericTypeParam]/CurrNominal: Key[#Key#]; name=Key + // GENERIC_PARAM_AND_ASSOC_TYPE-DAG: Decl[GenericTypeParam]/Local: Key[#Key#]; name=Key // GENERIC_PARAM_AND_ASSOC_TYPE-DAG: Decl[TypeAlias]/CurrNominal: Value[#CustomGenericCollection.Value#]; name=Value // GENERIC_PARAM_AND_ASSOC_TYPE: End completions diff --git a/test/IDE/complete_expr_postfix_begin.swift b/test/IDE/complete_expr_postfix_begin.swift index d1fef816733dc..83a9727e369b4 100644 --- a/test/IDE/complete_expr_postfix_begin.swift +++ b/test/IDE/complete_expr_postfix_begin.swift @@ -228,7 +228,7 @@ struct TestFindFuncParam5_6 { func testFindFuncParam5(a: Int, b: T) { #^FIND_FUNC_PARAM_5^# // FIND_FUNC_PARAM_5: Begin completions -// FIND_FUNC_PARAM_5-DAG: Decl[GenericTypeParam]/CurrNominal: T[#T#]{{; name=.+$}} +// FIND_FUNC_PARAM_5-DAG: Decl[GenericTypeParam]/Local: T[#T#]{{; name=.+$}} // FIND_FUNC_PARAM_5-DAG: Decl[LocalVar]/Local: self[#TestFindFuncParam5_6#]{{; name=.+$}} // FIND_FUNC_PARAM_5-DAG: Decl[LocalVar]/Local: a[#Int#]{{; name=.+$}} // FIND_FUNC_PARAM_5-DAG: Decl[LocalVar]/Local: b[#T#]{{; name=.+$}} @@ -238,7 +238,7 @@ struct TestFindFuncParam5_6 { func testFindFuncParam6(a: Int, b: T, c: U) { #^FIND_FUNC_PARAM_6^# // FIND_FUNC_PARAM_6: Begin completions -// FIND_FUNC_PARAM_6-DAG: Decl[GenericTypeParam]/CurrNominal: T[#T#]{{; name=.+$}} +// FIND_FUNC_PARAM_6-DAG: Decl[GenericTypeParam]/Local: T[#T#]{{; name=.+$}} // FIND_FUNC_PARAM_6-DAG: Decl[GenericTypeParam]/Local: U[#U#]{{; name=.+$}} // FIND_FUNC_PARAM_6-DAG: Decl[LocalVar]/Local: self[#TestFindFuncParam5_6#]{{; name=.+$}} // FIND_FUNC_PARAM_6-DAG: Decl[LocalVar]/Local: a[#Int#]{{; name=.+$}} @@ -309,10 +309,10 @@ class TestFindConstructorParam4 { init(a: Int, b: T) { #^FIND_CONSTRUCTOR_PARAM_4^# // FIND_CONSTRUCTOR_PARAM_4: Begin completions -// FIND_CONSTRUCTOR_PARAM_4-DAG: Decl[GenericTypeParam]/CurrNominal: T[#T#]{{; name=.+$}} -// FIND_CONSTRUCTOR_PARAM_4-DAG: Decl[LocalVar]/Local: self[#TestFindConstructorParam4#]{{; name=.+$}} -// FIND_CONSTRUCTOR_PARAM_4-DAG: Decl[LocalVar]/Local: a[#Int#]{{; name=.+$}} -// FIND_CONSTRUCTOR_PARAM_4-DAG: Decl[LocalVar]/Local: b[#T#]{{; name=.+$}} +// FIND_CONSTRUCTOR_PARAM_4-DAG: Decl[GenericTypeParam]/Local: T[#T#]{{; name=.+$}} +// FIND_CONSTRUCTOR_PARAM_4-DAG: Decl[LocalVar]/Local: self[#TestFindConstructorParam4#]{{; name=.+$}} +// FIND_CONSTRUCTOR_PARAM_4-DAG: Decl[LocalVar]/Local: a[#Int#]{{; name=.+$}} +// FIND_CONSTRUCTOR_PARAM_4-DAG: Decl[LocalVar]/Local: b[#T#]{{; name=.+$}} // FIND_CONSTRUCTOR_PARAM_4: End completions } } @@ -321,12 +321,12 @@ class TestFindConstructorParam5 { init(a: Int, b: T, c: U) { #^FIND_CONSTRUCTOR_PARAM_5^# // FIND_CONSTRUCTOR_PARAM_5: Begin completions -// FIND_CONSTRUCTOR_PARAM_5-DAG: Decl[GenericTypeParam]/CurrNominal: T[#T#]{{; name=.+$}} -// FIND_CONSTRUCTOR_PARAM_5-DAG: Decl[GenericTypeParam]/Local: U[#U#]{{; name=.+$}} -// FIND_CONSTRUCTOR_PARAM_5-DAG: Decl[LocalVar]/Local: self[#TestFindConstructorParam5#]{{; name=.+$}} -// FIND_CONSTRUCTOR_PARAM_5-DAG: Decl[LocalVar]/Local: a[#Int#]{{; name=.+$}} -// FIND_CONSTRUCTOR_PARAM_5-DAG: Decl[LocalVar]/Local: b[#T#]{{; name=.+$}} -// FIND_CONSTRUCTOR_PARAM_5-DAG: Decl[LocalVar]/Local: c[#U#]{{; name=.+$}} +// FIND_CONSTRUCTOR_PARAM_5-DAG: Decl[GenericTypeParam]/Local: T[#T#]{{; name=.+$}} +// FIND_CONSTRUCTOR_PARAM_5-DAG: Decl[GenericTypeParam]/Local: U[#U#]{{; name=.+$}} +// FIND_CONSTRUCTOR_PARAM_5-DAG: Decl[LocalVar]/Local: self[#TestFindConstructorParam5#]{{; name=.+$}} +// FIND_CONSTRUCTOR_PARAM_5-DAG: Decl[LocalVar]/Local: a[#Int#]{{; name=.+$}} +// FIND_CONSTRUCTOR_PARAM_5-DAG: Decl[LocalVar]/Local: b[#T#]{{; name=.+$}} +// FIND_CONSTRUCTOR_PARAM_5-DAG: Decl[LocalVar]/Local: c[#U#]{{; name=.+$}} // FIND_CONSTRUCTOR_PARAM_5: End completions } } @@ -357,7 +357,7 @@ class TestFindDestructorParam2 { deinit { #^FIND_DESTRUCTOR_PARAM_2^# // FIND_DESTRUCTOR_PARAM_2: Begin completions -// FIND_DESTRUCTOR_PARAM_2-DAG: Decl[GenericTypeParam]/CurrNominal: T[#T#]{{; name=.+$}} +// FIND_DESTRUCTOR_PARAM_2-DAG: Decl[GenericTypeParam]/Local: T[#T#]{{; name=.+$}} // FIND_DESTRUCTOR_PARAM_2-DAG: Decl[LocalVar]/Local: self[#TestFindDestructorParam2#]{{; name=.+$}} // FIND_DESTRUCTOR_PARAM_2: End completions } diff --git a/test/IDE/complete_from_stdlib.swift b/test/IDE/complete_from_stdlib.swift index b7aad664a1916..0c034b42e5741 100644 --- a/test/IDE/complete_from_stdlib.swift +++ b/test/IDE/complete_from_stdlib.swift @@ -148,7 +148,7 @@ func testArchetypeReplacement2(_ a: [BAR]) { // PRIVATE_NOMINAL_MEMBERS_6-DAG: Decl[InstanceMethod]/CurrNominal: append({#(newElement): Equatable#})[#Void#]{{; name=.+}} // PRIVATE_NOMINAL_MEMBERS_6-DAG: Decl[InstanceMethod]/CurrNominal: insert({#(newElement): Equatable#}, {#at: Int#})[#Void#]{{; name=.+}} // PRIVATE_NOMINAL_MEMBERS_6-DAG: Decl[InstanceMethod]/Super: dropFirst()[#ArraySlice#]{{; name=.+}} -// PRIVATE_NOMINAL_MEMBERS_6-DAG: Decl[InstanceMethod]/Super: dropLast()[#ArraySlice#]{{; name=.+}} +// PRIVATE_NOMINAL_MEMBERS_6-DAG: Decl[InstanceMethod]/Super: dropLast()[#[Equatable]#]{{; name=.+}} // PRIVATE_NOMINAL_MEMBERS_6-DAG: Decl[InstanceMethod]/Super: enumerated()[#EnumeratedSequence<[Equatable]>#]{{; name=.+}} // PRIVATE_NOMINAL_MEMBERS_6-DAG: Decl[InstanceMethod]/Super: min({#by: (Equatable, Equatable) throws -> Bool##(Equatable, Equatable) throws -> Bool#})[' rethrows'][#Equatable?#]{{; name=.+}} // PRIVATE_NOMINAL_MEMBERS_6-DAG: Decl[InstanceMethod]/Super: max({#by: (Equatable, Equatable) throws -> Bool##(Equatable, Equatable) throws -> Bool#})[' rethrows'][#Equatable?#]{{; name=.+}} diff --git a/test/IDE/complete_init.swift b/test/IDE/complete_init.swift index ad9d5aa53f1a8..e7882e535902b 100644 --- a/test/IDE/complete_init.swift +++ b/test/IDE/complete_init.swift @@ -124,7 +124,8 @@ extension L { // INSIDE_L_0-DAG: Decl[Constructor]/CurrNominal: Y({#x: A#})[#G#]{{; name=.+}} // FIXME: Code complete generic parameters in extensions -// disabled_INSIDE_L_0-DAG: Decl[Constructor]/CurrNominal: X({#x: A#})[#X#]{{; name=.+}} +// INSIDE_L_0-DAG: Decl[GenericTypeParam]/Local: X[#X#]; name=X +// INSIDE_L_0-DAG: Decl[Constructor]/Local: X({#x: A#})[#G#]{{; name=.+}} // INSIDE_L_0: End completions @@ -136,7 +137,7 @@ struct M { } // INSIDE_M_0: Begin completions // INSIDE_M_0-DAG: Decl[Constructor]/CurrNominal: Y({#x: A#})[#G#]{{; name=.+}} -// INSIDE_M_0-DAG: Decl[Constructor]/CurrNominal: X({#x: A#})[#G#]{{; name=.+}} +// INSIDE_M_0-DAG: Decl[Constructor]/Local: X({#x: A#})[#G#]{{; name=.+}} // INSIDE_M_0: End completions typealias CAlias = C diff --git a/test/IDE/complete_members_optional.swift b/test/IDE/complete_members_optional.swift index 912cfa38b3291..5aa726a30c80e 100644 --- a/test/IDE/complete_members_optional.swift +++ b/test/IDE/complete_members_optional.swift @@ -29,8 +29,8 @@ func optionalMembers1(_ a: HasOptionalMembers1) { a.#^OPTIONAL_MEMBERS_1^# } // OPTIONAL_MEMBERS_1: Begin completions, 3 items -// OPTIONAL_MEMBERS_1-DAG: Decl[InstanceMethod]/CurrNominal: optionalInstanceFunc?()[#Int#]{{; name=.+$}} -// OPTIONAL_MEMBERS_1-DAG: Decl[InstanceVar]/CurrNominal: optionalInstanceProperty[#Int?#]{{; name=.+$}} +// OPTIONAL_MEMBERS_1-DAG: Decl[InstanceMethod]/CurrNominal: optionalInstanceFunc?()[#Int#]{{; name=.+$}} +// OPTIONAL_MEMBERS_1-DAG: Decl[InstanceVar]/CurrNominal: optionalInstanceProperty[#Int?#]{{; name=.+$}} // OPTIONAL_MEMBERS_1-DAG: Keyword[self]/CurrNominal: self[#HasOptionalMembers1#]; name=self // OPTIONAL_MEMBERS_1: End completions @@ -38,8 +38,8 @@ func optionalMembers2(_ a: T) { T.#^OPTIONAL_MEMBERS_2^# } // OPTIONAL_MEMBERS_2: Begin completions, 4 items -// OPTIONAL_MEMBERS_2-DAG: Decl[InstanceMethod]/Super: optionalInstanceFunc?({#self: HasOptionalMembers1#})[#() -> Int#]{{; name=.+$}} -// OPTIONAL_MEMBERS_2-DAG: Decl[StaticMethod]/Super: optionalClassFunc?()[#Int#]{{; name=.+$}} -// OPTIONAL_MEMBERS_2-DAG: Decl[StaticVar]/Super: optionalClassProperty[#Int?#]{{; name=.+$}} +// OPTIONAL_MEMBERS_2-DAG: Decl[InstanceMethod]/CurrNominal: optionalInstanceFunc?({#self: HasOptionalMembers1#})[#() -> Int#]{{; name=.+$}} +// OPTIONAL_MEMBERS_2-DAG: Decl[StaticMethod]/CurrNominal: optionalClassFunc?()[#Int#]{{; name=.+$}} +// OPTIONAL_MEMBERS_2-DAG: Decl[StaticVar]/CurrNominal: optionalClassProperty[#Int?#]{{; name=.+$}} // OPTIONAL_MEMBERS_2-DAG: Keyword[self]/CurrNominal: self[#T.Type#]; name=self // OPTIONAL_MEMBERS_2: End completions diff --git a/test/IDE/complete_operators.swift b/test/IDE/complete_operators.swift index 5b53fb8fdf34f..c6fa650d52aa1 100644 --- a/test/IDE/complete_operators.swift +++ b/test/IDE/complete_operators.swift @@ -279,8 +279,8 @@ func testInfix15() { T#^INFIX_15^# } // INFIX_15: Begin completions, 3 items -// INFIX_15-NEXT: Decl[AssociatedType]/Super: .T; name=T -// INFIX_15-NEXT: Decl[InstanceMethod]/Super: .foo({#self: P#})[#() -> S2#]; name=foo(P) +// INFIX_15-NEXT: Decl[AssociatedType]/CurrNominal: .T; name=T +// INFIX_15-NEXT: Decl[InstanceMethod]/CurrNominal: .foo({#self: P#})[#() -> S2#]; name=foo(P) // INFIX_15-NEXT: Keyword[self]/CurrNominal: .self[#T.Type#]; name=self // INFIX_15: End completions diff --git a/test/IDE/complete_pattern.swift b/test/IDE/complete_pattern.swift index d865a799c38fb..32049bf35b674 100644 --- a/test/IDE/complete_pattern.swift +++ b/test/IDE/complete_pattern.swift @@ -198,9 +198,9 @@ struct PatternIsGeneric2< // PATTERN_IS_GENERIC_2: Begin completions // Generic parameters of the struct. -// PATTERN_IS_GENERIC_2-DAG: Decl[GenericTypeParam]/CurrNominal: StructGenericFoo[#StructGenericFoo#]{{; name=.+$}} -// PATTERN_IS_GENERIC_2-DAG: Decl[GenericTypeParam]/CurrNominal: StructGenericBar[#StructGenericBar#]{{; name=.+$}} -// PATTERN_IS_GENERIC_2-DAG: Decl[GenericTypeParam]/CurrNominal: StructGenericBaz[#StructGenericBaz#]{{; name=.+$}} +// PATTERN_IS_GENERIC_2-DAG: Decl[GenericTypeParam]/Local: StructGenericFoo[#StructGenericFoo#]{{; name=.+$}} +// PATTERN_IS_GENERIC_2-DAG: Decl[GenericTypeParam]/Local: StructGenericBar[#StructGenericBar#]{{; name=.+$}} +// PATTERN_IS_GENERIC_2-DAG: Decl[GenericTypeParam]/Local: StructGenericBaz[#StructGenericBaz#]{{; name=.+$}} // Generic parameters of the function. // PATTERN_IS_GENERIC_2-DAG: Decl[GenericTypeParam]/Local: GenericFoo[#GenericFoo#]{{; name=.+$}} // PATTERN_IS_GENERIC_2-DAG: Decl[GenericTypeParam]/Local: GenericBar[#GenericBar#]{{; name=.+$}} diff --git a/test/IDE/complete_type.swift b/test/IDE/complete_type.swift index ce22a39c0d37f..025e33f465766 100644 --- a/test/IDE/complete_type.swift +++ b/test/IDE/complete_type.swift @@ -456,7 +456,7 @@ typealias FooTypealias = Int //===--- // TYPE_IN_PROTOCOL: Begin completions -// TYPE_IN_PROTOCOL-DAG: Decl[GenericTypeParam]/Super: Self[#Self#]{{; name=.+$}} +// TYPE_IN_PROTOCOL-DAG: Decl[GenericTypeParam]/Local: Self[#Self#]{{; name=.+$}} // TYPE_IN_PROTOCOL: End completions protocol TestSelf1 { @@ -488,9 +488,9 @@ struct TestTypeInParamGeneric2< } // TYPE_IN_FUNC_PARAM_GENERIC_2: Begin completions -// TYPE_IN_FUNC_PARAM_GENERIC_2-DAG: Decl[GenericTypeParam]/CurrNominal: StructGenericFoo[#StructGenericFoo#]{{; name=.+$}} -// TYPE_IN_FUNC_PARAM_GENERIC_2-DAG: Decl[GenericTypeParam]/CurrNominal: StructGenericBar[#StructGenericBar#]{{; name=.+$}} -// TYPE_IN_FUNC_PARAM_GENERIC_2-DAG: Decl[GenericTypeParam]/CurrNominal: StructGenericBaz[#StructGenericBaz#]{{; name=.+$}} +// TYPE_IN_FUNC_PARAM_GENERIC_2-DAG: Decl[GenericTypeParam]/Local: StructGenericFoo[#StructGenericFoo#]{{; name=.+$}} +// TYPE_IN_FUNC_PARAM_GENERIC_2-DAG: Decl[GenericTypeParam]/Local: StructGenericBar[#StructGenericBar#]{{; name=.+$}} +// TYPE_IN_FUNC_PARAM_GENERIC_2-DAG: Decl[GenericTypeParam]/Local: StructGenericBaz[#StructGenericBaz#]{{; name=.+$}} // TYPE_IN_FUNC_PARAM_GENERIC_2: End completions struct TestTypeInParamGeneric3 { @@ -518,9 +518,9 @@ struct TestTypeInParamGeneric4< // TYPE_IN_FUNC_PARAM_GENERIC_4: Begin completions // Generic parameters of the struct. -// TYPE_IN_FUNC_PARAM_GENERIC_4-DAG: Decl[GenericTypeParam]/CurrNominal: StructGenericFoo[#StructGenericFoo#]{{; name=.+$}} -// TYPE_IN_FUNC_PARAM_GENERIC_4-DAG: Decl[GenericTypeParam]/CurrNominal: StructGenericBar[#StructGenericBar#]{{; name=.+$}} -// TYPE_IN_FUNC_PARAM_GENERIC_4-DAG: Decl[GenericTypeParam]/CurrNominal: StructGenericBaz[#StructGenericBaz#]{{; name=.+$}} +// TYPE_IN_FUNC_PARAM_GENERIC_4-DAG: Decl[GenericTypeParam]/Local: StructGenericFoo[#StructGenericFoo#]{{; name=.+$}} +// TYPE_IN_FUNC_PARAM_GENERIC_4-DAG: Decl[GenericTypeParam]/Local: StructGenericBar[#StructGenericBar#]{{; name=.+$}} +// TYPE_IN_FUNC_PARAM_GENERIC_4-DAG: Decl[GenericTypeParam]/Local: StructGenericBaz[#StructGenericBaz#]{{; name=.+$}} // Generic parameters of the function. // TYPE_IN_FUNC_PARAM_GENERIC_4-DAG: Decl[GenericTypeParam]/Local: GenericFoo[#GenericFoo#]{{; name=.+$}} // TYPE_IN_FUNC_PARAM_GENERIC_4-DAG: Decl[GenericTypeParam]/Local: GenericBar[#GenericBar#]{{; name=.+$}} @@ -537,9 +537,9 @@ struct TestTypeInParamGeneric5 { // TYPE_IN_FUNC_PARAM_GENERIC_5: Begin completions // Generic parameters of the containing structs. -// TYPE_IN_FUNC_PARAM_GENERIC_5-DAG: Decl[GenericTypeParam]/OutNominal: StructGenericFoo[#StructGenericFoo#]{{; name=.+$}} -// TYPE_IN_FUNC_PARAM_GENERIC_5-DAG: Decl[GenericTypeParam]/OutNominal: StructGenericBar[#StructGenericBar#]{{; name=.+$}} -// TYPE_IN_FUNC_PARAM_GENERIC_5-DAG: Decl[GenericTypeParam]/CurrNominal: StructGenericBaz[#StructGenericBaz#]{{; name=.+$}} +// TYPE_IN_FUNC_PARAM_GENERIC_5-DAG: Decl[GenericTypeParam]/Local: StructGenericFoo[#StructGenericFoo#]{{; name=.+$}} +// TYPE_IN_FUNC_PARAM_GENERIC_5-DAG: Decl[GenericTypeParam]/Local: StructGenericBar[#StructGenericBar#]{{; name=.+$}} +// TYPE_IN_FUNC_PARAM_GENERIC_5-DAG: Decl[GenericTypeParam]/Local: StructGenericBaz[#StructGenericBaz#]{{; name=.+$}} // Generic parameters of the function. // TYPE_IN_FUNC_PARAM_GENERIC_5-DAG: Decl[GenericTypeParam]/Local: GenericFoo[#GenericFoo#]{{; name=.+$}} // TYPE_IN_FUNC_PARAM_GENERIC_5: End completions @@ -552,9 +552,9 @@ struct TestTypeInConstructorParamGeneric1< } // TYPE_IN_CONSTRUCTOR_PARAM_GENERIC_1: Begin completions -// TYPE_IN_CONSTRUCTOR_PARAM_GENERIC_1-DAG: Decl[GenericTypeParam]/CurrNominal: StructGenericFoo[#StructGenericFoo#]{{; name=.+$}} -// TYPE_IN_CONSTRUCTOR_PARAM_GENERIC_1-DAG: Decl[GenericTypeParam]/CurrNominal: StructGenericBar[#StructGenericBar#]{{; name=.+$}} -// TYPE_IN_CONSTRUCTOR_PARAM_GENERIC_1-DAG: Decl[GenericTypeParam]/CurrNominal: StructGenericBaz[#StructGenericBaz#]{{; name=.+$}} +// TYPE_IN_CONSTRUCTOR_PARAM_GENERIC_1-DAG: Decl[GenericTypeParam]/Local: StructGenericFoo[#StructGenericFoo#]{{; name=.+$}} +// TYPE_IN_CONSTRUCTOR_PARAM_GENERIC_1-DAG: Decl[GenericTypeParam]/Local: StructGenericBar[#StructGenericBar#]{{; name=.+$}} +// TYPE_IN_CONSTRUCTOR_PARAM_GENERIC_1-DAG: Decl[GenericTypeParam]/Local: StructGenericBaz[#StructGenericBaz#]{{; name=.+$}} // TYPE_IN_CONSTRUCTOR_PARAM_GENERIC_1: End completions struct TestTypeInConstructorParamGeneric2 { @@ -580,9 +580,9 @@ struct TestTypeInConstructorParamGeneric3< // TYPE_IN_CONSTRUCTOR_PARAM_GENERIC_3: Begin completions // Generic parameters of the struct. -// TYPE_IN_CONSTRUCTOR_PARAM_GENERIC_3-DAG: Decl[GenericTypeParam]/CurrNominal: StructGenericFoo[#StructGenericFoo#]{{; name=.+$}} -// TYPE_IN_CONSTRUCTOR_PARAM_GENERIC_3-DAG: Decl[GenericTypeParam]/CurrNominal: StructGenericBar[#StructGenericBar#]{{; name=.+$}} -// TYPE_IN_CONSTRUCTOR_PARAM_GENERIC_3-DAG: Decl[GenericTypeParam]/CurrNominal: StructGenericBaz[#StructGenericBaz#]{{; name=.+$}} +// TYPE_IN_CONSTRUCTOR_PARAM_GENERIC_3-DAG: Decl[GenericTypeParam]/Local: StructGenericFoo[#StructGenericFoo#]{{; name=.+$}} +// TYPE_IN_CONSTRUCTOR_PARAM_GENERIC_3-DAG: Decl[GenericTypeParam]/Local: StructGenericBar[#StructGenericBar#]{{; name=.+$}} +// TYPE_IN_CONSTRUCTOR_PARAM_GENERIC_3-DAG: Decl[GenericTypeParam]/Local: StructGenericBaz[#StructGenericBaz#]{{; name=.+$}} // Generic parameters of the constructor. // TYPE_IN_CONSTRUCTOR_PARAM_GENERIC_3-DAG: Decl[GenericTypeParam]/Local: GenericFoo[#GenericFoo#]{{; name=.+$}} // TYPE_IN_CONSTRUCTOR_PARAM_GENERIC_3-DAG: Decl[GenericTypeParam]/Local: GenericBar[#GenericBar#]{{; name=.+$}} @@ -605,18 +605,18 @@ class A { } // TYPE_IN_RETURN_GEN_PARAM_NO_DUP: Begin completions -// TYPE_IN_RETURN_GEN_PARAM_NO_DUP-DAG: Decl[GenericTypeParam]/CurrNominal: T[#T#]; name=T -// TYPE_IN_RETURN_GEN_PARAM_NO_DUP-NOT: Decl[GenericTypeParam]/Local: T[#T#]; name=T +// TYPE_IN_RETURN_GEN_PARAM_NO_DUP-DAG: Decl[GenericTypeParam]/Local: T[#T#]; name=T +// TYPE_IN_RETURN_GEN_PARAM_NO_DUP-NOT: Decl[GenericTypeParam]/Local: T[#T#]; name=T // TYPE_IN_RETURN_GEN_PARAM_NO_DUP: End completions // TYPE_IVAR_GEN_PARAM_NO_DUP: Begin completions -// TYPE_IVAR_GEN_PARAM_NO_DUP-DAG: Decl[GenericTypeParam]/CurrNominal: T[#T#]; name=T -// TYPE_IVAR_GEN_PARAM_NO_DUP-NOT: Decl[GenericTypeParam]/Local: T[#T#]; name=T +// TYPE_IVAR_GEN_PARAM_NO_DUP-DAG: Decl[GenericTypeParam]/Local: T[#T#]; name=T +// TYPE_IVAR_GEN_PARAM_NO_DUP-NOT: Decl[GenericTypeParam]/Local: T[#T#]; name=T // TYPE_IVAR_GEN_PARAM_NO_DUP: End completions // TYPE_IN_SUBSCR_GEN_PARAM_NO_DUP: Begin completions -// TYPE_IN_SUBSCR_GEN_PARAM_NO_DUP-DAG: Decl[GenericTypeParam]/CurrNominal: T[#T#]; name=T -// TYPE_IN_SUBSCR_GEN_PARAM_NO_DUP-NOT: Decl[GenericTypeParam]/Local: T[#T#]; name=T +// TYPE_IN_SUBSCR_GEN_PARAM_NO_DUP-DAG: Decl[GenericTypeParam]/Local: T[#T#]; name=T +// TYPE_IN_SUBSCR_GEN_PARAM_NO_DUP-NOT: Decl[GenericTypeParam]/Local: T[#T#]; name=T // TYPE_IN_SUBSCR_GEN_PARAM_NO_DUP: End completions //===--- @@ -1013,7 +1013,7 @@ func testTypeIdentifierGeneric1< >(a: GenericFoo.#^TYPE_IDENTIFIER_GENERIC_1^# // TYPE_IDENTIFIER_GENERIC_1: Begin completions -// TYPE_IDENTIFIER_GENERIC_1-NEXT: Decl[AssociatedType]/Super: FooTypeAlias1{{; name=.+$}} +// TYPE_IDENTIFIER_GENERIC_1-NEXT: Decl[AssociatedType]/CurrNominal: FooTypeAlias1{{; name=.+$}} // TYPE_IDENTIFIER_GENERIC_1-NEXT: Keyword/None: Type[#GenericFoo.Type#] // TYPE_IDENTIFIER_GENERIC_1-NEXT: End completions @@ -1022,8 +1022,8 @@ func testTypeIdentifierGeneric2< >(a: GenericFoo.#^TYPE_IDENTIFIER_GENERIC_2^# // TYPE_IDENTIFIER_GENERIC_2: Begin completions -// TYPE_IDENTIFIER_GENERIC_2-NEXT: Decl[AssociatedType]/Super: BarTypeAlias1{{; name=.+$}} -// TYPE_IDENTIFIER_GENERIC_2-NEXT: Decl[AssociatedType]/Super: FooTypeAlias1{{; name=.+$}} +// TYPE_IDENTIFIER_GENERIC_2-NEXT: Decl[AssociatedType]/CurrNominal: BarTypeAlias1{{; name=.+$}} +// TYPE_IDENTIFIER_GENERIC_2-NEXT: Decl[AssociatedType]/CurrNominal: FooTypeAlias1{{; name=.+$}} // TYPE_IDENTIFIER_GENERIC_2-NEXT: Keyword/None: Type[#GenericFoo.Type#] // TYPE_IDENTIFIER_GENERIC_2-NEXT: End completions diff --git a/test/IDE/complete_type_subscript.swift b/test/IDE/complete_type_subscript.swift index cfbf9bb8b6050..e93fcf59a96e6 100644 --- a/test/IDE/complete_type_subscript.swift +++ b/test/IDE/complete_type_subscript.swift @@ -40,7 +40,7 @@ struct G0 { subscript(x: T) -> #^GEN_RETURN_0^# { return 0 } } // GEN_TOP_LEVEL_0: Keyword/None: Any[#Any#]; -// GEN_TOP_LEVEL_0: Decl[GenericTypeParam]/CurrNominal: T[#T#]; name=T +// GEN_TOP_LEVEL_0: Decl[GenericTypeParam]/Local: T[#T#]; name=T // GEN_TOP_LEVEL_0: Decl[Struct]/CurrModule: S0[#S0#]; // GEN_TOP_LEVEL_0: Decl[Struct]/OtherModule[Swift]: Int[#Int#]; @@ -100,7 +100,7 @@ extension G6 { subscript(b x: T.#^GEN_EXT_PARAM_6^#) -> Int { return 0 } subscript(b x: Int) -> T.#^GEN_EXT_RETURN_6^# { return 0 } } -// GEN_PARAM_6-DAG: Decl[AssociatedType]/Super: Assoc; +// GEN_PARAM_6-DAG: Decl[AssociatedType]/CurrNominal: Assoc; // GEN_PARAM_6-DAG: Keyword/None: Type[#T.Type#]; // RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=GENPROTO_PARAM_1 | %FileCheck %s -check-prefix=GENPROTO_1 @@ -116,5 +116,5 @@ extension GP1 { subscript(b x: I.#^GENPROTO_EXT_PARAM_1^#) -> Int { return 1 } subscript(b x: Int) -> I.#^GENPROTO_EXT_RETURN_1^# { return 1 } } -// GENPROTO_1-DAG: Decl[AssociatedType]/Super: Assoc; +// GENPROTO_1-DAG: Decl[AssociatedType]/CurrNominal: Assoc; // GENPROTO_1-DAG: Keyword/None: Type[#Self.I.Type#]; diff --git a/test/IDE/complete_value_expr.swift b/test/IDE/complete_value_expr.swift index 5bf21e2df4d59..b6ae225da9977 100644 --- a/test/IDE/complete_value_expr.swift +++ b/test/IDE/complete_value_expr.swift @@ -122,9 +122,9 @@ // RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=NODUP_RESTATED_REQ4 | %FileCheck %s -check-prefix=CHECK_NODUP_RESTATED_REQ // RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=NODUP_RESTATED_REQ5 | %FileCheck %s -check-prefix=CHECK_NODUP_RESTATED_REQ // RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=NODUP_RESTATED_REQ6 | %FileCheck %s -check-prefix=CHECK_NODUP_RESTATED_REQ -// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=NODUP_RESTATED_REQ_TYPE1 | %FileCheck %s -check-prefix=CHECK_NODUP_RESTATED_REQ_TYPE -// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=NODUP_RESTATED_REQ_TYPE2 | %FileCheck %s -check-prefix=CHECK_NODUP_RESTATED_REQ_TYPE -// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=NODUP_RESTATED_REQ_TYPE3 | %FileCheck %s -check-prefix=CHECK_NODUP_RESTATED_REQ_TYPE +// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=NODUP_RESTATED_REQ_TYPE1 | %FileCheck %s -check-prefix=CHECK_NODUP_RESTATED_REQ_TYPE1 +// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=NODUP_RESTATED_REQ_TYPE2 | %FileCheck %s -check-prefix=CHECK_NODUP_RESTATED_REQ_TYPE2 +// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=NODUP_RESTATED_REQ_TYPE3 | %FileCheck %s -check-prefix=CHECK_NODUP_RESTATED_REQ_TYPE3 // RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=NODUP_RESTATED_REQ_NODOT1 | %FileCheck %s -check-prefix=CHECK_NODUP_RESTATED_REQ_NODOT // RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=NODUP_RESTATED_REQ_NODOT2 | %FileCheck %s -check-prefix=CHECK_NODUP_RESTATED_REQ_NODOT // RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=NODUP_RESTATED_REQ_NODOT3 | %FileCheck %s -check-prefix=CHECK_NODUP_RESTATED_REQ_NODOT @@ -1006,10 +1006,10 @@ func testResolveFuncParam3(_ foo: Foo) { foo.#^RESOLVE_FUNC_PARAM_3^# // RESOLVE_FUNC_PARAM_3: Begin completions // RESOLVE_FUNC_PARAM_3-NEXT: Keyword[self]/CurrNominal: self[#Foo#]; name=self -// RESOLVE_FUNC_PARAM_3-NEXT: Decl[InstanceVar]/Super: fooInstanceVar1[#Int#]{{; name=.+$}} -// RESOLVE_FUNC_PARAM_3-NEXT: Decl[InstanceVar]/Super: fooInstanceVar2[#Int#]{{; name=.+$}} -// RESOLVE_FUNC_PARAM_3-NEXT: Decl[InstanceMethod]/Super: fooInstanceFunc0()[#Double#]{{; name=.+$}} -// RESOLVE_FUNC_PARAM_3-NEXT: Decl[InstanceMethod]/Super: fooInstanceFunc1({#(a): Int#})[#Double#]{{; name=.+$}} +// RESOLVE_FUNC_PARAM_3-NEXT: Decl[InstanceVar]/CurrNominal: fooInstanceVar1[#Int#]{{; name=.+$}} +// RESOLVE_FUNC_PARAM_3-NEXT: Decl[InstanceVar]/CurrNominal: fooInstanceVar2[#Int#]{{; name=.+$}} +// RESOLVE_FUNC_PARAM_3-NEXT: Decl[InstanceMethod]/CurrNominal: fooInstanceFunc0()[#Double#]{{; name=.+$}} +// RESOLVE_FUNC_PARAM_3-NEXT: Decl[InstanceMethod]/CurrNominal: fooInstanceFunc1({#(a): Int#})[#Double#]{{; name=.+$}} // RESOLVE_FUNC_PARAM_3-NEXT: End completions } @@ -1017,13 +1017,13 @@ func testResolveFuncParam4(_ fooBar: FooBar) fooBar.#^RESOLVE_FUNC_PARAM_4^# // RESOLVE_FUNC_PARAM_4: Begin completions // RESOLVE_FUNC_PARAM_4-NEXT: Keyword[self]/CurrNominal: self[#FooBar#]; name=self -// RESOLVE_FUNC_PARAM_4-NEXT: Decl[InstanceVar]/Super: barInstanceVar[#Int#]{{; name=.+$}} -// RESOLVE_FUNC_PARAM_4-NEXT: Decl[InstanceMethod]/Super: barInstanceFunc0()[#Double#]{{; name=.+$}} -// RESOLVE_FUNC_PARAM_4-NEXT: Decl[InstanceMethod]/Super: barInstanceFunc1({#(a): Int#})[#Double#]{{; name=.+$}} -// RESOLVE_FUNC_PARAM_4-NEXT: Decl[InstanceVar]/Super: fooInstanceVar1[#Int#]{{; name=.+$}} -// RESOLVE_FUNC_PARAM_4-NEXT: Decl[InstanceVar]/Super: fooInstanceVar2[#Int#]{{; name=.+$}} -// RESOLVE_FUNC_PARAM_4-NEXT: Decl[InstanceMethod]/Super: fooInstanceFunc0()[#Double#]{{; name=.+$}} -// RESOLVE_FUNC_PARAM_4-NEXT: Decl[InstanceMethod]/Super: fooInstanceFunc1({#(a): Int#})[#Double#]{{; name=.+$}} +// RESOLVE_FUNC_PARAM_4-NEXT: Decl[InstanceVar]/CurrNominal: barInstanceVar[#Int#]{{; name=.+$}} +// RESOLVE_FUNC_PARAM_4-NEXT: Decl[InstanceMethod]/CurrNominal: barInstanceFunc0()[#Double#]{{; name=.+$}} +// RESOLVE_FUNC_PARAM_4-NEXT: Decl[InstanceMethod]/CurrNominal: barInstanceFunc1({#(a): Int#})[#Double#]{{; name=.+$}} +// RESOLVE_FUNC_PARAM_4-NEXT: Decl[InstanceVar]/CurrNominal: fooInstanceVar1[#Int#]{{; name=.+$}} +// RESOLVE_FUNC_PARAM_4-NEXT: Decl[InstanceVar]/CurrNominal: fooInstanceVar2[#Int#]{{; name=.+$}} +// RESOLVE_FUNC_PARAM_4-NEXT: Decl[InstanceMethod]/CurrNominal: fooInstanceFunc0()[#Double#]{{; name=.+$}} +// RESOLVE_FUNC_PARAM_4-NEXT: Decl[InstanceMethod]/CurrNominal: fooInstanceFunc1({#(a): Int#})[#Double#]{{; name=.+$}} // RESOLVE_FUNC_PARAM_4-NEXT: End completions } @@ -1031,15 +1031,15 @@ func testResolveFuncParam5(_ a: FooE a.#^RESOLVE_FUNC_PARAM_5^# // RESOLVE_FUNC_PARAM_5: Begin completions // RESOLVE_FUNC_PARAM_5-NEXT: Keyword[self]/CurrNominal: self[#FooExBarEx#]; name=self -// RESOLVE_FUNC_PARAM_5-NEXT: Decl[InstanceVar]/Super: barInstanceVar[#Int#]{{; name=.+$}} +// RESOLVE_FUNC_PARAM_5-NEXT: Decl[InstanceVar]/Super: barInstanceVar[#Int#]{{; name=.+$}} // RESOLVE_FUNC_PARAM_5-NEXT: Decl[InstanceMethod]/Super: barInstanceFunc0()[#Double#]{{; name=.+$}} // RESOLVE_FUNC_PARAM_5-NEXT: Decl[InstanceMethod]/Super: barInstanceFunc1({#(a): Int#})[#Double#]{{; name=.+$}} -// RESOLVE_FUNC_PARAM_5-NEXT: Decl[InstanceMethod]/Super: barExInstanceFunc0()[#Double#]{{; name=.+$}} -// RESOLVE_FUNC_PARAM_5-NEXT: Decl[InstanceVar]/Super: fooInstanceVar1[#Int#]{{; name=.+$}} -// RESOLVE_FUNC_PARAM_5-NEXT: Decl[InstanceVar]/Super: fooInstanceVar2[#Int#]{{; name=.+$}} +// RESOLVE_FUNC_PARAM_5-NEXT: Decl[InstanceMethod]/CurrNominal: barExInstanceFunc0()[#Double#]{{; name=.+$}} +// RESOLVE_FUNC_PARAM_5-NEXT: Decl[InstanceVar]/Super: fooInstanceVar1[#Int#]{{; name=.+$}} +// RESOLVE_FUNC_PARAM_5-NEXT: Decl[InstanceVar]/Super: fooInstanceVar2[#Int#]{{; name=.+$}} // RESOLVE_FUNC_PARAM_5-NEXT: Decl[InstanceMethod]/Super: fooInstanceFunc0()[#Double#]{{; name=.+$}} // RESOLVE_FUNC_PARAM_5-NEXT: Decl[InstanceMethod]/Super: fooInstanceFunc1({#(a): Int#})[#Double#]{{; name=.+$}} -// RESOLVE_FUNC_PARAM_5-NEXT: Decl[InstanceMethod]/Super: fooExInstanceFunc0()[#Double#]{{; name=.+$}} +// RESOLVE_FUNC_PARAM_5-NEXT: Decl[InstanceMethod]/CurrNominal: fooExInstanceFunc0()[#Double#]{{; name=.+$}} // RESOLVE_FUNC_PARAM_5-NEXT: End completions } @@ -1047,13 +1047,13 @@ func testResolveFuncParam6(_ foo: Foo) { foo.#^RESOLVE_FUNC_PARAM_6^# // RESOLVE_FUNC_PARAM_6: Begin completions // RESOLVE_FUNC_PARAM_6-NEXT: Keyword[self]/CurrNominal: self[#Foo#]; name=self -// RESOLVE_FUNC_PARAM_6-NEXT: Decl[InstanceVar]/Super: fooInstanceVar1[#Int#]{{; name=.+$}} -// RESOLVE_FUNC_PARAM_6-NEXT: Decl[InstanceVar]/Super: fooInstanceVar2[#Int#]{{; name=.+$}} -// RESOLVE_FUNC_PARAM_6-NEXT: Decl[InstanceMethod]/Super: fooInstanceFunc0()[#Double#]{{; name=.+$}} -// RESOLVE_FUNC_PARAM_6-NEXT: Decl[InstanceMethod]/Super: fooInstanceFunc1({#(a): Int#})[#Double#]{{; name=.+$}} -// RESOLVE_FUNC_PARAM_6-NEXT: Decl[InstanceVar]/Super: fooClassInstanceVar[#Int#]{{; name=.+$}} -// RESOLVE_FUNC_PARAM_6-NEXT: Decl[InstanceMethod]/Super: fooClassInstanceFunc0()[#Void#]{{; name=.+$}} -// RESOLVE_FUNC_PARAM_6-NEXT: Decl[InstanceMethod]/Super: fooClassInstanceFunc1({#(a): Int#})[#Void#]{{; name=.+$}} +// RESOLVE_FUNC_PARAM_6-NEXT: Decl[InstanceVar]/CurrNominal: fooInstanceVar1[#Int#]{{; name=.+$}} +// RESOLVE_FUNC_PARAM_6-NEXT: Decl[InstanceVar]/CurrNominal: fooInstanceVar2[#Int#]{{; name=.+$}} +// RESOLVE_FUNC_PARAM_6-NEXT: Decl[InstanceMethod]/CurrNominal: fooInstanceFunc0()[#Double#]{{; name=.+$}} +// RESOLVE_FUNC_PARAM_6-NEXT: Decl[InstanceMethod]/CurrNominal: fooInstanceFunc1({#(a): Int#})[#Double#]{{; name=.+$}} +// RESOLVE_FUNC_PARAM_6-NEXT: Decl[InstanceVar]/CurrNominal: fooClassInstanceVar[#Int#]{{; name=.+$}} +// RESOLVE_FUNC_PARAM_6-NEXT: Decl[InstanceMethod]/CurrNominal: fooClassInstanceFunc0()[#Void#]{{; name=.+$}} +// RESOLVE_FUNC_PARAM_6-NEXT: Decl[InstanceMethod]/CurrNominal: fooClassInstanceFunc1({#(a): Int#})[#Void#]{{; name=.+$}} // RESOLVE_FUNC_PARAM_6-NEXT: End completions } @@ -1068,10 +1068,10 @@ class TestResolveConstructorParam2 { foo.#^RESOLVE_CONSTRUCTOR_PARAM_2^# // RESOLVE_CONSTRUCTOR_PARAM_2: Begin completions // RESOLVE_CONSTRUCTOR_PARAM_2-NEXT: Keyword[self]/CurrNominal: self[#Foo#]; name=self -// RESOLVE_CONSTRUCTOR_PARAM_2-NEXT: Decl[InstanceVar]/Super: fooInstanceVar1[#Int#]{{; name=.+$}} -// RESOLVE_CONSTRUCTOR_PARAM_2-NEXT: Decl[InstanceVar]/Super: fooInstanceVar2[#Int#]{{; name=.+$}} -// RESOLVE_CONSTRUCTOR_PARAM_2-NEXT: Decl[InstanceMethod]/Super: fooInstanceFunc0()[#Double#]{{; name=.+$}} -// RESOLVE_CONSTRUCTOR_PARAM_2-NEXT: Decl[InstanceMethod]/Super: fooInstanceFunc1({#(a): Int#})[#Double#]{{; name=.+$}} +// RESOLVE_CONSTRUCTOR_PARAM_2-NEXT: Decl[InstanceVar]/CurrNominal: fooInstanceVar1[#Int#]{{; name=.+$}} +// RESOLVE_CONSTRUCTOR_PARAM_2-NEXT: Decl[InstanceVar]/CurrNominal: fooInstanceVar2[#Int#]{{; name=.+$}} +// RESOLVE_CONSTRUCTOR_PARAM_2-NEXT: Decl[InstanceMethod]/CurrNominal: fooInstanceFunc0()[#Double#]{{; name=.+$}} +// RESOLVE_CONSTRUCTOR_PARAM_2-NEXT: Decl[InstanceMethod]/CurrNominal: fooInstanceFunc1({#(a): Int#})[#Double#]{{; name=.+$}} // RESOLVE_CONSTRUCTOR_PARAM_2-NEXT: End completions } } @@ -1081,10 +1081,10 @@ class TestResolveConstructorParam3 { foo.#^RESOLVE_CONSTRUCTOR_PARAM_3^# // RESOLVE_CONSTRUCTOR_PARAM_3: Begin completions // RESOLVE_CONSTRUCTOR_PARAM_3-NEXT: Keyword[self]/CurrNominal: self[#Foo#]; name=self -// RESOLVE_CONSTRUCTOR_PARAM_3-NEXT: Decl[InstanceVar]/Super: fooInstanceVar1[#Int#]{{; name=.+$}} -// RESOLVE_CONSTRUCTOR_PARAM_3-NEXT: Decl[InstanceVar]/Super: fooInstanceVar2[#Int#]{{; name=.+$}} -// RESOLVE_CONSTRUCTOR_PARAM_3-NEXT: Decl[InstanceMethod]/Super: fooInstanceFunc0()[#Double#]{{; name=.+$}} -// RESOLVE_CONSTRUCTOR_PARAM_3-NEXT: Decl[InstanceMethod]/Super: fooInstanceFunc1({#(a): Int#})[#Double#]{{; name=.+$}} +// RESOLVE_CONSTRUCTOR_PARAM_3-NEXT: Decl[InstanceVar]/CurrNominal: fooInstanceVar1[#Int#]{{; name=.+$}} +// RESOLVE_CONSTRUCTOR_PARAM_3-NEXT: Decl[InstanceVar]/CurrNominal: fooInstanceVar2[#Int#]{{; name=.+$}} +// RESOLVE_CONSTRUCTOR_PARAM_3-NEXT: Decl[InstanceMethod]/CurrNominal: fooInstanceFunc0()[#Double#]{{; name=.+$}} +// RESOLVE_CONSTRUCTOR_PARAM_3-NEXT: Decl[InstanceMethod]/CurrNominal: fooInstanceFunc1({#(a): Int#})[#Double#]{{; name=.+$}} // RESOLVE_CONSTRUCTOR_PARAM_3-NEXT: End completions } } @@ -1516,29 +1516,29 @@ func testGenericConforming1(x: T) { x.#^PROTOCOL_EXT_GENERICP1^# } // PROTOCOL_EXT_GENERICP1: Begin completions -// PROTOCOL_EXT_GENERICP1-DAG: Decl[InstanceMethod]/Super: reqP1()[#Void#]{{; name=.+$}} -// PROTOCOL_EXT_GENERICP1-DAG: Decl[InstanceMethod]/Super: extP1()[#Void#]{{; name=.+$}} +// PROTOCOL_EXT_GENERICP1-DAG: Decl[InstanceMethod]/CurrNominal: reqP1()[#Void#]{{; name=.+$}} +// PROTOCOL_EXT_GENERICP1-DAG: Decl[InstanceMethod]/CurrNominal: extP1()[#Void#]{{; name=.+$}} // PROTOCOL_EXT_GENERICP1: End completions func testGenericConforming2(x: T) { x.#^PROTOCOL_EXT_GENERICP2^# } // PROTOCOL_EXT_GENERICP2: Begin completions -// PROTOCOL_EXT_GENERICP2-DAG: Decl[InstanceMethod]/Super: reqP1()[#Void#]{{; name=.+$}} -// PROTOCOL_EXT_GENERICP2-DAG: Decl[InstanceMethod]/Super: reqP2()[#Void#]{{; name=.+$}} -// PROTOCOL_EXT_GENERICP2-DAG: Decl[InstanceMethod]/Super: extP1()[#Void#]{{; name=.+$}} -// PROTOCOL_EXT_GENERICP2-DAG: Decl[InstanceMethod]/Super: extP2()[#Void#]{{; name=.+$}} +// PROTOCOL_EXT_GENERICP2-DAG: Decl[InstanceMethod]/Super: reqP1()[#Void#]{{; name=.+$}} +// PROTOCOL_EXT_GENERICP2-DAG: Decl[InstanceMethod]/CurrNominal: reqP2()[#Void#]{{; name=.+$}} +// PROTOCOL_EXT_GENERICP2-DAG: Decl[InstanceMethod]/Super: extP1()[#Void#]{{; name=.+$}} +// PROTOCOL_EXT_GENERICP2-DAG: Decl[InstanceMethod]/CurrNominal: extP2()[#Void#]{{; name=.+$}} // PROTOCOL_EXT_GENERICP2: End completions func testGenericConforming3(x: T) { x.#^PROTOCOL_EXT_GENERICP3^# } // PROTOCOL_EXT_GENERICP3: Begin completions -// PROTOCOL_EXT_GENERICP3-DAG: Decl[InstanceMethod]/Super: reqP1()[#Void#]{{; name=.+$}} -// PROTOCOL_EXT_GENERICP3-DAG: Decl[InstanceMethod]/Super: reqP2()[#Void#]{{; name=.+$}} -// PROTOCOL_EXT_GENERICP3-DAG: Decl[InstanceMethod]/Super: extP1()[#Void#]{{; name=.+$}} -// PROTOCOL_EXT_GENERICP3-DAG: Decl[InstanceMethod]/Super: extP2()[#Void#]{{; name=.+$}} -// PROTOCOL_EXT_GENERICP3-DAG: Decl[InstanceMethod]/Super: extP3()[#Void#]{{; name=.+$}} +// PROTOCOL_EXT_GENERICP3-DAG: Decl[InstanceMethod]/Super: reqP1()[#Void#]{{; name=.+$}} +// PROTOCOL_EXT_GENERICP3-DAG: Decl[InstanceMethod]/Super: reqP2()[#Void#]{{; name=.+$}} +// PROTOCOL_EXT_GENERICP3-DAG: Decl[InstanceMethod]/Super: extP1()[#Void#]{{; name=.+$}} +// PROTOCOL_EXT_GENERICP3-DAG: Decl[InstanceMethod]/Super: extP2()[#Void#]{{; name=.+$}} +// PROTOCOL_EXT_GENERICP3-DAG: Decl[InstanceMethod]/CurrNominal: extP3()[#Void#]{{; name=.+$}} // PROTOCOL_EXT_GENERICP3: End completions protocol NoDupReq1 { @@ -1647,14 +1647,26 @@ func checkOverrideInclusion2(_ arg: Override3) { // CHECK_NODUP_RESTATED_REQ_NODOT-NOT: Decl[InstanceVar]/{{Super|CurrNominal}}: .doo[#Int#]; name=doo // CHECK_NODUP_RESTATED_REQ_NODOT: End completions -// CHECK_NODUP_RESTATED_REQ_TYPE: Begin completions -// CHECK_NODUP_RESTATED_REQ_TYPE-DAG: Decl[InstanceMethod]/Super: foo({#self: [[ARG:.+]]#})[#() -> Void#]; name=foo([[ARG]]) -// CHECK_NODUP_RESTATED_REQ_TYPE-DAG: Decl[InstanceMethod]/Super: roo({#self: [[ARG]]#})[#(arg1: Int) -> Void#]; name=roo([[ARG]]) -// CHECK_NODUP_RESTATED_REQ_TYPE-DAG: Decl[AssociatedType]/Super: E; name=E -// CHECK_NODUP_RESTATED_REQ_TYPE-DAG: Decl[InstanceMethod]/Super: roo({#self: [[ARG]]#})[#(arg2: Int) -> Void#]; name=roo([[ARG]]) -// CHECK_NODUP_RESTATED_REQ_TYPE-NOT: Decl[InstanceMethod]/Super: foo({#self: [[ARG:.+]]#})[#() -> Void#]; name=foo([[ARG]]) -// CHECK_NODUP_RESTATED_REQ_TYPE-NOT: Decl[AssociatedType]/Super: E; name=E -// CHECK_NODUP_RESTATED_REQ_TYPE: End completions +// CHECK_NODUP_RESTATED_REQ_TYPE1: Begin completions, 5 items +// CHECK_NODUP_RESTATED_REQ_TYPE1: Decl[InstanceMethod]/Super: foo({#self: NoDupReq6#})[#() -> Void#]; name=foo(NoDupReq6) +// CHECK_NODUP_RESTATED_REQ_TYPE1: Decl[InstanceMethod]/Super: roo({#self: NoDupReq6#})[#(arg1: Int) -> Void#]; name=roo(NoDupReq6 +// CHECK_NODUP_RESTATED_REQ_TYPE1: Decl[AssociatedType]/Super: E; name=E +// CHECK_NODUP_RESTATED_REQ_TYPE1: Decl[InstanceMethod]/CurrNominal: roo({#self: NoDupReq6#})[#(arg2: Int) -> Void#]; name=roo(NoDupReq6) +// CHECK_NODUP_RESTATED_REQ_TYPE1: End completions + +// CHECK_NODUP_RESTATED_REQ_TYPE2: Begin completions, 5 items +// CHECK_NODUP_RESTATED_REQ_TYPE2: Decl[InstanceMethod]/CurrNominal: foo({#self: NoDupReq1 & NoDupReq2 & NoDupReq3#})[#() -> Void#]; name=foo(NoDupReq1 & NoDupReq2 & NoDupReq3) +// CHECK_NODUP_RESTATED_REQ_TYPE2: Decl[InstanceMethod]/CurrNominal: roo({#self: NoDupReq1 & NoDupReq2 & NoDupReq3#})[#(arg1: Int) -> Void#]; name=roo(NoDupReq1 & NoDupReq2 & NoDupReq3) +// CHECK_NODUP_RESTATED_REQ_TYPE2: Decl[AssociatedType]/CurrNominal: E; name=E +// CHECK_NODUP_RESTATED_REQ_TYPE2: Decl[InstanceMethod]/CurrNominal: roo({#self: NoDupReq1 & NoDupReq2 & NoDupReq3#})[#(arg2: Int) -> Void#]; name=roo(NoDupReq1 & NoDupReq2 & NoDupReq3) +// CHECK_NODUP_RESTATED_REQ_TYPE2: End completions + +// CHECK_NODUP_RESTATED_REQ_TYPE3: Begin completions, 5 items +// CHECK_NODUP_RESTATED_REQ_TYPE3: Decl[InstanceMethod]/CurrNominal: foo({#self: NoDupReq1 & NoDupReq2 & NoDupReq3#})[#() -> Void#]; name=foo(NoDupReq1 & NoDupReq2 & NoDupReq3) +// CHECK_NODUP_RESTATED_REQ_TYPE3: Decl[InstanceMethod]/CurrNominal: roo({#self: NoDupReq1 & NoDupReq2 & NoDupReq3#})[#(arg1: Int) -> Void#]; name=roo(NoDupReq1 & NoDupReq2 & NoDupReq3) +// CHECK_NODUP_RESTATED_REQ_TYPE3: Decl[AssociatedType]/CurrNominal: E; name=E +// CHECK_NODUP_RESTATED_REQ_TYPE3: Decl[InstanceMethod]/CurrNominal: roo({#self: NoDupReq1 & NoDupReq2 & NoDupReq3#})[#(arg2: Int) -> Void#]; name=roo(NoDupReq1 & NoDupReq2 & NoDupReq3) +// CHECK_NODUP_RESTATED_REQ_TYPE3: End completions // CHECK_PROT_OVERRIDES: Decl[InstanceMethod]/{{Super|CurrNominal}}: foo({#(arg): NoDupReq1#})[#Void#]; name=foo(arg: NoDupReq1) // CHECK_PROT_OVERRIDES: Decl[InstanceMethod]/{{Super|CurrNominal}}: foo({#(arg): NoDupReq2#})[#Void#]; name=foo(arg: NoDupReq2) @@ -1715,8 +1727,8 @@ extension Concrete1 { } // PROTOCOL_EXT_P4_P1: Begin completions // PROTOCOL_EXT_P4_P1-NOT: extP4OnlyMe() -// PROTOCOL_EXT_P4_P1-DAG: Decl[InstanceMethod]/Super: extP4WhenP1()[#Void#]{{; name=.+$}} -// PROTOCOL_EXT_P4_P1-DAG: Decl[InstanceVar]/Super: x[#Int#]{{; name=.+$}} +// PROTOCOL_EXT_P4_P1-DAG: Decl[InstanceMethod]/{{Super|CurrNominal}}: extP4WhenP1()[#Void#]{{; name=.+$}} +// PROTOCOL_EXT_P4_P1-DAG: Decl[InstanceVar]/{{Super|CurrNominal}}: x[#Int#]{{; name=.+$}} // PROTOCOL_EXT_P4_P1-NOT: extP4OnlyMe() // PROTOCOL_EXT_P4_P1: End completions @@ -1746,13 +1758,13 @@ extension Concrete2 { // PROTOCOL_EXT_P4_ONLYME: Begin completions // PROTOCOL_EXT_P4_ONLYME-NOT: extP4WhenP1() // PROTOCOL_EXT_P4_ONLYME-NOT: x[#Int#] -// PROTOCOL_EXT_P4_ONLYME-DAG: Decl[InstanceMethod]/Super: extP4OnlyMe()[#Void#]{{; name=.+$}} +// PROTOCOL_EXT_P4_ONLYME-DAG: Decl[InstanceMethod]/{{Super|CurrNominal}}: extP4OnlyMe()[#Void#]{{; name=.+$}} // PROTOCOL_EXT_P4_ONLYME-NOT: extP4WhenP1() // PROTOCOL_EXT_P4_ONLYME-NOT: x[#Int#] // PROTOCOL_EXT_P4_ONLYME: End completions // PROTOCOL_EXT_P4_ONLYME_SUB: Begin completions -// PROTOCOL_EXT_P4_ONLYME_SUB: Decl[Subscript]/Super: [{#Int#}][#Int#]{{; name=.+$}} +// PROTOCOL_EXT_P4_ONLYME_SUB: Decl[Subscript]/{{Super|CurrNominal}}: [{#Int#}][#Int#]{{; name=.+$}} // PROTOCOL_EXT_P4_ONLYME_SUB: End completions func testTypealias1() { @@ -1770,7 +1782,7 @@ func testProtExtInit1() { } // PROTOCOL_EXT_INIT_1: Begin completions -// PROTOCOL_EXT_INIT_1: Decl[Constructor]/Super: ['(']{#x: Int#}[')'][#Concrete1#]{{; name=.+$}} +// PROTOCOL_EXT_INIT_1: Decl[Constructor]/{{Super|CurrNominal}}: ['(']{#x: Int#}[')'][#Concrete1#]{{; name=.+$}} // PROTOCOL_EXT_INIT_1: End completions func testProtExtInit2() { @@ -1779,9 +1791,9 @@ func testProtExtInit2() { S#^PROTOCOL_EXT_INIT_4^# } -// PROTOCOL_EXT_INIT_2: Decl[Constructor]/Super: ['(']{#x: Int#}[')'][#P4#]{{; name=.+$}} -// PROTOCOL_EXT_INIT_3: Decl[Constructor]/Super: init({#x: Int#})[#P4#]{{; name=.+$}} -// PROTOCOL_EXT_INIT_4: Decl[Constructor]/Super: ({#x: Int#})[#P4#]{{; name=.+$}} +// PROTOCOL_EXT_INIT_2: Decl[Constructor]/CurrNominal: ['(']{#x: Int#}[')'][#P4#]{{; name=.+$}} +// PROTOCOL_EXT_INIT_3: Decl[Constructor]/CurrNominal: init({#x: Int#})[#P4#]{{; name=.+$}} +// PROTOCOL_EXT_INIT_4: Decl[Constructor]/CurrNominal: ({#x: Int#})[#P4#]{{; name=.+$}} extension P4 where Self.T == OnlyMe { final func test1() { @@ -1793,7 +1805,7 @@ extension P4 where Self.T == OnlyMe { } // PROTOCOL_EXT_P4_DOT: Begin completions // PROTOCOL_EXT_P4_DOT-NOT: extP4WhenP1() -// PROTOCOL_EXT_P4_DOT-DAG: Decl[InstanceMethod]/Super: extP4OnlyMe()[#Void#]{{; name=.+$}} +// PROTOCOL_EXT_P4_DOT-DAG: Decl[InstanceMethod]/{{Super|CurrNominal}}: extP4OnlyMe()[#Void#]{{; name=.+$}} // PROTOCOL_EXT_P4_DOT-NOT: extP4WhenP1() // PROTOCOL_EXT_P4_DOT: End completions @@ -1850,10 +1862,12 @@ struct dedupS : dedupP { func testDeDuped(_ x: dedupS) { x#^PROTOCOL_EXT_DEDUP_1^# // FIXME: Should produce 3 items (?) -// PROTOCOL_EXT_DEDUP_1: Begin completions, 7 items + +// PROTOCOL_EXT_DEDUP_1: Begin completions, 5 items // PROTOCOL_EXT_DEDUP_1: Decl[InstanceMethod]/CurrNominal: .foo()[#Int#]; name=foo() // PROTOCOL_EXT_DEDUP_1: Decl[InstanceVar]/CurrNominal: .bar[#Int#]; name=bar // PROTOCOL_EXT_DEDUP_1: Decl[Subscript]/CurrNominal: [{#Int#}][#Int#]; name=[Int] +// PROTOCOL_EXT_DEDUP_1: Decl[InstanceVar]/Super: .bar[#Int#]; name=bar // PROTOCOL_EXT_DEDUP_1: Keyword[self]/CurrNominal: .self[#dedupS#]; name=self // PROTOCOL_EXT_DEDUP_1: End completions } @@ -1869,10 +1883,10 @@ func testDeDuped2(_ x: dedupP) { func testDeDuped3(_ x: T) { x#^PROTOCOL_EXT_DEDUP_3^# // PROTOCOL_EXT_DEDUP_3: Begin completions, 5 items -// PROTOCOL_EXT_DEDUP_3: Decl[InstanceMethod]/Super: .foo()[#Int#]; name=foo() -// PROTOCOL_EXT_DEDUP_3: Decl[InstanceVar]/Super: .bar[#Int#]; name=bar -// PROTOCOL_EXT_DEDUP_3: Decl[Subscript]/Super: [{#Self.T#}][#Self.T#]; name=[Self.T] -// PROTOCOL_EXT_DEDUP_3: Keyword[self]/CurrNominal: .self[#T#]; name=self +// PROTOCOL_EXT_DEDUP_3: Decl[InstanceMethod]/CurrNominal: .foo()[#Int#]; name=foo() +// PROTOCOL_EXT_DEDUP_3: Decl[InstanceVar]/CurrNominal: .bar[#Int#]; name=bar +// PROTOCOL_EXT_DEDUP_3: Decl[Subscript]/CurrNominal: [{#Self.T#}][#Self.T#]; name=[Self.T] +// PROTOCOL_EXT_DEDUP_3: Keyword[self]/CurrNominal: .self[#T#]; name=self // PROTOCOL_EXT_DEDUP_3: End completions } diff --git a/test/IDE/complete_where_clause.swift b/test/IDE/complete_where_clause.swift index 0b0af5eea878e..6b48840ff7a66 100644 --- a/test/IDE/complete_where_clause.swift +++ b/test/IDE/complete_where_clause.swift @@ -76,8 +76,7 @@ func ab(_ arg: T) where T.#^FUNC_ASSOC_NODUP_1^# func ab(_ arg: T) where T.#^FUNC_ASSOC_NODUP_2^# // GEN_T_ASSOC_E: Begin completions, 2 items -// GEN_T_ASSOC_E-NEXT: Decl[AssociatedType]/Super: E; name=E -// GEN_T_ASSOC_E-NOT: Decl[AssociatedType]/Super: E; name=E +// GEN_T_ASSOC_E-NEXT: Decl[AssociatedType]/{{Super|CurrNominal}}: E; name=E // GEN_T_ASSOC_E-NEXT: Keyword/None: Type[#T.Type#]; // GEN_T_ASSOC_E: End completions @@ -94,7 +93,7 @@ func f2(_: T) where T.#^FUNC_2^# {} // GEN_T_DOT: End completions func f2b(_: T) where T.#^FUNC_2_ASSOC^# {} // GEN_T_ASSOC_DOT: Begin completions -// GEN_T_ASSOC_DOT-DAG: Decl[AssociatedType]/Super: Q; +// GEN_T_ASSOC_DOT-DAG: Decl[AssociatedType]/{{Super|CurrNominal}}: Q; // GEN_T_ASSOC_DOT-DAG: Keyword/None: Type[#T.Type#]; // GEN_T_ASSOC_DOT-NOT: Keyword/CurrNominal: self[#T#]; // GEN_T_ASSOC_DOT: End completions @@ -119,7 +118,7 @@ class C1 where #^CLASS_1^# {} class C2 where T.#^CLASS_2^# {} enum E1 where #^ENUM_1^# {} enum E2 where T.#^ENUM_2^# {} -// GEN_T_NOMINAL: Decl[GenericTypeParam]/CurrNominal: T[#T#]; name=T +// GEN_T_NOMINAL: Decl[GenericTypeParam]/Local: T[#T#]; name=T protocol P2 { associatedtype T where #^ASSOC_1^# @@ -127,9 +126,9 @@ protocol P2 { } // P2: Begin completions -// P2-DAG: Decl[GenericTypeParam]/Super: Self[#Self#]; -// P2-DAG: Decl[AssociatedType]/Super: T; -// P2-DAG: Decl[AssociatedType]/Super: U; +// P2-DAG: Decl[GenericTypeParam]/Local: Self[#Self#]; +// P2-DAG: Decl[AssociatedType]/{{Super|CurrNominal}}: T; +// P2-DAG: Decl[AssociatedType]/{{Super|CurrNominal}}: U; // P2: End completions // U_DOT: Begin completions diff --git a/test/Sema/typo_correction.swift b/test/Sema/typo_correction.swift index af9010bd28bde..c011bd11c618a 100644 --- a/test/Sema/typo_correction.swift +++ b/test/Sema/typo_correction.swift @@ -113,10 +113,12 @@ struct Generic { } protocol P { // expected-note {{'P' previously declared here}} + // expected-note@-1 {{did you mean 'P'?}} typealias a = Generic } protocol P {} // expected-error {{invalid redeclaration of 'P'}} +// expected-note@-1 {{did you mean 'P'?}} func hasTypo() { _ = P.a.a // expected-error {{type 'P.a' (aka 'Generic') has no member 'a'}} @@ -170,7 +172,7 @@ class CircularValidationWithTypo { // Crash with invalid extension that has not been bound -- https://bugs.swift.org/browse/SR-8984 protocol PP {} -func boo() { // expected-note {{did you mean 'boo'?}} +func boo() { extension PP { // expected-error {{declaration is only valid at file scope}} func g() { booo() // expected-error {{use of unresolved identifier 'booo'}} @@ -197,3 +199,22 @@ func testFwdRef() { let _ = forward_refX + 1 // expected-error {{use of unresolved identifier 'forward_refX'}} let forward_ref1 = 4 } + +// Crash with protocol members. +protocol P1 { + associatedtype A1 + associatedtype A2 +} + +protocol P2 { + associatedtype A1 + associatedtype A2 + + func method(_: T) where T.A1 == A1, T.A2 == A2 +} + +extension P2 { + func f() { // expected-note {{did you mean 'f'?}} + _ = a // expected-error {{use of unresolved identifier 'a'}} + } +} diff --git a/test/SourceKit/CodeComplete/complete_optionalmethod.swift.response b/test/SourceKit/CodeComplete/complete_optionalmethod.swift.response index ce45a7cd3b4e6..098b1afbe973a 100644 --- a/test/SourceKit/CodeComplete/complete_optionalmethod.swift.response +++ b/test/SourceKit/CodeComplete/complete_optionalmethod.swift.response @@ -6,7 +6,7 @@ key.sourcetext: "optionalMethod?()", key.description: "optionalMethod?()", key.typename: "Int", - key.context: source.codecompletion.context.superclass, + key.context: source.codecompletion.context.thisclass, key.num_bytes_to_erase: 0, key.associated_usrs: "c:@M@complete_optionalmethod@objc(pl)Proto(im)optionalMethod", key.modulename: "complete_optionalmethod"