Skip to content

Commit 86d9e91

Browse files
committed
Only add accessibility if explicit
1 parent edd8ceb commit 86d9e91

File tree

6 files changed

+77
-21
lines changed

6 files changed

+77
-21
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: 57 additions & 13 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
{
@@ -538,7 +538,6 @@
538538
},
539539
{
540540
key.kind: source.lang.swift.decl.extension,
541-
key.accessibility: source.lang.swift.accessibility.internal,
542541
key.name: "DefAccess",
543542
key.offset: 1399,
544543
key.length: 43,
@@ -562,7 +561,6 @@
562561
},
563562
{
564563
key.kind: source.lang.swift.decl.extension,
565-
key.accessibility: source.lang.swift.accessibility.internal,
566564
key.name: "PubAccess",
567565
key.offset: 1443,
568566
key.length: 43,
@@ -586,7 +584,6 @@
586584
},
587585
{
588586
key.kind: source.lang.swift.decl.extension,
589-
key.accessibility: source.lang.swift.accessibility.internal,
590587
key.name: "IntAccess",
591588
key.offset: 1487,
592589
key.length: 43,
@@ -610,7 +607,6 @@
610607
},
611608
{
612609
key.kind: source.lang.swift.decl.extension,
613-
key.accessibility: source.lang.swift.accessibility.internal,
614610
key.name: "PrivAccess",
615611
key.offset: 1531,
616612
key.length: 44,
@@ -656,40 +652,88 @@
656652
}
657653
]
658654
},
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+
},
659703
{
660704
key.kind: source.lang.swift.decl.typealias,
661705
key.accessibility: source.lang.swift.accessibility.internal,
662706
key.name: "defAlias",
663-
key.offset: 1633,
707+
key.offset: 1751,
664708
key.length: 24,
665-
key.nameoffset: 1643,
709+
key.nameoffset: 1761,
666710
key.namelength: 8
667711
},
668712
{
669713
key.kind: source.lang.swift.decl.typealias,
670714
key.accessibility: source.lang.swift.accessibility.public,
671715
key.name: "pubAlias",
672-
key.offset: 1665,
716+
key.offset: 1783,
673717
key.length: 24,
674-
key.nameoffset: 1675,
718+
key.nameoffset: 1793,
675719
key.namelength: 8
676720
},
677721
{
678722
key.kind: source.lang.swift.decl.typealias,
679723
key.accessibility: source.lang.swift.accessibility.private,
680724
key.name: "privAlias",
681-
key.offset: 1698,
725+
key.offset: 1816,
682726
key.length: 25,
683-
key.nameoffset: 1708,
727+
key.nameoffset: 1826,
684728
key.namelength: 9
685729
},
686730
{
687731
key.kind: source.lang.swift.decl.typealias,
688732
key.accessibility: source.lang.swift.accessibility.internal,
689733
key.name: "intAlias",
690-
key.offset: 1733,
734+
key.offset: 1851,
691735
key.length: 24,
692-
key.nameoffset: 1743,
736+
key.nameoffset: 1861,
693737
key.namelength: 8
694738
}
695739
]

test/SourceKit/DocumentStructure/structure.swift.invalid.response

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
key.substructure: [
66
{
77
key.kind: source.lang.swift.decl.extension,
8-
key.accessibility: source.lang.swift.accessibility.internal,
98
key.name: "OuterCls",
109
key.offset: 0,
1110
key.length: 43,

test/SourceKit/DocumentStructure/structure.swift.response

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,6 @@
213213
},
214214
{
215215
key.kind: source.lang.swift.decl.extension,
216-
key.accessibility: source.lang.swift.accessibility.internal,
217216
key.name: "OuterCls",
218217
key.offset: 377,
219218
key.length: 45,
@@ -529,7 +528,6 @@
529528
},
530529
{
531530
key.kind: source.lang.swift.decl.extension,
532-
key.accessibility: source.lang.swift.accessibility.internal,
533531
key.name: "Foo",
534532
key.offset: 999,
535533
key.length: 58,

test/SourceKit/InterfaceGen/gen_clang_module.swift.response

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5600,7 +5600,6 @@ public class FooOverlayClassDerived : Foo.FooOverlayClassBase {
56005600
},
56015601
{
56025602
key.kind: source.lang.swift.decl.extension,
5603-
key.accessibility: source.lang.swift.accessibility.internal,
56045603
key.name: "FooClassBase",
56055604
key.offset: 5429,
56065605
key.length: 66,
@@ -5622,7 +5621,6 @@ public class FooOverlayClassDerived : Foo.FooOverlayClassBase {
56225621
},
56235622
{
56245623
key.kind: source.lang.swift.decl.extension,
5625-
key.accessibility: source.lang.swift.accessibility.internal,
56265624
key.name: "FooClassBase",
56275625
key.offset: 5542,
56285626
key.length: 107,
@@ -5653,7 +5651,6 @@ public class FooOverlayClassDerived : Foo.FooOverlayClassBase {
56535651
},
56545652
{
56555653
key.kind: source.lang.swift.decl.extension,
5656-
key.accessibility: source.lang.swift.accessibility.internal,
56575654
key.name: "FooClassBase",
56585655
key.offset: 5651,
56595656
key.length: 66,

tools/SourceKit/lib/SwiftLang/SwiftEditor.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -912,13 +912,22 @@ 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+
auto StrictAccess = getAccessibilityStrictly(ED);
928+
if (StrictAccess.hasValue())
929+
return StrictAccess.getValue();
930+
922931
// Assume "internal", which is the most common thing anyway.
923932
return Accessibility::Internal;
924933
}
@@ -1026,7 +1035,10 @@ class SwiftDocumentStructureWalker: public ide::SyntaxModelWalker {
10261035
if (auto *VD = dyn_cast_or_null<ValueDecl>(Node.Dcl)) {
10271036
AccessLevel = getAccessibilityUID(inferAccessibility(VD));
10281037
} else if (auto *ED = dyn_cast_or_null<ExtensionDecl>(Node.Dcl)) {
1029-
AccessLevel = getAccessibilityUID(inferDefaultAccessibility(ED));
1038+
auto StrictAccess = getAccessibilityStrictly(ED);
1039+
if (StrictAccess.hasValue()) {
1040+
AccessLevel = getAccessibilityUID(StrictAccess.getValue());
1041+
}
10301042
}
10311043
if (auto *ASD = dyn_cast_or_null<AbstractStorageDecl>(Node.Dcl)) {
10321044
Optional<Accessibility> SetAccess = inferSetterAccessibility(ASD);

0 commit comments

Comments
 (0)