Skip to content

Commit a051a03

Browse files
committed
define anon classes
1 parent 9cb1d0a commit a051a03

File tree

8 files changed

+43
-40
lines changed

8 files changed

+43
-40
lines changed

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

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ class ExtractSemanticDB extends Phase with
7272
!sym.exists
7373
|| sym.isLocalDummy
7474
|| sym.is(Synthetic)
75-
|| sym.isConstructor && sym.owner.is(ModuleClass)
75+
|| sym.isConstructor && (sym.owner.is(ModuleClass) || !sym.isGlobal)
7676
|| excludeDefStrict(sym)
7777

7878
private def excludeDefStrict(sym: Symbol)(given Context): Boolean =
@@ -81,7 +81,8 @@ class ExtractSemanticDB extends Phase with
8181

8282
private def excludeSymbolStrict(sym: Symbol)(given Context): Boolean =
8383
sym.name.isWildcard
84-
|| sym.isAnonymous
84+
|| sym.isAnonymousFunction
85+
|| sym.isAnonymousModuleVal
8586
|| sym.name.isEmptyNumbered
8687

8788
private def excludeChildren(sym: Symbol)(given Context): Boolean =
@@ -124,7 +125,7 @@ class ExtractSemanticDB extends Phase with
124125
return
125126
if !excludeDef(tree.symbol)
126127
&& tree.span.hasLength
127-
registerDefinition(tree.symbol, tree.nameSpan, symbolKinds(tree))
128+
registerDefinition(tree.symbol, tree.adjustedNameSpan, symbolKinds(tree))
128129
val privateWithin = tree.symbol.privateWithin
129130
if privateWithin.exists
130131
registerUse(privateWithin, spanOfSymbol(privateWithin, tree.span))
@@ -213,6 +214,12 @@ class ExtractSemanticDB extends Phase with
213214
case _ =>
214215
traverseChildren(tree)
215216

217+
private def (tree: NamedDefTree) adjustedNameSpan(given Context): Span =
218+
if tree.span.exists && tree.name.isAnonymousFunctionName || tree.name.isAnonymousClassName
219+
Span(tree.span.point)
220+
else
221+
tree.nameSpan
222+
216223
/** Add semanticdb name of the given symbol to string builder */
217224
private def addSymName(b: StringBuilder, sym: Symbol)(given ctx: Context): Unit =
218225

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,4 +202,8 @@ object Scala3 with
202202

203203
end InfoOps
204204

205+
given RangeOps: (range: Range) with
206+
def hasLength = range.endLine > range.startLine || range.endCharacter > range.startCharacter
207+
end RangeOps
208+
205209
end Scala3

