logic: Java anonymous class fixes

* fixed solving anonymous classes
* fixed solving methods declared in anonymous classes
* fixed solving calls to those methods
* updated JavaSymbolSolver Jars
This commit is contained in:
malte_langkabel
2017-08-10 15:15:48 +02:00
parent 5de050ab62
commit b9610951d8
12 changed files with 294 additions and 225 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,5 +1,6 @@
package com.sourcetrail;
import java.io.File;
import java.lang.String;
import java.util.List;
import java.util.Optional;
@@ -55,7 +56,7 @@ import com.sourcetrail.name.JavaDeclName;
public class AstVisitor extends AstVisitorAdapter
{
protected AstVisitorClient m_client = null;
private String m_filePath;
private File m_filePath;
private FileContent m_fileContent;
private TypeSolver m_typeSolver;
private List<DeclContext> m_context = new ArrayList<DeclContext>();
@@ -63,7 +64,7 @@ public class AstVisitor extends AstVisitorAdapter
public AstVisitor(AstVisitorClient client, String filePath, FileContent fileContent, TypeSolver typeSolver)
{
m_client = client;
m_filePath = filePath;
m_filePath = new File(filePath);
m_fileContent = fileContent;
m_typeSolver = typeSolver;
@@ -105,7 +106,7 @@ public class AstVisitor extends AstVisitorAdapter
{
SimpleName name = n.getName();
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(n, m_typeSolver).toNameHierarchy().serialize();
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(n, m_filePath, m_typeSolver).toNameHierarchy().serialize();
m_client.recordSymbolWithLocationAndScope(
qualifiedName, (n.isInterface() ? SymbolKind.INTERFACE : SymbolKind.CLASS),
@@ -140,7 +141,7 @@ public class AstVisitor extends AstVisitorAdapter
// throw something!
}
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(n, m_typeSolver).toNameHierarchy().serialize();
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(n, m_filePath, m_typeSolver).toNameHierarchy().serialize();
Optional<Range> range = Optional.empty();
if (n.getBegin().isPresent())
@@ -173,7 +174,7 @@ public class AstVisitor extends AstVisitorAdapter
{
SimpleName name = n.getName();
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(n, m_typeSolver).toNameHierarchy().serialize();
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(n, m_filePath, m_typeSolver).toNameHierarchy().serialize();
m_client.recordSymbolWithLocationAndScope(
qualifiedName, SymbolKind.ENUM,
@@ -200,7 +201,7 @@ public class AstVisitor extends AstVisitorAdapter
@Override
public Boolean visit(final EnumConstantDeclaration n, final Void v)
{
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(n, m_typeSolver).toNameHierarchy().serialize();
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(n, m_filePath, m_typeSolver).toNameHierarchy().serialize();
m_client.recordSymbolWithLocation(
qualifiedName, SymbolKind.ENUM_CONSTANT,
@@ -222,7 +223,7 @@ public class AstVisitor extends AstVisitorAdapter
{
SimpleName name = n.getName();
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(n, m_typeSolver).toNameHierarchy().serialize();
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(n, m_filePath, m_typeSolver).toNameHierarchy().serialize();
m_client.recordSymbolWithLocationAndScope(
qualifiedName, SymbolKind.METHOD,
@@ -251,7 +252,7 @@ public class AstVisitor extends AstVisitorAdapter
SimpleName name = n.getName();
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(n, m_typeSolver).toNameHierarchy().serialize();
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(n, m_filePath, m_typeSolver).toNameHierarchy().serialize();
m_client.recordSymbolWithLocationAndScope(
qualifiedName, SymbolKind.METHOD,
@@ -266,7 +267,8 @@ public class AstVisitor extends AstVisitorAdapter
com.github.javaparser.symbolsolver.model.declarations.MethodDeclaration overridden = getOverridden(n);
if (overridden != null && (overridden instanceof JavaParserMethodDeclaration))
{
String overriddenName = JavaparserDeclNameResolver.getQualifiedDeclName(((JavaParserMethodDeclaration)overridden).getWrappedNode(), m_typeSolver).toNameHierarchy().serialize();
String overriddenName = JavaparserDeclNameResolver.getQualifiedDeclName(
((JavaParserMethodDeclaration)overridden).getWrappedNode(), m_filePath, m_typeSolver).toNameHierarchy().serialize();
m_client.recordReference(
ReferenceKind.OVERRIDE, overriddenName, qualifiedName,
@@ -348,7 +350,7 @@ public class AstVisitor extends AstVisitorAdapter
for (VariableDeclarator declarator: n.getVariables())
{
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(declarator, m_typeSolver).toNameHierarchy().serialize();
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(declarator, m_filePath, m_typeSolver).toNameHierarchy().serialize();
SimpleName name = declarator.getName();
m_client.recordSymbolWithLocation(
qualifiedName, SymbolKind.FIELD,
@@ -429,7 +431,8 @@ public class AstVisitor extends AstVisitorAdapter
SymbolReference<ReferenceTypeDeclaration> solvedTypeDeclatarion = m_typeSolver.tryToSolveType(name.asString());
if (solvedTypeDeclatarion.isSolved())
{
importedDeclNames.add(JavaSymbolSolverDeclNameResolver.getQualifiedDeclName(solvedTypeDeclatarion.getCorrespondingDeclaration(), m_typeSolver));
importedDeclNames.add(JavaSymbolSolverDeclNameResolver.getQualifiedDeclName(
solvedTypeDeclatarion.getCorrespondingDeclaration(), m_filePath, m_typeSolver));
}
else if (n.isStatic())
{
@@ -443,13 +446,12 @@ public class AstVisitor extends AstVisitorAdapter
if (methodDecl.getName().equals(memberName))
{
importedDeclNames.add(
JavaSymbolSolverDeclNameResolver.getQualifiedDeclName(methodDecl, m_typeSolver
));
JavaSymbolSolverDeclNameResolver.getQualifiedDeclName(methodDecl, m_filePath, m_typeSolver));
}
}
if (importedDeclNames.isEmpty() && solvedDecl.hasField(memberName)) // look for field
{
JavaDeclName importedTypeDeclName = JavaSymbolSolverDeclNameResolver.getQualifiedDeclName(solvedDecl, m_typeSolver);
JavaDeclName importedTypeDeclName = JavaSymbolSolverDeclNameResolver.getQualifiedDeclName(solvedDecl, m_filePath, m_typeSolver);
if (importedTypeDeclName != null)
{
JavaDeclName importedDeclName = new JavaDeclName(memberName);
@@ -494,7 +496,7 @@ public class AstVisitor extends AstVisitorAdapter
{
for (DeclContext context: m_context)
{
String referencedName = JavaparserTypeNameResolver.getQualifiedTypeName(n, m_typeSolver).toNameHierarchy().serialize();
String referencedName = JavaparserTypeNameResolver.getQualifiedTypeName(n, m_filePath, m_typeSolver).toNameHierarchy().serialize();
Range range = Range.range(0, 0, 0, 0);
@@ -539,7 +541,7 @@ public class AstVisitor extends AstVisitorAdapter
{
try
{
String referencedName = JavaparserTypeNameResolver.getQualifiedTypeName(n, m_typeSolver).toNameHierarchy().serialize();
String referencedName = JavaparserTypeNameResolver.getQualifiedTypeName(n, m_filePath, m_typeSolver).toNameHierarchy().serialize();
m_client.recordSymbol(
referencedName, SymbolKind.BUILTIN_TYPE,
@@ -568,7 +570,7 @@ public class AstVisitor extends AstVisitorAdapter
{
try
{
String referencedName = JavaparserTypeNameResolver.getQualifiedTypeName(n, m_typeSolver).toNameHierarchy().serialize();
String referencedName = JavaparserTypeNameResolver.getQualifiedTypeName(n, m_filePath, m_typeSolver).toNameHierarchy().serialize();
m_client.recordSymbol(
referencedName, SymbolKind.BUILTIN_TYPE, AccessKind.NONE, DefinitionKind.EXPLICIT
@@ -613,7 +615,7 @@ public class AstVisitor extends AstVisitorAdapter
{
if (var.getName().getIdentifier().equals(fieldName.getIdentifier()))
{
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(var, m_typeSolver).toNameHierarchy().serialize();
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(var, m_filePath, m_typeSolver).toNameHierarchy().serialize();
for (DeclContext context: m_context)
{
m_client.recordReference(
@@ -667,7 +669,7 @@ public class AstVisitor extends AstVisitorAdapter
{
if (var.getName().getIdentifier().equals(n.getName().getIdentifier()))
{
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(var, m_typeSolver).toNameHierarchy().serialize();
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(var, m_filePath, m_typeSolver).toNameHierarchy().serialize();
for (DeclContext context: m_context)
{
m_client.recordReference(
@@ -695,7 +697,7 @@ public class AstVisitor extends AstVisitorAdapter
{
if (wrappedNode.getAncestorOfType(FieldDeclaration.class).isPresent())
{
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName((VariableDeclarator)wrappedNode, m_typeSolver).toNameHierarchy().serialize();
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName((VariableDeclarator)wrappedNode, m_filePath, m_typeSolver).toNameHierarchy().serialize();
for (DeclContext context: m_context)
{
@@ -741,7 +743,8 @@ public class AstVisitor extends AstVisitorAdapter
SymbolReference<com.github.javaparser.symbolsolver.model.declarations.MethodDeclaration> solvedSymbol = JavaParserFacade.get(m_typeSolver).solve(n);
if (solvedSymbol.isSolved())
{
qualifiedName = JavaSymbolSolverDeclNameResolver.getQualifiedDeclName(solvedSymbol.getCorrespondingDeclaration(), m_typeSolver).toNameHierarchy().serialize();
qualifiedName = JavaSymbolSolverDeclNameResolver.getQualifiedDeclName(
solvedSymbol.getCorrespondingDeclaration(), m_filePath, m_typeSolver).toNameHierarchy().serialize();
}
else
{
@@ -815,51 +818,64 @@ public class AstVisitor extends AstVisitorAdapter
@Override
public Boolean visit(final ObjectCreationExpr n, final Void v)
{
String qualifiedName = "";
if (m_context.size() > 0)
{
try
if (n.getAnonymousClassBody().isPresent())
{
SymbolReference<com.github.javaparser.symbolsolver.model.declarations.ConstructorDeclaration> solvedSymbol = JavaParserFacade.get(m_typeSolver).solve(n);
if (solvedSymbol.isSolved())
{
qualifiedName = JavaSymbolSolverDeclNameResolver.getQualifiedDeclName(solvedSymbol.getCorrespondingDeclaration(), m_typeSolver).toNameHierarchy().serialize();
}
else
{
throw new UnsolvedSymbolException("constructor for " + n.getType().getNameAsString());
}
}
catch (UnsupportedOperationException e)
{
recordException(e, n);
}
catch (MethodAmbiguityException e)
{
recordException(e, n);
}
catch(StackOverflowError e)
{
recordError(e, n);
}
catch (Exception e)
{
recordException(e, n);
}
}
if (!qualifiedName.isEmpty())
{
ClassOrInterfaceType type = n.getType();
for (DeclContext context: m_context)
{
m_client.recordReference(
ReferenceKind.CALL, qualifiedName, context.getName(),
type.getRange()
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(n, m_filePath, m_typeSolver).toNameHierarchy().serialize();
m_client.recordSymbolWithLocationAndScope(
qualifiedName, SymbolKind.CLASS,
n.getType().getRange(),
n.getRange(),
AccessKind.NONE,
DefinitionKind.EXPLICIT
);
}
else
{
String qualifiedName = "";
try
{
SymbolReference<com.github.javaparser.symbolsolver.model.declarations.ConstructorDeclaration> solvedSymbol = JavaParserFacade.get(m_typeSolver).solve(n);
if (solvedSymbol.isSolved())
{
qualifiedName = JavaSymbolSolverDeclNameResolver.getQualifiedDeclName(solvedSymbol.getCorrespondingDeclaration(), m_filePath, m_typeSolver).toNameHierarchy().serialize();
}
else
{
throw new UnsolvedSymbolException("constructor for " + n.getType().getNameAsString());
}
}
catch (UnsupportedOperationException e)
{
recordException(e, n);
}
catch (MethodAmbiguityException e)
{
recordException(e, n);
}
catch(StackOverflowError e)
{
recordError(e, n);
}
catch (Exception e)
{
recordException(e, n);
}
if (!qualifiedName.isEmpty())
{
ClassOrInterfaceType type = n.getType();
for (DeclContext context: m_context)
{
m_client.recordReference(
ReferenceKind.CALL, qualifiedName, context.getName(),
type.getRange()
);
}
}
}
}
return super.visit(n, v);
}
@@ -1,22 +1,15 @@
package com.sourcetrail;
import com.github.javaparser.ast.visitor.GenericListVisitorAdapter;
import com.github.javaparser.ast.visitor.GenericVisitorAdapter;
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;
import javax.annotation.Generated;
public abstract class AstVisitorAdapter extends GenericVisitorAdapter<Boolean, Void>
{
private Stack<ReferenceKind> m_typeRefKind = new Stack<ReferenceKind>();
@@ -1,19 +1,18 @@
package com.sourcetrail;
import java.util.ArrayList;
import java.util.List;
import com.github.javaparser.ast.body.BodyDeclaration;
import java.io.File;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
public abstract class JavaNameResolver
{
File m_currentFile = null;
TypeSolver m_typeSolver = null;
ContextList m_ignoredContexts = null;
public JavaNameResolver(TypeSolver typeSolver, ContextList ignoredContexts)
public JavaNameResolver(File currentFile, TypeSolver typeSolver, ContextList ignoredContexts)
{
m_currentFile = currentFile;
m_typeSolver = typeSolver;
if (ignoredContexts != null)
{
@@ -1,13 +1,10 @@
package com.sourcetrail;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import com.github.javaparser.ast.body.BodyDeclaration;
import com.github.javaparser.ast.body.FieldDeclaration;
import com.github.javaparser.ast.body.Parameter;
import com.github.javaparser.ast.type.TypeParameter;
import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserAnnotationDeclaration;
import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserAnonymousClassDeclaration;
import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserClassDeclaration;
@@ -21,16 +18,12 @@ import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParse
import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserSymbolDeclaration;
import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserTypeParameter;
import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserTypeVariableDeclaration;
import com.github.javaparser.symbolsolver.javassistmodel.JavassistClassDeclaration;
import com.github.javaparser.symbolsolver.javassistmodel.JavassistTypeParameter;
import com.github.javaparser.symbolsolver.model.declarations.Declaration;
import com.github.javaparser.symbolsolver.model.declarations.MethodDeclaration;
import com.github.javaparser.symbolsolver.model.declarations.MethodLikeDeclaration;
import com.github.javaparser.symbolsolver.model.declarations.ReferenceTypeDeclaration;
import com.github.javaparser.symbolsolver.model.declarations.TypeDeclaration;
import com.github.javaparser.symbolsolver.model.declarations.TypeParameterDeclaration;
import com.github.javaparser.symbolsolver.model.declarations.TypeParametrizable;
import com.github.javaparser.symbolsolver.model.declarations.ValueDeclaration;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
import com.sourcetrail.name.JavaDeclName;
@@ -40,19 +33,19 @@ import com.sourcetrail.name.JavaVariableDeclName;
public class JavaSymbolSolverDeclNameResolver extends JavaNameResolver
{
public JavaSymbolSolverDeclNameResolver(TypeSolver typeSolver, ContextList ignoredContexts)
public JavaSymbolSolverDeclNameResolver(File currentFile, TypeSolver typeSolver, ContextList ignoredContexts)
{
super(typeSolver, ignoredContexts);
super(currentFile, typeSolver, ignoredContexts);
}
public static JavaDeclName getQualifiedDeclName(Declaration decl, TypeSolver typeSolver)
public static JavaDeclName getQualifiedDeclName(Declaration decl, File currentFile, TypeSolver typeSolver)
{
return getQualifiedDeclName(decl, typeSolver, null);
return getQualifiedDeclName(decl, currentFile, typeSolver, null);
}
public static JavaDeclName getQualifiedDeclName(Declaration decl, TypeSolver typeSolver, ContextList ignoredContexts)
public static JavaDeclName getQualifiedDeclName(Declaration decl, File currentFile, TypeSolver typeSolver, ContextList ignoredContexts)
{
JavaSymbolSolverDeclNameResolver resolver = new JavaSymbolSolverDeclNameResolver(typeSolver, ignoredContexts);
JavaSymbolSolverDeclNameResolver resolver = new JavaSymbolSolverDeclNameResolver(currentFile, typeSolver, ignoredContexts);
return resolver.getQualifiedDeclName(decl);
}
@@ -69,44 +62,44 @@ public class JavaSymbolSolverDeclNameResolver extends JavaNameResolver
}
if (decl instanceof JavaParserAnonymousClassDeclaration)
{
// TODO: implement
// TODO: implement maybe the case is new XXX { methods and stuff }.doSomething();
System.out.println("solving name of JavaParserAnonymousClassDeclaration not implemented");
declName = JavaDeclName.unsolved();
}
else if (decl instanceof JavaParserClassDeclaration)
{
declName = JavaparserDeclNameResolver.getQualifiedDeclName(
((JavaParserClassDeclaration)decl).getWrappedNode(), m_typeSolver, m_ignoredContexts);
((JavaParserClassDeclaration)decl).getWrappedNode(), m_currentFile, m_typeSolver, m_ignoredContexts);
}
else if (decl instanceof JavaParserConstructorDeclaration)
{
declName = JavaparserDeclNameResolver.getQualifiedDeclName(
((JavaParserConstructorDeclaration)decl).getWrappedNode(), m_typeSolver, m_ignoredContexts);
((JavaParserConstructorDeclaration)decl).getWrappedNode(), m_currentFile, m_typeSolver, m_ignoredContexts);
}
else if (decl instanceof JavaParserEnumDeclaration)
{
declName = JavaparserDeclNameResolver.getQualifiedDeclName(
((JavaParserEnumDeclaration)decl).getWrappedNode(), m_typeSolver, m_ignoredContexts);
((JavaParserEnumDeclaration)decl).getWrappedNode(), m_currentFile, m_typeSolver, m_ignoredContexts);
}
else if (decl instanceof JavaParserEnumConstantDeclaration)
{
declName = JavaparserDeclNameResolver.getQualifiedDeclName(
((JavaParserEnumConstantDeclaration)decl).getWrappedNode(), m_typeSolver, m_ignoredContexts);
((JavaParserEnumConstantDeclaration)decl).getWrappedNode(), m_currentFile, m_typeSolver, m_ignoredContexts);
}
else if (decl instanceof JavaParserFieldDeclaration)
{
declName = JavaparserDeclNameResolver.getQualifiedDeclName(
((JavaParserFieldDeclaration)decl).getWrappedNode(), m_typeSolver, m_ignoredContexts);
((JavaParserFieldDeclaration)decl).getWrappedNode(), m_currentFile, m_typeSolver, m_ignoredContexts);
}
else if (decl instanceof JavaParserInterfaceDeclaration)
{
declName = JavaparserDeclNameResolver.getQualifiedDeclName(
((JavaParserInterfaceDeclaration)decl).getWrappedNode(), m_typeSolver, m_ignoredContexts);
((JavaParserInterfaceDeclaration)decl).getWrappedNode(), m_currentFile, m_typeSolver, m_ignoredContexts);
}
else if (decl instanceof JavaParserMethodDeclaration)
{
declName = JavaparserDeclNameResolver.getQualifiedDeclName(
((JavaParserMethodDeclaration)decl).getWrappedNode(), m_typeSolver, m_ignoredContexts);
((JavaParserMethodDeclaration)decl).getWrappedNode(), m_currentFile, m_typeSolver, m_ignoredContexts);
}
else if (decl instanceof JavaParserParameterDeclaration)
{
@@ -121,12 +114,12 @@ public class JavaSymbolSolverDeclNameResolver extends JavaNameResolver
else if (decl instanceof JavaParserTypeParameter)
{
declName = JavaparserDeclNameResolver.getQualifiedDeclName(
((JavaParserTypeParameter)decl).getWrappedNode(), m_typeSolver, m_ignoredContexts);
((JavaParserTypeParameter)decl).getWrappedNode(), m_currentFile, m_typeSolver, m_ignoredContexts);
}
else if (decl instanceof JavaParserTypeVariableDeclaration)
{
declName = JavaparserDeclNameResolver.getQualifiedDeclName(
((JavaParserTypeVariableDeclaration)decl).getWrappedNode(), m_typeSolver, m_ignoredContexts);
((JavaParserTypeVariableDeclaration)decl).getWrappedNode(), m_currentFile, m_typeSolver, m_ignoredContexts);
}
else
{
@@ -144,7 +137,7 @@ public class JavaSymbolSolverDeclNameResolver extends JavaNameResolver
Optional<ReferenceTypeDeclaration> containerType = ((ReferenceTypeDeclaration) decl).containerType();
if (containerType.isPresent())
{
declName.setParent(getQualifiedDeclName(containerType.get(), m_typeSolver, m_ignoredContexts));
declName.setParent(getQualifiedDeclName(containerType.get(), m_currentFile, m_typeSolver, m_ignoredContexts));
}
else
{
@@ -160,11 +153,11 @@ public class JavaSymbolSolverDeclNameResolver extends JavaNameResolver
{
if (container instanceof ReferenceTypeDeclaration)
{
declName.setParent(getQualifiedDeclName((ReferenceTypeDeclaration) container, m_typeSolver, m_ignoredContexts));
declName.setParent(getQualifiedDeclName((ReferenceTypeDeclaration) container, m_currentFile, m_typeSolver, m_ignoredContexts));
}
if (container instanceof MethodLikeDeclaration)
{
declName.setParent(getQualifiedDeclName((MethodLikeDeclaration) container, m_typeSolver, m_ignoredContexts));
declName.setParent(getQualifiedDeclName((MethodLikeDeclaration) container, m_currentFile, m_typeSolver, m_ignoredContexts));
}
}
}
@@ -177,18 +170,18 @@ public class JavaSymbolSolverDeclNameResolver extends JavaNameResolver
boolean isStatic = false;
if (decl instanceof MethodDeclaration)
{
returnTypeName = JavaSymbolSolverTypeNameResolver.getQualifiedTypeName(((MethodDeclaration)decl).getReturnType(), m_typeSolver, ignoredContextsForTypes);
returnTypeName = JavaSymbolSolverTypeNameResolver.getQualifiedTypeName(((MethodDeclaration)decl).getReturnType(), m_currentFile, m_typeSolver, ignoredContextsForTypes);
isStatic = ((MethodDeclaration)decl).isStatic();
}
declName = new JavaFunctionDeclName(
name, typeParameters,
returnTypeName,
getParameterTypeNames((MethodLikeDeclaration) decl, m_typeSolver, ignoredContextsForTypes),
getParameterTypeNames((MethodLikeDeclaration) decl, m_currentFile, m_typeSolver, ignoredContextsForTypes),
isStatic);
declName.setParent(
getQualifiedDeclName(((MethodLikeDeclaration) decl).declaringType(), m_typeSolver, m_ignoredContexts));
getQualifiedDeclName(((MethodLikeDeclaration) decl).declaringType(), m_currentFile, m_typeSolver, m_ignoredContexts));
}
else if (decl instanceof com.github.javaparser.symbolsolver.model.declarations.FieldDeclaration)
@@ -196,12 +189,13 @@ public class JavaSymbolSolverDeclNameResolver extends JavaNameResolver
com.github.javaparser.symbolsolver.model.declarations.FieldDeclaration fieldDecl = ((com.github.javaparser.symbolsolver.model.declarations.FieldDeclaration) decl);
declName = new JavaVariableDeclName(
name,
JavaSymbolSolverTypeNameResolver.getQualifiedTypeName(fieldDecl.getType(), m_typeSolver, m_ignoredContexts),
JavaSymbolSolverTypeNameResolver.getQualifiedTypeName(fieldDecl.getType(), m_currentFile, m_typeSolver, m_ignoredContexts),
fieldDecl.isStatic());
declName.setParent(
getQualifiedDeclName(
fieldDecl.declaringType(),
m_currentFile,
m_typeSolver,
m_ignoredContexts));
}
@@ -230,13 +224,13 @@ public class JavaSymbolSolverDeclNameResolver extends JavaNameResolver
return typeParameterNames;
}
private static List<JavaTypeName> getParameterTypeNames(MethodLikeDeclaration decl, TypeSolver typeSolver, ContextList ignoredContexts)
private static List<JavaTypeName> getParameterTypeNames(MethodLikeDeclaration decl, File currentFile, TypeSolver typeSolver, ContextList ignoredContexts)
{
List<JavaTypeName> typeTypeParameterNames = new ArrayList<>();
for (int i = 0; i < decl.getNumberOfParams(); i++)
{
typeTypeParameterNames.add(JavaSymbolSolverTypeNameResolver.getQualifiedTypeName(
decl.getParam(i).getType(), typeSolver, ignoredContexts
decl.getParam(i).getType(), currentFile, typeSolver, ignoredContexts
));
}
return typeTypeParameterNames;
@@ -1,5 +1,6 @@
package com.sourcetrail;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
@@ -24,19 +25,19 @@ import com.sourcetrail.name.JavaTypeName;
public class JavaSymbolSolverTypeNameResolver extends JavaNameResolver
{
public JavaSymbolSolverTypeNameResolver(TypeSolver typeSolver, ContextList ignoredContexts)
public JavaSymbolSolverTypeNameResolver(File currentFile, TypeSolver typeSolver, ContextList ignoredContexts)
{
super(typeSolver, ignoredContexts);
super(currentFile, typeSolver, ignoredContexts);
}
public static JavaTypeName getQualifiedTypeName(Type type, TypeSolver typeSolver)
public static JavaTypeName getQualifiedTypeName(Type type, File currentFile, TypeSolver typeSolver)
{
return getQualifiedTypeName(type, typeSolver, null);
return getQualifiedTypeName(type, currentFile, typeSolver, null);
}
public static JavaTypeName getQualifiedTypeName(Type type, TypeSolver typeSolver, ContextList ignoredContexts)
public static JavaTypeName getQualifiedTypeName(Type type, File currentFile, TypeSolver typeSolver, ContextList ignoredContexts)
{
JavaSymbolSolverTypeNameResolver resolver = new JavaSymbolSolverTypeNameResolver(typeSolver, ignoredContexts);
JavaSymbolSolverTypeNameResolver resolver = new JavaSymbolSolverTypeNameResolver(currentFile, typeSolver, ignoredContexts);
return resolver.getQualifiedTypeName(type);
}
@@ -67,7 +68,8 @@ public class JavaSymbolSolverTypeNameResolver extends JavaNameResolver
ReferenceType refTypeUsage = (ReferenceType)type;
JavaDeclName declName = JavaSymbolSolverDeclNameResolver.getQualifiedDeclName(
refTypeUsage.getTypeDeclaration(),
refTypeUsage.getTypeDeclaration(),
m_currentFile,
m_typeSolver,
m_ignoredContexts);
return new JavaTypeName(declName.getName() + declName.getTypeParameterString(), new ArrayList<JavaTypeName>(), declName.getParent());
@@ -76,6 +78,7 @@ public class JavaSymbolSolverTypeNameResolver extends JavaNameResolver
{
JavaDeclName declName = JavaSymbolSolverDeclNameResolver.getQualifiedDeclName(
((TypeVariable)type).asTypeParameter(),
m_currentFile,
m_typeSolver,
m_ignoredContexts);
return new JavaTypeName(declName.getName(), new ArrayList<JavaTypeName>(), declName.getParent());
@@ -1,9 +1,11 @@
package com.sourcetrail;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import com.github.javaparser.Position;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.NodeList;
@@ -20,6 +22,7 @@ import com.github.javaparser.ast.body.Parameter;
import com.github.javaparser.ast.body.TypeDeclaration;
import com.github.javaparser.ast.body.VariableDeclarator;
import com.github.javaparser.ast.expr.Name;
import com.github.javaparser.ast.expr.ObjectCreationExpr;
import com.github.javaparser.ast.type.TypeParameter;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
@@ -30,19 +33,19 @@ import com.sourcetrail.name.JavaVariableDeclName;
public class JavaparserDeclNameResolver extends JavaNameResolver
{
public JavaparserDeclNameResolver(TypeSolver typeSolver, ContextList ignoredContexts)
public JavaparserDeclNameResolver(File currentFile, TypeSolver typeSolver, ContextList ignoredContexts)
{
super(typeSolver, ignoredContexts);
super(currentFile, typeSolver, ignoredContexts);
}
public static JavaDeclName getQualifiedDeclName(VariableDeclarator decl, TypeSolver typeSolver)
public static JavaDeclName getQualifiedDeclName(VariableDeclarator decl, File currentFile, TypeSolver typeSolver)
{
return getQualifiedDeclName(decl, typeSolver, null);
return getQualifiedDeclName(decl, currentFile, typeSolver, null);
}
public static JavaDeclName getQualifiedDeclName(VariableDeclarator decl, TypeSolver typeSolver, ContextList ignoredContexts)
public static JavaDeclName getQualifiedDeclName(VariableDeclarator decl, File currentFile, TypeSolver typeSolver, ContextList ignoredContexts)
{
JavaparserDeclNameResolver resolver = new JavaparserDeclNameResolver(typeSolver, ignoredContexts);
JavaparserDeclNameResolver resolver = new JavaparserDeclNameResolver(currentFile, typeSolver, ignoredContexts);
return resolver.getQualifiedDeclName(decl);
}
@@ -53,31 +56,9 @@ public class JavaparserDeclNameResolver extends JavaNameResolver
if (decl != null)
{
declName = getDeclName(decl);
BodyDeclaration declContext = getBodyDeclContext(decl);
if (declContext != null)
if (!declName.getIsUnsolved())
{
if (!m_ignoredContexts.contains(declContext))
{
declName.setParent(getQualifiedDeclName(declContext));
}
}
else
{
Optional<CompilationUnit> compilationUnit = decl.getAncestorOfType(CompilationUnit.class);
if (compilationUnit.isPresent())
{
Optional<PackageDeclaration> packageDecl = compilationUnit.get().getPackageDeclaration();
if (packageDecl.isPresent())
{
declName.setParent(getQualifiedName(packageDecl.get().getName()));
}
}
else
{
throw new UnsupportedOperationException();
}
declName.setParent(getQualifiedContextName(decl));
}
}
return declName;
@@ -85,7 +66,7 @@ public class JavaparserDeclNameResolver extends JavaNameResolver
public JavaDeclName getDeclName(VariableDeclarator decl)
{
JavaTypeName typeName = JavaparserTypeNameResolver.getQualifiedTypeName(decl.getType(), m_typeSolver, m_ignoredContexts.copy());
JavaTypeName typeName = JavaparserTypeNameResolver.getQualifiedTypeName(decl.getType(), m_currentFile, m_typeSolver, m_ignoredContexts.copy());
boolean isStatic = false;
Optional<FieldDeclaration> fieldDeclaration = decl.getAncestorOfType(FieldDeclaration.class);
@@ -97,14 +78,14 @@ public class JavaparserDeclNameResolver extends JavaNameResolver
return new JavaVariableDeclName(decl.getNameAsString(), typeName, isStatic);
}
public static JavaDeclName getQualifiedDeclName(BodyDeclaration decl, TypeSolver typeSolver)
public static JavaDeclName getQualifiedDeclName(BodyDeclaration decl, File currentFile, TypeSolver typeSolver)
{
return getQualifiedDeclName(decl, typeSolver, null);
return getQualifiedDeclName(decl, currentFile, typeSolver, null);
}
public static JavaDeclName getQualifiedDeclName(BodyDeclaration decl, TypeSolver typeSolver, ContextList ignoredContexts)
public static JavaDeclName getQualifiedDeclName(BodyDeclaration decl, File currentFile, TypeSolver typeSolver, ContextList ignoredContexts)
{
JavaparserDeclNameResolver resolver = new JavaparserDeclNameResolver(typeSolver, ignoredContexts);
JavaparserDeclNameResolver resolver = new JavaparserDeclNameResolver(currentFile, typeSolver, ignoredContexts);
return resolver.getQualifiedDeclName(decl);
}
@@ -115,31 +96,9 @@ public class JavaparserDeclNameResolver extends JavaNameResolver
if (decl != null)
{
declName = getDeclName(decl);
BodyDeclaration declContext = getBodyDeclContext(decl);
if (declContext != null)
if (!declName.getIsUnsolved())
{
if (!m_ignoredContexts.contains(declContext))
{
declName.setParent(getQualifiedDeclName(declContext));
}
}
else
{
Optional<CompilationUnit> compilationUnit = decl.getAncestorOfType(CompilationUnit.class);
if (compilationUnit.isPresent())
{
Optional<PackageDeclaration> packageDecl = compilationUnit.get().getPackageDeclaration();
if (packageDecl.isPresent())
{
declName.setParent(getQualifiedName(packageDecl.get().getName()));
}
}
else
{
throw new UnsupportedOperationException();
}
declName.setParent(getQualifiedContextName(decl));
}
}
@@ -187,14 +146,14 @@ public class JavaparserDeclNameResolver extends JavaNameResolver
return declName;
}
public static JavaDeclName getQualifiedDeclName(TypeParameter decl, TypeSolver typeSolver)
public static JavaDeclName getQualifiedDeclName(TypeParameter decl, File currentFile, TypeSolver typeSolver)
{
return getQualifiedDeclName(decl, typeSolver, null);
return getQualifiedDeclName(decl, currentFile, typeSolver, null);
}
public static JavaDeclName getQualifiedDeclName(TypeParameter decl, TypeSolver typeSolver, ContextList ignoredContexts)
public static JavaDeclName getQualifiedDeclName(TypeParameter decl, File currentFile, TypeSolver typeSolver, ContextList ignoredContexts)
{
JavaparserDeclNameResolver resolver = new JavaparserDeclNameResolver(typeSolver, ignoredContexts);
JavaparserDeclNameResolver resolver = new JavaparserDeclNameResolver(currentFile, typeSolver, ignoredContexts);
return resolver.getQualifiedDeclName(decl);
}
@@ -205,18 +164,10 @@ public class JavaparserDeclNameResolver extends JavaNameResolver
if (decl != null)
{
declName = getDeclName(decl);
BodyDeclaration declContext = getBodyDeclContext(decl);
if (declContext != null)
if (!declName.getIsUnsolved())
{
if (!m_ignoredContexts.contains(declContext))
{
declName.setParent(getQualifiedDeclName(declContext));
}
}
else
{
throw new UnsupportedOperationException("no appropriate parent found for TypeParameter");
declName.setParent(getQualifiedContextName(decl));
}
}
return declName;
@@ -227,6 +178,42 @@ public class JavaparserDeclNameResolver extends JavaNameResolver
return new JavaDeclName(decl.getName().asString());
}
public static JavaDeclName getQualifiedDeclName(ObjectCreationExpr anonymousClassDecl, File currentFile, TypeSolver typeSolver)
{
return getQualifiedDeclName(anonymousClassDecl, currentFile, typeSolver, null);
}
public static JavaDeclName getQualifiedDeclName(ObjectCreationExpr anonymousClassDecl, File currentFile, TypeSolver typeSolver, ContextList ignoredContexts)
{
JavaparserDeclNameResolver resolver = new JavaparserDeclNameResolver(currentFile, typeSolver, ignoredContexts);
return resolver.getQualifiedDeclName(anonymousClassDecl);
}
public JavaDeclName getQualifiedDeclName(ObjectCreationExpr anonymousClassDecl)
{
JavaDeclName declName = JavaDeclName.unsolved();
if (anonymousClassDecl != null)
{
declName = getDeclName(anonymousClassDecl);
if (!declName.getIsUnsolved())
{
declName.setParent(getQualifiedContextName(anonymousClassDecl));
}
}
return declName;
}
public JavaDeclName getDeclName(ObjectCreationExpr anonymousClassDecl)
{
if (anonymousClassDecl.getAnonymousClassBody().isPresent())
{
Position position = anonymousClassDecl.getBegin().orElse(new Position(0, 0));
return JavaDeclName.anonymousClass(m_currentFile.getName(), position.line, position.column);
}
return JavaDeclName.unsolved();
}
private static List<String> getTypeParameterNames(TypeDeclaration decl)
{
NodeList<TypeParameter> typeParameters = null;
@@ -261,6 +248,39 @@ public class JavaparserDeclNameResolver extends JavaNameResolver
return declName;
}
private JavaDeclName getQualifiedContextName(Node decl)
{
Node parentNode = decl.getParentNode().orElse(null);
if (parentNode == null)
{
return null;
}
if (parentNode instanceof BodyDeclaration && !(parentNode instanceof FieldDeclaration))
{
if (m_ignoredContexts.contains((BodyDeclaration) parentNode))
{
return null;
}
return getQualifiedDeclName((BodyDeclaration) parentNode);
}
else if (parentNode instanceof CompilationUnit)
{
Optional<PackageDeclaration> packageDecl = ((CompilationUnit) parentNode).getPackageDeclaration();
if (packageDecl.isPresent())
{
return getQualifiedName(packageDecl.get().getName());
}
return null;
}
else if (parentNode instanceof ObjectCreationExpr && ((ObjectCreationExpr) parentNode).getAnonymousClassBody().isPresent())
{
return getQualifiedDeclName((ObjectCreationExpr) parentNode);
}
return getQualifiedContextName(parentNode);
}
private <T extends CallableDecl> JavaDeclName getDeclNameOfCallable(T decl)
{
ContextList ignoredContextsForTypes = m_ignoredContexts.copy();
@@ -269,13 +289,13 @@ public class JavaparserDeclNameResolver extends JavaNameResolver
List<JavaTypeName> parameterNames = new ArrayList<>();
for (Parameter parameter: decl.getParameters())
{
parameterNames.add(JavaparserTypeNameResolver.getQualifiedTypeName(parameter.getType(), m_typeSolver, ignoredContextsForTypes));
parameterNames.add(JavaparserTypeNameResolver.getQualifiedTypeName(parameter.getType(), m_currentFile, m_typeSolver, ignoredContextsForTypes));
}
JavaTypeName returnType = new JavaTypeName("", null);
if (decl.isMethod())
{
returnType = JavaparserTypeNameResolver.getQualifiedTypeName(decl.getType(), m_typeSolver, ignoredContextsForTypes);
returnType = JavaparserTypeNameResolver.getQualifiedTypeName(decl.getType(), m_currentFile, m_typeSolver, ignoredContextsForTypes);
}
return new JavaFunctionDeclName(
@@ -286,28 +306,4 @@ public class JavaparserDeclNameResolver extends JavaNameResolver
decl.isStatic()
);
}
private static BodyDeclaration getBodyDeclContext(Node decl)
{
BodyDeclaration context = null;
Optional<Node> parentNode = decl.getParentNode();
while (
parentNode.isPresent() &&
!(
parentNode.get() instanceof BodyDeclaration &&
(!(parentNode.get() instanceof FieldDeclaration))
)
)
{
parentNode = parentNode.get().getParentNode();
}
if (parentNode.isPresent())
{
context = (BodyDeclaration)parentNode.get();
}
return context;
}
}
@@ -1,5 +1,7 @@
package com.sourcetrail;
import java.io.File;
import com.github.javaparser.ast.type.*;
import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
@@ -8,19 +10,19 @@ import com.sourcetrail.name.JavaTypeName;
public class JavaparserTypeNameResolver extends JavaNameResolver
{
public JavaparserTypeNameResolver(TypeSolver typeSolver, ContextList ignoredContexts)
public JavaparserTypeNameResolver(File currentFile, TypeSolver typeSolver, ContextList ignoredContexts)
{
super(typeSolver, ignoredContexts);
super(currentFile, typeSolver, ignoredContexts);
}
public static JavaTypeName getQualifiedTypeName(Type type, TypeSolver typeSolver)
public static JavaTypeName getQualifiedTypeName(Type type, File currentFile, TypeSolver typeSolver)
{
return getQualifiedTypeName(type, typeSolver, null);
return getQualifiedTypeName(type, currentFile, typeSolver, null);
}
public static JavaTypeName getQualifiedTypeName(Type type, TypeSolver typeSolver, ContextList ignoredContexts)
public static JavaTypeName getQualifiedTypeName(Type type, File currentFile, TypeSolver typeSolver, ContextList ignoredContexts)
{
JavaparserTypeNameResolver resolver = new JavaparserTypeNameResolver(typeSolver, ignoredContexts);
JavaparserTypeNameResolver resolver = new JavaparserTypeNameResolver(currentFile, typeSolver, ignoredContexts);
return resolver.getQualifiedTypeName(type);
}
@@ -34,6 +36,7 @@ public class JavaparserTypeNameResolver extends JavaNameResolver
{
return JavaSymbolSolverTypeNameResolver.getQualifiedTypeName(
JavaParserFacade.get(m_typeSolver).convert(type, type),
m_currentFile,
m_typeSolver,
m_ignoredContexts
);
@@ -53,7 +56,8 @@ public class JavaparserTypeNameResolver extends JavaNameResolver
else if (type instanceof TypeParameter)
{
return JavaSymbolSolverTypeNameResolver.getQualifiedTypeName(
JavaParserFacade.get(m_typeSolver).convert(type, type),
JavaParserFacade.get(m_typeSolver).convert(type, type),
m_currentFile,
m_typeSolver,
m_ignoredContexts
);
@@ -7,10 +7,21 @@ public class JavaDeclName
private JavaDeclName m_parent = null;
private String m_name = "";
private List<String> m_typeParameterNames = null;
private boolean m_isUnsolved = false;
private boolean m_isAnonymous = false;
public static JavaDeclName unsolved()
{
return new JavaDeclName("unsolved-symbol");
JavaDeclName declName = new JavaDeclName("unsolved-symbol");
declName.m_isUnsolved = true;
return declName;
}
public static JavaDeclName anonymousClass(String fileName, int line, int col)
{
JavaDeclName declName = new JavaDeclName("anonymous class (" + fileName + "<" + line + ":" + col + ">)");
declName.m_isAnonymous = true;
return declName;
}
public static JavaDeclName fromDotSeparatedString(String s)
@@ -57,6 +68,16 @@ public class JavaDeclName
return m_name;
}
public boolean getIsUnsolved()
{
return m_isUnsolved;
}
public boolean getIsAnonymous()
{
return m_isAnonymous;
}
public NameHierarchy toNameHierarchy()
{
NameHierarchy nameHierarchy;