Skip to content

Commit 196f732

Browse files
committed
[CSFix] Introduce a fix for inaccessible members
If there are no other choices, let's attempt to use any available inaccessible candidates.
1 parent 53a9b1f commit 196f732

File tree

3 files changed

+41
-4
lines changed

3 files changed

+41
-4
lines changed

lib/Sema/CSFix.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,3 +384,13 @@ MoveOutOfOrderArgument *MoveOutOfOrderArgument::create(
384384
return new (cs.getAllocator())
385385
MoveOutOfOrderArgument(cs, argIdx, prevArgIdx, bindings, locator);
386386
}
387+
388+
bool AllowInaccessibleMember::diagnose(Expr *root, bool asNote) const {
389+
return false;
390+
}
391+
392+
AllowInaccessibleMember *
393+
AllowInaccessibleMember::create(ConstraintSystem &cs, ValueDecl *member,
394+
ConstraintLocator *locator) {
395+
return new (cs.getAllocator()) AllowInaccessibleMember(cs, member, locator);
396+
}

lib/Sema/CSFix.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,10 @@ enum class FixKind : uint8_t {
132132

133133
/// If there is out-of-order argument, let's fix that by re-ordering.
134134
MoveOutOfOrderArgument,
135+
136+
/// If there is a matching inaccessible member - allow it as if there
137+
/// no access control.
138+
AllowInaccessibleMember,
135139
};
136140

137141
class ConstraintFix {
@@ -713,6 +717,26 @@ class MoveOutOfOrderArgument final : public ConstraintFix {
713717
ConstraintLocator *locator);
714718
};
715719

720+
class AllowInaccessibleMember final : public ConstraintFix {
721+
ValueDecl *Member;
722+
723+
AllowInaccessibleMember(ConstraintSystem &cs, ValueDecl *member,
724+
ConstraintLocator *locator)
725+
: ConstraintFix(cs, FixKind::AllowInaccessibleMember, locator),
726+
Member(member) {}
727+
728+
public:
729+
std::string getName() const override {
730+
return "allow inaccessible member reference";
731+
}
732+
733+
bool diagnose(Expr *root, bool asNote = false) const override;
734+
735+
static AllowInaccessibleMember *create(ConstraintSystem &cs,
736+
ValueDecl *member,
737+
ConstraintLocator *locator);
738+
};
739+
716740
} // end namespace constraints
717741
} // end namespace swift
718742

lib/Sema/CSSimplify.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4160,10 +4160,12 @@ fixMemberRef(ConstraintSystem &cs, Type baseTy,
41604160
case MemberLookupResult::UR_TypeMemberOnInstance:
41614161
return AllowTypeOrInstanceMember::create(cs, baseTy, memberName, locator);
41624162

4163+
case MemberLookupResult::UR_Inaccessible:
4164+
return AllowInaccessibleMember::create(cs, decl, locator);
4165+
41634166
case MemberLookupResult::UR_MutatingMemberOnRValue:
41644167
case MemberLookupResult::UR_MutatingGetterOnRValue:
41654168
case MemberLookupResult::UR_LabelMismatch:
4166-
case MemberLookupResult::UR_Inaccessible:
41674169
case MemberLookupResult::UR_UnavailableInExistential:
41684170
break;
41694171
}
@@ -4187,9 +4189,9 @@ ConstraintSystem::SolutionKind ConstraintSystem::simplifyMemberConstraint(
41874189

41884190
auto locator = getConstraintLocator(locatorB);
41894191
MemberLookupResult result =
4190-
performMemberLookup(kind, member, baseTy, functionRefKind, locator,
4191-
/*includeInaccessibleMembers*/false);
4192-
4192+
performMemberLookup(kind, member, baseTy, functionRefKind, locator,
4193+
/*includeInaccessibleMembers*/ shouldAttemptFixes());
4194+
41934195
switch (result.OverallResult) {
41944196
case MemberLookupResult::Unsolved:
41954197
// If requested, generate a constraint.
@@ -6195,6 +6197,7 @@ ConstraintSystem::SolutionKind ConstraintSystem::simplifyFixConstraint(
61956197
case FixKind::AllowInvalidInitRef:
61966198
case FixKind::AllowClosureParameterDestructuring:
61976199
case FixKind::MoveOutOfOrderArgument:
6200+
case FixKind::AllowInaccessibleMember:
61986201
llvm_unreachable("handled elsewhere");
61996202
}
62006203

0 commit comments

Comments
 (0)