Skip to content

Commit b0ddee5

Browse files
committed
correct arrow direction in metac occurrences, include source snippet, correct package def role
1 parent da2776c commit b0ddee5

File tree

3 files changed

+1948
-1935
lines changed

3 files changed

+1948
-1935
lines changed

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

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,8 @@ class ExtractSemanticDB extends Phase {
322322
if !isWildcard(sym.name) then
323323
val symbol = symbolName(sym)
324324
registerOccurrence(symbol, span, SymbolOccurrence.Role.DEFINITION)
325-
registerSymbol(sym, symbol, symkinds)
325+
if !sym.is(Package)
326+
registerSymbol(sym, symbol, symkinds)
326327

327328
private def spanOfSymbol(sym: Symbol, span: Span)(given Context): Span = {
328329
val contents = if source.exists then source.content() else Array.empty[Char]
@@ -347,6 +348,16 @@ class ExtractSemanticDB extends Phase {
347348
}).toMap
348349
end findGetters
349350

351+
def adjustSpanToName(span: Span, qualSpan: Span, name: Name)(given Context) =
352+
val end = span.end
353+
val limit = qualSpan.end
354+
val start =
355+
if limit < end then
356+
val len = name.toString.length
357+
if source.content()(end - 1) == '`' then end - len - 2 else end - len
358+
else limit
359+
Span(start max end, end)
360+
350361
override def traverse(tree: Tree)(given Context): Unit =
351362
for annot <- tree.symbol.annotations do
352363
if annot.tree.span.exists
@@ -355,6 +366,15 @@ class ExtractSemanticDB extends Phase {
355366
traverse(annot.tree)
356367

357368
tree match
369+
case tree: PackageDef =>
370+
if !excludeDef(tree.pid.symbol) && tree.pid.span.start != tree.pid.span.end
371+
tree.pid match
372+
case tree @ Select(qual, _) =>
373+
traverse(qual)
374+
registerDefinition(tree.symbol, adjustSpanToName(tree.span, qual.span, tree.symbol.name), Set.empty)
375+
case tree @ Ident(name) =>
376+
registerDefinition(tree.symbol, tree.span, Set.empty)
377+
tree.stats.foreach(traverse)
358378
case tree: ValDef if tree.symbol.is(Module) => // skip module val
359379
case tree: NamedDefTree
360380
if !excludeDef(tree.symbol) && tree.span.start != tree.span.end =>
@@ -415,22 +435,16 @@ class ExtractSemanticDB extends Phase {
415435
if !excludeUseStrict(tree.lhs.symbol, tree.lhs.span)
416436
val name = tree.lhs.symbol.name
417437
val setter = tree.lhs.symbol.owner.info.decls.find(s => s.name.startsWith(name.show) && s.name.isSetterName)
418-
registerUse(setter.orElse(tree.lhs.symbol), tree.lhs.span)
438+
val span = tree.lhs.span
439+
registerUse(setter.orElse(tree.lhs.symbol), adjustSpanToName(span, span, name))
419440
traverse(tree.rhs)
420441
case tree: Ident =>
421442
if tree.name != nme.WILDCARD && !excludeUseStrict(tree.symbol, tree.span) then
422443
registerUse(tree.symbol, tree.span)
423444
case tree: Select =>
424445
val qualSpan = tree.qualifier.span
425446
if !excludeUseStrict(tree.symbol, tree.span) then
426-
val end = tree.span.end
427-
val limit = qualSpan.end
428-
val start =
429-
if limit < end then
430-
val len = tree.name.toString.length
431-
if source.content()(end - 1) == '`' then end - len - 1 else end - len
432-
else limit
433-
registerUse(tree.symbol, Span(start max limit, end))
447+
registerUse(tree.symbol, adjustSpanToName(tree.span, qualSpan, tree.name))
434448
if qualSpan.exists && qualSpan.start != qualSpan.end then
435449
traverseChildren(tree)
436450
case tree: Import =>

compiler/test/dotty/tools/dotc/semanticdb/Semanticdbs.scala

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,22 +127,28 @@ object Semanticdbs with
127127
sb.append(info.displayName).nl
128128
end processSymbol
129129

130-
def processOccurrence(occ: SymbolOccurrence)(given sb: StringBuilder): Unit =
130+
def processOccurrence(occ: SymbolOccurrence)(given sb: StringBuilder, sourceFile: SourceFile): Unit =
131131
occ.range match
132132
case Some(range) =>
133133
sb.append('[')
134134
.append(range.startLine).append(':').append(range.startCharacter)
135135
.append("..")
136136
.append(range.endLine).append(':').append(range.endCharacter)
137137
.append(')')
138+
if range.endLine == range.startLine
139+
&& range.startCharacter != range.endCharacter
140+
&& !(occ.role.isDefinition && occ.symbol.matches(raw".+`<init>`\((?:\+\d+)?\)\."))
141+
val line = sourceFile.lineContent(sourceFile.lineToOffset(range.startLine))
142+
sb.append(" ").append(line.substring(range.startCharacter, range.endCharacter))
138143
case _ =>
139144
sb.append("[)")
140145
end match
141-
sb.append(" => ").append(occ.symbol).nl
146+
sb.append(if occ.role.isReference then " -> " else " <- ").append(occ.symbol).nl
142147
end processOccurrence
143148

144149
def metac(doc: TextDocument, realPath: Path)(given sb: StringBuilder): StringBuilder =
145150
val realURI = realPath.toString
151+
given SourceFile = SourceFile.virtual(doc.uri, doc.text)
146152
sb.append(realURI).nl
147153
sb.append("_" * realURI.length).nl
148154
sb.nl

0 commit comments

Comments
 (0)