Skip to content

Commit 8a8f7c8

Browse files
marcelofabrinkcsgexi
authored andcommitted
[SourceKit] Add accessibility in extension structure (SR-4823) (#11260)
1 parent 106f4be commit 8a8f7c8

File tree

3 files changed

+76
-10
lines changed

3 files changed

+76
-10
lines changed

test/SourceKit/DocumentStructure/Inputs/access.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,12 @@ extension PrivAccess {
8989
private extension PubAccess {
9090
func privExtFunc() {}
9191
}
92+
internal extension DefAccess {
93+
func internalExtFunc() {}
94+
}
95+
public extension PubAccess {
96+
func publicExtFunc() {}
97+
}
9298

9399
typealias defAlias = Int
94100
public typealias pubAlias = Int

test/SourceKit/DocumentStructure/access_parse.swift.response

Lines changed: 58 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
key.offset: 0,
3-
key.length: 1758,
3+
key.length: 1876,
44
key.diagnostic_stage: source.diagnostic.stage.swift.parse,
55
key.substructure: [
66
{
@@ -630,6 +630,7 @@
630630
},
631631
{
632632
key.kind: source.lang.swift.decl.extension,
633+
key.accessibility: source.lang.swift.accessibility.private,
633634
key.name: "PubAccess",
634635
key.offset: 1584,
635636
key.length: 47,
@@ -651,40 +652,88 @@
651652
}
652653
]
653654
},
655+
{
656+
key.kind: source.lang.swift.decl.extension,
657+
key.accessibility: source.lang.swift.accessibility.internal,
658+
key.name: "DefAccess",
659+
key.offset: 1641,
660+
key.length: 51,
661+
key.nameoffset: 1651,
662+
key.namelength: 9,
663+
key.bodyoffset: 1662,
664+
key.bodylength: 29,
665+
key.substructure: [
666+
{
667+
key.kind: source.lang.swift.decl.function.method.instance,
668+
key.accessibility: source.lang.swift.accessibility.internal,
669+
key.name: "internalExtFunc()",
670+
key.offset: 1665,
671+
key.length: 25,
672+
key.nameoffset: 1670,
673+
key.namelength: 17,
674+
key.bodyoffset: 1689,
675+
key.bodylength: 0
676+
}
677+
]
678+
},
679+
{
680+
key.kind: source.lang.swift.decl.extension,
681+
key.accessibility: source.lang.swift.accessibility.public,
682+
key.name: "PubAccess",
683+
key.offset: 1700,
684+
key.length: 49,
685+
key.nameoffset: 1710,
686+
key.namelength: 9,
687+
key.bodyoffset: 1721,
688+
key.bodylength: 27,
689+
key.substructure: [
690+
{
691+
key.kind: source.lang.swift.decl.function.method.instance,
692+
key.accessibility: source.lang.swift.accessibility.public,
693+
key.name: "publicExtFunc()",
694+
key.offset: 1724,
695+
key.length: 23,
696+
key.nameoffset: 1729,
697+
key.namelength: 15,
698+
key.bodyoffset: 1746,
699+
key.bodylength: 0
700+
}
701+
]
702+
},
654703
{
655704
key.kind: source.lang.swift.decl.typealias,
656705
key.accessibility: source.lang.swift.accessibility.internal,
657706
key.name: "defAlias",
658-
key.offset: 1633,
707+
key.offset: 1751,
659708
key.length: 24,
660-
key.nameoffset: 1643,
709+
key.nameoffset: 1761,
661710
key.namelength: 8
662711
},
663712
{
664713
key.kind: source.lang.swift.decl.typealias,
665714
key.accessibility: source.lang.swift.accessibility.public,
666715
key.name: "pubAlias",
667-
key.offset: 1665,
716+
key.offset: 1783,
668717
key.length: 24,
669-
key.nameoffset: 1675,
718+
key.nameoffset: 1793,
670719
key.namelength: 8
671720
},
672721
{
673722
key.kind: source.lang.swift.decl.typealias,
674723
key.accessibility: source.lang.swift.accessibility.private,
675724
key.name: "privAlias",
676-
key.offset: 1698,
725+
key.offset: 1816,
677726
key.length: 25,
678-
key.nameoffset: 1708,
727+
key.nameoffset: 1826,
679728
key.namelength: 9
680729
},
681730
{
682731
key.kind: source.lang.swift.decl.typealias,
683732
key.accessibility: source.lang.swift.accessibility.internal,
684733
key.name: "intAlias",
685-
key.offset: 1733,
734+
key.offset: 1851,
686735
key.length: 24,
687-
key.nameoffset: 1743,
736+
key.nameoffset: 1861,
688737
key.namelength: 8
689738
}
690739
]

tools/SourceKit/lib/SwiftLang/SwiftEditor.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -912,13 +912,21 @@ static UIdent getAccessibilityUID(Accessibility Access) {
912912
llvm_unreachable("Unhandled Accessibility in switch.");
913913
}
914914

915-
static Accessibility inferDefaultAccessibility(const ExtensionDecl *ED) {
915+
static Optional<Accessibility> getAccessibilityStrictly(const ExtensionDecl *ED) {
916916
if (ED->hasDefaultAccessibility())
917917
return ED->getDefaultAccessibility();
918918

919+
// Check if the decl has an explicit accessibility attribute.
919920
if (auto *AA = ED->getAttrs().getAttribute<AccessibilityAttr>())
920921
return AA->getAccess();
921922

923+
return None;
924+
}
925+
926+
static Accessibility inferDefaultAccessibility(const ExtensionDecl *ED) {
927+
if (auto StrictAccess = getAccessibilityStrictly(ED))
928+
return StrictAccess.getValue();
929+
922930
// Assume "internal", which is the most common thing anyway.
923931
return Accessibility::Internal;
924932
}
@@ -1025,6 +1033,9 @@ class SwiftDocumentStructureWalker: public ide::SyntaxModelWalker {
10251033
if (Node.Kind != SyntaxStructureKind::Parameter) {
10261034
if (auto *VD = dyn_cast_or_null<ValueDecl>(Node.Dcl)) {
10271035
AccessLevel = getAccessibilityUID(inferAccessibility(VD));
1036+
} else if (auto *ED = dyn_cast_or_null<ExtensionDecl>(Node.Dcl)) {
1037+
if (auto StrictAccess = getAccessibilityStrictly(ED))
1038+
AccessLevel = getAccessibilityUID(StrictAccess.getValue());
10281039
}
10291040
if (auto *ASD = dyn_cast_or_null<AbstractStorageDecl>(Node.Dcl)) {
10301041
Optional<Accessibility> SetAccess = inferSetterAccessibility(ASD);

0 commit comments

Comments
 (0)