logic: show java import not found as error

* implemented resolving nested types, methods and fields in import statements
* updated java-symbol-solver and corresponding jars
* renamed toNameHierarchy methods of Java...Name classes
* renamed Java name resolvers
This commit is contained in:
malte_langkabel
2016-09-21 12:05:53 +02:00
parent 77cf33666f
commit ba6aee45be
10 changed files with 317 additions and 213 deletions
+50 -57
View File
@@ -19,6 +19,7 @@ import com.github.javaparser.ast.comments.LineComment;
import com.github.javaparser.ast.expr.ArrayInitializerExpr;
import com.github.javaparser.ast.expr.MethodCallExpr;
import com.github.javaparser.ast.expr.NameExpr;
import com.github.javaparser.ast.expr.QualifiedNameExpr;
import com.github.javaparser.ast.expr.VariableDeclarationExpr;
import com.github.javaparser.ast.stmt.BlockStmt;
import com.github.javaparser.ast.stmt.SwitchStmt;
@@ -71,7 +72,7 @@ public class JavaAstVisitor extends JavaAstVisitorAdapter
{
NameExpr nameExpr = n.getName();
String packageName = JavaDeclNameResolver.getQualifiedName(nameExpr).toNameHierarchy();
String packageName = JavaparserDeclNameResolver.getQualifiedName(nameExpr).toSerializedNameHierarchy();
JavaIndexer.recordSymbolWithScope(
m_callbackId, packageName, SymbolType.PACKAGE,
@@ -87,7 +88,7 @@ public class JavaAstVisitor extends JavaAstVisitorAdapter
{
NameExpr nameExpr = n.getNameExpr();
String qualifiedName = JavaDeclNameResolver.getQualifiedDeclName(n, m_typeSolver).toNameHierarchy();
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(n, m_typeSolver).toSerializedNameHierarchy();
JavaIndexer.recordSymbolWithScope(
m_callbackId, qualifiedName, (n.isInterface() ? SymbolType.INTERFACE : SymbolType.CLASS),
@@ -138,7 +139,7 @@ public class JavaAstVisitor extends JavaAstVisitorAdapter
{
NameExpr nameExpr = n.getNameExpr();
String qualifiedName = JavaDeclNameResolver.getQualifiedDeclName(n, m_typeSolver).toNameHierarchy();
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(n, m_typeSolver).toSerializedNameHierarchy();
JavaIndexer.recordSymbolWithScope(
m_callbackId, qualifiedName, SymbolType.ENUM,
@@ -159,7 +160,7 @@ public class JavaAstVisitor extends JavaAstVisitorAdapter
@Override public void visit(final EnumConstantDeclaration n, final Void v)
{
String qualifiedName = JavaDeclNameResolver.getQualifiedDeclName(n, m_typeSolver).toNameHierarchy();
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(n, m_typeSolver).toSerializedNameHierarchy();
JavaIndexer.recordSymbol(
m_callbackId, qualifiedName, SymbolType.ENUM_CONSTANT,
@@ -178,7 +179,7 @@ public class JavaAstVisitor extends JavaAstVisitorAdapter
{
NameExpr nameExpr = n.getNameExpr();
String qualifiedName = JavaDeclNameResolver.getQualifiedDeclName(n, m_typeSolver).toNameHierarchy();
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(n, m_typeSolver).toSerializedNameHierarchy();
JavaIndexer.recordSymbolWithScope(
m_callbackId, qualifiedName, SymbolType.METHOD,
@@ -198,7 +199,7 @@ public class JavaAstVisitor extends JavaAstVisitorAdapter
{
NameExpr nameExpr = n.getNameExpr();
String qualifiedName = JavaDeclNameResolver.getQualifiedDeclName(n, m_typeSolver).toNameHierarchy();
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(n, m_typeSolver).toSerializedNameHierarchy();
JavaIndexer.recordSymbolWithScope(
m_callbackId, qualifiedName, SymbolType.METHOD,
@@ -214,7 +215,7 @@ public class JavaAstVisitor extends JavaAstVisitorAdapter
me.tomassetti.symbolsolver.model.declarations.MethodDeclaration overridden = getOverridden(n, parent);
if (overridden != null && (overridden instanceof JavaParserMethodDeclaration))
{
String overriddenName = JavaDeclNameResolver.getQualifiedDeclName(((JavaParserMethodDeclaration)overridden).getWrappedNode(), m_typeSolver).toNameHierarchy();
String overriddenName = JavaparserDeclNameResolver.getQualifiedDeclName(((JavaParserMethodDeclaration)overridden).getWrappedNode(), m_typeSolver).toSerializedNameHierarchy();
JavaIndexer.recordReference(
m_callbackId, ReferenceKind.OVERRIDE, overriddenName, qualifiedName,
@@ -306,7 +307,7 @@ public class JavaAstVisitor extends JavaAstVisitorAdapter
for (int i = 0; i < variableDeclarators.size(); i++)
{
VariableDeclarator varDecl = variableDeclarators.get(i);
String qualifiedName = JavaDeclNameResolver.getQualifiedDeclName(varDecl, m_typeSolver).toNameHierarchy();
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(varDecl, m_typeSolver).toSerializedNameHierarchy();
VariableDeclaratorId varDeclId = varDecl.getId();
JavaIndexer.recordSymbol(
@@ -363,7 +364,7 @@ public class JavaAstVisitor extends JavaAstVisitorAdapter
if (n.isAsterisk())
{
NameExpr nameExpr = n.getName();
String importedName = JavaDeclNameResolver.getQualifiedName(nameExpr).toNameHierarchy();
String importedName = JavaparserDeclNameResolver.getQualifiedName(nameExpr).toSerializedNameHierarchy();
for (DeclContext context: m_context)
{
JavaIndexer.recordReference(
@@ -378,77 +379,69 @@ public class JavaAstVisitor extends JavaAstVisitorAdapter
try
{
NameExpr nameExpr = n.getName();
JavaDeclName importedDeclName = null;
List<JavaDeclName> importedDeclNames = new ArrayList<>();
SymbolReference<TypeDeclaration> symbolReference = m_typeSolver.tryToSolveType(
JavaDeclNameResolver.getQualifiedName(nameExpr).toString()
JavaparserDeclNameResolver.getQualifiedName(nameExpr).toString()
);
if (symbolReference.isSolved())
{
importedDeclName = JavaDeclNameResolver.getQualifiedDeclName(symbolReference.getCorrespondingDeclaration(), m_typeSolver);
importedDeclNames.add(JavaSymbolSolverDeclNameResolver.getQualifiedDeclName(
symbolReference.getCorrespondingDeclaration(), m_typeSolver
));
}
/*
else
{
// TODO: handle import of static field or method
if (nameExpr instanceof QualifiedNameExpr)
{
String qName = nameExpr.toString();
int typeNameEndIndex = qName.lastIndexOf('.');
if (typeNameEndIndex != -1)
String typeName = ((QualifiedNameExpr)nameExpr).getQualifier().toString();
String memberName = nameExpr.getName();
me.tomassetti.symbolsolver.model.declarations.TypeDeclaration ref = m_typeSolver.solveType(typeName);
for (me.tomassetti.symbolsolver.model.declarations.MethodDeclaration methodDecl: ref.getDeclaredMethods()) // look for method
{
String typeName = qName.substring(0, typeNameEndIndex);
String memberName = qName.substring(typeNameEndIndex + 1);
me.tomassetti.symbolsolver.model.declarations.TypeDeclaration ref = m_typeSolver.solveType(typeName);
for (me.tomassetti.symbolsolver.model.declarations.MethodDeclaration methodDecl: ref.getDeclaredMethods()) // look for method
if (methodDecl.getName().equals(memberName))
{
if (methodDecl.getName().equals(memberName))
{
System.out.println("methodDeclNamasdasdasdasd: " + methodDecl.getName());
importedDeclName = JavaDeclNameResolver.getQualifiedDeclName(methodDecl, m_typeSolver);
break;
}
importedDeclNames.add(
JavaSymbolSolverDeclNameResolver.getQualifiedDeclName(methodDecl, m_typeSolver
));
}
if (importedDeclName == null && ref.hasField(memberName)) // look for field
}
if (importedDeclNames.isEmpty() && ref.hasField(memberName)) // look for field
{
JavaDeclName importedTypeDeclName = JavaSymbolSolverDeclNameResolver.getQualifiedDeclName(ref, m_typeSolver);
if (importedTypeDeclName != null)
{
JavaDeclName importedTypeDeclName = JavaDeclNameResolver.getQualifiedDeclName(ref, m_typeSolver);
if (importedTypeDeclName != null)
{
importedDeclName = new JavaDeclName(memberName);
importedDeclName.setParent(importedTypeDeclName);
}
JavaDeclName importedDeclName = new JavaDeclName(memberName);
importedDeclName.setParent(importedTypeDeclName);
importedDeclNames.add(importedDeclName);
}
}
}
}
*/
if (importedDeclName != null)
if (!importedDeclNames.isEmpty())
{
String importedName = importedDeclName.toNameHierarchy();
for (DeclContext context: m_context)
for (JavaDeclName importedDeclName: importedDeclNames)
{
JavaIndexer.recordReference(
m_callbackId, ReferenceKind.IMPORT,
importedName, context.getName(),
nameExpr.getBeginLine(), nameExpr.getBeginColumn(), nameExpr.getEndLine(), nameExpr.getEndColumn()
);
String nameHierarchy = importedDeclName.toSerializedNameHierarchy();
for (DeclContext context: m_context)
{
JavaIndexer.recordReference(
m_callbackId, ReferenceKind.IMPORT,
nameHierarchy, context.getName(),
nameExpr.getBeginLine(), nameExpr.getBeginColumn(), nameExpr.getEndLine(), nameExpr.getEndColumn()
);
}
}
}
else
{
// uncomment this when there are no errors where there shouldn't be
/*
JavaIndexer.recordError(
m_callbackId, "Import not found.", true, true,
nameExpr.getBeginLine(), nameExpr.getBeginColumn(), nameExpr.getEndLine(), nameExpr.getEndColumn()
);
*/
}
}
catch (Exception e)
@@ -468,7 +461,7 @@ public class JavaAstVisitor extends JavaAstVisitorAdapter
{
for (DeclContext context: m_context)
{
String referencedName = JavaTypeNameResolver.getQualifiedTypeName(n, m_typeSolver).toNameHierarchy();
String referencedName = JavaparserTypeNameResolver.getQualifiedTypeName(n, m_typeSolver).toSerializedNameHierarchy();
int beginLine = n.getBeginLine();
int beginColumn = n.getBeginColumn();
@@ -501,7 +494,7 @@ public class JavaAstVisitor extends JavaAstVisitorAdapter
{
try
{
String referencedName = JavaTypeNameResolver.getQualifiedTypeName(n, m_typeSolver).toNameHierarchy();
String referencedName = JavaparserTypeNameResolver.getQualifiedTypeName(n, m_typeSolver).toSerializedNameHierarchy();
JavaIndexer.recordSymbolWithoutLocation(
m_callbackId, referencedName, SymbolType.BUILTIN_TYPE,
@@ -531,7 +524,7 @@ public class JavaAstVisitor extends JavaAstVisitorAdapter
{
try
{
String referencedName = JavaTypeNameResolver.getQualifiedTypeName(n, m_typeSolver).toNameHierarchy();
String referencedName = JavaparserTypeNameResolver.getQualifiedTypeName(n, m_typeSolver).toSerializedNameHierarchy();
JavaIndexer.recordSymbolWithoutLocation(
m_callbackId, referencedName, SymbolType.BUILTIN_TYPE,
@@ -603,7 +596,7 @@ public class JavaAstVisitor extends JavaAstVisitorAdapter
{
if (getFieldDeclarationInParentHierarchy(wrappedNode) != null)
{
String qualifiedName = JavaDeclNameResolver.getQualifiedDeclName((VariableDeclarator)wrappedNode, m_typeSolver).toNameHierarchy();
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName((VariableDeclarator)wrappedNode, m_typeSolver).toSerializedNameHierarchy();
for (DeclContext context: m_context)
{
@@ -785,7 +778,7 @@ public class JavaAstVisitor extends JavaAstVisitorAdapter
if (methodDecl instanceof JavaParserMethodDeclaration)
{
MethodDeclaration wrappedNode = ((JavaParserMethodDeclaration)methodDecl).getWrappedNode();
qualifiedName = JavaDeclNameResolver.getQualifiedDeclName(wrappedNode, m_typeSolver).toNameHierarchy();
qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(wrappedNode, m_typeSolver).toSerializedNameHierarchy();
}
else // todo: move this implementation somewhere else
{
+2 -2
View File
@@ -69,12 +69,12 @@ public class JavaDeclName
return m_name;
}
public String toNameHierarchy()
public String toSerializedNameHierarchy()
{
String nameHierarchy = "";
if (m_parent != null)
{
nameHierarchy = m_parent.toNameHierarchy();
nameHierarchy = m_parent.toSerializedNameHierarchy();
nameHierarchy += "\tn";
}
@@ -0,0 +1,121 @@
package io.coati;
import java.util.ArrayList;
import java.util.List;
import com.github.javaparser.ast.body.BodyDeclaration;
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
import com.github.javaparser.ast.body.Parameter;
import me.tomassetti.symbolsolver.javaparsermodel.declarations.JavaParserClassDeclaration;
import me.tomassetti.symbolsolver.javaparsermodel.declarations.JavaParserInterfaceDeclaration;
import me.tomassetti.symbolsolver.javaparsermodel.declarations.JavaParserMethodDeclaration;
import me.tomassetti.symbolsolver.model.declarations.Declaration;
import me.tomassetti.symbolsolver.model.declarations.MethodDeclaration;
import me.tomassetti.symbolsolver.model.declarations.ParameterDeclaration;
import me.tomassetti.symbolsolver.model.declarations.TypeDeclaration;
import me.tomassetti.symbolsolver.model.resolution.TypeParameter;
import me.tomassetti.symbolsolver.model.resolution.TypeSolver;
public class JavaSymbolSolverDeclNameResolver extends JavaNameResolver
{
public JavaSymbolSolverDeclNameResolver(TypeSolver typeSolver, ArrayList<BodyDeclaration> ignoredContexts)
{
super(typeSolver, ignoredContexts);
}
public static JavaDeclName getQualifiedDeclName(Declaration decl, TypeSolver typeSolver)
{
return getQualifiedDeclName(decl, typeSolver, null);
}
public static JavaDeclName getQualifiedDeclName(Declaration decl, TypeSolver typeSolver, ArrayList<BodyDeclaration> ignoredContexts)
{
JavaSymbolSolverDeclNameResolver resolver = new JavaSymbolSolverDeclNameResolver(typeSolver, ignoredContexts);
return resolver.getQualifiedDeclName(decl);
}
public JavaDeclName getQualifiedDeclName(Declaration decl)
{
JavaDeclName declName = null;
if (decl != null)
{
if (decl instanceof TypeDeclaration)
{
TypeDeclaration typeDecl = (TypeDeclaration)decl;
ClassOrInterfaceDeclaration javaparserDecl = null;
if (typeDecl instanceof JavaParserClassDeclaration)
{
javaparserDecl = ((JavaParserClassDeclaration)typeDecl).getWrappedNode();
}
else if (typeDecl instanceof JavaParserInterfaceDeclaration)
{
javaparserDecl = ((JavaParserInterfaceDeclaration)typeDecl).getWrappedNode();
}
if (javaparserDecl != null)
{
declName = JavaparserDeclNameResolver.getQualifiedDeclName(javaparserDecl, m_typeSolver, m_ignoredContexts);
}
else
{
declName = JavaDeclName.fromDotSeparatedString(typeDecl.getQualifiedName());
}
}
else if (decl instanceof MethodDeclaration)
{
MethodDeclaration methodDecl = (MethodDeclaration)decl;
if (methodDecl instanceof JavaParserMethodDeclaration)
{
declName = JavaparserDeclNameResolver.getQualifiedDeclName(
((JavaParserMethodDeclaration)methodDecl).getWrappedNode(),
m_typeSolver,
m_ignoredContexts
);
}
else
{
// TODO: what about endless recursion regarding type parameters and return type??
List<JavaTypeName> parameterNames = new ArrayList<>();
for (int i = 0; i < methodDecl.getNoParams(); i++)
{
parameterNames.add(JavaSymbolSolverTypeNameResolver.getQualifiedTypeName(
methodDecl.getParam(i).getType(), m_typeSolver, m_ignoredContexts
));
}
declName = new JavaDeclName(
methodDecl.getName(),
getTypeParameterNames(methodDecl.getTypeParameters()),
JavaSymbolSolverTypeNameResolver.getQualifiedTypeName(methodDecl.getReturnType(), m_typeSolver, m_ignoredContexts),
parameterNames
);
declName.setParent(
getQualifiedDeclName(methodDecl.declaringType(), m_typeSolver, m_ignoredContexts)
);
}
}
}
return declName;
}
private static List<String> getTypeParameterNames(List<TypeParameter> typeParameters)
{
List<String> typeParameterNames = new ArrayList<>();
if (typeParameters != null && typeParameters.size() > 0)
{
for (int i = 0; i < typeParameters.size(); i++)
{
typeParameterNames.add(typeParameters.get(i).getName());
}
}
return typeParameterNames;
}
}
@@ -0,0 +1,130 @@
package io.coati;
import java.util.ArrayList;
import java.util.List;
import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.body.BodyDeclaration;
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
import com.github.javaparser.ast.type.ClassOrInterfaceType;
import com.github.javaparser.ast.type.IntersectionType;
import com.github.javaparser.ast.type.PrimitiveType;
import com.github.javaparser.ast.type.ReferenceType;
import com.github.javaparser.ast.type.Type;
import com.github.javaparser.ast.type.UnionType;
import com.github.javaparser.ast.type.UnknownType;
import com.github.javaparser.ast.type.VoidType;
import com.github.javaparser.ast.type.WildcardType;
import me.tomassetti.symbolsolver.javaparsermodel.JavaParserFacade;
import me.tomassetti.symbolsolver.javaparsermodel.LambdaArgumentTypeUsagePlaceholder;
import me.tomassetti.symbolsolver.javaparsermodel.declarations.JavaParserClassDeclaration;
import me.tomassetti.symbolsolver.javaparsermodel.declarations.JavaParserInterfaceDeclaration;
import me.tomassetti.symbolsolver.javaparsermodel.declarations.JavaParserMethodDeclaration;
import me.tomassetti.symbolsolver.javaparsermodel.declarations.JavaParserTypeParameter;
import me.tomassetti.symbolsolver.model.declarations.Declaration;
import me.tomassetti.symbolsolver.model.declarations.MethodDeclaration;
import me.tomassetti.symbolsolver.model.declarations.TypeDeclaration;
import me.tomassetti.symbolsolver.model.resolution.TypeParameter;
import me.tomassetti.symbolsolver.model.resolution.TypeSolver;
import me.tomassetti.symbolsolver.model.typesystem.ArrayTypeUsage;
import me.tomassetti.symbolsolver.model.typesystem.NullTypeUsage;
import me.tomassetti.symbolsolver.model.typesystem.PrimitiveTypeUsage;
import me.tomassetti.symbolsolver.model.typesystem.ReferenceTypeUsage;
import me.tomassetti.symbolsolver.model.typesystem.TypeParameterUsage;
import me.tomassetti.symbolsolver.model.typesystem.TypeUsage;
import me.tomassetti.symbolsolver.model.typesystem.VoidTypeUsage;
import me.tomassetti.symbolsolver.model.typesystem.WildcardUsage;
public class JavaSymbolSolverTypeNameResolver extends JavaNameResolver
{
public JavaSymbolSolverTypeNameResolver(TypeSolver typeSolver, ArrayList<BodyDeclaration> ignoredContexts)
{
super(typeSolver, ignoredContexts);
}
public static JavaTypeName getQualifiedTypeName(TypeUsage typeUsage, TypeSolver typeSolver)
{
return getQualifiedTypeName(typeUsage, typeSolver, null);
}
public static JavaTypeName getQualifiedTypeName(TypeUsage typeUsage, TypeSolver typeSolver, ArrayList<BodyDeclaration> ignoredContexts)
{
JavaSymbolSolverTypeNameResolver resolver = new JavaSymbolSolverTypeNameResolver(typeSolver, ignoredContexts);
return resolver.getQualifiedTypeName(typeUsage);
}
public JavaTypeName getQualifiedTypeName(TypeUsage typeUsage)
{
if (typeUsage instanceof ArrayTypeUsage)
{
return getQualifiedTypeName(((ArrayTypeUsage)typeUsage).getComponentType());
}
else if (typeUsage instanceof LambdaArgumentTypeUsagePlaceholder)
{
}
else if (typeUsage instanceof NullTypeUsage)
{
return JavaTypeName.fromDotSeparatedString(typeUsage.describe());
}
else if (typeUsage instanceof PrimitiveTypeUsage)
{
return JavaTypeName.fromDotSeparatedString(typeUsage.describe());
}
else if (typeUsage instanceof ReferenceTypeUsage)
{
ReferenceTypeUsage refTypeUsage = (ReferenceTypeUsage)typeUsage;
JavaDeclName declName = JavaSymbolSolverDeclNameResolver.getQualifiedDeclName(
refTypeUsage.getTypeDeclaration(),
m_typeSolver,
m_ignoredContexts
);
if (declName != null)
{
List<JavaTypeName> typeArgumentNames = new ArrayList<>();
for (TypeUsage typeArgument: refTypeUsage.parameters()) // don't know why this method is called "parameters()"
{
typeArgumentNames.add(getQualifiedTypeName(typeArgument, m_typeSolver, m_ignoredContexts));
}
return new JavaTypeName(declName.getName(), typeArgumentNames, declName.getParent());
}
}
else if (typeUsage instanceof TypeParameterUsage)
{
TypeParameter typeParam = ((TypeParameterUsage)typeUsage).asTypeParameter();
if (typeParam instanceof JavaParserTypeParameter)
{
com.github.javaparser.ast.TypeParameter jpTypeParameter = ((JavaParserTypeParameter)typeParam).getWrappedNode();
Node genericDecl = jpTypeParameter.getParentNode();
if (genericDecl instanceof BodyDeclaration)
{
JavaDeclName genericName = null;
if (!ignoresContext((BodyDeclaration)genericDecl))
{
genericName = JavaparserDeclNameResolver.getQualifiedDeclName((BodyDeclaration)genericDecl, m_typeSolver, m_ignoredContexts);
}
return new JavaTypeName(jpTypeParameter.getName(), genericName);
}
}
else
{
// do we need to handle using type parameters of external code? YES! so: TODO: do this!
}
}
else if (typeUsage instanceof VoidTypeUsage)
{
return JavaTypeName.fromDotSeparatedString(typeUsage.describe());
}
else if (typeUsage instanceof WildcardUsage)
{
// TODO: implement this one
}
System.out.println("Unable to resolve qualified name of " + typeUsage.getClass().toString() + ": " + typeUsage.toString());
return new JavaTypeName("unresolved-type", null);
}
}
+2 -2
View File
@@ -48,12 +48,12 @@ public class JavaTypeName
return m_name;
}
public String toNameHierarchy()
public String toSerializedNameHierarchy()
{
String nameHierarchy = "";
if (m_parent != null)
{
nameHierarchy = m_parent.toNameHierarchy();
nameHierarchy = m_parent.toSerializedNameHierarchy();
nameHierarchy += "\tn";
}
@@ -26,9 +26,9 @@ import me.tomassetti.symbolsolver.javaparsermodel.declarations.JavaParserClassDe
import me.tomassetti.symbolsolver.javaparsermodel.declarations.JavaParserInterfaceDeclaration;
import me.tomassetti.symbolsolver.model.resolution.TypeSolver;
public class JavaDeclNameResolver extends JavaNameResolver
public class JavaparserDeclNameResolver extends JavaNameResolver
{
public JavaDeclNameResolver(TypeSolver typeSolver, ArrayList<BodyDeclaration> ignoredContexts)
public JavaparserDeclNameResolver(TypeSolver typeSolver, ArrayList<BodyDeclaration> ignoredContexts)
{
super(typeSolver, ignoredContexts);
}
@@ -40,7 +40,7 @@ public class JavaDeclNameResolver extends JavaNameResolver
public static JavaDeclName getQualifiedDeclName(VariableDeclarator decl, TypeSolver typeSolver, ArrayList<BodyDeclaration> ignoredContexts)
{
JavaDeclNameResolver resolver = new JavaDeclNameResolver(typeSolver, ignoredContexts);
JavaparserDeclNameResolver resolver = new JavaparserDeclNameResolver(typeSolver, ignoredContexts);
return resolver.getQualifiedDeclName(decl);
}
@@ -88,7 +88,7 @@ public class JavaDeclNameResolver extends JavaNameResolver
public static JavaDeclName getQualifiedDeclName(BodyDeclaration decl, TypeSolver typeSolver, ArrayList<BodyDeclaration> ignoredContexts)
{
JavaDeclNameResolver resolver = new JavaDeclNameResolver(typeSolver, ignoredContexts);
JavaparserDeclNameResolver resolver = new JavaparserDeclNameResolver(typeSolver, ignoredContexts);
return resolver.getQualifiedDeclName(decl);
}
@@ -128,110 +128,6 @@ public class JavaDeclNameResolver extends JavaNameResolver
}
return declName;
}
public static JavaDeclName getQualifiedDeclName(me.tomassetti.symbolsolver.model.declarations.TypeDeclaration typeDecl, TypeSolver typeSolver)
{
return getQualifiedDeclName(typeDecl, typeSolver, null);
}
public static JavaDeclName getQualifiedDeclName(me.tomassetti.symbolsolver.model.declarations.TypeDeclaration typeDecl, TypeSolver typeSolver, ArrayList<BodyDeclaration> ignoredContexts)
{
JavaDeclNameResolver resolver = new JavaDeclNameResolver(typeSolver, ignoredContexts);
return resolver.getQualifiedDeclName(typeDecl);
}
public JavaDeclName getQualifiedDeclName(me.tomassetti.symbolsolver.model.declarations.TypeDeclaration typeDecl)
{
JavaDeclName declName = null;
if (typeDecl != null)
{
ClassOrInterfaceDeclaration decl = null;
if (typeDecl instanceof JavaParserClassDeclaration)
{
decl = ((JavaParserClassDeclaration)typeDecl).getWrappedNode();
}
else if (typeDecl instanceof JavaParserInterfaceDeclaration)
{
decl = ((JavaParserInterfaceDeclaration)typeDecl).getWrappedNode();
}
if (decl != null)
{
declName = JavaDeclNameResolver.getQualifiedDeclName(decl, m_typeSolver, m_ignoredContexts);
}
else
{
declName = JavaDeclName.fromDotSeparatedString(typeDecl.getQualifiedName());
}
}
return declName;
}
// TODO: move this to JavaSymbolSolverDeclNameResolver
/*
public static JavaDeclName getQualifiedDeclName(me.tomassetti.symbolsolver.model.declarations.MethodDeclaration methodDecl, TypeSolver typeSolver)
{
return getQualifiedDeclName(methodDecl, typeSolver, null);
}
public static JavaDeclName getQualifiedDeclName(me.tomassetti.symbolsolver.model.declarations.MethodDeclaration methodDecl, TypeSolver typeSolver, ArrayList<BodyDeclaration> ignoredContexts)
{
JavaDeclNameResolver resolver = new JavaDeclNameResolver(typeSolver, ignoredContexts);
return resolver.getQualifiedDeclName(methodDecl);
}
public JavaDeclName getQualifiedDeclName(me.tomassetti.symbolsolver.model.declarations.MethodDeclaration methodDecl)
{
JavaDeclName declName = null;
if (methodDecl != null)
{
MethodDeclaration decl = null;
if (methodDecl instanceof JavaParserMethodDeclaration)
{
decl = ((JavaParserMethodDeclaration)methodDecl).getWrappedNode();
}
else
{
methodDecl.declaringType();
String name = methodDecl.getName();
List<me.tomassetti.symbolsolver.model.resolution.TypeParameter> typeParameters = methodDecl.getTypeParameters();
List<String> typeParameterNames = new ArrayList<>();
if (typeParameters != null && typeParameters.size() > 0)
{
for (int i = 0; i < typeParameters.size(); i++)
{
typeParameterNames.add(typeParameters.get(i).getName());
}
}
JavaTypeName returnTypeName = methodDecl.getReturnType().;
List<JavaTypeName> parameterNames = new ArrayList<>();
for (Parameter parameter: decl.getParameters())
{
parameterNames.add(JavaTypeNameResolver.getQualifiedTypeName(parameter.getType(), m_typeSolver, m_ignoredContexts));
}
return new JavaDeclName(name, typeParameterNames, returnTypeName, parameterNames);
}
// todo: implement for JavaParserEnumDeclaration.ValuesMethod
if (decl != null)
{
declName = JavaDeclNameResolver.getQualifiedDeclName(decl, m_typeSolver, m_ignoredContexts);
}
}
return declName;
}
*/
public JavaDeclName getDeclName(VariableDeclarator decl)
{
@@ -324,11 +220,11 @@ public class JavaDeclNameResolver extends JavaNameResolver
String name = decl.getName();
List<String> typeParameterNames = getTypeParameterNames(decl.getTypeParameters());
JavaTypeName returnTypeName = JavaTypeNameResolver.getQualifiedTypeName(decl.getType(), m_typeSolver, ignoredContextsForTypes);
JavaTypeName returnTypeName = JavaparserTypeNameResolver.getQualifiedTypeName(decl.getType(), m_typeSolver, ignoredContextsForTypes);
List<JavaTypeName> parameterNames = new ArrayList<>();
for (Parameter parameter: decl.getParameters())
{
parameterNames.add(JavaTypeNameResolver.getQualifiedTypeName(parameter.getType(), m_typeSolver, ignoredContextsForTypes));
parameterNames.add(JavaparserTypeNameResolver.getQualifiedTypeName(parameter.getType(), m_typeSolver, ignoredContextsForTypes));
}
return new JavaDeclName(name, typeParameterNames, returnTypeName, parameterNames);
@@ -14,9 +14,9 @@ import me.tomassetti.symbolsolver.model.resolution.TypeSolver;
import me.tomassetti.symbolsolver.model.typesystem.TypeParameterUsage;
import me.tomassetti.symbolsolver.model.typesystem.TypeUsage;
public class JavaTypeNameResolver extends JavaNameResolver
public class JavaparserTypeNameResolver extends JavaNameResolver
{
public JavaTypeNameResolver(TypeSolver typeSolver, ArrayList<BodyDeclaration> ignoredContexts)
public JavaparserTypeNameResolver(TypeSolver typeSolver, ArrayList<BodyDeclaration> ignoredContexts)
{
super(typeSolver, ignoredContexts);
}
@@ -28,7 +28,7 @@ public class JavaTypeNameResolver extends JavaNameResolver
public static JavaTypeName getQualifiedTypeName(Type type, TypeSolver typeSolver, ArrayList<BodyDeclaration> ignoredContexts)
{
JavaTypeNameResolver resolver = new JavaTypeNameResolver(typeSolver, ignoredContexts);
JavaparserTypeNameResolver resolver = new JavaparserTypeNameResolver(typeSolver, ignoredContexts);
return resolver.getQualifiedTypeName(type);
}
@@ -40,45 +40,9 @@ public class JavaTypeNameResolver extends JavaNameResolver
{
try
{
TypeUsage typeUsage = JavaParserFacade.get(m_typeSolver).convert(type, type);
if (typeUsage.isReferenceType())
{
JavaDeclName declName = JavaDeclNameResolver.getQualifiedDeclName(typeUsage.asReferenceTypeUsage().getTypeDeclaration(), m_typeSolver, m_ignoredContexts);
if (declName != null)
{
List<JavaTypeName> typeArgumentNames = new ArrayList<>();
for (Type typeArgument: ((ClassOrInterfaceType)type).getTypeArgs())
{
typeArgumentNames.add(getQualifiedTypeName(typeArgument, m_typeSolver, m_ignoredContexts));
}
JavaTypeName ret = new JavaTypeName(declName.getName(), typeArgumentNames, declName.getParent());
return ret;
}
}
else if (typeUsage instanceof TypeParameterUsage)
{
TypeParameter typeParam = typeUsage.asTypeParameter();
if (typeParam instanceof JavaParserTypeParameter)
{
com.github.javaparser.ast.TypeParameter jpTypeParameter = ((JavaParserTypeParameter)typeParam).getWrappedNode();
Node genericDecl = jpTypeParameter.getParentNode();
if (genericDecl instanceof BodyDeclaration)
{
JavaDeclName genericName = null;
if (!ignoresContext((BodyDeclaration)genericDecl))
{
genericName = JavaDeclNameResolver.getQualifiedDeclName((BodyDeclaration)genericDecl, m_typeSolver, m_ignoredContexts);
}
return new JavaTypeName(jpTypeParameter.getName(), genericName);
}
}
else
{
// do we need to handle using type parameters of external code?
}
}
TypeUsage typeUsage = JavaParserFacade.get(m_typeSolver).convert(type, type);
return JavaSymbolSolverTypeNameResolver.getQualifiedTypeName(typeUsage, m_typeSolver, m_ignoredContexts);
}
catch (Exception e)
{