Skip to content

Commit ad4853e

Browse files
authored
Merge pull request #11805 from Kordyjan/semdb-fixes
Fix invented names causing incorrect spans in semanticdb
2 parents ac5bde5 + d1815fb commit ad4853e

File tree

5 files changed

+230
-3
lines changed

5 files changed

+230
-3
lines changed

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -481,10 +481,20 @@ class ExtractSemanticDB extends Phase:
481481

482482
private def registerDefinition(sym: Symbol, span: Span, symkinds: Set[SymbolKind], treeSource: SourceFile)(using Context) =
483483
val symbol = symbolName(sym)
484-
registerOccurrence(symbol, span, SymbolOccurrence.Role.DEFINITION, treeSource)
484+
val finalSpan = if !span.hasLength || !sym.is(Given) || namePresentInSource(sym, span, treeSource) then
485+
span
486+
else
487+
Span(span.start)
488+
489+
registerOccurrence(symbol, finalSpan, SymbolOccurrence.Role.DEFINITION, treeSource)
485490
if !sym.is(Package) then
486491
registerSymbol(sym, symbol, symkinds)
487492

493+
private def namePresentInSource(sym: Symbol, span: Span, source:SourceFile)(using Context): Boolean =
494+
val content = source.content()
495+
val (start, end) = if content(span.end - 1) == '`' then (span.start + 1, span.end - 1) else (span.start, span.end)
496+
content.slice(start, end).mkString == sym.name.stripModuleClassSuffix.lastPart.toString
497+
488498
private def spanOfSymbol(sym: Symbol, span: Span, treeSource: SourceFile)(using Context): Span =
489499
val contents = if treeSource.exists then treeSource.content() else Array.empty[Char]
490500
val idx = contents.indexOfSlice(sym.name.show, span.start)

tests/semanticdb/expect/Enums.expect.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ object Enums/*<-_empty_::Enums.*/:
4747
case Refl/*<-_empty_::Enums.`<:<`.Refl#*/[C/*<-_empty_::Enums.`<:<`.Refl#[C]*/]() extends (C/*->_empty_::Enums.`<:<`.Refl#[C]*/ <:</*->_empty_::Enums.`<:<`#*/ C/*->_empty_::Enums.`<:<`.Refl#[C]*/)
4848

4949
object <:</*<-_empty_::Enums.`<:<`.*/ :
50-
given [T]: (T <:< T/*<-_empty_::Enums.`<:<`.`given_<:<_T_T`().*//*<-_empty_::Enums.`<:<`.`given_<:<_T_T`().[T]*//*->_empty_::Enums.`<:<`.`given_<:<_T_T`().[T]*//*->_empty_::Enums.`<:<`#*//*->_empty_::Enums.`<:<`.`given_<:<_T_T`().[T]*/) = Refl/*->_empty_::Enums.`<:<`.Refl.*//*->_empty_::Enums.`<:<`.Refl.apply().*/()
50+
given /*<-_empty_::Enums.`<:<`.`given_<:<_T_T`().*/[T/*<-_empty_::Enums.`<:<`.`given_<:<_T_T`().[T]*/]: (T/*->_empty_::Enums.`<:<`.`given_<:<_T_T`().[T]*/ <:</*->_empty_::Enums.`<:<`#*/ T/*->_empty_::Enums.`<:<`.`given_<:<_T_T`().[T]*/) = Refl/*->_empty_::Enums.`<:<`.Refl.*//*->_empty_::Enums.`<:<`.Refl.apply().*/()
5151

