Skip to content

Commit 6f086b8

Browse files
committed
Refine exclusion criteria
1 parent 7ae7356 commit 6f086b8

File tree

1 file changed

+33
-15
lines changed

1 file changed

+33
-15
lines changed

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

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ import collection.mutable
1818
import java.lang.Character.{isJavaIdentifierPart, isJavaIdentifierStart}
1919
import java.nio.file.Paths
2020

21+
/** Extract symbol references and uses to semanticdb files.
22+
* See https://scalameta.org/docs/semanticdb/specification.html#symbol-1
23+
* for a description of the format.
24+
* TODO: Also extract type information
25+
*/
2126
class ExtractSemanticDB extends Phase {
2227
import ast.tpd._
2328

@@ -127,35 +132,48 @@ class ExtractSemanticDB extends Phase {
127132
addSymName(b, sym)
128133
b.toString
129134

135+
private def source(given ctx: Context) = ctx.compilationUnit.source
136+
130137
private def range(span: Span)(given ctx: Context): Option[Range] =
131-
val src = ctx.compilationUnit.source
132-
def lineCol(offset: Int) = (src.offsetToLine(offset), src.column(offset))
138+
def lineCol(offset: Int) = (source.offsetToLine(offset), source.column(offset))
133139
val (startLine, startCol) = lineCol(span.start)
134140
val (endLine, endCol) = lineCol(span.end)
135141
Some(Range(startLine, startCol, endLine, endCol))
136142

137-
private def excluded(sym: Symbol)(given Context): Boolean =
138-
!sym.exists || sym.isLocalDummy
143+
private def excludeDef(sym: Symbol)(given Context): Boolean =
144+
!sym.exists || sym.isLocalDummy || sym.is(Synthetic)
145+
146+
private def excludeUse(sym: Symbol, span: Span)(given Context): Boolean =
147+
excludeDef(sym) && span.start == span.end
139148

140149
private def registerOccurrence(sym: Symbol, span: Span, role: SymbolOccurrence.Role)(given Context): Unit =
141-
if !excluded(sym) then
142-
val occ = SymbolOccurrence(symbolName(sym), range(span), role)
143-
if !generated.contains(occ) then
144-
occurrences += occ
145-
generated += occ
150+
val occ = SymbolOccurrence(symbolName(sym), range(span), role)
151+
if !generated.contains(occ) then
152+
occurrences += occ
153+
generated += occ
146154

147155
private def registerUse(sym: Symbol, span: Span)(given Context) =
148-
registerOccurrence(sym, span, SymbolOccurrence.Role.REFERENCE)
149-
private def registerDef(sym: Symbol, span: Span)(given Context) =
150-
registerOccurrence(sym, span, SymbolOccurrence.Role.DEFINITION)
156+
if !excludeUse(sym, span) then
157+
registerOccurrence(sym, span, SymbolOccurrence.Role.REFERENCE)
151158

152159
override def traverse(tree: Tree)(given ctx: Context): Unit =
160+
//println(i"reg $tree")
153161
tree match
154-
case tree: DefTree =>
155-
registerDef(tree.symbol, tree.span)
162+
case tree: DefTree if !excludeDef(tree.symbol) =>
163+
registerOccurrence(tree.symbol, tree.span, SymbolOccurrence.Role.DEFINITION)
156164
traverseChildren(tree)
157-
case tree: RefTree =>
165+
case tree: Ident =>
158166
registerUse(tree.symbol, tree.span)
167+
case tree: Select =>
168+
if !excludeUse(tree.symbol, tree.span) then
169+
val end = tree.span.end
170+
val limit = tree.qualifier.span.end
171+
val start =
172+
if limit < end then
173+
val len = tree.name.toString.length
174+
if source.content()(end - 1) == '`' then end - len - 1 else end - len
175+
else limit
176+
registerUse(tree.symbol, Span(start max limit, end))
159177
traverseChildren(tree)
160178
case tree: Import =>
161179
for sel <- tree.selectors do

0 commit comments

Comments
 (0)