Skip to content

Commit d4f836e

Browse files
committed
Fix production of SemanticDB of shadowed parameters
1 parent 16a67dc commit d4f836e

File tree

4 files changed

+144
-1
lines changed

4 files changed

+144
-1
lines changed

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

+3-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,9 @@ class TypeOps:
9696
// We try to find the "actual" binder of <y>: `inner`,
9797
// and register them to the symbol table with `(<y>, inner) -> <y>`
9898
// instead of `("y", outer) -> <y>`
99-
if lam.paramNames.contains(sym.name) then
99+
// We must also check for parameter shadowing such as def shadowParam(x: Int) = {val x = true}
100+
101+
if (sym.is(Flags.Param) || !sym.owner.info.isInstanceOf[LambdaType]) && lam.paramNames.contains(sym.name) then
100102
paramRefSymtab((lam, sym.name)) = sym
101103
else
102104
enterParamRef(lam.resType)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package example
2+
3+
class Shadow/*<-example::Shadow#*/{
4+
5+
def shadowParam/*<-example::Shadow#shadowParam().*/(x/*<-example::Shadow#shadowParam().(x)*/: Int/*->scala::Int#*/)= {
6+
val x/*<-local0*/ = true
7+
}
8+
9+
def curriedParams/*<-example::Shadow#curriedParams().*/(x/*<-example::Shadow#curriedParams().(x)*/: Int/*->scala::Int#*/)(y/*<-example::Shadow#curriedParams().(y)*/: List/*->scala::package.List#*/[Int/*->scala::Int#*/]) = {
10+
val x/*<-local1*/ = "shadow"
11+
val y/*<-local2*/ = 1
12+
}
13+
14+
15+
def multiParams/*<-example::Shadow#multiParams().*/(x/*<-example::Shadow#multiParams().(x)*/: List/*->scala::package.List#*/[Int/*->scala::Int#*/], y/*<-example::Shadow#multiParams().(y)*/: String/*->scala::Predef.String#*/) = {
16+
val x/*<-local3*/ = 1
17+
val y/*<-local4*/ = List/*->scala::package.List.*/(1,2,3)
18+
}
19+
20+
21+
def shadowInParamBlock/*<-example::Shadow#shadowInParamBlock().*/(x/*<-example::Shadow#shadowInParamBlock().(x)*/: Int/*->scala::Int#*/, y/*<-example::Shadow#shadowInParamBlock().(y)*/: Int/*->scala::Int#*/) = {
22+
val y/*<-local5*/ = 1
23+
{
24+
val x/*<-local6*/ = 2
25+
}
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package example
2+
3+
class Shadow{
4+
5+
def shadowParam(x: Int)= {
6+
val x = true
7+
}
8+
9+
def curriedParams(x: Int)(y: List[Int]) = {
10+
val x = "shadow"
11+
val y = 1
12+
}
13+
14+
15+
def multiParams(x: List[Int], y: String) = {
16+
val x = 1
17+
val y = List(1,2,3)
18+
}
19+
20+
21+
def shadowInParamBlock(x: Int, y: Int) = {
22+
val y = 1
23+
{
24+
val x = 2
25+
}
26+
}
27+
}

tests/semanticdb/metac.expect

+87
Original file line numberDiff line numberDiff line change
@@ -3484,6 +3484,93 @@ Diagnostics:
34843484
[10:29..10:33): [warning] with as a type operator has been deprecated; use & instead
34853485
This construct can be rewritten automatically under -rewrite -source 3.4-migration.
34863486

3487+
expect/ShadowedParameters.scala
3488+
-------------------------------
3489+
3490+
Summary:
3491+
Schema => SemanticDB v4
3492+
Uri => ShadowedParameters.scala
3493+
Text => empty
3494+
Language => Scala
3495+
Symbols => 20 entries
3496+
Occurrences => 31 entries
3497+
Diagnostics => 14 entries
3498+
Synthetics => 1 entries
3499+
3500+
Symbols:
3501+
example/Shadow# => class Shadow extends Object { self: Shadow => +5 decls }
3502+
example/Shadow#`<init>`(). => primary ctor <init> (): Shadow
3503+
example/Shadow#curriedParams(). => method curriedParams (param x: Int)(param y: List[Int]): Unit
3504+
example/Shadow#curriedParams().(x) => param x: Int
3505+
example/Shadow#curriedParams().(y) => param y: List[Int]
3506+
example/Shadow#multiParams(). => method multiParams (param x: List[Int], param y: String): Unit
3507+
example/Shadow#multiParams().(x) => param x: List[Int]
3508+
example/Shadow#multiParams().(y) => param y: String
3509+
example/Shadow#shadowInParamBlock(). => method shadowInParamBlock (param x: Int, param y: Int): Unit
3510+
example/Shadow#shadowInParamBlock().(x) => param x: Int
3511+
example/Shadow#shadowInParamBlock().(y) => param y: Int
3512+
example/Shadow#shadowParam(). => method shadowParam (param x: Int): Unit
3513+
example/Shadow#shadowParam().(x) => param x: Int
3514+
local0 => val local x: Boolean
3515+
local1 => val local x: String
3516+
local2 => val local y: Int
3517+
local3 => val local x: Int
3518+
local4 => val local y: List[Int]
3519+
local5 => val local y: Int
3520+
local6 => val local x: Int
3521+
3522+
Occurrences:
3523+
[0:8..0:15): example <- example/
3524+
[2:6..2:12): Shadow <- example/Shadow#
3525+
[4:4..4:4): <- example/Shadow#`<init>`().
3526+
[4:8..4:19): shadowParam <- example/Shadow#shadowParam().
3527+
[4:20..4:21): x <- example/Shadow#shadowParam().(x)
3528+
[4:23..4:26): Int -> scala/Int#
3529+
[5:12..5:13): x <- local0
3530+
[8:8..8:21): curriedParams <- example/Shadow#curriedParams().
3531+
[8:22..8:23): x <- example/Shadow#curriedParams().(x)
3532+
[8:25..8:28): Int -> scala/Int#
3533+
[8:30..8:31): y <- example/Shadow#curriedParams().(y)
3534+
[8:33..8:37): List -> scala/package.List#
3535+
[8:38..8:41): Int -> scala/Int#
3536+
[9:12..9:13): x <- local1
3537+
[10:12..10:13): y <- local2
3538+
[14:8..14:19): multiParams <- example/Shadow#multiParams().
3539+
[14:20..14:21): x <- example/Shadow#multiParams().(x)
3540+
[14:23..14:27): List -> scala/package.List#
3541+
[14:28..14:31): Int -> scala/Int#
3542+
[14:34..14:35): y <- example/Shadow#multiParams().(y)
3543+
[14:37..14:43): String -> scala/Predef.String#
3544+
[15:12..15:13): x <- local3
3545+
[16:12..16:13): y <- local4
3546+
[16:16..16:20): List -> scala/package.List.
3547+
[20:8..20:26): shadowInParamBlock <- example/Shadow#shadowInParamBlock().
3548+
[20:27..20:28): x <- example/Shadow#shadowInParamBlock().(x)
3549+
[20:30..20:33): Int -> scala/Int#
3550+
[20:35..20:36): y <- example/Shadow#shadowInParamBlock().(y)
3551+
[20:38..20:41): Int -> scala/Int#
3552+
[21:12..21:13): y <- local5
3553+
[23:16..23:17): x <- local6
3554+
3555+
Diagnostics:
3556+
[4:20..4:21): [warning] unused explicit parameter
3557+
[5:12..5:13): [warning] unused local definition
3558+
[8:22..8:23): [warning] unused explicit parameter
3559+
[8:30..8:31): [warning] unused explicit parameter
3560+
[9:12..9:13): [warning] unused local definition
3561+
[10:12..10:13): [warning] unused local definition
3562+
[14:20..14:21): [warning] unused explicit parameter
3563+
[14:34..14:35): [warning] unused explicit parameter
3564+
[15:12..15:13): [warning] unused local definition
3565+
[16:12..16:13): [warning] unused local definition
3566+
[20:27..20:28): [warning] unused explicit parameter
3567+
[20:35..20:36): [warning] unused explicit parameter
3568+
[21:12..21:13): [warning] unused local definition
3569+
[23:16..23:17): [warning] unused local definition
3570+
3571+
Synthetics:
3572+
[16:16..16:20):List => *.apply[Int]
3573+
34873574
expect/StructuralTypes.scala
34883575
----------------------------
34893576

0 commit comments

Comments
 (0)