5252
extension [A/*<-_empty_::Enums.unwrap().[A]*/, B/*<-_empty_::Enums.unwrap().[B]*/](opt/*<-_empty_::Enums.unwrap().(opt)*/: Option/*->scala::Option#*/[A/*->_empty_::Enums.unwrap().[A]*/]) def unwrap/*<-_empty_::Enums.unwrap().*/(using ev/*<-_empty_::Enums.unwrap().(ev)*/: A/*->_empty_::Enums.unwrap().[A]*/ <:</*->_empty_::Enums.`<:<`#*/ Option/*->scala::Option#*/[B/*->_empty_::Enums.unwrap().[B]*/]): Option/*->scala::Option#*/[B/*->_empty_::Enums.unwrap().[B]*/] = ev/*->_empty_::Enums.unwrap().(ev)*/ match
5353
case Refl/*->_empty_::Enums.`<:<`.Refl.*//*->_empty_::Enums.`<:<`.Refl.unapply().*/() => opt/*->_empty_::Enums.unwrap().(opt)*/.flatMap/*->scala::Option#flatMap().*/(identity/*->scala::Predef.identity().*//*->local0*/[Option/*->scala::Option#*/[B/*->_empty_::Enums.unwrap().[B]*/]])
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package givens
2+
3+
trait X/*<-givens::X#*/:
4+
def doX/*<-givens::X#doX().*/: Int/*->scala::Int#*/
5+
6+
trait Y/*<-givens::Y#*/:
7+
def doY/*<-givens::Y#doY().*/: String/*->scala::Predef.String#*/
8+
9+
trait Z/*<-givens::Z#*/[T/*<-givens::Z#[T]*/]:
10+
def doZ/*<-givens::Z#doZ().*/: List/*->scala::package.List#*/[T/*->givens::Z#[T]*/]
11+
12+
13+
14+
/*<-givens::InventedNames$package.*/given intValue/*<-givens::InventedNames$package.intValue.*/: Int/*->scala::Int#*/ = 4
15+
given /*<-givens::InventedNames$package.given_String.*/String/*->scala::Predef.String#*/ = "str"
16+
given /*<-givens::InventedNames$package.given_Double().*/(using Int/*->scala::Int#*/): Double/*->scala::Double#*/ = 4.0
17+
given /*<-givens::InventedNames$package.given_List_T().*/[T/*<-givens::InventedNames$package.given_List_T().[T]*/]: List/*->scala::package.List#*/[T/*->givens::InventedNames$package.given_List_T().[T]*/] = Nil/*->scala::package.Nil.*/
18+
given given_Char/*<-givens::InventedNames$package.given_Char.*/: Char/*->scala::Char#*/ = '?'
19+
given `given_Float/*<-givens::InventedNames$package.given_Float.*/`: Float/*->scala::Float#*/ = 3.0
20+
given `* */*<-givens::InventedNames$package.`* *`.*/`: Long/*->scala::Long#*/ = 5
21+
22+
given X with
23+
/*<-givens::InventedNames$package.given_X.*//*->givens::X#*/ def doX/*<-givens::InventedNames$package.given_X.doX().*/ = 7
24+
25+
given (using X/*->givens::X#*/): Y/*->givens::Y#*/ with
26+
def doY/*<-givens::InventedNames$package.given_Y#doY().*/ = "7"
27+
28+
given [T/*<-givens::InventedNames$package.given_Z_T#[T]*/]: Z/*->givens::Z#*/[T/*->givens::InventedNames$package.given_Z_T#[T]*/] with
29+
def doZ/*<-givens::InventedNames$package.given_Z_T#doZ().*/: List/*->scala::package.List#*/[T/*->givens::InventedNames$package.given_Z_T#[T]*/] = Nil/*->scala::package.Nil.*/
30+
31+
32+
33+
val a/*<-givens::InventedNames$package.a.*/ = intValue/*->givens::InventedNames$package.intValue.*/
34+
val b/*<-givens::InventedNames$package.b.*/ = given_String/*->givens::InventedNames$package.given_String.*/
35+
val c/*<-givens::InventedNames$package.c.*/ = given_Double/*->givens::InventedNames$package.given_Double().*//*->givens::InventedNames$package.intValue.*/
36+
val d/*<-givens::InventedNames$package.d.*/ = given_List_T/*->givens::InventedNames$package.given_List_T().*/[Int/*->scala::Int#*/]
37+
val e/*<-givens::InventedNames$package.e.*/ = given_Char/*->givens::InventedNames$package.given_Char.*/
38+
val f/*<-givens::InventedNames$package.f.*/ = given_Float/*->givens::InventedNames$package.given_Float.*/
39+
val g/*<-givens::InventedNames$package.g.*/ = `* *`/*->givens::InventedNames$package.`* *`.*/
40+
val x/*<-givens::InventedNames$package.x.*/ = given_X/*->givens::InventedNames$package.given_X.*/
41+
val y/*<-givens::InventedNames$package.y.*/ = given_Y/*->givens::InventedNames$package.given_Y().*//*->givens::InventedNames$package.given_X.*/
42+
val z/*<-givens::InventedNames$package.z.*/ = given_Z_T/*->givens::InventedNames$package.given_Z_T().*/[String/*->scala::Predef.String#*/]
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package givens
2+
3+
trait X:
4+
def doX: Int
5+
6+
trait Y:
7+
def doY: String
8+
9+
trait Z[T]:
10+
def doZ: List[T]
11+
12+
13+
14+
given intValue: Int = 4
15+
given String = "str"
16+
given (using Int): Double = 4.0
17+
given [T]: List[T] = Nil
18+
given given_Char: Char = '?'
19+
given `given_Float`: Float = 3.0
20+
given `* *`: Long = 5
21+
22+
given X with
23+
def doX = 7
24+
25+
given (using X): Y with
26+
def doY = "7"
27+
28+
given [T]: Z[T] with
29+
def doZ: List[T] = Nil
30+
31+
32+
33+
val a = intValue
34+
val b = given_String
35+
val c = given_Double
36+
val d = given_List_T[Int]
37+
val e = given_Char
38+
val f = given_Float
39+
val g = `* *`
40+
val x = given_X
41+
val y = given_Y
42+
val z = given_Z_T[String]

