Skip to content

Commit ad9e2b0

Browse files
committed
fix bug with var definition and protected[this] var and vals
1 parent 622ac99 commit ad9e2b0

File tree

3 files changed

+59
-31
lines changed

3 files changed

+59
-31
lines changed

semanticdb/input/src/main/scala/example/Access.scala

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,20 @@ class Access {
88
protected[this] def m5 = ???
99
protected[example] def m6 = ???
1010
def m7 = ???
11+
12+
private val mv1 = ???
13+
private[this] val mv2 = ???
14+
private[Access] val mv3 = ???
15+
protected val mv4 = ???
16+
protected[this] val mv5 = ???
17+
protected[example] val mv6 = ???
18+
val mv7 = ???
19+
20+
private var mr1 = ???
21+
private[this] var mr2 = ???
22+
private[Access] var mr3 = ???
23+
protected var mr4 = ???
24+
protected[this] var mr5 = ???
25+
protected[example] var mr6 = ???
26+
var mr7 = ???
1127
}

semanticdb/src/dotty/semanticdb/SemanticdbConsumer.scala

Lines changed: 41 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,6 @@ class SemanticdbConsumer(sourceFile: java.nio.file.Path) extends TastyConsumer {
6666
def isUserCreated: Boolean = {
6767
val children: List[Position] =
6868
ChildTraverser.getChildren(tree)(reflect.rootContext).map(_.pos)
69-
/*println("call to isusercreated on " + iterateParent(tree.symbol))
70-
if (tree.pos.exists)
71-
println(tree.pos.start, tree.pos.end)
72-
println(children.map(x => (x.start, x.end)))*/
7369
return !((tree.pos.exists && tree.pos.start == tree.pos.end && children == Nil) || children
7470
.exists(_ == tree.pos))
7571
}
@@ -214,11 +210,15 @@ class SemanticdbConsumer(sourceFile: java.nio.file.Path) extends TastyConsumer {
214210
}
215211
}
216212

