Skip to content

Commit 18b8901

Browse files
committed
Add undefined type case for TypeRef with no symbols
1 parent 2693983 commit 18b8901

File tree

4 files changed

+110
-75
lines changed

4 files changed

+110
-75
lines changed

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

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -228,12 +228,22 @@ class TypeOps:
228228
val stpe = loop(tpe)
229229
s.ByNameType(stpe)
230230

231-
case tr @ TypeRef(pre, _) =>
231+
case TypeRef(pre, sym: Symbol) =>
232+
val spre = if tpe.hasTrivialPrefix then s.Type.Empty else loop(pre)
233+
val ssym = sym.symbolName
234+
s.TypeRef(spre, ssym, Seq.empty)
235+
236+
case tr @ TypeRef(pre, _) if tr.symbol != NoSymbol =>
232237
val spre = if tpe.hasTrivialPrefix then s.Type.Empty else loop(pre)
233238
val ssym = tr.symbol.symbolName
234239
s.TypeRef(spre, ssym, Seq.empty)
235240

236-
case tr @ TermRef(pre, _) =>
241+
case TermRef(pre, sym: Symbol) =>
242+
val spre = if tpe.hasTrivialPrefix then s.Type.Empty else loop(pre)
243+
val ssym = sym.symbolName
244+
s.SingleType(spre, ssym)
245+
246+
case tr @ TermRef(pre, _) if tr.symbol != NoSymbol =>
237247
val spre = if(tpe.hasTrivialPrefix) s.Type.Empty else loop(pre)
238248
val ssym = tr.symbol.symbolName
239249
s.SingleType(spre, ssym)
@@ -448,10 +458,17 @@ class TypeOps:
448458
private def hasTrivialPrefix(using Context): Boolean =
449459
def checkTrivialPrefix(pre: Type, sym: Symbol)(using Context): Boolean =
450460
pre =:= sym.owner.thisType
461+
// Make sure `tr.symbol != NoSymbol` where `tr @ TypeRef(...)`, that happens
462+
// when TypeRef refers the refinement of RefinedType e.g.
463+
// TypeRef for `foo.B` in `trait T[A] { val foo: { type B = A } = ???; def bar(b: foo.B) = () }` has NoSymbol
451464
tpe match {
452-
case tr @ TypeRef(pre, _) =>
465+
case TypeRef(pre, sym: Symbol) =>
466+
checkTrivialPrefix(pre, sym)
467+
case tr @ TypeRef(pre, _) if tr.symbol != NoSymbol =>
453468
checkTrivialPrefix(pre, tr.symbol)
454-
case tr @ TermRef(pre, _) =>
469+
case TermRef(pre, sym: Symbol) =>
470+
checkTrivialPrefix(pre, sym)
471+
case tr @ TermRef(pre, _) if tr.symbol != NoSymbol =>
455472
checkTrivialPrefix(pre, tr.symbol)
456473
case _ => false
457474
}

tests/semanticdb/expect/Advanced.expect.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class Structural/*<-advanced::Structural#*/ {
1414
def s2/*<-advanced::Structural#s2().*/: { val x/*<-local1*/: Int/*->scala::Int#*/ } = new { val x/*<-local2*/: Int/*->scala::Int#*/ = ???/*->scala::Predef.`???`().*/ }
1515
def s3/*<-advanced::Structural#s3().*/: { def m/*<-local6*/(x/*<-local5*/: Int/*->scala::Int#*/): Int/*->scala::Int#*/ } = new { def m/*<-local8*/(x/*<-local7*/: Int/*->scala::Int#*/): Int/*->scala::Int#*/ = ???/*->scala::Predef.`???`().*/ }
1616
def s4/*<-advanced::Structural#s4().*/(a/*<-advanced::Structural#s4().(a)*/: Int/*->scala::Int#*/): { val x/*<-local11*/: Int/*->scala::Int#*/ } = ???/*->scala::Predef.`???`().*/
17+
trait T/*<-advanced::Structural#T#*/[A/*<-advanced::Structural#T#[A]*/] { val foo/*<-advanced::Structural#T#foo.*/: { type B/*<-local12*/ = A/*->advanced::Structural#T#[A]*/ } = ???/*->scala::Predef.`???`().*/; def bar/*<-advanced::Structural#T#bar().*/(b/*<-advanced::Structural#T#bar().(b)*/: foo/*->advanced::Structural#T#foo.*/.B) = () } // from tests/pos/t8177e.scala
1718
}
1819

