Skip to content

Commit b2408db

Browse files
committed
Retain position of extension function calls
1 parent 0d6c926 commit b2408db

File tree

7 files changed

+55
-9
lines changed

7 files changed

+55
-9
lines changed

compiler/src/dotty/tools/dotc/ast/Trees.scala

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,13 @@ object Trees {
415415
qualifier.typeOpt.member(name).atSignature(Signature.NotAMethod, name)
416416
case _ =>
417417
super.denot
418+
419+
def nameSpan(using Context): Span =
420+
if span.exists then
421+
val point = span.point
422+
if span.isSynthetic || name.toTermName == nme.ERROR then Span(point)
423+
else Span(point, span.end, point)
424+
else span
418425
}
419426

420427
class SelectWithSig[-T >: Untyped] private[ast] (qualifier: Tree[T], name: Name, val sig: Signature)(implicit @constructorOnly src: SourceFile)

compiler/src/dotty/tools/dotc/typer/Typer.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2988,7 +2988,7 @@ class Typer extends Namer
29882988
def tryExtension(using Context): Tree =
29892989
findRef(tree.name, WildcardType, ExtensionMethod, EmptyFlags, qual.srcPos) match
29902990
case ref: TermRef =>
2991-
extMethodApply(untpd.ref(ref).withSpan(tree.span), qual, pt)
2991+
extMethodApply(untpd.TypedSplice(tpd.ref(ref).withSpan(tree.nameSpan)), qual, pt)
29922992
case _ =>
29932993
EmptyTree
29942994

tests/semanticdb/expect/Enums.expect.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ object Enums/*<-_empty_::Enums.*/:
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]*/]])
5454

55-
val some1/*<-_empty_::Enums.some1.*/ = /*->_empty_::Enums.unwrap().*/Some/*->scala::Some.*//*->scala::Some.apply().*/(Some/*->scala::Some.*//*->scala::Some.apply().*/(1)).unwrap/*->_empty_::Enums.`<:<`.given_T().*/
55+
val some1/*<-_empty_::Enums.some1.*/ = Some/*->scala::Some.*//*->scala::Some.apply().*/(Some/*->scala::Some.*//*->scala::Some.apply().*/(1)).unwrap/*->_empty_::Enums.unwrap().*//*->_empty_::Enums.`<:<`.given_T().*/
5656

5757
enum Planet/*<-_empty_::Enums.Planet#*/(mass/*<-_empty_::Enums.Planet#mass.*/: Double/*->scala::Double#*/, radius/*<-_empty_::Enums.Planet#radius.*/: Double/*->scala::Double#*/) extends Enum/*->java::lang::Enum#*/[Planet/*->_empty_::Enums.Planet#*/]/*->java::lang::Enum#`<init>`().*/:
5858
private final val G/*<-_empty_::Enums.Planet#G.*/ = 6.67300E-11
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package ext
2+
3+
/*<-ext::Extension$package.*/extension (s/*<-ext::Extension$package.foo().(s)*/: String/*->scala::Predef.String#*/)
4+
def foo/*<-ext::Extension$package.foo().*/: Int/*->scala::Int#*/ = 42
5+
6+
val a/*<-ext::Extension$package.a.*/ = "asd".foo/*->ext::Extension$package.foo().*/
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package ext
2+
3+
extension (s: String)
4+
def foo: Int = 42
5+
6+
val a = "asd".foo

tests/semanticdb/expect/Givens.expect.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ object Givens/*<-a::b::Givens.*/:
1010
def sayGoodbye/*<-a::b::Givens.sayGoodbye().*/ = s"/*->scala::StringContext.apply().*/Goodbye, from $any/*->a::b::Givens.sayGoodbye().(any)*/"/*->scala::StringContext#s().*/
1111
def saySoLong/*<-a::b::Givens.saySoLong().*/ = s"/*->scala::StringContext.apply().*/So Long, from $any/*->a::b::Givens.saySoLong().(any)*/"/*->scala::StringContext#s().*/
1212

