Skip to content

Commit 052913d

Browse files
authored
Merge pull request #11574 from Kordyjan/extensions-position
Retain position of extension function calls
2 parents 9531534 + a1b5b77 commit 052913d

File tree

9 files changed

+127
-9
lines changed

9 files changed

+127
-9
lines changed

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,18 @@ 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 name.toTermName == nme.ERROR then
423+
Span(point)
424+
else if qualifier.span.start > span.start then // right associative
425+
val realName = name.stripModuleClassSuffix.lastPart
426+
Span(span.start, span.start + realName.length, point)
427+
else
428+
Span(point, span.end, point)
429+
else span
418430
}
419431

420432
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: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package ext
2+
3+
/*<-ext::Extension$package.*/extension (s/*<-ext::Extension$package.foo().(s)*//*<-ext::Extension$package.`#*#`().(s)*/: String/*->scala::Predef.String#*/)
4+
def foo/*<-ext::Extension$package.foo().*/: Int/*->scala::Int#*/ = 42
5+
def #*#/*<-ext::Extension$package.`#*#`().*/ (i/*<-ext::Extension$package.`#*#`().(i)*/: Int/*->scala::Int#*/): (String/*->scala::Predef.String#*/, Int/*->scala::Int#*/) = (/*->scala::Tuple2.apply().*/s/*->ext::Extension$package.`#*#`().(s)*/, i/*->ext::Extension$package.`#*#`().(i)*/)
6+
7+
val a/*<-ext::Extension$package.a.*/ = "asd".foo/*->ext::Extension$package.foo().*/
8+
9+
val c/*<-ext::Extension$package.c.*/ = "foo" #*#/*->ext::Extension$package.`#*#`().*/ 23
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package ext
2+
3+
extension (s: String)
4+
def foo: Int = 42
5+
def #*# (i: Int): (String, Int) = (s, i)
6+
7+
val a = "asd".foo
8+
9+
val c = "foo" #*# 23

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]*/
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package ext
2+
3+
/*<-ext::RightAssociativeExtension$package.*/extension (s/*<-ext::RightAssociativeExtension$package.`:*:`().(s)*/: String/*->scala::Predef.String#*/)
4+
def :*:/*<-ext::RightAssociativeExtension$package.`:*:`().*/ (i/*<-ext::RightAssociativeExtension$package.`:*:`().(i)*/: Int/*->scala::Int#*/): (String/*->scala::Predef.String#*/, Int/*->scala::Int#*/) = (/*->scala::Tuple2.apply().*/s/*->ext::RightAssociativeExtension$package.`:*:`().(s)*/, i/*->ext::RightAssociativeExtension$package.`:*:`().(i)*/)
5+
6+
val b/*<-ext::RightAssociativeExtension$package.b.*/ = "foo" :*:/*->ext::RightAssociativeExtension$package.`:*:`().*/ 23
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 :*: (i: Int): (String, Int) = (s, i)
5+
6+
val b = "foo" :*: 23

tests/semanticdb/metac.expect

Lines changed: 80 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -992,11 +992,11 @@ Occurrences:
992992
[52:40..52:46): Option -> scala/Option#
993993
[52:47..52:48): B -> _empty_/Enums.unwrap().[B]
994994
[54:6..54:11): some1 <- _empty_/Enums.some1.
995-
[54:14..54:14): -> _empty_/Enums.unwrap().
996995
[54:14..54:18): Some -> scala/Some.
997996
[54:18..54:18): -> scala/Some.apply().
998997
[54:19..54:23): Some -> scala/Some.
999998
[54:23..54:23): -> scala/Some.apply().
999+
[54:28..54:34): unwrap -> _empty_/Enums.unwrap().
10001000
[54:34..54:34): -> _empty_/Enums.`<:<`.given_T().
10011001
[56:7..56:13): Planet <- _empty_/Enums.Planet#
10021002
[56:13..56:13): <- _empty_/Enums.Planet#`<init>`().
@@ -1130,6 +1130,48 @@ Occurrences:
11301130
[9:33..9:36): Int -> scala/Int#
11311131
[9:37..9:37): -> scala/reflect/ClassTag.apply().
11321132

