From 7bb4474c174664efaa9b0bff2f491cdc9a47638c Mon Sep 17 00:00:00 2001 From: Noah Santschi-Cooney Date: Tue, 22 Sep 2020 15:56:45 +0100 Subject: [PATCH] Closes #28 with full signature (#41) --- src/main/java/lsifjava/DocumentIndexer.java | 152 +++++++++++++++----- 1 file changed, 114 insertions(+), 38 deletions(-) diff --git a/src/main/java/lsifjava/DocumentIndexer.java b/src/main/java/lsifjava/DocumentIndexer.java index 06cadc0d..33cf6fb1 100644 --- a/src/main/java/lsifjava/DocumentIndexer.java +++ b/src/main/java/lsifjava/DocumentIndexer.java @@ -27,6 +27,7 @@ public class DocumentIndexer { private String documentId; private Set rangeIds = new HashSet<>(); private Map definitions = new HashMap<>(); + private String packageName; public DocumentIndexer( String projectRoot, @@ -108,33 +109,33 @@ public void visitCtParameter(CtParameter el) { return; } emitDefinition(mkRange(el.getPosition()), mkDoc(el.getType(), el.getDocComment())); - } - - @Override - public void visitCtAnnotationType(CtAnnotationType el) { - super.visitCtAnnotationType(el); - if (el.getPosition() instanceof NoSourcePosition) { - return; - } - - emitDefinition(mkRange(el.getPosition()), mkDoc(el.getReference(), el.getDocComment())); - } - - @Override - public > void visitCtEnum(CtEnum el) { - super.visitCtEnum(el); - if (el.getPosition() instanceof NoSourcePosition) { - return; - } - - emitDefinition(mkRange(el.getPosition()), mkDoc(el.getReference(), el.getDocComment())); - } + } + + @Override + public void visitCtAnnotationType(CtAnnotationType el) { + super.visitCtAnnotationType(el); + if (el.getPosition() instanceof NoSourcePosition) { + return; + } + + emitDefinition(mkRange(el.getPosition()), mkDoc(el.getReference(), el.getDocComment())); + } + + @Override + public > void visitCtEnum(CtEnum el) { + super.visitCtEnum(el); + if (el.getPosition() instanceof NoSourcePosition) { + return; + } + + emitDefinition(mkRange(el.getPosition()), mkDoc(el.getReference(), el.getDocComment())); + } @Override public void visitCtLocalVariable(CtLocalVariable el) { super.visitCtLocalVariable(el); if (el.getPosition() instanceof NoSourcePosition) { - return; + return; } emitDefinition(mkRange(el.getPosition()), mkDoc(el.getType(), el.getDocComment())); @@ -144,7 +145,7 @@ public void visitCtLocalVariable(CtLocalVariable el) { public void visitCtCatchVariable(CtCatchVariable el) { super.visitCtCatchVariable(el); if (el.getPosition() instanceof NoSourcePosition) { - return; + return; } emitDefinition(mkRange(el.getPosition()), mkDoc(el.getType(), el.getDocComment())); @@ -154,7 +155,7 @@ public void visitCtCatchVariable(CtCatchVariable el) { public void visitCtMethod(CtMethod el) { super.visitCtMethod(el); if (el.getPosition() instanceof NoSourcePosition) { - return; + return; } emitDefinition(nameRange(el), mkDoc(el.getType(), el.getDocComment())); @@ -164,7 +165,7 @@ public void visitCtMethod(CtMethod el) { public void visitCtField(CtField el) { super.visitCtField(el); if (el.getPosition() instanceof NoSourcePosition) { - return; + return; } emitDefinition(mkRange(el.getPosition()), mkDoc(el.getType(), el.getDocComment())); @@ -174,7 +175,7 @@ public void visitCtField(CtField el) { public void visitCtConstructor(CtConstructor el) { super.visitCtConstructor(el); if (el.getPosition() instanceof NoSourcePosition) { - return; + return; } emitDefinition(mkRange(el.getPosition()), mkDoc(el.getType(), el.getDocComment())); @@ -184,7 +185,7 @@ public void visitCtConstructor(CtConstructor el) { public void visitCtEnumValue(CtEnumValue el) { super.visitCtEnumValue(el); if (el.getPosition() instanceof NoSourcePosition) { - return; + return; } emitDefinition(nameRange(el), mkDoc(el.getType(), el.getDocComment())); @@ -192,18 +193,16 @@ public void visitCtEnumValue(CtEnumValue el) { @Override public void visitCtClass(CtClass el) { - super.visitCtClass(el); - // TODO(nsc) test behaviour with nested inner classes - /* if (el.get) */ - /* CtPackage elPackage = el.getPackage(); + super.visitCtClass(el); + CtPackage elPackage = el.getPackage(); if (elPackage == null) { - - System.err.println("e"); + // if anonymous object instance eg new Object() {...} + // do we want to emit a def? Probably + emitDefinition(mkRange(el.getPosition()), el.getDocComment()); + return; } - packageName = elPackage.getQualifiedName(); - String doc = mkClassDoc(el, el.getSuperclass(), el.getSuperInterfaces(), el.getDocComment()); - emitDefinition(nameRange(el), doc); */ - emitDefinition(mkRange(el.getPosition()), el.getDocComment()); + packageName = elPackage.getQualifiedName(); + emitDefinition(nameRange(el), mkClassDoc(el, el.getDocComment())); } /* @Override @@ -322,7 +321,7 @@ public void visitCtTypeReference(CtTypeReference el) { public void visitCtAssignment(CtAssignment el) { super.visitCtAssignment(el); if (el.getPosition() instanceof NoSourcePosition) { - return; + return; } el.getAssigned().getpa @@ -444,6 +443,83 @@ private String mkDoc(CtTypeReference t, String docComment) { return "```java\n" + t + "\n```" + (docComment.equals("") ? "" : "\n---\n" + docComment); } + private String mkClassDoc(CtClass t, String docComment) { + CtTypeReference superClass = t.getSuperclass(); + Set> implemented = t.getSuperInterfaces(); + + StringBuilder b = new StringBuilder("```java\n"); + + t.getModifiers().stream().sorted().forEach(m -> b.append(m.toString() + " ")); + + b.append("class "); + b.append(t.getSimpleName()); + + // handle super class + if(superClass != null) { + b.append(" extends "); + b.append(getLocalizedName(superClass)); + + appendTypeParam(b, superClass); + } + + // handle all implemented interfaces + if(implemented.size() > 0) { + Iterator> iter = implemented.iterator(); + b.append(" implements "); + CtTypeReference next = iter.next(); + b.append(getLocalizedName(next)); + + appendTypeParam(b, next); + + while(iter.hasNext()) { + next = iter.next(); + b.append(", "); + b.append(getLocalizedName(next)); + + appendTypeParam(b, next); + } + } + + b.append("\n```"); + + if(!docComment.equals("")) { + b.append("\n---\n"); + b.append(docComment); + } + + return b.toString(); + } + + /** + * Appends string representation of generic type parameters for a superclass/interface to the + * top-level type definition signature string builder + * @param b the type signature string builder + * @param next the current superclass/interface + */ + private void appendTypeParam(StringBuilder b, CtTypeReference next) { + if(next.getActualTypeArguments().size() > 0) { + b.append("<"); + Iterator> genIter = next.getActualTypeArguments().iterator(); + while(genIter.hasNext()) { + CtTypeReference gen = genIter.next(); + b.append(getLocalizedName(gen)); + if(genIter.hasNext()) b.append(", "); + } + + b.append(">"); + } + } + + private String getLocalizedName(CtTypeReference type) { + if(type.getPackage().getQualifiedName().equals("java.lang")) { + return type.getSimpleName(); + } else if(type.getPackage().getQualifiedName().startsWith(this.packageName)) { + return type.getSimpleName(); + } else { + return type.getQualifiedName(); + } + } + private String humanRange(Range r) { return r.begin.line + ":" + r.begin.column + "-" + r.end.line + ":" + r.end.column; }