From 5149dd0cd7b2daec43876209b6382e04501db347 Mon Sep 17 00:00:00 2001 From: Noah Santschi-Cooney Date: Thu, 5 Nov 2020 16:08:10 +0000 Subject: [PATCH] Fixed hover for enum constants --- src/main/kotlin/lsifjava/IndexingVisitor.kt | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/lsifjava/IndexingVisitor.kt b/src/main/kotlin/lsifjava/IndexingVisitor.kt index 76a41391..9f4747fb 100644 --- a/src/main/kotlin/lsifjava/IndexingVisitor.kt +++ b/src/main/kotlin/lsifjava/IndexingVisitor.kt @@ -5,6 +5,7 @@ import com.sun.source.tree.* import com.sun.source.util.* import com.sun.tools.javac.code.Flags import com.sun.tools.javac.code.Symbol +import com.sun.tools.javac.code.Type import com.sun.tools.javac.tree.JCTree.* import org.eclipse.lsp4j.Location import org.eclipse.lsp4j.Position @@ -18,6 +19,9 @@ import javax.lang.model.element.ElementKind data class ReferenceData(val useRange: Range, val refRange: Range, val defPath: Path) +// We probably don't want to include `java.lang.` for types of that package. +fun Type.strip() = this.toString().removePrefix("java.lang.") + class IndexingVisitor( task: JavacTask, private val compUnit: CompilationUnitTree, @@ -33,7 +37,21 @@ class IndexingVisitor( val defRange = findLocation(currentPath, node.name.toString())?.range ?: return super.visitVariable(node, p) - indexer.emitDefinition(defRange, node.toString(), docs.getDocComment(currentPath)) + // handle enum + val isEnum = (node as JCVariableDecl).sym?.flags()?.and(Flags.ENUM.toLong())?.equals(0L)?.not() + ?: return super.visitVariable(node, p); + + val nodeString = if(isEnum) { + val constructorCall = ((node.init as JCNewClass).constructor as Symbol.MethodSymbol) + + "enum-constant ${node.sym.owner.name}.${node.sym.name}" + + if (constructorCall.params.isEmpty()) "" + else "(${constructorCall.params.map { "${it.type.strip()} ${it.name}" }.toString(", ")})" + } else { + node.toString() + } + + indexer.emitDefinition(defRange, nodeString, docs.getDocComment(currentPath)) return super.visitVariable(node, p) }