Skip to content

Commit a1b5b77

Browse files
committed
Remove operator position attachment
- simplify select name span logic - add test for left associative operators
1 parent e93460b commit a1b5b77

File tree

5 files changed

+36
-15
lines changed

5 files changed

+36
-15
lines changed

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,6 @@ object desugar {
3939
*/
4040
val MultiLineInfix: Property.Key[Unit] = Property.StickyKey()
4141

42-
/** An attachment for retaining information about the original span of the operator after desugaring it to Select. */
43-
val OperatorSpan: Property.Key[Span] = Property.StickyKey()
44-
4542
/** What static check should be applied to a Match? */
4643
enum MatchCheck {
4744
case None, Exhaustive, IrrefutablePatDef, IrrefutableGenFrom
@@ -1218,7 +1215,7 @@ object desugar {
12181215
case _ => arg
12191216
}
12201217
def makeOp(fn: Tree, arg: Tree, selectPos: Span) =
1221-
val sel = Select(fn, op.name).withSpan(selectPos).withAttachment(OperatorSpan, op.span)
1218+
val sel = Select(fn, op.name).withSpan(selectPos)
12221219
if (left.sourcePos.endLine < op.sourcePos.startLine)
12231220
sel.pushAttachment(MultiLineInfix, ())
12241221
arg match

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -419,10 +419,13 @@ object Trees {
419419
def nameSpan(using Context): Span =
420420
if span.exists then
421421
val point = span.point
422-
getAttachment(desugar.OperatorSpan) match
423-
case Some(s) => s
424-
case None if span.isSynthetic || name.toTermName == nme.ERROR => Span(point)
425-
case None => Span(point, span.end, 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)
426429
else span
427430
}
428431

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package ext
22

3-
/*<-ext::Extension$package.*/extension (s/*<-ext::Extension$package.foo().(s)*/: String/*->scala::Predef.String#*/)
3+
/*<-ext::Extension$package.*/extension (s/*<-ext::Extension$package.foo().(s)*//*<-ext::Extension$package.`#*#`().(s)*/: String/*->scala::Predef.String#*/)
44
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)*/)
56

6-
val a/*<-ext::Extension$package.a.*/ = "asd".foo/*->ext::Extension$package.foo().*/
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

tests/semanticdb/expect/Extension.scala

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,8 @@ package ext
22

33
extension (s: String)
44
def foo: Int = 42
5+
def #*# (i: Int): (String, Int) = (s, i)
56

6-
val a = "asd".foo
7+
val a = "asd".foo
8+
9+
val c = "foo" #*# 23

tests/semanticdb/metac.expect

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1112,24 +1112,39 @@ Schema => SemanticDB v4
11121112
Uri => Extension.scala
11131113
Text => empty
11141114
Language => Scala
1115-
Symbols => 4 entries
1116-
Occurrences => 8 entries
1115+
Symbols => 8 entries
1116+
Occurrences => 19 entries
11171117

11181118
Symbols:
11191119
ext/Extension$package. => final package object ext
1120+
ext/Extension$package.`#*#`(). => method #*#
1121+
ext/Extension$package.`#*#`().(i) => param i
1122+
ext/Extension$package.`#*#`().(s) => param s
11201123
ext/Extension$package.a. => val method a
1124+
ext/Extension$package.c. => val method c
11211125
ext/Extension$package.foo(). => method foo
11221126
ext/Extension$package.foo().(s) => param s
11231127

11241128
Occurrences:
11251129
[0:8..0:11): ext <- ext/
11261130
[2:0..2:0): <- ext/Extension$package.
11271131
[2:11..2:12): s <- ext/Extension$package.foo().(s)
1132+
[2:11..2:12): s <- ext/Extension$package.`#*#`().(s)
11281133
[2:14..2:20): String -> scala/Predef.String#
11291134
[3:6..3:9): foo <- ext/Extension$package.foo().
11301135
[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().
1136+
[4:6..4:9): #*# <- ext/Extension$package.`#*#`().
1137+
[4:11..4:12): i <- ext/Extension$package.`#*#`().(i)
1138+
[4:14..4:17): Int -> scala/Int#
1139+
[4:21..4:27): String -> scala/Predef.String#
1140+
[4:29..4:32): Int -> scala/Int#
1141+
[4:37..4:37): -> scala/Tuple2.apply().
1142+
[4:37..4:38): s -> ext/Extension$package.`#*#`().(s)
1143+
[4:40..4:41): i -> ext/Extension$package.`#*#`().(i)
1144+
[6:4..6:5): a <- ext/Extension$package.a.
1145+
[6:14..6:17): foo -> ext/Extension$package.foo().
1146+
[8:4..8:5): c <- ext/Extension$package.c.
1147+
[8:14..8:17): #*# -> ext/Extension$package.`#*#`().
11331148

11341149
expect/ForComprehension.scala
11351150
-----------------------------

0 commit comments

Comments
 (0)