diff --git a/compiler/src/dotty/tools/dotc/interactive/Completion.scala b/compiler/src/dotty/tools/dotc/interactive/Completion.scala index b57c300defae..1f26b50b6cce 100644 --- a/compiler/src/dotty/tools/dotc/interactive/Completion.scala +++ b/compiler/src/dotty/tools/dotc/interactive/Completion.scala @@ -24,6 +24,7 @@ import dotty.tools.dotc.printing.Texts._ import dotty.tools.dotc.util.{NameTransformer, NoSourcePosition, SourcePosition} import scala.collection.mutable +import scala.util.control.NonFatal /** * One of the results of a completion query. @@ -61,6 +62,8 @@ object Completion { */ def completionMode(path: List[Tree], pos: SourcePosition): Mode = path match { + case Ident(_) :: Import(_, _) :: _ => + Mode.Import case (ref: RefTree) :: _ => if (ref.name.isTermName) Mode.Term else if (ref.name.isTypeName) Mode.Type @@ -211,6 +214,22 @@ object Completion { // import a.C def isSameSymbolImportedDouble = denotss.forall(_.denots == first.denots) + def isScalaPackage(scopedDenots: ScopedDenotations) = + scopedDenots.denots.exists(_.info.typeSymbol.owner == defn.ScalaPackageClass) + + def isJavaLangPackage(scopedDenots: ScopedDenotations) = + scopedDenots.denots.exists(_.info.typeSymbol.owner == defn.JavaLangPackageClass) + + // For example + // import java.lang.annotation + // is shadowed by + // import scala.annotation + def isJavaLangAndScala = + try + denotss.forall(denots => isScalaPackage(denots) || isJavaLangPackage(denots)) + catch + case NonFatal(_) => false + denotss.find(!_.ctx.isImportContext) match { // most deeply nested member or local definition if not shadowed by an import case Some(local) if local.ctx.scope == first.ctx.scope => @@ -218,6 +237,12 @@ object Completion { case None if isSingleImport || isImportedInDifferentScope || isSameSymbolImportedDouble => resultMappings += name -> first.denots + case None if isJavaLangAndScala => + denotss.foreach{ + denots => + if isScalaPackage(denots) then + resultMappings += name -> denots.denots + } case _ => } diff --git a/language-server/test/dotty/tools/languageserver/CompletionTest.scala b/language-server/test/dotty/tools/languageserver/CompletionTest.scala index bc870e329f4f..afee53328857 100644 --- a/language-server/test/dotty/tools/languageserver/CompletionTest.scala +++ b/language-server/test/dotty/tools/languageserver/CompletionTest.scala @@ -976,4 +976,22 @@ class CompletionTest { ("main", Module, "main") ) ) + + @Test def i13623_annotation : Unit = + code"""import annot${m1}""" + .withSource + .completion(m1, + Set( + ("annotation", Module, "scala.annotation") + ) + ) + + @Test def importAnnotationAfterImport : Unit = + code"""import java.lang.annotation; import annot${m1}""" + .withSource + .completion(m1, + Set( + ("annotation", Module, "scala.annotation") + ) + ) }