@@ -489,10 +489,19 @@ class DottyLanguageServer extends LanguageServer
489
489
490
490
val uriTrees = driver.openedTrees(uri)
491
491
492
- val defs = Interactive .namedTrees(uriTrees, Include .empty)
492
+ val excludeLocalsFromSyntheticSymbols = (n : NameTree ) => {
493
+ val owner = n.symbol.owner
494
+ n.symbol.is(Case ) || {
495
+ ! owner.is(Synthetic ) &&
496
+ ! owner.isPrimaryConstructor
497
+ }
498
+ }
499
+
500
+ val defs = Interactive .namedTrees(uriTrees, Include .local, excludeLocalsFromSyntheticSymbols)
501
+
493
502
(for {
494
- d <- defs if ! isWorksheetWrapper(d)
495
- info <- symbolInfo(d.tree.symbol, d.namePos )
503
+ d <- defs if ( ! isWorksheetWrapper(d) && ! isTopLevelWrapper(d) )
504
+ info <- symbolInfo(d.tree.symbol, d.pos )
496
505
} yield JEither .forLeft(info)).asJava
497
506
}
498
507
@@ -808,6 +817,14 @@ object DottyLanguageServer {
808
817
symbol.owner == ctx.definitions.EmptyPackageClass
809
818
}
810
819
820
+ /**
821
+ * Is this symbol the wrapper object for top level definitions?
822
+ */
823
+ def isTopLevelWrapper (sourceTree : SourceTree )(implicit ctx : Context ): Boolean = {
824
+ val symbol = sourceTree.tree.symbol
825
+ symbol.isPackageObject
826
+ }
827
+
811
828
/** Create an lsp4j.CompletionItem from a completion result */
812
829
def completionItem (completion : Completion )(implicit ctx : Context ): lsp4j.CompletionItem = {
813
830
def completionItemKind (sym : Symbol )(implicit ctx : Context ): lsp4j.CompletionItemKind = {
@@ -883,24 +900,36 @@ object DottyLanguageServer {
883
900
SK .Constructor
884
901
else if (sym.is(Module ))
885
902
SK .Module
903
+ else if (sym.isAllOf(EnumCase ) || sym.isAllOf(EnumValue ))
904
+ SK .EnumMember
905
+ else if (sym.is(Enum ))
906
+ SK .Enum
907
+ else if (sym.is(Trait ))
908
+ SK .Interface
886
909
else if (sym.isClass)
887
910
SK .Class
888
911
else if (sym.is(Mutable ))
889
912
SK .Variable
890
913
else if (sym.is(Method ))
891
914
SK .Method
915
+ else if (sym.is(TypeParam ) || sym.isAbstractOrAliasType)
916
+ SK .TypeParameter
892
917
else
893
918
SK .Field
894
919
}
920
+ def containerName (sym : Symbol ): String = {
921
+ if (sym.owner.exists && ! sym.owner.isEmptyPackage) {
922
+ if (sym.owner.isPackageObject && sym.owner.owner.exists) {
923
+ sym.owner.owner.name.stripModuleClassSuffix.show
924
+ } else
925
+ sym.owner.name.stripModuleClassSuffix.show
926
+ } else
927
+ null
928
+ }
895
929
896
930
val name = sym.name.stripModuleClassSuffix.show
897
- val containerName =
898
- if (sym.owner.exists && ! sym.owner.isEmptyPackage)
899
- sym.owner.name.show
900
- else
901
- null
902
931
903
- location(pos).map(l => new lsp4j.SymbolInformation (name, symbolKind(sym), l, containerName))
932
+ location(pos).map(l => new lsp4j.SymbolInformation (name, symbolKind(sym), l, containerName(sym) ))
904
933
}
905
934
906
935
/** Convert `signature` to a `SignatureInformation` */
0 commit comments