Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

SI-7463,SI-8003 Correct wrong position for {select,apply}Dynamic calls

The new positions are range positions that directly refer to the
beginning and the end of the method calls in the sources instead of
simply point to the beginning of the expression. This allows the
scala-ide to semantically highlight select- and applyDynamic method
calls, because it has only to traverse the tree and apply the color
ranges to the given position ranges.

This also fixes the position marker of an error messages related
to a wrong Dynamic method signature.
  • Loading branch information...
commit b915f440eb3738d2991b1f96b7c810cc87b88d0c 1 parent 2ad9666
@sschaef sschaef authored retronym committed
View
5 src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -4061,7 +4061,10 @@ trait Typers extends Modes with Adaptations with Tags {
case Some((opName, treeInfo.Applied(_, targs, _))) =>
val fun = gen.mkTypeApply(Select(qual, opName), targs)
if (opName == nme.updateDynamic) suppressMacroExpansion(fun) // SI-7617
- atPos(qual.pos)(Apply(fun, Literal(Constant(name.decode)) :: Nil))
+ val nameStringLit = atPos(treeSelection.pos.withStart(treeSelection.pos.point).makeTransparent) {
+ Literal(Constant(name.decode))
+ }
+ atPos(qual.pos)(Apply(fun, List(nameStringLit)))
case _ =>
setError(tree)
}
View
8 test/files/neg/applydynamic_sip.check
@@ -13,28 +13,28 @@ applydynamic_sip.scala:18: error: type mismatch;
error after rewriting to Test.this.bad1.selectDynamic("sel")
possible cause: maybe a wrong Dynamic method signature?
bad1.sel
- ^
+ ^
applydynamic_sip.scala:19: error: type mismatch;
found : String("sel")
required: Int
error after rewriting to Test.this.bad1.applyDynamic("sel")
possible cause: maybe a wrong Dynamic method signature?
bad1.sel(1)
- ^
+ ^
applydynamic_sip.scala:20: error: type mismatch;
found : String("sel")
required: Int
error after rewriting to Test.this.bad1.applyDynamicNamed("sel")
possible cause: maybe a wrong Dynamic method signature?
bad1.sel(a = 1)
- ^
+ ^
applydynamic_sip.scala:21: error: type mismatch;
found : String("sel")
required: Int
error after rewriting to Test.this.bad1.updateDynamic("sel")
possible cause: maybe a wrong Dynamic method signature?
bad1.sel = 1
- ^
+ ^
applydynamic_sip.scala:29: error: Int does not take parameters
error after rewriting to Test.this.bad2.selectDynamic("sel")
possible cause: maybe a wrong Dynamic method signature?
View
14 test/files/run/dynamic-applyDynamic.check
@@ -0,0 +1,14 @@
+[[syntax trees at end of typer]] // newSource1.scala
+[0:67]package [0:0]<empty> {
+ [0:67]object X extends [9:67][67]scala.AnyRef {
+ [9]def <init>(): [9]X.type = [9]{
+ [9][9][9]X.super.<init>();
+ [9]()
+ };
+ [17:30]private[this] val d: [21]D = [25:30][25:30][25:30]new [29:30]D();
+ [21]<stable> <accessor> def d: [21]D = [21][21]X.this.d;
+ [37:49][37:38][37:38][37]X.this.d.applyDynamic(<39:45>"method")([46:48]10);
+ [56:61]<56:57><56:57>[56]X.this.d.applyDynamic(<56:57>"apply")([58:60]10)
+ }
+}
+
View
26 test/files/run/dynamic-applyDynamic.scala
@@ -0,0 +1,26 @@
+import scala.tools.partest.DirectTest
+
+object Test extends DirectTest {
+
+ override def extraSettings: String =
+ s"-usejavacp -Xprint-pos -Xprint:typer -Yrangepos -Ystop-after:typer -d ${testOutput.path}"
+
+ override def code = """
+ object X {
+ val d = new D
+ d.method(10)
+ d(10)
+ }
+ """.trim
+
+ override def show(): Unit = {
+ Console.withErr(System.out) {
+ compile()
+ }
+ }
+}
+
+import language.dynamics
+class D extends Dynamic {
+ def applyDynamic(name: String)(value: Any) = ???
+}
View
13 test/files/run/dynamic-selectDynamic.check
@@ -0,0 +1,13 @@
+[[syntax trees at end of typer]] // newSource1.scala
+[0:50]package [0:0]<empty> {
+ [0:50]object X extends [9:50][50]scala.AnyRef {
+ [9]def <init>(): [9]X.type = [9]{
+ [9][9][9]X.super.<init>();
+ [9]()
+ };
+ [17:30]private[this] val d: [21]D = [25:30][25:30][25:30]new [29:30]D();
+ [21]<stable> <accessor> def d: [21]D = [21][21]X.this.d;
+ [37:38][37:38][37]X.this.d.selectDynamic(<39:44>"field")
+ }
+}
+
View
25 test/files/run/dynamic-selectDynamic.scala
@@ -0,0 +1,25 @@
+import scala.tools.partest.DirectTest
+
+object Test extends DirectTest {
+
+ override def extraSettings: String =
+ s"-usejavacp -Xprint-pos -Xprint:typer -Yrangepos -Ystop-after:typer -d ${testOutput.path}"
+
+ override def code = """
+ object X {
+ val d = new D
+ d.field
+ }
+ """.trim
+
+ override def show(): Unit = {
+ Console.withErr(System.out) {
+ compile()
+ }
+ }
+}
+
+import language.dynamics
+class D extends Dynamic {
+ def selectDynamic(name: String) = ???
+}
Please sign in to comment.
Something went wrong with that request. Please try again.