1133+
expect/Extension.scala
1134+
----------------------
1135+
1136+
Summary:
1137+
Schema => SemanticDB v4
1138+
Uri => Extension.scala
1139+
Text => empty
1140+
Language => Scala
1141+
Symbols => 8 entries
1142+
Occurrences => 19 entries
1143+
1144+
Symbols:
1145+
ext/Extension$package. => final package object ext
1146+
ext/Extension$package.`#*#`(). => method #*#
1147+
ext/Extension$package.`#*#`().(i) => param i
1148+
ext/Extension$package.`#*#`().(s) => param s
1149+
ext/Extension$package.a. => val method a
1150+
ext/Extension$package.c. => val method c
1151+
ext/Extension$package.foo(). => method foo
1152+
ext/Extension$package.foo().(s) => param s
1153+
1154+
Occurrences:
1155+
[0:8..0:11): ext <- ext/
1156+
[2:0..2:0): <- ext/Extension$package.
1157+
[2:11..2:12): s <- ext/Extension$package.foo().(s)
1158+
[2:11..2:12): s <- ext/Extension$package.`#*#`().(s)
1159+
[2:14..2:20): String -> scala/Predef.String#
1160+
[3:6..3:9): foo <- ext/Extension$package.foo().
1161+
[3:11..3:14): Int -> scala/Int#
1162+
[4:6..4:9): #*# <- ext/Extension$package.`#*#`().
1163+
[4:11..4:12): i <- ext/Extension$package.`#*#`().(i)
1164+
[4:14..4:17): Int -> scala/Int#
1165+
[4:21..4:27): String -> scala/Predef.String#
1166+
[4:29..4:32): Int -> scala/Int#
1167+
[4:37..4:37): -> scala/Tuple2.apply().
1168+
[4:37..4:38): s -> ext/Extension$package.`#*#`().(s)
1169+
[4:40..4:41): i -> ext/Extension$package.`#*#`().(i)
1170+
[6:4..6:5): a <- ext/Extension$package.a.
1171+
[6:14..6:17): foo -> ext/Extension$package.foo().
1172+
[8:4..8:5): c <- ext/Extension$package.c.
1173+
[8:14..8:17): #*# -> ext/Extension$package.`#*#`().
1174+
11331175
expect/ForComprehension.scala
11341176
-----------------------------
11351177

@@ -1314,11 +1356,11 @@ Occurrences:
13141356
[10:37..10:40): any -> a/b/Givens.saySoLong().(any)
13151357
[10:40..10:41): " -> scala/StringContext#s().
13161358
[12:6..12:12): hello1 <- a/b/Givens.hello1.
1317-
[12:15..12:15): -> a/b/Givens.sayHello().
1359+
[12:17..12:25): sayHello -> a/b/Givens.sayHello().
13181360
[13:6..13:14): goodbye1 <- a/b/Givens.goodbye1.
1319-
[13:17..13:17): -> a/b/Givens.sayGoodbye().
1361+
[13:19..13:29): sayGoodbye -> a/b/Givens.sayGoodbye().
13201362
[14:6..14:13): soLong1 <- a/b/Givens.soLong1.
1321-
[14:16..14:16): -> a/b/Givens.saySoLong().
1363+
[14:18..14:27): saySoLong -> a/b/Givens.saySoLong().
13221364
[16:8..16:14): Monoid <- a/b/Givens.Monoid#
13231365
[16:14..16:14): <- a/b/Givens.Monoid#`<init>`().
13241366
[16:15..16:16): A <- a/b/Givens.Monoid#[A]
@@ -2414,6 +2456,40 @@ Occurrences:
24142456
[31:10..31:11): T -> prefixes/M.T#
24152457
[31:14..31:17): ??? -> scala/Predef.`???`().
24162458

2459+
expect/RightAssociativeExtension.scala
2460+
--------------------------------------
2461+
2462+
Summary:
2463+
Schema => SemanticDB v4
2464+
Uri => RightAssociativeExtension.scala
2465+
Text => empty
2466+
Language => Scala
2467+
Symbols => 5 entries
2468+
Occurrences => 14 entries
2469+
2470+
Symbols:
2471+
ext/RightAssociativeExtension$package. => final package object ext
2472+
ext/RightAssociativeExtension$package.`:*:`(). => method :*:
2473+
ext/RightAssociativeExtension$package.`:*:`().(i) => param i
2474+
ext/RightAssociativeExtension$package.`:*:`().(s) => param s
2475+
ext/RightAssociativeExtension$package.b. => val method b
2476+
2477+
Occurrences:
2478+
[0:8..0:11): ext <- ext/
2479+
[2:0..2:0): <- ext/RightAssociativeExtension$package.
2480+
[2:11..2:12): s <- ext/RightAssociativeExtension$package.`:*:`().(s)
2481+
[2:14..2:20): String -> scala/Predef.String#
2482+
[3:6..3:9): :*: <- ext/RightAssociativeExtension$package.`:*:`().
2483+
[3:11..3:12): i <- ext/RightAssociativeExtension$package.`:*:`().(i)
2484+
[3:14..3:17): Int -> scala/Int#
2485+
[3:21..3:27): String -> scala/Predef.String#
2486+
[3:29..3:32): Int -> scala/Int#
2487+
[3:37..3:37): -> scala/Tuple2.apply().
2488+
[3:37..3:38): s -> ext/RightAssociativeExtension$package.`:*:`().(s)
2489+
[3:40..3:41): i -> ext/RightAssociativeExtension$package.`:*:`().(i)
2490+
[5:4..5:5): b <- ext/RightAssociativeExtension$package.b.
2491+
[5:14..5:17): :*: -> ext/RightAssociativeExtension$package.`:*:`().
2492+
24172493
expect/Selfs.scala
24182494
------------------
24192495

0 commit comments

Comments
 (0)