213+
/* the `isFieldForPrivateThis` is commented out otherwise class members of the form
214+
"private[this] val foo" are not converted to symbol occurences.
215+
In the original semanticdb this line is commented out.
216+
*/
217217
def isScalacField(implicit ctx: Context): Boolean = {
218-
val isFieldForPrivateThis = symbol.flags.is(Flags.PrivateLocal) && symbol.isTerm && !symbol.isMethod && !symbol.isObject
218+
//val isFieldForPrivateThis = symbol.flags.is(Flags.PrivateLocal) && symbol.isTerm && !symbol.isMethod && !symbol.isObject
219219
val isFieldForOther = false //symbol.name.endsWith(g.nme.LOCAL_SUFFIX_STRING)
220220
val isJavaDefined = symbol.flags.is(Flags.JavaDefined)
221-
(isFieldForPrivateThis || isFieldForOther) && !isJavaDefined
221+
(/*isFieldForPrivateThis ||*/ isFieldForOther) && !isJavaDefined
222222
}
223223
def isUselessField(implicit ctx: Context): Boolean = {
224224
symbol.isScalacField && symbol.owner != NoSymbol
@@ -360,7 +360,6 @@ class SemanticdbConsumer(sourceFile: java.nio.file.Path) extends TastyConsumer {
360360

361361
val isdef = symbol match {case IsDefSymbol(_) => true case _ => false}
362362
val symbolName = if (isMutableAssignement) symbol.trueName + "_=" else symbol.trueName
363-
println("=>", symbolName)
364363
val next_atom =
365364
if (symbol.isPackage) {
366365
d.Package(symbolName)
@@ -374,7 +373,6 @@ class SemanticdbConsumer(sourceFile: java.nio.file.Path) extends TastyConsumer {
374373
} else if (symbol.isValMethod && !symbol.isVarAccessor) {
375374
d.Term(symbolName)
376375
} else if (symbol.isMethod || symbol.isUsefulField || symbol.isVarAccessor) {
377-
println("METHOD", symbol.isMethod, symbol.isUsefulField)
378376
d.Method(symbolName,
379377
disimbiguate(previous_symbol + symbolName, symbol))
380378
} else if (symbol.isTypeParameter) {
@@ -435,7 +433,6 @@ class SemanticdbConsumer(sourceFile: java.nio.file.Path) extends TastyConsumer {
435433
val (symbol_path, is_global) = posToRange(symbol.pos) match {
436434
case Some(keyRange)
437435
if symbolsCache.contains((symbolName, keyRange)) => {
438-
println("already found")
439436
(symbolsCache((symbolName, keyRange)), symbol.isSemanticdbLocal)}
440437
case Some(keyRange) => {
441438
val (sp, ig) = symbolToSymbolString(symbol, isMutableAssignement)
@@ -446,7 +443,6 @@ class SemanticdbConsumer(sourceFile: java.nio.file.Path) extends TastyConsumer {
446443
symbolToSymbolString(symbol)
447444
}
448445

449-
println(symbol_path, symbol.isUselessOccurrence)
450446
// We want to add symbols coming from our file
451447
// if (symbol.pos.sourceFile != sourceFile) return
452448
if (symbol_path == "" /*|| symbol.isUselessOccurrence*/) return
@@ -475,22 +471,39 @@ class SemanticdbConsumer(sourceFile: java.nio.file.Path) extends TastyConsumer {
475471
)
476472
}
477473

474+
475+
/* Return true if symbol represents the definition of a var setter, false otherwise.
476+
We return true if the extract of source code corresponding to the position of the symbol is the same as the symbol name.
477+
Ex:
478+
var m = ???
479+
-> there is a defdef for `m_=` with position "m =". As "m =" != "m_=", we return false
480+
*/
481+
def isMutableSetterExplicit(symbol : Symbol, role : s.SymbolOccurrence.Role) = {
482+
if (role == s.SymbolOccurrence.Role.DEFINITION &&
483+
symbol.pos.exists &&
484+
symbol.flags.is(Flags.Mutable) && symbol.isMethod &&
485+
symbol.trueName.endsWith("_="))
486+
(sourceCode.substring(symbol.pos.start, symbol.pos.end) == symbol.trueName)
487+
else
488+
true
489+
}
490+
478491
val reservedFunctions: List[String] = Nil
479492
def addOccurenceTree(tree: Tree,
480493
type_symbol: s.SymbolOccurrence.Role,
481494
range: s.Range,
482495
force_add: Boolean = false,
483496
isMutableAssignement: Boolean = false): Unit = {
484-
println("coming from tree", isMutableAssignement)
485-
if (tree.symbol.isUseful && (tree.isUserCreated || (force_add && !(!tree.isUserCreated && iterateParent(
486-
tree.symbol) == "java/lang/Object#`<init>`().")))) {
497+
if (tree.symbol.isUseful &&
498+
isMutableSetterExplicit(tree.symbol, type_symbol) &&
499+
(tree.isUserCreated ||
500+
(force_add && !(!tree.isUserCreated && iterateParent(tree.symbol) == "java/lang/Object#`<init>`().")))) {
487501
addOccurence(tree.symbol, type_symbol, range, isMutableAssignement)
488502
}
489503
}
490504
def addOccurenceTypeTree(typetree: TypeTree,
491505
type_symbol: s.SymbolOccurrence.Role,
492506
range: s.Range): Unit = {
493-
println("coming from type")
494507
if (typetree.symbol.isUseful && typetree.isUserCreated) {
495508
addOccurence(typetree.symbol, type_symbol, range)
496509
}
@@ -551,7 +564,6 @@ class SemanticdbConsumer(sourceFile: java.nio.file.Path) extends TastyConsumer {
551564

552565
def rangeSelect(name: String, range: Position): s.Range = {
553566
if (name == "<init>") {
554-
println(posToRange(range).get)
555567
return posToRange(range).get
556568
} else
557569
/* The position of a select is the position of the whole select expression,
@@ -747,10 +759,12 @@ class SemanticdbConsumer(sourceFile: java.nio.file.Path) extends TastyConsumer {
747759
def generateParamsPosMapping(cdef: DefDef)(implicit ctx: Context): Map[String, s.Range] = {
748760
val DefDef(_, _, params, _, _) = cdef
749761
val start = Map[String, s.Range]()
750-
return params.foldLeft(start)((old, statements) =>
751-
return statements.foldLeft(old)((old, cval) =>
752-
return old + (cval.name -> range(cval, cval.symbol.pos, cval.symbol.trueName))
753-
)
762+
params.foldLeft(start)((old, statements) => {
763+
statements.foldLeft(old)((old, cval) => {
764+
println(cval)
765+
old + (cval.name -> range(cval, cval.symbol.pos, cval.symbol.trueName))
766+
})
767+
}
754768
)
755769
}
756770

@@ -808,7 +822,6 @@ class SemanticdbConsumer(sourceFile: java.nio.file.Path) extends TastyConsumer {
808822
constr.symbol.pos.endLine,
809823
constr.symbol.pos.endColumn))
810824
}*/
811-
println(tree.symbol.flags, cl.symbol.asClass.companionClass, tree.symbol, constr.pos.start, constr.pos.end)
812825

813826
disableConstrParamTraversal = true
814827
traverseTree(constr)
@@ -860,25 +873,24 @@ class SemanticdbConsumer(sourceFile: java.nio.file.Path) extends TastyConsumer {
860873
if (!tree.symbol.flags.is(Flags.Case)) {
861874
classStacks = tree.symbol :: classStacks
862875

863-
println("\n>>>>>>>>>" + classStacks)
864876
println(statements)
865-
877+
println("")
866878
val paramsPosMapping = generateParamsPosMapping(constr)
867-
868-
println("####" + paramsPosMapping)
879+
println(paramsPosMapping)
880+
println("")
869881

870882
statements.foreach(statement => {
871883
if (statement.symbol.flags.is(Flags.ParamAccessor)) {
872-
println("oki", statement.symbol.pos)
873884
if (paramsPosMapping.contains(statement.symbol.name)) {
885+
println("parameter "+statement)
874886
addOccurence(statement.symbol, s.SymbolOccurrence.Role.DEFINITION, paramsPosMapping(statement.symbol.name))
875887
}
876888
//traverseTree(statement)
877889
} else if (!statement.symbol.flags.is(Flags.Param)) {
890+
println(statement.symbol, statement.symbol.flags)
878891
traverseTree(statement)
879892
}
880893
})
881-
println("<<<<<<<<<<" + classStacks + "\n" )
882894

883895
classStacks = classStacks.tail
884896
}
@@ -901,14 +913,14 @@ class SemanticdbConsumer(sourceFile: java.nio.file.Path) extends TastyConsumer {
901913
}
902914

903915
case Term.Assign(lhs, rhs) => {
904-
println("ASSIGN:", lhs.symbol, lhs.symbol.flags, rhs.symbol, rhs.symbol.flags)
905916
isAssignedTerm = true
906917
super.traverseTree(tree)
907918
isAssignedTerm = false
908919
}
909920

910921
case IsDefinition(cdef) => {
911-
922+
println("definition " + cdef.symbol + " " + cdef.symbol.flags)
923+
println(cdef.symbol.protectedWithin, cdef.symbol.privateWithin)
912924
if (cdef.symbol.flags.is(Flags.Protected)) {
913925
cdef.symbol.protectedWithin match {
914926
case Some(within) => {
@@ -927,6 +939,7 @@ class SemanticdbConsumer(sourceFile: java.nio.file.Path) extends TastyConsumer {
927939
} else {
928940
cdef.symbol.privateWithin match {
929941
case Some(within) => {
942+
println("YES")
930943
val startColumn = cdef.pos.startColumn + "private[".length
931944
addOccurence(
932945
within.typeSymbol,
@@ -991,8 +1004,6 @@ class SemanticdbConsumer(sourceFile: java.nio.file.Path) extends TastyConsumer {
9911004
shouldForceAdd = qualifier.isUserCreated
9921005
}
9931006
}
994-
println("SELECT => " + tree + tree.symbol.flags)
995-
println("acc", isAssignedTerm && tree.symbol.flags.is(Flags.Mutable))
9961007
val temp = isAssignedTerm
9971008
isAssignedTerm = false
9981009
super.traverseTree(tree)

semanticdb/test/dotty/semanticdb/Tests.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,9 @@ class Tests {
122122
*/
123123
//@Test def testTypesAnnotations() : Unit = checkFile("example/TypesAnnotations.scala") // Crash, has to deal with init symbols
124124
//@Test def testNew(): Unit = checkFile("example/New.scala")
125-
@Test def testClasses(): Unit = checkFile("example/Classes.scala")
125+
//@Test def testClasses(): Unit = checkFile("example/Classes.scala")
126126

127127
//@Test def testSemanticDoc(): Unit = checkFile("example/SemanticDoc.scala")
128+
@Test def testAccess(): Unit = checkFile("example/Access.scala")
128129
//@Test def testDependantModule(): Unit = checkFile("example/DependantModule.scala")
129130
}

0 commit comments

Comments
 (0)