Skip to content

Commit

Permalink
Closes #28 with full signature (#41)
Browse files Browse the repository at this point in the history
  • Loading branch information
Strum355 committed Sep 22, 2020
1 parent ae10916 commit 7bb4474
Showing 1 changed file with 114 additions and 38 deletions.
152 changes: 114 additions & 38 deletions src/main/java/lsifjava/DocumentIndexer.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ public class DocumentIndexer {
private String documentId;
private Set<String> rangeIds = new HashSet<>();
private Map<Range, DefinitionMeta> definitions = new HashMap<>();
private String packageName;

public DocumentIndexer(
String projectRoot,
Expand Down Expand Up @@ -108,33 +109,33 @@ public <T> void visitCtParameter(CtParameter<T> el) {
return;
}
emitDefinition(mkRange(el.getPosition()), mkDoc(el.getType(), el.getDocComment()));
}
@Override
public <A extends Annotation> void visitCtAnnotationType(CtAnnotationType<A> el) {
super.visitCtAnnotationType(el);
if (el.getPosition() instanceof NoSourcePosition) {
return;
}

emitDefinition(mkRange(el.getPosition()), mkDoc(el.getReference(), el.getDocComment()));
}

@Override
public <T extends Enum<?>> void visitCtEnum(CtEnum<T> el) {
super.visitCtEnum(el);
if (el.getPosition() instanceof NoSourcePosition) {
return;
}

emitDefinition(mkRange(el.getPosition()), mkDoc(el.getReference(), el.getDocComment()));
}
}
@Override
public <A extends Annotation> void visitCtAnnotationType(CtAnnotationType<A> el) {
super.visitCtAnnotationType(el);
if (el.getPosition() instanceof NoSourcePosition) {
return;
}

emitDefinition(mkRange(el.getPosition()), mkDoc(el.getReference(), el.getDocComment()));
}

@Override
public <T extends Enum<?>> void visitCtEnum(CtEnum<T> el) {
super.visitCtEnum(el);
if (el.getPosition() instanceof NoSourcePosition) {
return;
}

emitDefinition(mkRange(el.getPosition()), mkDoc(el.getReference(), el.getDocComment()));
}

@Override
public <T> void visitCtLocalVariable(CtLocalVariable<T> el) {
super.visitCtLocalVariable(el);
if (el.getPosition() instanceof NoSourcePosition) {
return;
return;
}

emitDefinition(mkRange(el.getPosition()), mkDoc(el.getType(), el.getDocComment()));
Expand All @@ -144,7 +145,7 @@ public <T> void visitCtLocalVariable(CtLocalVariable<T> el) {
public <T> void visitCtCatchVariable(CtCatchVariable<T> el) {
super.visitCtCatchVariable(el);
if (el.getPosition() instanceof NoSourcePosition) {
return;
return;
}

emitDefinition(mkRange(el.getPosition()), mkDoc(el.getType(), el.getDocComment()));
Expand All @@ -154,7 +155,7 @@ public <T> void visitCtCatchVariable(CtCatchVariable<T> el) {
public <T> void visitCtMethod(CtMethod<T> el) {
super.visitCtMethod(el);
if (el.getPosition() instanceof NoSourcePosition) {
return;
return;
}

emitDefinition(nameRange(el), mkDoc(el.getType(), el.getDocComment()));
Expand All @@ -164,7 +165,7 @@ public <T> void visitCtMethod(CtMethod<T> el) {
public <T> void visitCtField(CtField<T> el) {
super.visitCtField(el);
if (el.getPosition() instanceof NoSourcePosition) {
return;
return;
}

emitDefinition(mkRange(el.getPosition()), mkDoc(el.getType(), el.getDocComment()));
Expand All @@ -174,7 +175,7 @@ public <T> void visitCtField(CtField<T> el) {
public <T> void visitCtConstructor(CtConstructor<T> el) {
super.visitCtConstructor(el);
if (el.getPosition() instanceof NoSourcePosition) {
return;
return;
}

emitDefinition(mkRange(el.getPosition()), mkDoc(el.getType(), el.getDocComment()));
Expand All @@ -184,26 +185,24 @@ public <T> void visitCtConstructor(CtConstructor<T> el) {
public <T> void visitCtEnumValue(CtEnumValue<T> el) {
super.visitCtEnumValue(el);
if (el.getPosition() instanceof NoSourcePosition) {
return;
return;
}
emitDefinition(nameRange(el), mkDoc(el.getType(), el.getDocComment()));
} */

@Override
public <T> void visitCtClass(CtClass<T> 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
Expand Down Expand Up @@ -322,7 +321,7 @@ public <T> void visitCtTypeReference(CtTypeReference<T> el) {
public <T, A extends T> void visitCtAssignment(CtAssignment<T, A> el) {
super.visitCtAssignment(el);
if (el.getPosition() instanceof NoSourcePosition) {
return;
return;
}
el.getAssigned().getpa
Expand Down Expand Up @@ -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<CtTypeReference<?>> 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<CtTypeReference<?>> 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<CtTypeReference<?>> 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;
}
Expand Down

0 comments on commit 7bb4474

Please sign in to comment.