Skip to content

Commit 9f97b0b

Browse files
authored
Merge pull request #12964 from tanishiking/access-info
Add access information to SymbolInformation
2 parents 79fae19 + fb6b679 commit 9f97b0b

File tree

3 files changed

+84
-50
lines changed

3 files changed

+84
-50
lines changed

compiler/src/dotty/tools/dotc/semanticdb/ExtractSemanticDB.scala

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import NameOps._
1616
import util.Spans.Span
1717
import util.{SourceFile, SourcePosition}
1818
import transform.SymUtils._
19+
import SymbolInformation.{Kind => k}
1920

2021
import scala.jdk.CollectionConverters._
2122
import scala.collection.mutable
@@ -450,13 +451,31 @@ class ExtractSemanticDB extends Phase:
450451
props |= SymbolInformation.Property.ENUM.value
451452
props
452453

454+
private def symbolAccess(sym: Symbol, kind: SymbolInformation.Kind)(using Context): Access =
455+
kind match
456+
case k.LOCAL | k.PARAMETER | k.SELF_PARAMETER | k.TYPE_PARAMETER | k.PACKAGE | k.PACKAGE_OBJECT =>
457+
Access.Empty
458+
case _ =>
459+
if (sym.privateWithin == NoSymbol)
460+
if (sym.isAllOf(PrivateLocal)) PrivateThisAccess()
461+
else if (sym.is(Private)) PrivateAccess()
462+
else if (sym.isAllOf(ProtectedLocal)) ProtectedThisAccess()
463+
else if (sym.is(Protected)) ProtectedAccess()
464+
else PublicAccess()
465+
else
466+
val ssym = symbolName(sym.privateWithin)
467+
if (sym.is(Protected)) ProtectedWithinAccess(ssym)
468+
else PrivateWithinAccess(ssym)
469+
453470
private def symbolInfo(sym: Symbol, symbolName: String, symkinds: Set[SymbolKind])(using Context): SymbolInformation =
471+
val kind = symbolKind(sym, symkinds)
454472
SymbolInformation(
455473
symbol = symbolName,
456474
language = Language.SCALA,
457-
kind = symbolKind(sym, symkinds),
475+
kind = kind,
458476
properties = symbolProps(sym, symkinds),
459-
displayName = Symbols.displaySymbol(sym)
477+
displayName = Symbols.displaySymbol(sym),
478+
access = symbolAccess(sym, kind),
460479
)
461480

462481
private def registerSymbol(sym: Symbol, symbolName: String, symkinds: Set[SymbolKind])(using Context): Unit =

compiler/src/dotty/tools/dotc/semanticdb/Tools.scala

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,24 @@ object Tools:
8585
case UNKNOWN_LANGUAGE | Unrecognized(_) => "unknown"
8686
end languageString
8787

88+
private def accessString(access: Access): String =
89+
access match
90+
case Access.Empty => ""
91+
case _: PublicAccess => ""
92+
case _: PrivateAccess => "private "
93+
case _: ProtectedAccess => "protected "
94+
case _: PrivateThisAccess => "private[this] "
95+
case _: ProtectedThisAccess => "protected[this] "
96+
case PrivateWithinAccess(ssym) =>
97+
s"private[${ssym}] "
98+
case ProtectedWithinAccess(ssym) =>
99+
s"protected[${ssym}] "
100+
101+
88102
private def processSymbol(info: SymbolInformation)(using sb: StringBuilder): Unit =
89103
import SymbolInformation.Kind._
90104
sb.append(info.symbol).append(" => ")
105+
sb.append(accessString(info.access))
91106
if info.isAbstract then sb.append("abstract ")
92107
if info.isFinal then sb.append("final ")
93108
if info.isSealed then sb.append("sealed ")

tests/semanticdb/metac.expect

