Skip to content

Commit 618ccc8

Browse files
author
Matthieu
committed
produce SDB of var reassigning
1 parent 94f787a commit 618ccc8

File tree

4 files changed

+60
-36
lines changed

4 files changed

+60
-36
lines changed

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

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ import dotty.tools.dotc.semanticdb.Scala3.TastyFakeSymbol
6262

6363

6464
import dotty.tools.dotc.SDBSymbolNameBuilder
65+
import dotty.tools.dotc.core.StdNames.str
6566

6667
extension (sym : Symbol){
6768

@@ -292,16 +293,24 @@ class CustomTreeTraverser(sourceFilePath: String)(using ctx: Context)(using SDBS
292293
val sname = sym.SDBname
293294
registerSymbol(sym, symkinds)
294295

295-
private def registerOccurrence(symbol: Symbol, span: SourcePosition, role: SymbolOccurrence.Role)(using Context, SDBSymbolNameBuilder): Unit =
296-
val range = if span.isUnknown then None else
297-
val result = extractor.extract(symbol.name.toString(), span, symbol)
298-
Some(result)
299-
296+
private def registerOccurrence(symbol: Symbol, range: Option[dotty.tools.dotc.semanticdb.Range], role: SymbolOccurrence.Role)(using Context, SDBSymbolNameBuilder): Unit =
300297
val occ = SymbolOccurrence(range, symbol.SDBname, role)
301298
if !generated.contains(occ) && occ.symbol.nonEmpty && !range.isEmpty then
302299
occurrences += occ
303300
generated += occ
301+
302+
private def registerOccurrence(symbol: Symbol, span: SourcePosition, role: SymbolOccurrence.Role)(using Context, SDBSymbolNameBuilder): Unit =
303+
val range = if span.isUnknown then None else
304+
val result = extractor.extract(symbol.name.toString(), span, symbol)
305+
Some(result)
306+
registerOccurrence(symbol, range, role)
307+
308+
private def registerOccurrence(symbol: Symbol, otherSymbol: Symbol, otherSymbolSpan: SourcePosition, role: SymbolOccurrence.Role)(using Context, SDBSymbolNameBuilder): Unit =
309+
val range = if otherSymbolSpan.isUnknown then None else
310+
val result = extractor.extract(otherSymbol.name.toString(), otherSymbolSpan, otherSymbol)
311+
Some(result)
304312

313+
registerOccurrence(symbol, range, role)
305314

306315
private def registerOccurrence(symbol: Symbol, symbolName: String, span: SourcePosition, role: SymbolOccurrence.Role)(using Context, SDBSymbolNameBuilder): Unit =
307316
val range = if span.isUnknown then None else
@@ -392,13 +401,21 @@ class CustomTreeTraverser(sourceFilePath: String)(using ctx: Context)(using SDBS
392401
case assign : Assign =>
393402
assign.lhs match
394403
case select : Select =>
395-
registerOccurrence(select.symbol, select.pos, dotty.tools.dotc.semanticdb.SymbolOccurrence.Role.REFERENCE)
404+
val setterName = select.symbol.name.toTermName match
405+
case simpleName : SimpleName => simpleName.append(str.SETTER_SUFFIX)
406+
case _ => select.symbol.name.toTermName
407+
408+
val found = select.symbol.owner match
409+
case classSymbol: ClassSymbol =>
410+
classSymbol.declarations.find(_.name == setterName).getOrElse(select.symbol)
411+
case _ => select.symbol
412+
413+
registerOccurrence(found, select.symbol, select.pos, dotty.tools.dotc.semanticdb.SymbolOccurrence.Role.REFERENCE)
396414
super.traverse(assign.rhs)
397415
case _ => super.traverse(tree)
398416

399417

400418
case ident: Ident=>
401-
402419
registerOccurrence(ident.symbol, ident.pos, dotty.tools.dotc.semanticdb.SymbolOccurrence.Role.REFERENCE)
403420
super.traverse(tree)
404421

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
class TastyQueryVar/*<-_empty_::TastyQueryVar#*/{
2-
var v/*<-_empty_::TastyQueryVar#v().*/ = 1
3-
val x/*<-_empty_::TastyQueryVar#x.*/ = v/*->_empty_::TastyQueryVar#v().*/
4-
def foo/*<-_empty_::TastyQueryVar#foo().*/(x/*<-_empty_::TastyQueryVar#foo().(x)*/ : Int/*->scala::Int#*/) = {
5-
var z/*<-local0*/ = "Hello"
6-
}
2+
var x/*<-_empty_::TastyQueryVar#x().*/ = 2
3+
x/*->_empty_::TastyQueryVar#`x_=`().*/ = 3
74

5+
def foo/*<-_empty_::TastyQueryVar#foo().*/ =
6+
var z/*<-local0*/ = 2
7+
z/*->local0*/ = 3
8+
var p/*<-_empty_::TastyQueryVar#p().*/ = foo/*->_empty_::TastyQueryVar#foo().*/
9+
p/*->_empty_::TastyQueryVar#`p_=`().*/ = {val x/*<-local1*/ = true}
810
}
Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
class TastyQueryVar{
2-
var v = 1
3-
val x = v
4-
5-
def foo(x : Int) = {
6-
var z = "Hello"
7-
}
2+
var x = 2
3+
x = 3
84

5+
def foo =
6+
var x = 2
7+
x = 3
8+
var p = foo
9+
p = {val x = true}
910
}

tests/semanticdb/metac.expect

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4315,34 +4315,38 @@ Schema => SemanticDB v4
43154315
Uri => TastyQueryVar.scala
43164316
Text => empty
43174317
Language => Scala
4318-
Symbols => 9 entries
4319-
Occurrences => 9 entries
4318+
Symbols => 11 entries
4319+
Occurrences => 11 entries
43204320
Diagnostics => 1 entries
43214321

43224322
Symbols:
4323-
_empty_/TastyQueryVar# => class TastyQueryVar extends Object { self: TastyQueryVar => +5 decls }
4323+
_empty_/TastyQueryVar# => class TastyQueryVar extends Object { self: TastyQueryVar => +6 decls }
43244324
_empty_/TastyQueryVar#`<init>`(). => primary ctor <init> (): TastyQueryVar
4325-
_empty_/TastyQueryVar#`v_=`(). => var method v_= (param x$1: Int): Unit
4326-
_empty_/TastyQueryVar#`v_=`().(x$1) => param x$1: Int
4327-
_empty_/TastyQueryVar#foo(). => method foo (param x: Int): Unit
4328-
_empty_/TastyQueryVar#foo().(x) => param x: Int
4329-
_empty_/TastyQueryVar#v(). => var method v Int
4330-
_empty_/TastyQueryVar#x. => val method x Int
4331-
local0 => var local z: String
4325+
_empty_/TastyQueryVar#`p_=`(). => var method p_= (param x$1: Unit): Unit
4326+
_empty_/TastyQueryVar#`p_=`().(x$1) => param x$1: Unit
4327+
_empty_/TastyQueryVar#`x_=`(). => var method x_= (param x$1: Int): Unit
4328+
_empty_/TastyQueryVar#`x_=`().(x$1) => param x$1: Int
4329+
_empty_/TastyQueryVar#foo(). => method foo => Unit
4330+
_empty_/TastyQueryVar#p(). => var method p Unit
4331+
_empty_/TastyQueryVar#x(). => var method x Int
4332+
local0 => var local z: Int
4333+
local1 => val local x: Boolean
43324334

43334335
Occurrences:
43344336
[0:6..0:19): TastyQueryVar <- _empty_/TastyQueryVar#
43354337
[1:4..1:4): <- _empty_/TastyQueryVar#`<init>`().
4336-
[1:8..1:9): v <- _empty_/TastyQueryVar#v().
4337-
[2:8..2:9): x <- _empty_/TastyQueryVar#x.
4338-
[2:12..2:13): v -> _empty_/TastyQueryVar#v().
4339-
[3:8..3:11): foo <- _empty_/TastyQueryVar#foo().
4340-
[3:12..3:13): x <- _empty_/TastyQueryVar#foo().(x)
4341-
[3:16..3:19): Int -> scala/Int#
4342-
[4:12..4:13): z <- local0
4338+
[1:8..1:9): x <- _empty_/TastyQueryVar#x().
4339+
[2:4..2:5): x -> _empty_/TastyQueryVar#`x_=`().
4340+
[4:8..4:11): foo <- _empty_/TastyQueryVar#foo().
4341+
[5:12..5:13): z <- local0
4342+
[6:8..6:9): z -> local0
4343+
[7:8..7:9): p <- _empty_/TastyQueryVar#p().
4344+
[7:12..7:15): foo -> _empty_/TastyQueryVar#foo().
4345+
[8:4..8:5): p -> _empty_/TastyQueryVar#`p_=`().
4346+
[8:13..8:14): x <- local1
43434347

43444348
Diagnostics:
4345-
[4:12..4:13): [warning] unused local definition
4349+
[8:13..8:14): [warning] unused local definition
43464350

43474351
expect/TastyQueryVariousFeatures.scala
43484352
--------------------------------------

0 commit comments

Comments
 (0)