diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2015-09-24 14:27:58 +1000 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2015-09-24 16:56:18 +1000 |
commit | fb299f80f3f85e935695d5b7cb7f2c712b150e3c (patch) | |
tree | 4d95bc66e8354e0eb9135aaf1fa102761fb59dff /test | |
parent | 2c9e506bc32248f9ae4929790a0cb7484a53a66e (diff) | |
download | scala-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.scala | 11 |
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) |