Lines changed: 48 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@ Occurrences => 19 entries
1212
Symbols:
1313
example/Access# => class Access
1414
example/Access#`<init>`(). => primary ctor <init>
15-
example/Access#m1(). => method m1
16-
example/Access#m2(). => method m2
17-
example/Access#m3(). => method m3
18-
example/Access#m4(). => method m4
19-
example/Access#m5(). => method m5
20-
example/Access#m6(). => method m6
15+
example/Access#m1(). => private[this] method m1
16+
example/Access#m2(). => private[this] method m2
17+
example/Access#m3(). => private[example/Access#] method m3
18+
example/Access#m4(). => protected method m4
19+
example/Access#m5(). => protected[this] method m5
20+
example/Access#m6(). => protected[example/] method m6
2121
example/Access#m7(). => method m7
2222

2323
Occurrences:
@@ -201,12 +201,12 @@ annot/Annotations#`<init>`(). => primary ctor <init>
201201
annot/Annotations#`<init>`().(x) => param x
202202
annot/Annotations#field. => val method field
203203
annot/Annotations#method(). => method method
204-
annot/Annotations#x. => val method x
204+
annot/Annotations#x. => private[this] val method x
205205
annot/B# => class B
206206
annot/B#`<init>`(). => primary ctor <init>
207207
annot/B#`<init>`().(x) => param x
208208
annot/B#`<init>`(+1). => ctor <init>
209-
annot/B#x. => val method x
209+
annot/B#x. => private[this] val method x
210210
annot/M. => final object M
211211
annot/M.m(). => macro m
212212
annot/M.m().[TT] => typeparam TT
@@ -411,7 +411,7 @@ classes/C6#`<init>`().(x) => param x
411411
classes/C6#copy$default$1(). => method copy$default$1
412412
classes/C6#copy(). => method copy
413413
classes/C6#copy().(x) => param x
414-
classes/C6#x. => val method x
414+
classes/C6#x. => private val method x
415415
classes/C6. => final object C6
416416
classes/C6.apply(). => method apply
417417
classes/C6.apply().(x) => param x
@@ -421,19 +421,19 @@ classes/C6.unapply().(x$1) => param x$1
421421
classes/C7# => class C7
422422
classes/C7#`<init>`(). => primary ctor <init>
423423
classes/C7#`<init>`().(x) => param x
424-
classes/C7#x. => val method x
424+
classes/C7#x. => private[this] val method x
425425
classes/C8# => class C8
426426
classes/C8#`<init>`(). => primary ctor <init>
427427
classes/C8#`<init>`().(x) => param x
428-
classes/C8#x. => val method x
428+
classes/C8#x. => private[this] val method x
429429
classes/C9# => class C9
430430
classes/C9#`<init>`(). => primary ctor <init>
431431
classes/C9#`<init>`().(x) => param x
432-
classes/C9#x(). => var method x
432+
classes/C9#x(). => private[this] var method x
433433
classes/C10# => class C10
434434
classes/C10#`<init>`(). => primary ctor <init>
435435
classes/C10#`<init>`().(s) => param s
436-
classes/C10#s. => val method s
436+
classes/C10#s. => private[this] val method s
437437
classes/C11# => class C11
438438
classes/C11#`<init>`(). => primary ctor <init>
439439
classes/C11#foo(). => macro foo
@@ -465,7 +465,7 @@ classes/M. => final object M
465465
classes/M.C5# => class C5
466466
classes/M.C5#`<init>`(). => primary ctor <init>
467467
classes/M.C5#`<init>`().(x) => param x
468-
classes/M.C5#x. => val method x
468+
classes/M.C5#x. => private[this] val method x
469469
classes/M.C5(). => final implicit method C5
470470
classes/M.C5().(x) => param x
471471
classes/N. => final object N
@@ -779,7 +779,7 @@ enumVal/Color#`<init>`(). => primary ctor <init>
779779
enumVal/Color#`<init>`().(rgb) => val param rgb
780780
enumVal/Color#rgb. => val method rgb
781781
enumVal/Color. => final object Color
782-
enumVal/Color.$values. => val method $values
782+
enumVal/Color.$values. => private[this] val method $values
783783
enumVal/Color.Blue. => case val static enum method Blue
784784
enumVal/Color.Green. => case val static enum method Green
785785
enumVal/Color.Red. => case val static enum method Red
@@ -828,9 +828,9 @@ _empty_/Enums. => final object Enums
828828
_empty_/Enums.Coin# => abstract sealed enum class Coin
829829
_empty_/Enums.Coin#`<init>`(). => primary ctor <init>
830830
_empty_/Enums.Coin#`<init>`().(value) => param value
831-
_empty_/Enums.Coin#value. => val method value
831+
_empty_/Enums.Coin#value. => private[this] val method value
832832
_empty_/Enums.Coin. => final object Coin
833-
_empty_/Enums.Coin.$values. => val method $values
833+
_empty_/Enums.Coin.$values. => private[this] val method $values
834834
_empty_/Enums.Coin.Dime. => case val static enum method Dime
835835
_empty_/Enums.Coin.Dollar. => case val static enum method Dollar
836836
_empty_/Enums.Coin.Nickel. => case val static enum method Nickel
@@ -844,10 +844,10 @@ _empty_/Enums.Coin.values(). => method values
844844
_empty_/Enums.Colour# => abstract sealed enum class Colour
845845
_empty_/Enums.Colour#`<init>`(). => primary ctor <init>
846846
_empty_/Enums.Colour. => final object Colour
847-
_empty_/Enums.Colour.$new(). => method $new
847+
_empty_/Enums.Colour.$new(). => private[this] method $new
848848
_empty_/Enums.Colour.$new().($name) => param $name
849849
_empty_/Enums.Colour.$new().(_$ordinal) => param _$ordinal
850-
_empty_/Enums.Colour.$values. => val method $values
850+
_empty_/Enums.Colour.$values. => private[this] val method $values
851851
_empty_/Enums.Colour.Blue. => case val static enum method Blue
852852
_empty_/Enums.Colour.Green. => case val static enum method Green
853853
_empty_/Enums.Colour.Red. => case val static enum method Red
@@ -859,10 +859,10 @@ _empty_/Enums.Colour.values(). => method values
859859
_empty_/Enums.Directions# => abstract sealed enum class Directions
860860
_empty_/Enums.Directions#`<init>`(). => primary ctor <init>
861861
_empty_/Enums.Directions. => final object Directions
862-
_empty_/Enums.Directions.$new(). => method $new
862+
_empty_/Enums.Directions.$new(). => private[this] method $new
863863
_empty_/Enums.Directions.$new().($name) => param $name
864864
_empty_/Enums.Directions.$new().(_$ordinal) => param _$ordinal
865-
_empty_/Enums.Directions.$values. => val method $values
865+
_empty_/Enums.Directions.$values. => private[this] val method $values
866866
_empty_/Enums.Directions.East. => case val static enum method East
867867
_empty_/Enums.Directions.North. => case val static enum method North
868868
_empty_/Enums.Directions.South. => case val static enum method South
@@ -900,17 +900,17 @@ _empty_/Enums.Maybe.None. => case val static enum method None
900900
_empty_/Enums.Maybe.fromOrdinal(). => method fromOrdinal
901901
_empty_/Enums.Maybe.fromOrdinal().(ordinal) => param ordinal
902902
_empty_/Enums.Planet# => abstract sealed enum class Planet
903-
_empty_/Enums.Planet#G. => final val method G
903+
_empty_/Enums.Planet#G. => private[this] final val method G
904904
_empty_/Enums.Planet#`<init>`(). => primary ctor <init>
905905
_empty_/Enums.Planet#`<init>`().(mass) => param mass
906906
_empty_/Enums.Planet#`<init>`().(radius) => param radius
907-
_empty_/Enums.Planet#mass. => val method mass
908-
_empty_/Enums.Planet#radius. => val method radius
907+
_empty_/Enums.Planet#mass. => private[this] val method mass
908+
_empty_/Enums.Planet#radius. => private[this] val method radius
909909
_empty_/Enums.Planet#surfaceGravity(). => method surfaceGravity
910910
_empty_/Enums.Planet#surfaceWeight(). => method surfaceWeight
911911
_empty_/Enums.Planet#surfaceWeight().(otherMass) => param otherMass
912912
_empty_/Enums.Planet. => final object Planet
913-
_empty_/Enums.Planet.$values. => val method $values
913+
_empty_/Enums.Planet.$values. => private[this] val method $values
914914
_empty_/Enums.Planet.Earth. => case val static enum method Earth
915915
_empty_/Enums.Planet.Jupiter. => case val static enum method Jupiter
916916
_empty_/Enums.Planet.Mars. => case val static enum method Mars
@@ -927,10 +927,10 @@ _empty_/Enums.Planet.values(). => method values
927927
_empty_/Enums.Suits# => abstract sealed enum class Suits
928928
_empty_/Enums.Suits#`<init>`(). => primary ctor <init>
929929
_empty_/Enums.Suits. => final object Suits
930-
_empty_/Enums.Suits.$new(). => method $new
930+
_empty_/Enums.Suits.$new(). => private[this] method $new
931931
_empty_/Enums.Suits.$new().($name) => param $name
932932
_empty_/Enums.Suits.$new().(_$ordinal) => param _$ordinal
933-
_empty_/Enums.Suits.$values. => val method $values
933+
_empty_/Enums.Suits.$values. => private[this] val method $values
934934
_empty_/Enums.Suits.Clubs. => case val static enum method Clubs
935935
_empty_/Enums.Suits.Diamonds. => case val static enum method Diamonds
936936
_empty_/Enums.Suits.Hearts. => case val static enum method Hearts
@@ -949,7 +949,7 @@ _empty_/Enums.Tag# => abstract sealed enum class Tag
949949
_empty_/Enums.Tag#[A] => typeparam A
950950
_empty_/Enums.Tag#`<init>`(). => primary ctor <init>
951951
_empty_/Enums.Tag. => final object Tag
952-
_empty_/Enums.Tag.$values. => val method $values
952+
_empty_/Enums.Tag.$values. => private[this] val method $values
953953
_empty_/Enums.Tag.BooleanTag. => case val static enum method BooleanTag
954954
_empty_/Enums.Tag.IntTag. => case val static enum method IntTag
955955
_empty_/Enums.Tag.fromOrdinal(). => method fromOrdinal
@@ -960,10 +960,10 @@ _empty_/Enums.Tag.values(). => method values
960960
_empty_/Enums.WeekDays# => abstract sealed enum class WeekDays
961961
_empty_/Enums.WeekDays#`<init>`(). => primary ctor <init>
962962
_empty_/Enums.WeekDays. => final object WeekDays
963-
_empty_/Enums.WeekDays.$new(). => method $new
963+
_empty_/Enums.WeekDays.$new(). => private[this] method $new
964964
_empty_/Enums.WeekDays.$new().($name) => param $name
965965
_empty_/Enums.WeekDays.$new().(_$ordinal) => param _$ordinal
966-
_empty_/Enums.WeekDays.$values. => val method $values
966+
_empty_/Enums.WeekDays.$values. => private[this] val method $values
967967
_empty_/Enums.WeekDays.Friday. => case val static enum method Friday
968968
_empty_/Enums.WeekDays.Monday. => case val static enum method Monday
969969
_empty_/Enums.WeekDays.Saturday. => case val static enum method Saturday
@@ -1568,7 +1568,7 @@ example/ImplicitConversion.newAny2stringadd#`+`(). => method +
15681568
example/ImplicitConversion.newAny2stringadd#`+`().(other) => param other
15691569
example/ImplicitConversion.newAny2stringadd#`<init>`(). => primary ctor <init>
15701570
example/ImplicitConversion.newAny2stringadd#`<init>`().(self) => param self
1571-
example/ImplicitConversion.newAny2stringadd#self. => val method self
1571+
example/ImplicitConversion.newAny2stringadd#self. => private val method self
15721572
example/ImplicitConversion.newAny2stringadd(). => final implicit method newAny2stringadd
15731573
example/ImplicitConversion.newAny2stringadd().(self) => param self
15741574
example/ImplicitConversion.newAny2stringadd().[A] => typeparam A
@@ -1769,7 +1769,7 @@ givens/InventedNames$package.given_Y# => class given_Y
17691769
givens/InventedNames$package.given_Y#`<init>`(). => primary ctor <init>
17701770
givens/InventedNames$package.given_Y#`<init>`().(x$1) => implicit val param x$1
17711771
givens/InventedNames$package.given_Y#doY(). => method doY
1772-
givens/InventedNames$package.given_Y#x$1. => implicit val method x$1
1772+
givens/InventedNames$package.given_Y#x$1. => protected implicit val method x$1
17731773
givens/InventedNames$package.given_Y(). => final implicit method given_Y
17741774
givens/InventedNames$package.given_Y().(x$1) => implicit param x$1
17751775
givens/InventedNames$package.given_Z_T# => class given_Z_T
@@ -3179,7 +3179,7 @@ Symbols:
31793179
example/ValUsages. => final object ValUsages
31803180
example/ValUsages.v. => val method v
31813181
example/Vals# => abstract class Vals
3182-
example/Vals#_explicitSetter(). => var method _explicitSetter
3182+
example/Vals#_explicitSetter(). => private[this] var method _explicitSetter
31833183
example/Vals#`<init>`(). => primary ctor <init>
31843184
example/Vals#`<init>`().(p) => param p
31853185
example/Vals#`<init>`().(xp) => val param xp
@@ -3198,19 +3198,19 @@ example/Vals#`yp_=`(). => var method yp_=
31983198
example/Vals#`yp_=`().(x$1) => param x$1
31993199
example/Vals#explicitSetter(). => method explicitSetter
32003200
example/Vals#m(). => method m
3201-
example/Vals#p. => val method p
3201+
example/Vals#p. => private[this] val method p
32023202
example/Vals#xam. => abstract val method xam
32033203
example/Vals#xfm. => final val method xfm
32043204
example/Vals#xim. => implicit val method xim
3205-
example/Vals#xlm. => val method xlm
3205+
example/Vals#xlm. => private[this] val method xlm
32063206
example/Vals#xm. => val method xm
32073207
example/Vals#xp. => val method xp
3208-
example/Vals#xzlm. => lazy val method xzlm
3208+
example/Vals#xzlm. => private[this] lazy val method xzlm
32093209
example/Vals#xzm. => lazy val method xzm
32103210
example/Vals#yam(). => abstract var method yam
32113211
example/Vals#yfm(). => final var method yfm
32123212
example/Vals#yim(). => implicit var method yim
3213-
example/Vals#ylm(). => var method ylm
3213+
example/Vals#ylm(). => private[this] var method ylm
32143214
example/Vals#ym(). => var method ym
32153215
example/Vals#yp(). => var method yp
32163216
local0 => val local xl
@@ -3401,10 +3401,10 @@ exports/example/Codec#`<init>`().(decode) => param decode
34013401
exports/example/Codec#`<init>`().(encode) => param encode
34023402
exports/example/Codec#decode(). => final method decode
34033403
exports/example/Codec#decode().(a) => param a
3404-
exports/example/Codec#decode. => val method decode
3404+
exports/example/Codec#decode. => private[this] val method decode
34053405
exports/example/Codec#encode(). => final method encode
34063406
exports/example/Codec#encode().(t) => param t
3407-
exports/example/Codec#encode. => val method encode
3407+
exports/example/Codec#encode. => private[this] val method encode
34083408
exports/example/Decoder# => trait Decoder
34093409
exports/example/Decoder#[T] => covariant typeparam T
34103410
exports/example/Decoder#`<init>`(). => primary ctor <init>
@@ -3516,7 +3516,7 @@ Symbols:
35163516
i9727/Test# => class Test
35173517
i9727/Test#`<init>`(). => primary ctor <init>
35183518
i9727/Test#`<init>`().(a) => param a
3519-
i9727/Test#a. => val method a
3519+
i9727/Test#a. => private[this] val method a
35203520
i9727/i9727$package. => final package object i9727
35213521
i9727/i9727$package.a. => val method a
35223522
i9727/i9727$package.b. => val method b
@@ -3777,7 +3777,7 @@ flags/p/package.AA#`<init>`().(y) => val param y
37773777
flags/p/package.AA#`<init>`().(z) => var param z
37783778
flags/p/package.AA#`z_=`(). => var method z_=
37793779
flags/p/package.AA#`z_=`().(x$1) => param x$1
3780-
flags/p/package.AA#x. => val method x
3780+
flags/p/package.AA#x. => private[this] val method x
37813781
flags/p/package.AA#y. => val method y
37823782
flags/p/package.AA#z(). => var method z
37833783
flags/p/package.C# => abstract class C
@@ -3792,9 +3792,9 @@ flags/p/package.C#`<init>`(+1). => ctor <init>
37923792
flags/p/package.C#`<init>`(+2). => ctor <init>
37933793
flags/p/package.C#`<init>`(+2).(t) => param t
37943794
flags/p/package.C#w(). => abstract method w
3795-
flags/p/package.C#x. => val method x
3796-
flags/p/package.C#y. => val method y
3797-
flags/p/package.C#z. => val method z
3795+
flags/p/package.C#x. => private[this] val method x
3796+
flags/p/package.C#y. => private[this] val method y
3797+
flags/p/package.C#z. => private[this] val method z
37983798
flags/p/package.S# => class S
37993799
flags/p/package.S#[T] => typeparam T
38003800
flags/p/package.S#`<init>`(). => primary ctor <init>
@@ -3808,13 +3808,13 @@ flags/p/package.Y# => final class Y
38083808
flags/p/package.Y#`<init>`(). => primary ctor <init>
38093809
flags/p/package.Z# => sealed trait Z
38103810
flags/p/package.Z#`<init>`(). => primary ctor <init>
3811-
flags/p/package.`y_=`(). => var method y_=
3811+
flags/p/package.`y_=`(). => protected var method y_=
38123812
flags/p/package.`y_=`().(x$1) => param x$1
38133813
flags/p/package.m(). => macro m
38143814
flags/p/package.m().[TT] => typeparam TT
3815-
flags/p/package.x. => lazy val method x
3815+
flags/p/package.x. => private[flags/p/] lazy val method x
38163816
flags/p/package.xs1. => val method xs1
3817-
flags/p/package.y(). => implicit var method y
3817+
flags/p/package.y(). => protected implicit var method y
38183818
flags/p/package.z(). => method z
38193819
flags/p/package.z().(pp) => param pp
38203820
local0 => val local xs2
@@ -4053,7 +4053,7 @@ types/ann# => class ann
40534053
types/ann#[T] => typeparam T
40544054
types/ann#`<init>`(). => primary ctor <init>
40554055
types/ann#`<init>`().(x) => param x
4056-
types/ann#x. => val method x
4056+
types/ann#x. => private[this] val method x
40574057
types/ann1# => class ann1
40584058
types/ann1#`<init>`(). => primary ctor <init>
40594059
types/ann2# => class ann2

0 commit comments

Comments
 (0)