tests/semanticdb/expect/Advanced.expect.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ class C/*<-advanced::C#*/[T/*<-advanced::C#[T]*/] {
1111

1212
class Structural/*<-advanced::Structural#*/ {
1313
def s1/*<-advanced::Structural#s1().*/: { val x/*<-local0*/: Int/*->scala::Int#*/ } = ???/*->scala::Predef.`???`().*/
14-
def s2/*<-advanced::Structural#s2().*/: { val x/*<-local1*/: Int/*->scala::Int#*/ } = new { val x/*<-local3*/: Int/*->scala::Int#*/ = ???/*->scala::Predef.`???`().*/ }
15-
def s3/*<-advanced::Structural#s3().*/: { def m/*<-local4*/(x/*<-local5*/: Int/*->scala::Int#*/): Int/*->scala::Int#*/ } = new { def m/*<-local7*/(x/*<-local8*/: Int/*->scala::Int#*/): Int/*->scala::Int#*/ = ???/*->scala::Predef.`???`().*/ }
14+
def s2/*<-advanced::Structural#s2().*/: { val x/*<-local1*/: Int/*->scala::Int#*/ } = /*<-local2*/new { val x/*<-local3*/: Int/*->scala::Int#*/ = ???/*->scala::Predef.`???`().*/ }
15+
def s3/*<-advanced::Structural#s3().*/: { def m/*<-local4*/(x/*<-local5*/: Int/*->scala::Int#*/): Int/*->scala::Int#*/ } = /*<-local6*/new { def m/*<-local7*/(x/*<-local8*/: Int/*->scala::Int#*/): Int/*->scala::Int#*/ = ???/*->scala::Predef.`???`().*/ }
1616
}
1717

1818
class Wildcards/*<-advanced::Wildcards#*/ {

tests/semanticdb/expect/Anonymous.expect.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,5 @@ class Anonymous/*<-example::Anonymous#*/ {
1616
}
1717

1818
trait Foo/*<-example::Anonymous#Foo#*/
19-
val foo/*<-example::Anonymous#foo.*/ = new Foo/*->example::Anonymous#Foo#*/ {}
19+
val foo/*<-example::Anonymous#foo.*/ = /*<-local1*/new Foo/*->example::Anonymous#Foo#*/ {}
2020
}

tests/semanticdb/expect/Classes.expect.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class C8/*<-classes::C8#*/(private[this] val x/*<-classes::C8#x.*/: Int/*->scala
2323
class C9/*<-classes::C9#*/(private[this] var x/*<-classes::C9#x().*/: Int/*->scala::Int#*/)
2424

2525
object N/*<-classes::N.*/ {
26-
val anonClass/*<-classes::N.anonClass.*/ = new C7/*->classes::C7#*/(42) {
26+
val anonClass/*<-classes::N.anonClass.*/ = /*<-local0*/new C7/*->classes::C7#*/(42) {
2727
val local/*<-local1*/ = ???/*->scala::Predef.`???`().*/
2828
}
2929
val anonFun/*<-classes::N.anonFun.*/ = List/*->scala::package.List.*//*->scala::collection::IterableFactory#apply().*/(1).map/*->scala::collection::immutable::List#map().*/ { i/*<-local2*/ =>

tests/semanticdb/expect/Traits.expect.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ trait T/*<-traits::T#*/ {
66

77
sealed trait U/*<-traits::U#*/
88
object U/*<-traits::U.*/ {
9-
def u/*<-traits::U.u().*/: U/*->traits::U#*/ = new U/*->traits::U#*/ {}
9+
def u/*<-traits::U.u().*/: U/*->traits::U#*/ = /*<-local0*/new U/*->traits::U#*/ {}
1010
}
1111

1212
class C/*<-traits::C#*/

tests/semanticdb/expect/Types.expect.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,9 @@ object Test/*<-types::Test.*/ {
5555
val compoundType1/*<-types::Test.C#compoundType1.*/: { def k/*<-local0*/: Int/*->scala::Int#*/ } = ???/*->scala::Predef.`???`().*/
5656
val compoundType2/*<-types::Test.C#compoundType2.*/: M/*->types::Test.M#*/ with N/*->types::Test.N#*/ = ???/*->scala::Predef.`???`().*/
5757
val compoundType3/*<-types::Test.C#compoundType3.*/: M/*->types::Test.M#*/ with N/*->types::Test.N#*/ { def k/*<-local1*/: Int/*->scala::Int#*/ } = ???/*->scala::Predef.`???`().*/
58-
val compoundType4/*<-types::Test.C#compoundType4.*/ = new { def k/*<-local3*/: Int/*->scala::Int#*/ = ???/*->scala::Predef.`???`().*/ }
59-
val compoundType5/*<-types::Test.C#compoundType5.*/ = new M/*->types::Test.M#*/ with N/*->types::Test.N#*/
60-
val compoundType6/*<-types::Test.C#compoundType6.*/ = new M/*->types::Test.M#*/ with N/*->types::Test.N#*/ { def k/*<-local6*/: Int/*->scala::Int#*/ = ???/*->scala::Predef.`???`().*/ }
58+
val compoundType4/*<-types::Test.C#compoundType4.*/ = /*<-local2*/new { def k/*<-local3*/: Int/*->scala::Int#*/ = ???/*->scala::Predef.`???`().*/ }
59+
val compoundType5/*<-types::Test.C#compoundType5.*/ = /*<-local4*/new M/*->types::Test.M#*/ with N/*->types::Test.N#*/
60+
val compoundType6/*<-types::Test.C#compoundType6.*/ = /*<-local5*/new M/*->types::Test.M#*/ with N/*->types::Test.N#*/ { def k/*<-local6*/: Int/*->scala::Int#*/ = ???/*->scala::Predef.`???`().*/ }
6161

6262
val annType1/*<-types::Test.C#annType1.*/: T/*->types::T#*/ @ann(42) = ???/*->scala::Predef.`???`().*/
6363
val annType2/*<-types::Test.C#annType2.*/: T/*->types::T#*/ @ann1 @ann2 = ???/*->scala::Predef.`???`().*/

tests/semanticdb/metac.expect

Lines changed: 21 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ Uri => Advanced.scala
5050
Text => empty
5151
Language => Scala
5252
Symbols => 34 entries
53-
Occurrences => 96 entries
53+
Occurrences => 94 entries
5454

5555
Symbols:
5656
advanced/C# => class C
@@ -78,11 +78,11 @@ advanced/Wildcards#`<init>`(). => primary ctor <init>
7878
advanced/Wildcards#e1(). => method e1
7979
local0 => abstract val method x
8080
local1 => abstract val method x
81-
local2 => primary ctor <init>
81+
local2 => final class $anon
8282
local3 => val method x
8383
local4 => abstract method m
8484
local5 => param x
85-
local6 => primary ctor <init>
85+
local6 => final class $anon
8686
local7 => method m
8787
local8 => param x
8888
local9 => val local e3
@@ -115,23 +115,21 @@ Occurrences:
115115
[13:6..13:8): s2 <- advanced/Structural#s2().
116116
[13:16..13:17): x <- local1
117117
[13:19..13:22): Int -> scala/Int#
118-
[13:33..13:33): <- local2
118+
[13:27..13:27): <- local2
119119
[13:37..13:38): x <- local3
120120
[13:40..13:43): Int -> scala/Int#
121121
[13:46..13:49): ??? -> scala/Predef.`???`().
122-
[13:51..13:51): -> local2
123122
[14:6..14:8): s3 <- advanced/Structural#s3().
124123
[14:16..14:17): m <- local4
125124
[14:18..14:19): x <- local5
126125
[14:21..14:24): Int -> scala/Int#
127126
[14:27..14:30): Int -> scala/Int#
128-
[14:41..14:41): <- local6
127+
[14:35..14:35): <- local6
129128
[14:45..14:46): m <- local7
130129
[14:47..14:48): x <- local8
131130
[14:50..14:53): Int -> scala/Int#
132131
[14:56..14:59): Int -> scala/Int#
133132
[14:62..14:65): ??? -> scala/Predef.`???`().
134-
[14:67..14:67): -> local6
135133
[17:6..17:15): Wildcards <- advanced/Wildcards#
136134
[18:2..18:2): <- advanced/Wildcards#`<init>`().
137135
[18:6..18:8): e1 <- advanced/Wildcards#e1().
@@ -283,7 +281,7 @@ Uri => Anonymous.scala
283281
Text => empty
284282
Language => Scala
285283
Symbols => 13 entries
286-
Occurrences => 34 entries
284+
Occurrences => 33 entries
287285

288286
Symbols:
289287
example/Anonymous# => class Anonymous
@@ -298,7 +296,7 @@ example/Anonymous#m1(). => method m1
298296
example/Anonymous#m1().[T] => typeparam T
299297
example/Anonymous#m2(). => method m2
300298
local0 => val local x
301-
local1 => primary ctor <init>
299+
local1 => final class $anon
302300

303301
Occurrences:
304302
[0:8..0:15): example <- example/
@@ -332,9 +330,8 @@ Occurrences:
332330
[17:2..17:2): <- example/Anonymous#Foo#`<init>`().
333331
[17:8..17:11): Foo <- example/Anonymous#Foo#
334332
[18:6..18:9): foo <- example/Anonymous#foo.
335-
[18:16..18:16): <- local1
333+
[18:12..18:12): <- local1
336334
[18:16..18:19): Foo -> example/Anonymous#Foo#
337-
[18:22..18:22): -> local1
338335

339336
expect/Classes.scala
340337
____________________
@@ -345,7 +342,7 @@ Uri => Classes.scala
345342
Text => empty
346343
Language => Scala
347344
Symbols => 75 entries
348-
Occurrences => 60 entries
345+
Occurrences => 59 entries
349346

350347
Symbols:
351348
classes/C1# => final class C1
@@ -419,7 +416,7 @@ classes/M.C5().(x) => param x
419416
classes/N. => final object N
420417
classes/N.anonClass. => val method anonClass
421418
classes/N.anonFun. => val method anonFun
422-
local0 => primary ctor <init>
419+
local0 => final class $anon
423420
local1 => val method local
424421
local2 => param i
425422
local3 => val local local
@@ -471,12 +468,11 @@ Occurrences:
471468
[22:30..22:33): Int -> scala/Int#
472469
[24:7..24:8): N <- classes/N.
473470
[25:6..25:15): anonClass <- classes/N.anonClass.
474-
[25:22..25:22): <- local0
471+
[25:18..25:18): <- local0
475472
[25:22..25:24): C7 -> classes/C7#
476473
[25:24..25:24): -> classes/C7#`<init>`().
477474
[26:8..26:13): local <- local1
478475
[26:16..26:19): ??? -> scala/Predef.`???`().
479-
[27:3..27:3): -> local0
480476
[28:6..28:13): anonFun <- classes/N.anonFun.
481477
[28:16..28:20): List -> scala/package.List.
482478
[28:20..28:20): -> scala/collection/IterableFactory#apply().
@@ -2641,10 +2637,10 @@ Uri => Traits.scala
26412637
Text => empty
26422638
Language => Scala
26432639
Symbols => 13 entries
2644-
Occurrences => 18 entries
2640+
Occurrences => 17 entries
26452641

26462642
Symbols:
2647-
local0 => primary ctor <init>
2643+
local0 => final class $anon
26482644
local1 => selfparam self
26492645
traits/C# => class C
26502646
traits/C#`<init>`(). => primary ctor <init>
@@ -2668,9 +2664,8 @@ Occurrences:
26682664
[7:7..7:8): U <- traits/U.
26692665
[8:6..8:7): u <- traits/U.u().
26702666
[8:9..8:10): U -> traits/U#
2671-
[8:17..8:17): <- local0
2667+
[8:13..8:13): <- local0
26722668
[8:17..8:18): U -> traits/U#
2673-
[8:21..8:21): -> local0
26742669
[11:0..11:0): <- traits/C#`<init>`().
26752670
[11:6..11:7): C <- traits/C#
26762671
[12:6..12:7): V <- traits/V#
@@ -2687,15 +2682,15 @@ Uri => Types.scala
26872682
Text => empty
26882683
Language => Scala
26892684
Symbols => 125 entries
2690-
Occurrences => 249 entries
2685+
Occurrences => 246 entries
26912686

26922687
Symbols:
26932688
local0 => abstract method k
26942689
local1 => abstract method k
2695-
local2 => primary ctor <init>
2690+
local2 => final class $anon
26962691
local3 => method k
2697-
local4 => primary ctor <init>
2698-
local5 => primary ctor <init>
2692+
local4 => final class $anon
2693+
local5 => final class $anon
26992694
local6 => method k
27002695
local7 => type L
27012696
local8 => typeparam T
@@ -2939,26 +2934,23 @@ Occurrences:
29392934
[56:41..56:44): Int -> scala/Int#
29402935
[56:49..56:52): ??? -> scala/Predef.`???`().
29412936
[57:8..57:21): compoundType4 <- types/Test.C#compoundType4.
2942-
[57:30..57:30): <- local2
2937+
[57:24..57:24): <- local2
29432938
[57:34..57:35): k <- local3
29442939
[57:37..57:40): Int -> scala/Int#
29452940
[57:43..57:46): ??? -> scala/Predef.`???`().
2946-
[57:48..57:48): -> local2
29472941
[58:8..58:21): compoundType5 <- types/Test.C#compoundType5.
2948-
[58:28..58:28): <- local4
2942+
[58:24..58:24): <- local4
29492943
[58:28..58:29): M -> types/Test.M#
29502944
[58:29..58:29): -> types/Test.M#`<init>`().
29512945
[58:35..58:36): N -> types/Test.N#
2952-
[58:36..58:36): -> local4
29532946
[59:8..59:21): compoundType6 <- types/Test.C#compoundType6.
2954-
[59:28..59:28): <- local5
2947+
[59:24..59:24): <- local5
29552948
[59:28..59:29): M -> types/Test.M#
29562949
[59:29..59:29): -> types/Test.M#`<init>`().
29572950
[59:35..59:36): N -> types/Test.N#
29582951
[59:43..59:44): k <- local6
29592952
[59:46..59:49): Int -> scala/Int#
29602953
[59:52..59:55): ??? -> scala/Predef.`???`().
2961-
[59:57..59:57): -> local5
29622954
[61:8..61:16): annType1 <- types/Test.C#annType1.
29632955
[61:18..61:19): T -> types/T#
29642956
[61:31..61:34): ??? -> scala/Predef.`???`().

0 commit comments

Comments
 (0)