1920
class Wildcards/*<-advanced::Wildcards#*/ {
@@ -36,8 +37,8 @@ object Test/*<-advanced::Test.*/ {
3637

3738
{
3839
(???/*->scala::Predef.`???`().*/ : Any/*->scala::Any#*/) match {
39-
case e3/*<-local12*/: List/*->scala::package.List#*/[_] =>
40-
val e3x/*<-local14*/ = e3/*->local12*/.head/*->scala::collection::IterableOps#head().*/
40+
case e3/*<-local13*/: List/*->scala::package.List#*/[_] =>
41+
val e3x/*<-local15*/ = e3/*->local13*/.head/*->scala::collection::IterableOps#head().*/
4142
()
4243
}
4344
}

tests/semanticdb/expect/Advanced.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class Structural {
1414
def s2: { val x: Int } = new { val x: Int = ??? }
1515
def s3: { def m(x: Int): Int } = new { def m(x: Int): Int = ??? }
1616
def s4(a: Int): { val x: Int } = ???
17+
trait T[A] { val foo: { type B = A } = ???; def bar(b: foo.B) = () } // from tests/pos/t8177e.scala
1718
}
1819

1920
class Wildcards {

tests/semanticdb/metac.expect

Lines changed: 85 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ Schema => SemanticDB v4
4848
Uri => Advanced.scala
4949
Text => empty
5050
Language => Scala
51-
Symbols => 48 entries
52-
Occurrences => 105 entries
51+
Symbols => 55 entries
52+
Occurrences => 114 entries
5353
Synthetics => 3 entries
5454

5555
Symbols:
@@ -67,7 +67,13 @@ advanced/HKClass#foo(). => method foo [typeparam T , typeparam U ](param x: F[T,
6767
advanced/HKClass#foo().(x) => param x: F[T, U]
6868
advanced/HKClass#foo().[T] => typeparam T
6969
advanced/HKClass#foo().[U] => typeparam U
70-
advanced/Structural# => class Structural extends Object { self: Structural => +5 decls }
70+
advanced/Structural# => class Structural extends Object { self: Structural => +6 decls }
71+
advanced/Structural#T# => trait T [typeparam A ] extends Object { self: T[A] => +4 decls }
72+
advanced/Structural#T#[A] => typeparam A
73+
advanced/Structural#T#`<init>`(). => primary ctor <init> [typeparam A ](): T[A]
74+
advanced/Structural#T#bar(). => method bar (param b: <?>): Unit
75+
advanced/Structural#T#bar().(b) => param b: <?>
76+
advanced/Structural#T#foo. => val method foo Object { type B = A }
7177
advanced/Structural#`<init>`(). => primary ctor <init> (): Structural
7278
advanced/Structural#s1(). => method s1 => Object { abstract val method x Int }
7379
advanced/Structural#s2(). => method s2 => Object { abstract val method x Int }
@@ -99,8 +105,9 @@ local7 => param x: Int
99105
local8 => method m (param x: Int): Int
100106
local9 => final class $anon extends Object { self: $anon => +2 decls }
101107
local11 => abstract val method x Int
102-
local12 => val local e3: List[local13]
103-
local14 => val local e3x: local13
108+
local12 => type B = A
109+
local13 => val local e3: List[local14]
110+
local15 => val local e3x: local14
104111

105112
Occurrences:
106113
[0:8..0:16): advanced <- advanced/
@@ -146,73 +153,82 @@ Occurrences:
146153
[15:24..15:25): x <- local11
147154
[15:27..15:30): Int -> scala/Int#
148155
[15:35..15:38): ??? -> scala/Predef.`???`().
149-
[18:6..18:15): Wildcards <- advanced/Wildcards#
150-
[19:6..19:8): e1 <- advanced/Wildcards#e1().
151-
[19:10..19:14): List -> scala/package.List#
152-
[19:20..19:23): ??? -> scala/Predef.`???`().
153-
[20:6..20:8): e2 <- advanced/Wildcards#e2().
156+
[16:8..16:9): T <- advanced/Structural#T#
157+
[16:10..16:11): A <- advanced/Structural#T#[A]
158+
[16:19..16:22): foo <- advanced/Structural#T#foo.
159+
[16:31..16:32): B <- local12
160+
[16:35..16:36): A -> advanced/Structural#T#[A]
161+
[16:41..16:44): ??? -> scala/Predef.`???`().
162+
[16:50..16:53): bar <- advanced/Structural#T#bar().
163+
[16:54..16:55): b <- advanced/Structural#T#bar().(b)
164+
[16:57..16:60): foo -> advanced/Structural#T#foo.
165+
[19:6..19:15): Wildcards <- advanced/Wildcards#
166+
[20:6..20:8): e1 <- advanced/Wildcards#e1().
154167
[20:10..20:14): List -> scala/package.List#
155-
[20:20..20:23): Int -> scala/Int#
156-
[20:27..20:30): ??? -> scala/Predef.`???`().
157-
[23:7..23:11): Test <- advanced/Test.
158-
[24:6..24:7): s <- advanced/Test.s.
159-
[24:14..24:24): Structural -> advanced/Structural#
160-
[25:6..25:8): s1 <- advanced/Test.s1.
161-
[25:11..25:12): s -> advanced/Test.s.
162-
[25:13..25:15): s1 -> advanced/Structural#s1().
163-
[26:6..26:9): s1x <- advanced/Test.s1x.
164-
[26:12..26:13): s -> advanced/Test.s.
165-
[26:14..26:16): s1 -> advanced/Structural#s1().
166-
[27:6..27:8): s2 <- advanced/Test.s2.
167-
[27:11..27:12): s -> advanced/Test.s.
168-
[27:13..27:15): s2 -> advanced/Structural#s2().
169-
[28:6..28:9): s2x <- advanced/Test.s2x.
170-
[28:12..28:13): s -> advanced/Test.s.
171-
[28:14..28:16): s2 -> advanced/Structural#s2().
172-
[29:6..29:8): s3 <- advanced/Test.s3.
173-
[29:11..29:12): s -> advanced/Test.s.
174-
[29:13..29:15): s3 -> advanced/Structural#s3().
175-
[30:6..30:9): s3x <- advanced/Test.s3x.
176-
[30:12..30:13): s -> advanced/Test.s.
177-
[30:14..30:16): s3 -> advanced/Structural#s3().
178-
[30:19..30:22): ??? -> scala/Predef.`???`().
179-
[32:6..32:7): e <- advanced/Test.e.
180-
[32:14..32:23): Wildcards -> advanced/Wildcards#
181-
[33:6..33:8): e1 <- advanced/Test.e1.
182-
[33:11..33:12): e -> advanced/Test.e.
183-
[33:13..33:15): e1 -> advanced/Wildcards#e1().
184-
[34:6..34:9): e1x <- advanced/Test.e1x.
185-
[34:12..34:13): e -> advanced/Test.e.
186-
[34:14..34:16): e1 -> advanced/Wildcards#e1().
187-
[34:17..34:21): head -> scala/collection/IterableOps#head().
188-
[37:5..37:8): ??? -> scala/Predef.`???`().
189-
[37:11..37:14): Any -> scala/Any#
190-
[38:11..38:13): e3 <- local12
191-
[38:15..38:19): List -> scala/package.List#
192-
[39:12..39:15): e3x <- local14
193-
[39:18..39:20): e3 -> local12
194-
[39:21..39:25): head -> scala/collection/IterableOps#head().
195-
[47:6..47:13): HKClass <- advanced/HKClass#
196-
[47:14..47:15): F <- advanced/HKClass#[F]
197-
[47:20..47:21): T <- advanced/HKClass#`<init>`().[F][T]
198-
[47:28..47:29): U <- advanced/HKClass#`<init>`().[F][U]
199-
[47:36..47:37): U -> advanced/HKClass#`<init>`().[F][U]
200-
[47:39..47:40): T -> advanced/HKClass#`<init>`().[F][T]
201-
[48:6..48:9): foo <- advanced/HKClass#foo().
202-
[48:10..48:11): T <- advanced/HKClass#foo().[T]
203-
[48:12..48:13): U <- advanced/HKClass#foo().[U]
204-
[48:15..48:16): x <- advanced/HKClass#foo().(x)
205-
[48:18..48:19): F -> advanced/HKClass#[F]
206-
[48:20..48:21): T -> advanced/HKClass#foo().[T]
207-
[48:23..48:24): U -> advanced/HKClass#foo().[U]
208-
[48:28..48:34): String -> scala/Predef.String#
209-
[48:37..48:38): x -> advanced/HKClass#foo().(x)
210-
[48:39..48:47): toString -> scala/Tuple2#toString().
168+
[20:20..20:23): ??? -> scala/Predef.`???`().
169+
[21:6..21:8): e2 <- advanced/Wildcards#e2().
170+
[21:10..21:14): List -> scala/package.List#
171+
[21:20..21:23): Int -> scala/Int#
172+
[21:27..21:30): ??? -> scala/Predef.`???`().
173+
[24:7..24:11): Test <- advanced/Test.
174+
[25:6..25:7): s <- advanced/Test.s.
175+
[25:14..25:24): Structural -> advanced/Structural#
176+
[26:6..26:8): s1 <- advanced/Test.s1.
177+
[26:11..26:12): s -> advanced/Test.s.
178+
[26:13..26:15): s1 -> advanced/Structural#s1().
179+
[27:6..27:9): s1x <- advanced/Test.s1x.
180+
[27:12..27:13): s -> advanced/Test.s.
181+
[27:14..27:16): s1 -> advanced/Structural#s1().
182+
[28:6..28:8): s2 <- advanced/Test.s2.
183+
[28:11..28:12): s -> advanced/Test.s.
184+
[28:13..28:15): s2 -> advanced/Structural#s2().
185+
[29:6..29:9): s2x <- advanced/Test.s2x.
186+
[29:12..29:13): s -> advanced/Test.s.
187+
[29:14..29:16): s2 -> advanced/Structural#s2().
188+
[30:6..30:8): s3 <- advanced/Test.s3.
189+
[30:11..30:12): s -> advanced/Test.s.
190+
[30:13..30:15): s3 -> advanced/Structural#s3().
191+
[31:6..31:9): s3x <- advanced/Test.s3x.
192+
[31:12..31:13): s -> advanced/Test.s.
193+
[31:14..31:16): s3 -> advanced/Structural#s3().
194+
[31:19..31:22): ??? -> scala/Predef.`???`().
195+
[33:6..33:7): e <- advanced/Test.e.
196+
[33:14..33:23): Wildcards -> advanced/Wildcards#
197+
[34:6..34:8): e1 <- advanced/Test.e1.
198+
[34:11..34:12): e -> advanced/Test.e.
199+
[34:13..34:15): e1 -> advanced/Wildcards#e1().
200+
[35:6..35:9): e1x <- advanced/Test.e1x.
201+
[35:12..35:13): e -> advanced/Test.e.
202+
[35:14..35:16): e1 -> advanced/Wildcards#e1().
203+
[35:17..35:21): head -> scala/collection/IterableOps#head().
204+
[38:5..38:8): ??? -> scala/Predef.`???`().
205+
[38:11..38:14): Any -> scala/Any#
206+
[39:11..39:13): e3 <- local13
207+
[39:15..39:19): List -> scala/package.List#
208+
[40:12..40:15): e3x <- local15
209+
[40:18..40:20): e3 -> local13
210+
[40:21..40:25): head -> scala/collection/IterableOps#head().
211+
[48:6..48:13): HKClass <- advanced/HKClass#
212+
[48:14..48:15): F <- advanced/HKClass#[F]
213+
[48:20..48:21): T <- advanced/HKClass#`<init>`().[F][T]
214+
[48:28..48:29): U <- advanced/HKClass#`<init>`().[F][U]
215+
[48:36..48:37): U -> advanced/HKClass#`<init>`().[F][U]
216+
[48:39..48:40): T -> advanced/HKClass#`<init>`().[F][T]
217+
[49:6..49:9): foo <- advanced/HKClass#foo().
218+
[49:10..49:11): T <- advanced/HKClass#foo().[T]
219+
[49:12..49:13): U <- advanced/HKClass#foo().[U]
220+
[49:15..49:16): x <- advanced/HKClass#foo().(x)
221+
[49:18..49:19): F -> advanced/HKClass#[F]
222+
[49:20..49:21): T -> advanced/HKClass#foo().[T]
223+
[49:23..49:24): U -> advanced/HKClass#foo().[U]
224+
[49:28..49:34): String -> scala/Predef.String#
225+
[49:37..49:38): x -> advanced/HKClass#foo().(x)
226+
[49:39..49:47): toString -> scala/Tuple2#toString().
211227

212228
Synthetics:
213-
[26:12..26:16):s.s1 => reflectiveSelectable(*)
214-
[28:12..28:16):s.s2 => reflectiveSelectable(*)
215-
[30:12..30:16):s.s3 => reflectiveSelectable(*)
229+
[27:12..27:16):s.s1 => reflectiveSelectable(*)
230+
[29:12..29:16):s.s2 => reflectiveSelectable(*)
231+
[31:12..31:16):s.s3 => reflectiveSelectable(*)
216232

217233
expect/Annotations.scala
218234
------------------------

0 commit comments

Comments
 (0)