13-
val hello1/*<-a::b::Givens.hello1.*/ = /*->a::b::Givens.sayHello().*/1.sayHello
14-
val goodbye1/*<-a::b::Givens.goodbye1.*/ = /*->a::b::Givens.sayGoodbye().*/1.sayGoodbye
15-
val soLong1/*<-a::b::Givens.soLong1.*/ = /*->a::b::Givens.saySoLong().*/1.saySoLong
13+
val hello1/*<-a::b::Givens.hello1.*/ = 1.sayHello/*->a::b::Givens.sayHello().*/
14+
val goodbye1/*<-a::b::Givens.goodbye1.*/ = 1.sayGoodbye/*->a::b::Givens.sayGoodbye().*/
15+
val soLong1/*<-a::b::Givens.soLong1.*/ = 1.saySoLong/*->a::b::Givens.saySoLong().*/
1616

1717
trait Monoid/*<-a::b::Givens.Monoid#*/[A/*<-a::b::Givens.Monoid#[A]*/]:
1818
def empty/*<-a::b::Givens.Monoid#empty().*/: A/*->a::b::Givens.Monoid#[A]*/

tests/semanticdb/metac.expect

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -966,11 +966,11 @@ Occurrences:
966966
[52:40..52:46): Option -> scala/Option#
967967
[52:47..52:48): B -> _empty_/Enums.unwrap().[B]
968968
[54:6..54:11): some1 <- _empty_/Enums.some1.
969-
[54:14..54:14): -> _empty_/Enums.unwrap().
970969
[54:14..54:18): Some -> scala/Some.
971970
[54:18..54:18): -> scala/Some.apply().
972971
[54:19..54:23): Some -> scala/Some.
973972
[54:23..54:23): -> scala/Some.apply().
973+
[54:28..54:34): unwrap -> _empty_/Enums.unwrap().
974974
[54:34..54:34): -> _empty_/Enums.`<:<`.given_T().
975975
[56:7..56:13): Planet <- _empty_/Enums.Planet#
976976
[56:13..56:13): <- _empty_/Enums.Planet#`<init>`().
@@ -1104,6 +1104,33 @@ Occurrences:
11041104
[9:33..9:36): Int -> scala/Int#
11051105
[9:37..9:37): -> scala/reflect/ClassTag.apply().
11061106

1107+
expect/Extension.scala
1108+
----------------------
1109+
1110+
Summary:
1111+
Schema => SemanticDB v4
1112+
Uri => Extension.scala
1113+
Text => empty
1114+
Language => Scala
1115+
Symbols => 4 entries
1116+
Occurrences => 8 entries
1117+
1118+
Symbols:
1119+
ext/Extension$package. => final package object ext
1120+
ext/Extension$package.a. => val method a
1121+
ext/Extension$package.foo(). => method foo
1122+
ext/Extension$package.foo().(s) => param s
1123+
1124+
Occurrences:
1125+
[0:8..0:11): ext <- ext/
1126+
[2:0..2:0): <- ext/Extension$package.
1127+
[2:11..2:12): s <- ext/Extension$package.foo().(s)
1128+
[2:14..2:20): String -> scala/Predef.String#
1129+
[3:6..3:9): foo <- ext/Extension$package.foo().
1130+
[3:11..3:14): Int -> scala/Int#
1131+
[5:4..5:5): a <- ext/Extension$package.a.
1132+
[5:14..5:17): foo -> ext/Extension$package.foo().
1133+
11071134
expect/ForComprehension.scala
11081135
-----------------------------
11091136

@@ -1288,11 +1315,11 @@ Occurrences:
12881315
[10:37..10:40): any -> a/b/Givens.saySoLong().(any)
12891316
[10:40..10:41): " -> scala/StringContext#s().
12901317
[12:6..12:12): hello1 <- a/b/Givens.hello1.
1291-
[12:15..12:15): -> a/b/Givens.sayHello().
1318+
[12:17..12:25): sayHello -> a/b/Givens.sayHello().
12921319
[13:6..13:14): goodbye1 <- a/b/Givens.goodbye1.
1293-
[13:17..13:17): -> a/b/Givens.sayGoodbye().
1320+
[13:19..13:29): sayGoodbye -> a/b/Givens.sayGoodbye().
12941321
[14:6..14:13): soLong1 <- a/b/Givens.soLong1.
1295-
[14:16..14:16): -> a/b/Givens.saySoLong().
1322+
[14:18..14:27): saySoLong -> a/b/Givens.saySoLong().
12961323
[16:8..16:14): Monoid <- a/b/Givens.Monoid#
12971324
[16:14..16:14): <- a/b/Givens.Monoid#`<init>`().
12981325
[16:15..16:16): A <- a/b/Givens.Monoid#[A]

0 commit comments

Comments
 (0)