@@ -534,20 +534,29 @@ class LabelingFailure final : public FailureDiagnostic {
534534 bool diagnoseAsNote () override ;
535535};
536536
537+ // / A diagnostic that will be emitted on the base if its locator points to a
538+ // / member access.
539+ class MemberReferenceFailure : public FailureDiagnostic {
540+ public:
541+ MemberReferenceFailure (const Solution &solution, ConstraintLocator *locator)
542+ : FailureDiagnostic(solution, locator) {}
543+
544+ ASTNode getAnchor () const override ;
545+ };
546+
537547// / Diagnose failures related to attempting member access on optional base
538548// / type without optional chaining or force-unwrapping it first.
539- class MemberAccessOnOptionalBaseFailure final : public FailureDiagnostic {
549+ class MemberAccessOnOptionalBaseFailure final : public MemberReferenceFailure {
540550 DeclNameRef Member;
541551 Type MemberBaseType;
542552 bool ResultTypeIsOptional;
543553
544554public:
545555 MemberAccessOnOptionalBaseFailure (const Solution &solution,
546556 ConstraintLocator *locator,
547- DeclNameRef memberName,
548- Type memberBaseType,
557+ DeclNameRef memberName, Type memberBaseType,
549558 bool resultOptional)
550- : FailureDiagnostic (solution, locator), Member(memberName),
559+ : MemberReferenceFailure (solution, locator), Member(memberName),
551560 MemberBaseType (resolveType(memberBaseType)),
552561 ResultTypeIsOptional(resultOptional) {}
553562
@@ -1127,6 +1136,8 @@ class PropertyWrapperReferenceFailure : public ContextualFailure {
11271136 : ContextualFailure(solution, base, wrapper, locator), Property(property),
11281137 UsingProjection (usingProjection) {}
11291138
1139+ ASTNode getAnchor () const override ;
1140+
11301141 VarDecl *getProperty () const { return Property; }
11311142
11321143 Identifier getPropertyName () const { return Property->getName (); }
@@ -1201,14 +1212,14 @@ class SubscriptMisuseFailure final : public FailureDiagnostic {
12011212 bool diagnoseAsNote () override ;
12021213};
12031214
1204- class InvalidMemberRefFailure : public FailureDiagnostic {
1215+ class InvalidMemberRefFailure : public MemberReferenceFailure {
12051216 Type BaseType;
12061217 DeclNameRef Name;
12071218
12081219public:
12091220 InvalidMemberRefFailure (const Solution &solution, Type baseType,
12101221 DeclNameRef memberName, ConstraintLocator *locator)
1211- : FailureDiagnostic (solution, locator),
1222+ : MemberReferenceFailure (solution, locator),
12121223 BaseType (baseType->getRValueType ()), Name(memberName) {}
12131224
12141225protected:
@@ -1334,7 +1345,7 @@ class InvalidMemberRefOnExistential final : public InvalidMemberRefFailure {
13341345// /
13351346// / }
13361347// / ```
1337- class AllowTypeOrInstanceMemberFailure final : public FailureDiagnostic {
1348+ class AllowTypeOrInstanceMemberFailure final : public MemberReferenceFailure {
13381349 Type BaseType;
13391350 ValueDecl *Member;
13401351 DeclNameRef Name;
@@ -1343,7 +1354,7 @@ class AllowTypeOrInstanceMemberFailure final : public FailureDiagnostic {
13431354 AllowTypeOrInstanceMemberFailure (const Solution &solution, Type baseType,
13441355 ValueDecl *member, DeclNameRef name,
13451356 ConstraintLocator *locator)
1346- : FailureDiagnostic (solution, locator),
1357+ : MemberReferenceFailure (solution, locator),
13471358 BaseType (baseType->getRValueType ()), Member(member), Name(name) {
13481359 assert (member);
13491360 }
0 commit comments