tests/semanticdb/metac.expect

Lines changed: 134 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -962,7 +962,7 @@ Occurrences:
962962
[46:34..46:35): C -> _empty_/Enums.`<:<`.Refl#[C]
963963
[46:35..46:35): -> _empty_/Enums.`<:<`#`<init>`().
964964
[48:9..48:12): <:< <- _empty_/Enums.`<:<`.
965-
[49:10..49:23): [T]: (T <:< T <- _empty_/Enums.`<:<`.`given_<:<_T_T`().
965+
[49:10..49:10): <- _empty_/Enums.`<:<`.`given_<:<_T_T`().
966966
[49:11..49:12): T <- _empty_/Enums.`<:<`.`given_<:<_T_T`().[T]
967967
[49:16..49:17): T -> _empty_/Enums.`<:<`.`given_<:<_T_T`().[T]
968968
[49:18..49:21): <:< -> _empty_/Enums.`<:<`#
@@ -1599,6 +1599,139 @@ Occurrences:
15991599
[24:30..24:36): Option -> scala/Option#
16001600
[24:37..24:40): Int -> scala/Int#
16011601

1602+
expect/InventedNames.scala
1603+
--------------------------
1604+
1605+
Summary:
1606+
Schema => SemanticDB v4
1607+
Uri => InventedNames.scala
1608+
Text => empty
1609+
Language => Scala
1610+
Symbols => 45 entries
1611+
Occurrences => 73 entries
1612+
1613+
Symbols:
1614+
givens/InventedNames$package. => final package object givens
1615+
givens/InventedNames$package.`* *`. => final implicit lazy val method * *
1616+
givens/InventedNames$package.a. => val method a
1617+
givens/InventedNames$package.b. => val method b
1618+
givens/InventedNames$package.c. => val method c
1619+
givens/InventedNames$package.d. => val method d
1620+
givens/InventedNames$package.e. => val method e
1621+
givens/InventedNames$package.f. => val method f
1622+
givens/InventedNames$package.g. => val method g
1623+
givens/InventedNames$package.given_Char. => final implicit lazy val method given_Char
1624+
givens/InventedNames$package.given_Double(). => final implicit method given_Double
1625+
givens/InventedNames$package.given_Double().(x$1) => implicit param x$1
1626+
givens/InventedNames$package.given_Float. => final implicit lazy val method given_Float
1627+
givens/InventedNames$package.given_List_T(). => final implicit method given_List_T
1628+
givens/InventedNames$package.given_List_T().[T] => typeparam T
1629+
givens/InventedNames$package.given_String. => final implicit lazy val method given_String
1630+
givens/InventedNames$package.given_X. => final implicit object given_X
1631+
givens/InventedNames$package.given_X.doX(). => method doX
1632+
givens/InventedNames$package.given_Y# => class given_Y
1633+
givens/InventedNames$package.given_Y#`<init>`(). => primary ctor <init>
1634+
givens/InventedNames$package.given_Y#`<init>`().(x$1) => implicit val param x$1
1635+
givens/InventedNames$package.given_Y#doY(). => method doY
1636+
givens/InventedNames$package.given_Y#x$1. => implicit val method x$1
1637+
givens/InventedNames$package.given_Y(). => final implicit method given_Y
1638+
givens/InventedNames$package.given_Y().(x$1) => implicit param x$1
1639+
givens/InventedNames$package.given_Z_T# => class given_Z_T
1640+
givens/InventedNames$package.given_Z_T#[T] => typeparam T
1641+
givens/InventedNames$package.given_Z_T#`<init>`(). => primary ctor <init>
1642+
givens/InventedNames$package.given_Z_T#doZ(). => method doZ
1643+
givens/InventedNames$package.given_Z_T(). => final implicit method given_Z_T
1644+
givens/InventedNames$package.given_Z_T().[T] => typeparam T
1645+
givens/InventedNames$package.intValue. => final implicit lazy val method intValue
1646+
givens/InventedNames$package.x. => val method x
1647+
givens/InventedNames$package.y. => val method y
1648+
givens/InventedNames$package.z. => val method z
1649+
givens/X# => trait X
1650+
givens/X#`<init>`(). => primary ctor <init>
1651+
givens/X#doX(). => abstract method doX
1652+
givens/Y# => trait Y
1653+
givens/Y#`<init>`(). => primary ctor <init>
1654+
givens/Y#doY(). => abstract method doY
1655+
givens/Z# => trait Z
1656+
givens/Z#[T] => typeparam T
1657+
givens/Z#`<init>`(). => primary ctor <init>
1658+
givens/Z#doZ(). => abstract method doZ
1659+
1660+
Occurrences:
1661+
[0:8..0:14): givens <- givens/
1662+
[2:6..2:7): X <- givens/X#
1663+
[3:2..3:2): <- givens/X#`<init>`().
1664+
[3:6..3:9): doX <- givens/X#doX().
1665+
[3:11..3:14): Int -> scala/Int#
1666+
[5:6..5:7): Y <- givens/Y#
1667+
[6:2..6:2): <- givens/Y#`<init>`().
1668+
[6:6..6:9): doY <- givens/Y#doY().
1669+
[6:11..6:17): String -> scala/Predef.String#
1670+
[8:6..8:7): Z <- givens/Z#
1671+
[8:7..8:7): <- givens/Z#`<init>`().
1672+
[8:8..8:9): T <- givens/Z#[T]
1673+
[9:6..9:9): doZ <- givens/Z#doZ().
1674+
[9:11..9:15): List -> scala/package.List#
1675+
[9:16..9:17): T -> givens/Z#[T]
1676+
[13:0..13:0): <- givens/InventedNames$package.
1677+
[13:6..13:14): intValue <- givens/InventedNames$package.intValue.
1678+
[13:16..13:19): Int -> scala/Int#
1679+
[14:6..14:6): <- givens/InventedNames$package.given_String.
1680+
[14:6..14:12): String -> scala/Predef.String#
1681+
[15:6..15:6): <- givens/InventedNames$package.given_Double().
1682+
[15:13..15:16): Int -> scala/Int#
1683+
[15:19..15:25): Double -> scala/Double#
1684+
[16:6..16:6): <- givens/InventedNames$package.given_List_T().
1685+
[16:7..16:8): T <- givens/InventedNames$package.given_List_T().[T]
1686+
[16:11..16:15): List -> scala/package.List#
1687+
[16:16..16:17): T -> givens/InventedNames$package.given_List_T().[T]
1688+
[16:21..16:24): Nil -> scala/package.Nil.
1689+
[17:6..17:16): given_Char <- givens/InventedNames$package.given_Char.
1690+
[17:18..17:22): Char -> scala/Char#
1691+
[18:7..18:18): given_Float <- givens/InventedNames$package.given_Float.
1692+
[18:21..18:26): Float -> scala/Float#
1693+
[19:7..19:10): * * <- givens/InventedNames$package.`* *`.
1694+
[19:13..19:17): Long -> scala/Long#
1695+
[21:6..22:0): <- givens/InventedNames$package.given_X.
1696+
[21:6..21:7): X -> givens/X#
1697+
[22:6..22:9): doX <- givens/InventedNames$package.given_X.doX().
1698+
[24:13..24:13): <- givens/InventedNames$package.given_Y#`<init>`().
1699+
[24:13..24:14): X -> givens/X#
1700+
[24:17..24:18): Y -> givens/Y#
1701+
[25:6..25:9): doY <- givens/InventedNames$package.given_Y#doY().
1702+
[27:7..27:7): <- givens/InventedNames$package.given_Z_T#`<init>`().
1703+
[27:7..27:8): T <- givens/InventedNames$package.given_Z_T#[T]
1704+
[27:11..27:12): Z -> givens/Z#
1705+
[27:13..27:14): T -> givens/InventedNames$package.given_Z_T#[T]
1706+
[28:6..28:9): doZ <- givens/InventedNames$package.given_Z_T#doZ().
1707+
[28:11..28:15): List -> scala/package.List#
1708+
[28:16..28:17): T -> givens/InventedNames$package.given_Z_T#[T]
1709+
[28:21..28:24): Nil -> scala/package.Nil.
1710+
[32:4..32:5): a <- givens/InventedNames$package.a.
1711+
[32:8..32:16): intValue -> givens/InventedNames$package.intValue.
1712+
[33:4..33:5): b <- givens/InventedNames$package.b.
1713+
[33:8..33:20): given_String -> givens/InventedNames$package.given_String.
1714+
[34:4..34:5): c <- givens/InventedNames$package.c.
1715+
[34:8..34:20): given_Double -> givens/InventedNames$package.given_Double().
1716+
[34:20..34:20): -> givens/InventedNames$package.intValue.
1717+
[35:4..35:5): d <- givens/InventedNames$package.d.
1718+
[35:8..35:20): given_List_T -> givens/InventedNames$package.given_List_T().
1719+
[35:21..35:24): Int -> scala/Int#
1720+
[36:4..36:5): e <- givens/InventedNames$package.e.
1721+
[36:8..36:18): given_Char -> givens/InventedNames$package.given_Char.
1722+
[37:4..37:5): f <- givens/InventedNames$package.f.
1723+
[37:8..37:19): given_Float -> givens/InventedNames$package.given_Float.
1724+
[38:4..38:5): g <- givens/InventedNames$package.g.
1725+
[38:8..38:13): `* *` -> givens/InventedNames$package.`* *`.
1726+
[39:4..39:5): x <- givens/InventedNames$package.x.
1727+
[39:8..39:15): given_X -> givens/InventedNames$package.given_X.
1728+
[40:4..40:5): y <- givens/InventedNames$package.y.
1729+
[40:8..40:15): given_Y -> givens/InventedNames$package.given_Y().
1730+
[40:15..40:15): -> givens/InventedNames$package.given_X.
1731+
[41:4..41:5): z <- givens/InventedNames$package.z.
1732+
[41:8..41:17): given_Z_T -> givens/InventedNames$package.given_Z_T().
1733+
[41:18..41:24): String -> scala/Predef.String#
1734+
16021735
expect/Issue1749.scala
16031736
----------------------
16041737

0 commit comments

Comments
 (0)