249 lines
5.5 KiB
Java
249 lines
5.5 KiB
Java
package com.sourcetrail;
|
|
|
|
import com.github.javaparser.ast.visitor.VoidVisitorAdapter;
|
|
|
|
import com.github.javaparser.ast.*;
|
|
import com.github.javaparser.ast.body.*;
|
|
import com.github.javaparser.ast.comments.Comment;
|
|
import com.github.javaparser.ast.expr.*;
|
|
import com.github.javaparser.ast.nodeTypes.NodeWithAnnotations;
|
|
import com.github.javaparser.ast.stmt.*;
|
|
import com.github.javaparser.ast.type.*;
|
|
|
|
import java.util.Optional;
|
|
import java.util.Stack;
|
|
|
|
public abstract class AstVisitorAdapter extends VoidVisitorAdapter<Void>
|
|
{
|
|
private Stack<ReferenceKind> m_typeRefKind = new Stack<ReferenceKind>();
|
|
|
|
protected ReferenceKind getTypeReferenceKind()
|
|
{
|
|
if (!m_typeRefKind.isEmpty())
|
|
{
|
|
return m_typeRefKind.peek();
|
|
}
|
|
return ReferenceKind.TYPE_USAGE;
|
|
}
|
|
|
|
//- Compilation Unit ----------------------------------
|
|
|
|
@Override public void visit(final CompilationUnit n, Void arg)
|
|
{
|
|
m_typeRefKind.push(ReferenceKind.TYPE_USAGE);
|
|
visitComment(n.getComment(), arg);
|
|
if (n.getPackageDeclaration().isPresent())
|
|
{
|
|
n.getPackageDeclaration().get().accept(this, arg);
|
|
}
|
|
if (n.getImports() != null)
|
|
{
|
|
for (final ImportDeclaration i : n.getImports())
|
|
{
|
|
i.accept(this, arg);
|
|
}
|
|
}
|
|
if (n.getTypes() != null)
|
|
{
|
|
for (final TypeDeclaration<?> typeDeclaration : n.getTypes())
|
|
{
|
|
typeDeclaration.accept(this, arg);
|
|
}
|
|
}
|
|
m_typeRefKind.pop();
|
|
}
|
|
|
|
//- Body ----------------------------------------------
|
|
|
|
@Override public void visit(ClassOrInterfaceDeclaration n, Void arg)
|
|
{
|
|
visitComment(n.getComment(), arg);
|
|
visitAnnotations(n, arg);
|
|
n.getName().accept(this, arg);
|
|
for (final TypeParameter t : n.getTypeParameters())
|
|
{
|
|
t.accept(this, arg);
|
|
}
|
|
|
|
m_typeRefKind.push(ReferenceKind.INHERITANCE);
|
|
for (final ClassOrInterfaceType c : n.getExtendedTypes())
|
|
{
|
|
c.accept(this, arg);
|
|
}
|
|
for (final ClassOrInterfaceType c : n.getImplementedTypes())
|
|
{
|
|
c.accept(this, arg);
|
|
}
|
|
m_typeRefKind.pop();
|
|
|
|
for (final BodyDeclaration<?> member : n.getMembers())
|
|
{
|
|
member.accept(this, arg);
|
|
}
|
|
}
|
|
|
|
@Override public void visit(EnumDeclaration n, Void arg)
|
|
{
|
|
visitComment(n.getComment(), arg);
|
|
visitAnnotations(n, arg);
|
|
n.getName().accept(this, arg);
|
|
|
|
m_typeRefKind.push(ReferenceKind.INHERITANCE);
|
|
if (n.getImplementedTypes() != null)
|
|
{
|
|
for (final ClassOrInterfaceType c : n.getImplementedTypes())
|
|
{
|
|
c.accept(this, arg);
|
|
}
|
|
}
|
|
m_typeRefKind.pop();
|
|
|
|
if (n.getEntries() != null)
|
|
{
|
|
for (final EnumConstantDeclaration e : n.getEntries())
|
|
{
|
|
e.accept(this, arg);
|
|
}
|
|
}
|
|
if (n.getMembers() != null)
|
|
{
|
|
for (final BodyDeclaration<?> member : n.getMembers())
|
|
{
|
|
member.accept(this, arg);
|
|
}
|
|
}
|
|
}
|
|
|
|
//- Type ----------------------------------------------
|
|
|
|
@Override public void visit(ClassOrInterfaceType n, Void arg)
|
|
{
|
|
visitComment(n.getComment(), arg);
|
|
visitAnnotations(n, arg);
|
|
// don't visit the qualifier here.
|
|
// if (n.getScope().isPresent())
|
|
// {
|
|
// n.getScope().get().accept(this, arg);
|
|
// }
|
|
m_typeRefKind.push(ReferenceKind.TYPE_ARGUMENT);
|
|
if (n.getTypeArguments().isPresent())
|
|
{
|
|
for (final Type t : n.getTypeArguments().get())
|
|
{
|
|
t.accept(this, arg);
|
|
}
|
|
}
|
|
m_typeRefKind.pop();
|
|
}
|
|
|
|
//- Expression ----------------------------------------
|
|
|
|
@Override public void visit(MethodCallExpr n, Void arg)
|
|
{
|
|
visitComment(n.getComment(), arg);
|
|
if (n.getScope().isPresent())
|
|
{
|
|
n.getScope().get().accept(this, arg);
|
|
}
|
|
|
|
m_typeRefKind.push(ReferenceKind.TYPE_ARGUMENT);
|
|
if (n.getTypeArguments().isPresent())
|
|
{
|
|
for (final Type t : n.getTypeArguments().get())
|
|
{
|
|
t.accept(this, arg);
|
|
}
|
|
}
|
|
m_typeRefKind.pop();
|
|
|
|
n.getName().accept(this, arg);
|
|
if (n.getArguments() != null)
|
|
{
|
|
for (final Expression e : n.getArguments())
|
|
{
|
|
e.accept(this, arg);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override public void visit(ObjectCreationExpr n, Void arg)
|
|
{
|
|
visitComment(n.getComment(), arg);
|
|
if (n.getScope().isPresent())
|
|
{
|
|
n.getScope().get().accept(this, arg);
|
|
}
|
|
|
|
m_typeRefKind.push(ReferenceKind.TYPE_ARGUMENT);
|
|
if (n.getTypeArguments().isPresent())
|
|
{
|
|
for (final Type t : n.getTypeArguments().get())
|
|
{
|
|
t.accept(this, arg);
|
|
}
|
|
}
|
|
m_typeRefKind.pop();
|
|
|
|
// n.getType().accept(this, arg);
|
|
if (n.getArguments() != null)
|
|
{
|
|
for (final Expression e : n.getArguments())
|
|
{
|
|
e.accept(this, arg);
|
|
}
|
|
}
|
|
if (n.getAnonymousClassBody().isPresent())
|
|
{
|
|
for (final BodyDeclaration<?> member : n.getAnonymousClassBody().get())
|
|
{
|
|
member.accept(this, arg);
|
|
}
|
|
}
|
|
}
|
|
|
|
//- Statements ----------------------------------------
|
|
|
|
@Override public void visit(ExplicitConstructorInvocationStmt n, Void arg)
|
|
{
|
|
visitComment(n.getComment(), arg);
|
|
if (!n.isThis() && n.getExpression().isPresent())
|
|
{
|
|
n.getExpression().get().accept(this, arg);
|
|
}
|
|
|
|
m_typeRefKind.push(ReferenceKind.TYPE_ARGUMENT);
|
|
if (n.getTypeArguments().isPresent())
|
|
{
|
|
for (final Type t : n.getTypeArguments().get())
|
|
{
|
|
t.accept(this, arg);
|
|
}
|
|
}
|
|
m_typeRefKind.pop();
|
|
|
|
if (n.getArguments() != null)
|
|
{
|
|
for (final Expression e : n.getArguments())
|
|
{
|
|
e.accept(this, arg);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void visitComment(final Optional<Comment> n, final Void arg)
|
|
{
|
|
if (n.isPresent())
|
|
{
|
|
n.get().accept(this, arg);
|
|
}
|
|
}
|
|
|
|
private void visitAnnotations(NodeWithAnnotations<?> n, final Void arg)
|
|
{
|
|
for (AnnotationExpr annotation : n.getAnnotations())
|
|
{
|
|
annotation.accept(this, arg);
|
|
}
|
|
}
|
|
}
|