summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2015-09-24 14:27:58 +1000
committerJason Zaugg <jzaugg@gmail.com>2015-09-24 16:56:18 +1000
commitfb299f80f3f85e935695d5b7cb7f2c712b150e3c (patch)
tree4d95bc66e8354e0eb9135aaf1fa102761fb59dff /test
parent2c9e506bc32248f9ae4929790a0cb7484a53a66e (diff)
downloadscala-fb299f80f3f85e935695d5b7cb7f2c712b150e3c.tar.gz
scala-fb299f80f3f85e935695d5b7cb7f2c712b150e3c.tar.bz2
scala-fb299f80f3f85e935695d5b7cb7f2c712b150e3c.zip
Improve presentation compilation of annotations
A trio of problems were hampering autocompletion of annotations. First, given that that annotation is written before the annotated member, it is very common to end parse incomplete code that has a floating annotation without an anotatee. The parser was discarding the annotations (ie, the modifiers) and emitting an `EmptyTree`. Second, the presetation compiler was only looking for annotations in the Modifiers of a member def, but after typechecking annotations are moved into the symbol. Third, if an annotation failed to typecheck, it was being discarded in place of `ErroneousAnnotation`. This commit: - modifies the parser to uses a dummy class- or type-def tree, instead of EmptyTree, which can carry the annotations. - updates the locator to look in the symbol annotations of the modifiers contains no annotations. - uses a separate instance of `ErroneousAnnotation` for each erroneous annotation, and stores the original tree in its `original` tree.
Diffstat (limited to 'test')
-rw-r--r--test/junit/scala/tools/nsc/interpreter/CompletionTest.scala11
1 files changed, 11 insertions, 0 deletions
diff --git a/test/junit/scala/tools/nsc/interpreter/CompletionTest.scala b/test/junit/scala/tools/nsc/interpreter/CompletionTest.scala
index d00a9bf69a..78ebb7cf9c 100644
--- a/test/junit/scala/tools/nsc/interpreter/CompletionTest.scala
+++ b/test/junit/scala/tools/nsc/interpreter/CompletionTest.scala
@@ -52,6 +52,17 @@ class CompletionTest {
}
@Test
+ def annotations(): Unit = {
+ val intp = newIMain()
+ val completer = new PresentationCompilerCompleter(intp)
+ checkExact(completer, "def foo[@specialize", " A]")("specialized")
+ checkExact(completer, "def foo[@specialize")("specialized")
+ checkExact(completer, """@deprecatedN""", """ class Foo""")("deprecatedName")
+ checkExact(completer, """@deprecateN""")("deprecatedName")
+ checkExact(completer, """{@deprecateN""")("deprecatedName")
+ }
+
+ @Test
def incompleteStringInterpolation(): Unit = {
val intp = newIMain()
val completer = new PresentationCompilerCompleter(intp)