logic: add type information of variable decl to name hierarchy
* implemented this feature for both, CXX and Java * adjusted tests to reflect these changes * added NameElement and NameHierarchy to Java code * created more specialized JavaDeclName classes: JavaFunctionDeclName and JavaVariableDeclName * implemented recording static modifier for Java methods and variables fortune cookie message = You will enjoy true success in whatever you do.
This commit is contained in:
@@ -83,3 +83,5 @@ TextAccess.cpp WARNING: Line numbers start with one, is 0
|
||||
INFO: Indexer - indexing source file: input.cc
|
||||
INFO: Indexer - indexing source file: input.cc
|
||||
INFO: Indexer - indexing source file: input.cc
|
||||
INFO: Indexer - indexing source file: input.cc
|
||||
INFO: Indexer - indexing source file: input.cc
|
||||
|
||||
@@ -51,6 +51,7 @@ import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
|
||||
import com.github.javaparser.symbolsolver.model.resolution.UnsolvedSymbolException;
|
||||
import com.github.javaparser.symbolsolver.model.typesystem.*;
|
||||
import com.github.javaparser.symbolsolver.resolution.MethodResolutionLogic;
|
||||
import com.sourcetrail.name.JavaDeclName;
|
||||
|
||||
public class AstVisitor extends AstVisitorAdapter
|
||||
{
|
||||
@@ -77,7 +78,7 @@ public class AstVisitor extends AstVisitorAdapter
|
||||
Name name = n.getName();
|
||||
|
||||
m_client.recordSymbolWithLocationAndScope(
|
||||
JavaparserDeclNameResolver.getQualifiedName(name).toSerializedNameHierarchy(),
|
||||
JavaparserDeclNameResolver.getQualifiedName(name).toNameHierarchy().serialize(),
|
||||
SymbolKind.PACKAGE,
|
||||
name.getRange(),
|
||||
n.getRange(),
|
||||
@@ -89,7 +90,7 @@ public class AstVisitor extends AstVisitorAdapter
|
||||
{
|
||||
name = name.getQualifier().get();
|
||||
m_client.recordSymbol(
|
||||
JavaparserDeclNameResolver.getQualifiedName(name).toSerializedNameHierarchy(),
|
||||
JavaparserDeclNameResolver.getQualifiedName(name).toNameHierarchy().serialize(),
|
||||
SymbolKind.PACKAGE,
|
||||
AccessKind.NONE,
|
||||
DefinitionKind.EXPLICIT
|
||||
@@ -103,7 +104,7 @@ public class AstVisitor extends AstVisitorAdapter
|
||||
{
|
||||
SimpleName name = n.getName();
|
||||
|
||||
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(n, m_typeSolver).toSerializedNameHierarchy();
|
||||
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(n, m_typeSolver).toNameHierarchy().serialize();
|
||||
|
||||
m_client.recordSymbolWithLocationAndScope(
|
||||
qualifiedName, (n.isInterface() ? SymbolKind.INTERFACE : SymbolKind.CLASS),
|
||||
@@ -171,7 +172,7 @@ public class AstVisitor extends AstVisitorAdapter
|
||||
{
|
||||
SimpleName name = n.getName();
|
||||
|
||||
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(n, m_typeSolver).toSerializedNameHierarchy();
|
||||
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(n, m_typeSolver).toNameHierarchy().serialize();
|
||||
|
||||
m_client.recordSymbolWithLocationAndScope(
|
||||
qualifiedName, SymbolKind.ENUM,
|
||||
@@ -196,7 +197,7 @@ public class AstVisitor extends AstVisitorAdapter
|
||||
|
||||
@Override public void visit(final EnumConstantDeclaration n, final Void v)
|
||||
{
|
||||
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(n, m_typeSolver).toSerializedNameHierarchy();
|
||||
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(n, m_typeSolver).toNameHierarchy().serialize();
|
||||
|
||||
m_client.recordSymbolWithLocation(
|
||||
qualifiedName, SymbolKind.ENUM_CONSTANT,
|
||||
@@ -216,7 +217,7 @@ public class AstVisitor extends AstVisitorAdapter
|
||||
{
|
||||
SimpleName name = n.getName();
|
||||
|
||||
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(n, m_typeSolver).toSerializedNameHierarchy();
|
||||
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(n, m_typeSolver).toNameHierarchy().serialize();
|
||||
|
||||
m_client.recordSymbolWithLocationAndScope(
|
||||
qualifiedName, SymbolKind.METHOD,
|
||||
@@ -237,7 +238,7 @@ public class AstVisitor extends AstVisitorAdapter
|
||||
{
|
||||
SimpleName name = n.getName();
|
||||
|
||||
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(n, m_typeSolver).toSerializedNameHierarchy();
|
||||
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(n, m_typeSolver).toNameHierarchy().serialize();
|
||||
|
||||
m_client.recordSymbolWithLocationAndScope(
|
||||
qualifiedName, SymbolKind.METHOD,
|
||||
@@ -252,7 +253,7 @@ 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).toSerializedNameHierarchy();
|
||||
String overriddenName = JavaparserDeclNameResolver.getQualifiedDeclName(((JavaParserMethodDeclaration)overridden).getWrappedNode(), m_typeSolver).toNameHierarchy().serialize();
|
||||
|
||||
m_client.recordReference(
|
||||
ReferenceKind.OVERRIDE, overriddenName, qualifiedName,
|
||||
@@ -332,9 +333,8 @@ public class AstVisitor extends AstVisitorAdapter
|
||||
|
||||
for (VariableDeclarator declarator: n.getVariables())
|
||||
{
|
||||
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(declarator, m_typeSolver).toSerializedNameHierarchy();
|
||||
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(declarator, m_typeSolver).toNameHierarchy().serialize();
|
||||
SimpleName name = declarator.getName();
|
||||
|
||||
m_client.recordSymbolWithLocation(
|
||||
qualifiedName, SymbolKind.FIELD,
|
||||
name.getRange(),
|
||||
@@ -392,7 +392,7 @@ public class AstVisitor extends AstVisitorAdapter
|
||||
|
||||
if (n.isAsterisk())
|
||||
{
|
||||
String importedName = JavaparserDeclNameResolver.getQualifiedName(name).toSerializedNameHierarchy();
|
||||
String importedName = JavaparserDeclNameResolver.getQualifiedName(name).toNameHierarchy().serialize();
|
||||
for (DeclContext context: m_context)
|
||||
{
|
||||
m_client.recordReference(
|
||||
@@ -445,7 +445,7 @@ public class AstVisitor extends AstVisitorAdapter
|
||||
{
|
||||
for (JavaDeclName importedDeclName: importedDeclNames)
|
||||
{
|
||||
String nameHierarchy = importedDeclName.toSerializedNameHierarchy();
|
||||
String nameHierarchy = importedDeclName.toNameHierarchy().serialize();
|
||||
for (DeclContext context: m_context)
|
||||
{
|
||||
m_client.recordReference(
|
||||
@@ -475,7 +475,7 @@ public class AstVisitor extends AstVisitorAdapter
|
||||
{
|
||||
for (DeclContext context: m_context)
|
||||
{
|
||||
String referencedName = JavaparserTypeNameResolver.getQualifiedTypeName(n, m_typeSolver).toSerializedNameHierarchy();
|
||||
String referencedName = JavaparserTypeNameResolver.getQualifiedTypeName(n, m_typeSolver).toNameHierarchy().serialize();
|
||||
|
||||
Range range = Range.range(0, 0, 0, 0);
|
||||
|
||||
@@ -519,7 +519,7 @@ public class AstVisitor extends AstVisitorAdapter
|
||||
{
|
||||
try
|
||||
{
|
||||
String referencedName = JavaparserTypeNameResolver.getQualifiedTypeName(n, m_typeSolver).toSerializedNameHierarchy();
|
||||
String referencedName = JavaparserTypeNameResolver.getQualifiedTypeName(n, m_typeSolver).toNameHierarchy().serialize();
|
||||
|
||||
m_client.recordSymbol(
|
||||
referencedName, SymbolKind.BUILTIN_TYPE,
|
||||
@@ -547,7 +547,7 @@ public class AstVisitor extends AstVisitorAdapter
|
||||
{
|
||||
try
|
||||
{
|
||||
String referencedName = JavaparserTypeNameResolver.getQualifiedTypeName(n, m_typeSolver).toSerializedNameHierarchy();
|
||||
String referencedName = JavaparserTypeNameResolver.getQualifiedTypeName(n, m_typeSolver).toNameHierarchy().serialize();
|
||||
|
||||
m_client.recordSymbol(
|
||||
referencedName, SymbolKind.BUILTIN_TYPE, AccessKind.NONE, DefinitionKind.EXPLICIT
|
||||
@@ -591,7 +591,7 @@ public class AstVisitor extends AstVisitorAdapter
|
||||
{
|
||||
if (var.getName().getIdentifier().equals(fieldName.getIdentifier()))
|
||||
{
|
||||
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(var, m_typeSolver).toSerializedNameHierarchy();
|
||||
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(var, m_typeSolver).toNameHierarchy().serialize();
|
||||
for (DeclContext context: m_context)
|
||||
{
|
||||
m_client.recordReference(
|
||||
@@ -656,7 +656,7 @@ public class AstVisitor extends AstVisitorAdapter
|
||||
{
|
||||
if (var.getName().getIdentifier().equals(e.getName().getIdentifier()))
|
||||
{
|
||||
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(var, m_typeSolver).toSerializedNameHierarchy();
|
||||
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(var, m_typeSolver).toNameHierarchy().serialize();
|
||||
for (DeclContext context: m_context)
|
||||
{
|
||||
m_client.recordReference(
|
||||
@@ -684,7 +684,7 @@ public class AstVisitor extends AstVisitorAdapter
|
||||
{
|
||||
if (wrappedNode.getAncestorOfType(FieldDeclaration.class).isPresent())
|
||||
{
|
||||
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName((VariableDeclarator)wrappedNode, m_typeSolver).toSerializedNameHierarchy();
|
||||
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName((VariableDeclarator)wrappedNode, m_typeSolver).toNameHierarchy().serialize();
|
||||
|
||||
for (DeclContext context: m_context)
|
||||
{
|
||||
@@ -849,7 +849,7 @@ public class AstVisitor extends AstVisitorAdapter
|
||||
if (method instanceof JavaParserMethodDeclaration)
|
||||
{
|
||||
MethodDeclaration wrappedNode = ((JavaParserMethodDeclaration)method).getWrappedNode();
|
||||
qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(wrappedNode, m_typeSolver).toSerializedNameHierarchy();
|
||||
qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(wrappedNode, m_typeSolver).toNameHierarchy().serialize();
|
||||
}
|
||||
else // todo: move this implementation somewhere else
|
||||
{
|
||||
@@ -884,7 +884,7 @@ public class AstVisitor extends AstVisitorAdapter
|
||||
if (constructor instanceof JavaParserConstructorDeclaration)
|
||||
{
|
||||
ConstructorDeclaration wrappedNode = ((JavaParserConstructorDeclaration)constructor).getWrappedNode();
|
||||
qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(wrappedNode, m_typeSolver).toSerializedNameHierarchy();
|
||||
qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(wrappedNode, m_typeSolver).toNameHierarchy().serialize();
|
||||
}
|
||||
else // todo: move this implementation somewhere else
|
||||
{
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
package com.sourcetrail;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.github.javaparser.ast.type.TypeParameter;
|
||||
import com.github.javaparser.ast.NodeList;
|
||||
import com.github.javaparser.ast.body.BodyDeclaration;
|
||||
@@ -43,4 +41,9 @@ public class CallableConstructorDecl implements CallableDecl
|
||||
{
|
||||
return new UnknownType();
|
||||
}
|
||||
|
||||
public boolean isStatic()
|
||||
{
|
||||
return m_decl.isStatic();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,4 +13,5 @@ public interface CallableDecl
|
||||
public NodeList<TypeParameter> getTypeParameters();
|
||||
public NodeList<Parameter> getParameters();
|
||||
public Type getType();
|
||||
public boolean isStatic();
|
||||
}
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
package com.sourcetrail;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.github.javaparser.ast.type.TypeParameter;
|
||||
import com.github.javaparser.ast.NodeList;
|
||||
import com.github.javaparser.ast.body.BodyDeclaration;
|
||||
@@ -42,4 +40,9 @@ public class CallableMethodDecl implements CallableDecl
|
||||
{
|
||||
return m_decl.getType();
|
||||
}
|
||||
|
||||
public boolean isStatic()
|
||||
{
|
||||
return m_decl.isStatic();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,10 @@ import com.github.javaparser.symbolsolver.model.declarations.TypeDeclaration;
|
||||
import com.github.javaparser.symbolsolver.model.declarations.TypeParameterDeclaration;
|
||||
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
|
||||
|
||||
import com.sourcetrail.name.JavaDeclName;
|
||||
import com.sourcetrail.name.JavaFunctionDeclName;
|
||||
import com.sourcetrail.name.JavaTypeName;
|
||||
|
||||
public class JavaSymbolSolverDeclNameResolver extends JavaNameResolver
|
||||
{
|
||||
public JavaSymbolSolverDeclNameResolver(TypeSolver typeSolver, ArrayList<BodyDeclaration> ignoredContexts)
|
||||
@@ -86,11 +90,12 @@ public class JavaSymbolSolverDeclNameResolver extends JavaNameResolver
|
||||
));
|
||||
}
|
||||
|
||||
declName = new JavaDeclName(
|
||||
declName = new JavaFunctionDeclName(
|
||||
methodDecl.getName(),
|
||||
getTypeParameterNames(methodDecl.getTypeParameters()),
|
||||
JavaSymbolSolverTypeNameResolver.getQualifiedTypeName(methodDecl.getReturnType(), m_typeSolver, m_ignoredContexts),
|
||||
parameterNames
|
||||
parameterNames,
|
||||
methodDecl.isStatic()
|
||||
);
|
||||
|
||||
declName.setParent(
|
||||
|
||||
@@ -5,7 +5,6 @@ import java.util.Optional;
|
||||
|
||||
import com.github.javaparser.ast.Node;
|
||||
import com.github.javaparser.ast.body.BodyDeclaration;
|
||||
|
||||
import com.github.javaparser.symbolsolver.javaparsermodel.LambdaArgumentTypePlaceholder;
|
||||
import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserTypeParameter;
|
||||
import com.github.javaparser.symbolsolver.logic.InferenceVariableType;
|
||||
@@ -20,6 +19,9 @@ import com.github.javaparser.symbolsolver.model.typesystem.TypeVariable;
|
||||
import com.github.javaparser.symbolsolver.model.typesystem.VoidType;
|
||||
import com.github.javaparser.symbolsolver.model.typesystem.Wildcard;
|
||||
|
||||
import com.sourcetrail.name.JavaDeclName;
|
||||
import com.sourcetrail.name.JavaTypeName;
|
||||
|
||||
public class JavaSymbolSolverTypeNameResolver extends JavaNameResolver
|
||||
{
|
||||
public JavaSymbolSolverTypeNameResolver(TypeSolver typeSolver, ArrayList<BodyDeclaration> ignoredContexts)
|
||||
|
||||
@@ -24,6 +24,11 @@ import com.github.javaparser.ast.expr.Name;
|
||||
import com.github.javaparser.ast.type.TypeParameter;
|
||||
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
|
||||
|
||||
import com.sourcetrail.name.JavaDeclName;
|
||||
import com.sourcetrail.name.JavaFunctionDeclName;
|
||||
import com.sourcetrail.name.JavaTypeName;
|
||||
import com.sourcetrail.name.JavaVariableDeclName;
|
||||
|
||||
public class JavaparserDeclNameResolver extends JavaNameResolver
|
||||
{
|
||||
public JavaparserDeclNameResolver(TypeSolver typeSolver, ArrayList<BodyDeclaration> ignoredContexts)
|
||||
@@ -129,7 +134,17 @@ public class JavaparserDeclNameResolver extends JavaNameResolver
|
||||
|
||||
public JavaDeclName getDeclName(VariableDeclarator decl)
|
||||
{
|
||||
return new JavaDeclName(decl.getNameAsString());
|
||||
ArrayList<BodyDeclaration> ignoredContextsForTypes = new ArrayList<BodyDeclaration>(m_ignoredContexts);
|
||||
JavaTypeName typeName = JavaparserTypeNameResolver.getQualifiedTypeName(decl.getType(), m_typeSolver, ignoredContextsForTypes);
|
||||
|
||||
boolean isStatic = false;
|
||||
Optional<FieldDeclaration> fieldDeclaration = decl.getAncestorOfType(FieldDeclaration.class);
|
||||
if (fieldDeclaration.isPresent())
|
||||
{
|
||||
isStatic = fieldDeclaration.get().isStatic();
|
||||
}
|
||||
|
||||
return new JavaVariableDeclName(decl.getNameAsString(), typeName, isStatic);
|
||||
}
|
||||
|
||||
public JavaDeclName getDeclName(BodyDeclaration decl)
|
||||
@@ -216,16 +231,19 @@ public class JavaparserDeclNameResolver extends JavaNameResolver
|
||||
ArrayList<BodyDeclaration> ignoredContextsForTypes = new ArrayList<BodyDeclaration>(m_ignoredContexts);
|
||||
ignoredContextsForTypes.add(decl.getWrappedNode()); // adding own decl
|
||||
|
||||
String name = decl.getName();
|
||||
List<String> typeParameterNames = getTypeParameterNames(decl.getTypeParameters());
|
||||
JavaTypeName returnTypeName = JavaparserTypeNameResolver.getQualifiedTypeName(decl.getType(), m_typeSolver, ignoredContextsForTypes);
|
||||
List<JavaTypeName> parameterNames = new ArrayList<>();
|
||||
for (Parameter parameter: decl.getParameters())
|
||||
{
|
||||
parameterNames.add(JavaparserTypeNameResolver.getQualifiedTypeName(parameter.getType(), m_typeSolver, ignoredContextsForTypes));
|
||||
}
|
||||
|
||||
return new JavaDeclName(name, typeParameterNames, returnTypeName, parameterNames);
|
||||
return new JavaFunctionDeclName(
|
||||
decl.getName(),
|
||||
getTypeParameterNames(decl.getTypeParameters()),
|
||||
JavaparserTypeNameResolver.getQualifiedTypeName(decl.getType(), m_typeSolver, ignoredContextsForTypes),
|
||||
parameterNames,
|
||||
decl.isStatic()
|
||||
);
|
||||
}
|
||||
|
||||
private static BodyDeclaration getBodyDeclContext(Node decl)
|
||||
|
||||
@@ -4,10 +4,11 @@ import java.util.ArrayList;
|
||||
|
||||
import com.github.javaparser.ast.body.BodyDeclaration;
|
||||
import com.github.javaparser.ast.type.*;
|
||||
|
||||
import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
|
||||
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
|
||||
|
||||
import com.sourcetrail.name.JavaTypeName;
|
||||
|
||||
public class JavaparserTypeNameResolver extends JavaNameResolver
|
||||
{
|
||||
public JavaparserTypeNameResolver(TypeSolver typeSolver, ArrayList<BodyDeclaration> ignoredContexts)
|
||||
|
||||
+9
-49
@@ -1,4 +1,4 @@
|
||||
package com.sourcetrail;
|
||||
package com.sourcetrail.name;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -7,8 +7,6 @@ public class JavaDeclName
|
||||
private JavaDeclName m_parent = null;
|
||||
private String m_name = "";
|
||||
private List<String> m_typeParameterNames = null;
|
||||
private JavaTypeName m_returnTypeName = null;
|
||||
private List<JavaTypeName> m_parameterNames = null;
|
||||
|
||||
public static JavaDeclName fromDotSeparatedString(String s)
|
||||
{
|
||||
@@ -34,25 +32,11 @@ public class JavaDeclName
|
||||
m_name = name;
|
||||
}
|
||||
|
||||
public JavaDeclName(String name, JavaTypeName returnTypeName, List<JavaTypeName> parameterNames)
|
||||
{
|
||||
m_name = name;
|
||||
m_returnTypeName = returnTypeName;
|
||||
m_parameterNames = parameterNames;
|
||||
}
|
||||
|
||||
public JavaDeclName(String name, List<String> typeParameterNames)
|
||||
{
|
||||
m_name = name;
|
||||
m_typeParameterNames = typeParameterNames;
|
||||
}
|
||||
public JavaDeclName(String name, List<String> typeParameterNames, JavaTypeName returnTypeName, List<JavaTypeName> parameterNames)
|
||||
{
|
||||
m_name = name;
|
||||
m_typeParameterNames = typeParameterNames;
|
||||
m_returnTypeName = returnTypeName;
|
||||
m_parameterNames = parameterNames;
|
||||
}
|
||||
|
||||
public void setParent(JavaDeclName parent)
|
||||
{
|
||||
@@ -69,26 +53,21 @@ public class JavaDeclName
|
||||
return m_name;
|
||||
}
|
||||
|
||||
public String toSerializedNameHierarchy()
|
||||
public NameHierarchy toNameHierarchy()
|
||||
{
|
||||
String nameHierarchy = ".\tm";
|
||||
NameHierarchy nameHierarchy;
|
||||
|
||||
if (m_parent != null)
|
||||
{
|
||||
nameHierarchy = m_parent.toSerializedNameHierarchy();
|
||||
nameHierarchy += "\tn";
|
||||
nameHierarchy = m_parent.toNameHierarchy();
|
||||
}
|
||||
|
||||
nameHierarchy += m_name;
|
||||
nameHierarchy += getTypeParameterString();
|
||||
|
||||
nameHierarchy += "\ts";
|
||||
if (m_returnTypeName != null)
|
||||
else
|
||||
{
|
||||
nameHierarchy += m_returnTypeName.toString();
|
||||
nameHierarchy = new NameHierarchy();
|
||||
}
|
||||
|
||||
nameHierarchy += "\tp";
|
||||
nameHierarchy += getParameterString();
|
||||
nameHierarchy.push(new NameElement(m_name + getTypeParameterString()));
|
||||
|
||||
return nameHierarchy;
|
||||
}
|
||||
|
||||
@@ -107,25 +86,6 @@ public class JavaDeclName
|
||||
return string;
|
||||
}
|
||||
|
||||
private String getParameterString()
|
||||
{
|
||||
String string = "";
|
||||
if (m_parameterNames != null)
|
||||
{
|
||||
string += "(";
|
||||
for (int i = 0; i < m_parameterNames.size(); i++)
|
||||
{
|
||||
if (i != 0)
|
||||
{
|
||||
string += ", ";
|
||||
}
|
||||
string += m_parameterNames.get(i).toString();
|
||||
}
|
||||
string += ")";
|
||||
}
|
||||
return string;
|
||||
}
|
||||
|
||||
public String getTypeParameterString()
|
||||
{
|
||||
String string = "";
|
||||
@@ -0,0 +1,76 @@
|
||||
package com.sourcetrail.name;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
public class JavaFunctionDeclName extends JavaDeclName
|
||||
{
|
||||
private JavaTypeName m_returnTypeName = null;
|
||||
private List<JavaTypeName> m_parameterNames = null;
|
||||
private boolean m_isStatic = false;
|
||||
|
||||
public JavaFunctionDeclName(String name, JavaTypeName returnTypeName, List<JavaTypeName> parameterNames, boolean isStatic)
|
||||
{
|
||||
super(name);
|
||||
|
||||
m_returnTypeName = returnTypeName;
|
||||
m_parameterNames = parameterNames;
|
||||
m_isStatic = isStatic;
|
||||
}
|
||||
|
||||
public JavaFunctionDeclName(String name, List<String> typeParameterNames, JavaTypeName returnTypeName, List<JavaTypeName> parameterNames, boolean isStatic)
|
||||
{
|
||||
super(name, typeParameterNames);
|
||||
|
||||
m_returnTypeName = returnTypeName;
|
||||
m_parameterNames = parameterNames;
|
||||
m_isStatic = isStatic;
|
||||
}
|
||||
|
||||
@Override
|
||||
public NameHierarchy toNameHierarchy()
|
||||
{
|
||||
String prefix = "";
|
||||
if (m_isStatic)
|
||||
{
|
||||
prefix += "static ";
|
||||
}
|
||||
if (m_returnTypeName != null)
|
||||
{
|
||||
prefix += m_returnTypeName.toString();
|
||||
}
|
||||
|
||||
String postfix = getParameterString();
|
||||
|
||||
NameHierarchy nameHierarchy = super.toNameHierarchy();
|
||||
|
||||
Optional<NameElement> nameElement = nameHierarchy.peek();
|
||||
if (nameElement.isPresent())
|
||||
{
|
||||
String name = nameElement.get().getName();
|
||||
|
||||
nameHierarchy.pop();
|
||||
nameHierarchy.push(new NameElement(name, prefix, postfix));
|
||||
}
|
||||
|
||||
return nameHierarchy;
|
||||
}
|
||||
|
||||
private String getParameterString()
|
||||
{
|
||||
String string = "(";
|
||||
if (m_parameterNames != null)
|
||||
{
|
||||
for (int i = 0; i < m_parameterNames.size(); i++)
|
||||
{
|
||||
if (i != 0)
|
||||
{
|
||||
string += ", ";
|
||||
}
|
||||
string += m_parameterNames.get(i).toString();
|
||||
}
|
||||
}
|
||||
string += ")";
|
||||
return string;
|
||||
}
|
||||
}
|
||||
+10
-8
@@ -1,4 +1,4 @@
|
||||
package com.sourcetrail;
|
||||
package com.sourcetrail.name;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -48,18 +48,20 @@ public class JavaTypeName
|
||||
return m_name;
|
||||
}
|
||||
|
||||
public String toSerializedNameHierarchy()
|
||||
public NameHierarchy toNameHierarchy()
|
||||
{
|
||||
String nameHierarchy = ".\tm";
|
||||
NameHierarchy nameHierarchy;
|
||||
|
||||
if (m_parent != null)
|
||||
{
|
||||
nameHierarchy = m_parent.toSerializedNameHierarchy();
|
||||
nameHierarchy += "\tn";
|
||||
nameHierarchy = m_parent.toNameHierarchy();
|
||||
}
|
||||
else
|
||||
{
|
||||
nameHierarchy = new NameHierarchy();
|
||||
}
|
||||
|
||||
nameHierarchy += m_name;
|
||||
nameHierarchy += getTypeArgumentString();
|
||||
nameHierarchy += "\ts\tp";
|
||||
nameHierarchy.push(new NameElement(m_name + getTypeArgumentString()));
|
||||
|
||||
return nameHierarchy;
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
package com.sourcetrail.name;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
public class JavaVariableDeclName extends JavaDeclName
|
||||
{
|
||||
private JavaTypeName m_typeName = null;
|
||||
private boolean m_isStatic = false;
|
||||
|
||||
public JavaVariableDeclName(String name, JavaTypeName typeName, boolean isStatic)
|
||||
{
|
||||
super(name);
|
||||
|
||||
m_typeName = typeName;
|
||||
m_isStatic = isStatic;
|
||||
}
|
||||
|
||||
@Override
|
||||
public NameHierarchy toNameHierarchy()
|
||||
{
|
||||
String prefix = "";
|
||||
if (m_isStatic)
|
||||
{
|
||||
prefix += "static ";
|
||||
}
|
||||
if (m_typeName != null)
|
||||
{
|
||||
prefix += m_typeName.toString();
|
||||
}
|
||||
|
||||
NameHierarchy nameHierarchy = super.toNameHierarchy();
|
||||
Optional<NameElement> nameElement = nameHierarchy.peek();
|
||||
if (nameElement.isPresent())
|
||||
{
|
||||
String name = nameElement.get().getName();
|
||||
|
||||
nameHierarchy.pop();
|
||||
nameHierarchy.push(new NameElement(name, prefix, ""));
|
||||
}
|
||||
return nameHierarchy;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
package com.sourcetrail.name;
|
||||
|
||||
public class NameElement
|
||||
{
|
||||
private String m_name = "";
|
||||
private String m_prefix = "";
|
||||
private String m_postfix = "";
|
||||
|
||||
|
||||
public NameElement(String name)
|
||||
{
|
||||
if (name != null) m_name = name;
|
||||
}
|
||||
|
||||
public NameElement(String name, String prefix, String postfix)
|
||||
{
|
||||
if (name != null) m_name = name;
|
||||
if (prefix != null) m_prefix = prefix;
|
||||
if (postfix != null) m_postfix = postfix;
|
||||
}
|
||||
|
||||
String getName()
|
||||
{
|
||||
return m_name;
|
||||
}
|
||||
|
||||
String getNameWithSignature()
|
||||
{
|
||||
String nameWithSignature = m_name;
|
||||
|
||||
if (m_prefix.length() > 0 || m_postfix.length() > 0)
|
||||
{
|
||||
nameWithSignature = m_prefix;
|
||||
if (!m_name.isEmpty())
|
||||
{
|
||||
if (!m_prefix.isEmpty())
|
||||
{
|
||||
nameWithSignature += " ";
|
||||
}
|
||||
nameWithSignature += m_name;
|
||||
}
|
||||
nameWithSignature += m_postfix;
|
||||
}
|
||||
|
||||
return nameWithSignature;
|
||||
}
|
||||
|
||||
String serialize()
|
||||
{
|
||||
return m_name + "\ts" + m_prefix + "\tp" + m_postfix;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
package com.sourcetrail.name;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
public class NameHierarchy
|
||||
{
|
||||
private List<NameElement> m_elements = new ArrayList<>();
|
||||
|
||||
public NameHierarchy()
|
||||
{
|
||||
}
|
||||
|
||||
public NameHierarchy(String name)
|
||||
{
|
||||
m_elements.add(new NameElement(name));
|
||||
}
|
||||
|
||||
public NameHierarchy(NameElement name)
|
||||
{
|
||||
m_elements.add(name);
|
||||
}
|
||||
|
||||
public NameHierarchy(List<NameElement> names)
|
||||
{
|
||||
m_elements.addAll(names);
|
||||
}
|
||||
|
||||
public void push(NameElement element)
|
||||
{
|
||||
m_elements.add(element);
|
||||
}
|
||||
|
||||
public void pop()
|
||||
{
|
||||
if (!m_elements.isEmpty())
|
||||
{
|
||||
m_elements.remove(m_elements.size() - 1);
|
||||
}
|
||||
}
|
||||
|
||||
public Optional<NameElement> peek()
|
||||
{
|
||||
if (!m_elements.isEmpty())
|
||||
{
|
||||
return Optional.of(m_elements.get(m_elements.size() - 1));
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public String serialize()
|
||||
{
|
||||
String serialized = ".\tm";
|
||||
|
||||
for (int i = 0; i < m_elements.size(); i++)
|
||||
{
|
||||
if (i != 0)
|
||||
{
|
||||
serialized += "\tn";
|
||||
}
|
||||
|
||||
serialized += m_elements.get(i).serialize();
|
||||
}
|
||||
|
||||
return serialized;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -24,6 +24,8 @@ add_files(
|
||||
data/parser/cxx/name/CxxQualifierFlags.h
|
||||
data/parser/cxx/name/CxxTypeName.cpp
|
||||
data/parser/cxx/name/CxxTypeName.h
|
||||
data/parser/cxx/name/CxxVariableDeclName.cpp
|
||||
data/parser/cxx/name/CxxVariableDeclName.h
|
||||
|
||||
data/parser/cxx/name_resolver/CxxDeclNameResolver.cpp
|
||||
data/parser/cxx/name_resolver/CxxDeclNameResolver.h
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
#include "data/parser/cxx/name/CxxVariableDeclName.h"
|
||||
|
||||
CxxVariableDeclName::CxxVariableDeclName(
|
||||
std::string name,
|
||||
std::vector<std::string> templateParameterNames,
|
||||
std::shared_ptr<CxxTypeName> typeName,
|
||||
bool isStatic
|
||||
)
|
||||
: CxxDeclName(name, templateParameterNames)
|
||||
, m_typeName(typeName)
|
||||
, m_isStatic(isStatic)
|
||||
{
|
||||
}
|
||||
|
||||
CxxVariableDeclName::CxxVariableDeclName(
|
||||
std::string name,
|
||||
std::vector<std::string> templateParameterNames,
|
||||
std::shared_ptr<CxxTypeName> typeName,
|
||||
bool isStatic,
|
||||
std::shared_ptr<CxxName> parent
|
||||
)
|
||||
: CxxDeclName(name, templateParameterNames, parent)
|
||||
, m_typeName(typeName)
|
||||
, m_isStatic(isStatic)
|
||||
{
|
||||
}
|
||||
|
||||
CxxVariableDeclName::~CxxVariableDeclName()
|
||||
{
|
||||
}
|
||||
|
||||
NameHierarchy CxxVariableDeclName::toNameHierarchy() const
|
||||
{
|
||||
std::string signaturePrefix = "";
|
||||
if (m_isStatic)
|
||||
{
|
||||
signaturePrefix += "static ";
|
||||
}
|
||||
signaturePrefix += CxxTypeName::makeUnsolvedIfNull(m_typeName)->toString();
|
||||
|
||||
const std::string signaturePostfix = "";
|
||||
|
||||
NameHierarchy ret = CxxDeclName::toNameHierarchy();
|
||||
std::shared_ptr<NameElement> nameElement = std::make_shared<NameElement>(
|
||||
ret.back()->getName(),
|
||||
NameElement::Signature(signaturePrefix, signaturePostfix)
|
||||
);
|
||||
|
||||
ret.pop();
|
||||
ret.push(nameElement);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
#ifndef CXX_VARIABLE_DECL_NAME_H
|
||||
#define CXX_VARIABLE_DECL_NAME_H
|
||||
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
#include "data/parser/cxx/name/CxxDeclName.h"
|
||||
#include "data/parser/cxx/name/CxxTypeName.h"
|
||||
|
||||
class CxxVariableDeclName: public CxxDeclName
|
||||
{
|
||||
public:
|
||||
CxxVariableDeclName(
|
||||
std::string name,
|
||||
std::vector<std::string> templateParameterNames,
|
||||
std::shared_ptr<CxxTypeName> typeName,
|
||||
bool isStatic
|
||||
);
|
||||
|
||||
CxxVariableDeclName(
|
||||
std::string name,
|
||||
std::vector<std::string> templateParameterNames,
|
||||
std::shared_ptr<CxxTypeName> typeName,
|
||||
bool isStatic,
|
||||
std::shared_ptr<CxxName> parent
|
||||
);
|
||||
|
||||
virtual ~CxxVariableDeclName();
|
||||
|
||||
virtual NameHierarchy toNameHierarchy() const;
|
||||
|
||||
private:
|
||||
std::shared_ptr<CxxTypeName> m_typeName;
|
||||
bool m_isStatic;
|
||||
};
|
||||
|
||||
#endif // CXX_VARIABLE_DECL_NAME_H
|
||||
@@ -4,6 +4,7 @@
|
||||
#include <clang/AST/ASTContext.h>
|
||||
|
||||
#include "data/parser/cxx/name/CxxFunctionDeclName.h"
|
||||
#include "data/parser/cxx/name/CxxVariableDeclName.h"
|
||||
#include "data/parser/cxx/name_resolver/CxxSpecifierNameResolver.h"
|
||||
#include "data/parser/cxx/name_resolver/CxxTemplateArgumentNameResolver.h"
|
||||
#include "data/parser/cxx/name_resolver/CxxTypeNameResolver.h"
|
||||
@@ -270,6 +271,14 @@ std::shared_ptr<CxxDeclName> CxxDeclNameResolver::getDeclName(const clang::Named
|
||||
}
|
||||
return std::make_shared<CxxDeclName>(declNameString, templateParameters);
|
||||
}
|
||||
else if (clang::isa<clang::FieldDecl>(declaration))
|
||||
{
|
||||
const clang::FieldDecl* fieldDecl = clang::dyn_cast<clang::FieldDecl>(declaration);
|
||||
CxxTypeNameResolver typenNameResolver(getIgnoredContextDecls());
|
||||
typenNameResolver.ignoreContextDecl(fieldDecl);
|
||||
std::shared_ptr<CxxTypeName> typeName = CxxTypeName::makeUnsolvedIfNull(typenNameResolver.getName(fieldDecl->getType()));
|
||||
return std::make_shared<CxxVariableDeclName>(declNameString, std::vector<std::string>(), typeName, false);
|
||||
}
|
||||
else if (clang::isa<clang::NamespaceDecl>(declaration) && clang::dyn_cast<clang::NamespaceDecl>(declaration)->isAnonymousNamespace())
|
||||
{
|
||||
const clang::SourceManager& sourceManager = declaration->getASTContext().getSourceManager();
|
||||
@@ -299,6 +308,28 @@ std::shared_ptr<CxxDeclName> CxxDeclNameResolver::getDeclName(const clang::Named
|
||||
const clang::PresumedLoc& presumedBegin = sourceManager.getPresumedLoc(declaration->getLocStart());
|
||||
return std::make_shared<CxxDeclName>(getNameForAnonymousSymbol("parameter", presumedBegin), std::vector<std::string>());
|
||||
}
|
||||
else if (clang::isa<clang::VarDecl>(declaration))
|
||||
{
|
||||
const clang::VarDecl* varDecl = clang::dyn_cast<clang::VarDecl>(declaration);
|
||||
if (varDecl->getParentFunctionOrMethod() == NULL)
|
||||
{
|
||||
bool isStatic = false;
|
||||
if (varDecl->getAccess() != clang::AS_none)
|
||||
{
|
||||
// var is declared inside a type and must be static (non-statics are stored as clang::FieldDecl)
|
||||
isStatic = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// nothing todo, varDecl is global (and non-static)
|
||||
}
|
||||
|
||||
CxxTypeNameResolver typenNameResolver(getIgnoredContextDecls());
|
||||
typenNameResolver.ignoreContextDecl(varDecl);
|
||||
std::shared_ptr<CxxTypeName> typeName = CxxTypeName::makeUnsolvedIfNull(typenNameResolver.getName(varDecl->getType()));
|
||||
return std::make_shared<CxxVariableDeclName>(declNameString, std::vector<std::string>(), typeName, isStatic);
|
||||
}
|
||||
}
|
||||
|
||||
if (declNameString.size() > 0)
|
||||
{
|
||||
|
||||
@@ -28,7 +28,7 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->usages, "void A::foo(int) -> A::bar <6:7 6:9>"
|
||||
client->usages, "void A::foo(int) -> int A::bar <6:7 6:9>"
|
||||
));
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->usages, "void A::foo(int) -> A::a <6:3 6:3>"
|
||||
client->usages, "void A::foo(int) -> A * A::a <6:3 6:3>"
|
||||
));
|
||||
}
|
||||
|
||||
@@ -109,7 +109,7 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->globalVariables, "x <1:5 1:5>"
|
||||
client->globalVariables, "int x <1:5 1:5>"
|
||||
));
|
||||
}
|
||||
|
||||
@@ -130,16 +130,16 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->fields, "private A::a <3:6 3:6>"
|
||||
client->fields, "private int A::a <3:6 3:6>"
|
||||
));
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->fields, "public A::b <6:6 6:6>"
|
||||
client->fields, "public int A::b <6:6 6:6>"
|
||||
));
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->fields, "protected A::c <8:13 8:13>"
|
||||
client->fields, "protected static int A::c <8:13 8:13>"
|
||||
));
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->fields, "private A::d <10:12 10:12>"
|
||||
client->fields, "private const int A::d <10:12 10:12>"
|
||||
));
|
||||
}
|
||||
|
||||
@@ -799,7 +799,7 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->fields, "private A<typename T>::foo <4:6 4:8>"
|
||||
client->fields, "private int A<typename T>::foo <4:6 4:8>"
|
||||
));
|
||||
}
|
||||
|
||||
@@ -814,7 +814,7 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->typeUses, "A<typename T>::foo -> A<typename T>::T <4:2 4:2>"
|
||||
client->typeUses, "A<typename T>::T A<typename T>::foo -> A<typename T>::T <4:2 4:2>"
|
||||
));
|
||||
}
|
||||
|
||||
@@ -1124,7 +1124,7 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->globalVariables, "n::x <2:6 2:6>"
|
||||
client->globalVariables, "int n::x <2:6 2:6>"
|
||||
));
|
||||
}
|
||||
|
||||
@@ -1143,7 +1143,7 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->fields, "private B::C::amount <7:20 7:25>"
|
||||
client->fields, "private static const int B::C::amount <7:20 7:25>"
|
||||
));
|
||||
}
|
||||
|
||||
@@ -1319,8 +1319,8 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->typeUses, "A<typename T>::foo -> A<typename T>::TestType <9:2 9:9>"
|
||||
));
|
||||
client->typeUses, "A<typename T>::TestType A<typename T>::foo -> A<typename T>::TestType <9:2 9:9>"
|
||||
));
|
||||
}
|
||||
|
||||
void test_cxx_parser_finds_correct_field_member_type_of_nested_template_class_in_declaration()
|
||||
@@ -1337,8 +1337,8 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->typeUses, "A<typename T>::B::foo -> A<typename T>::T <6:3 6:3>"
|
||||
));
|
||||
client->typeUses, "A<typename T>::T A<typename T>::B::foo -> A<typename T>::T <6:3 6:3>"
|
||||
));
|
||||
}
|
||||
|
||||
void test_cxx_parser_finds_type_usage_of_global_variable()
|
||||
@@ -1348,7 +1348,7 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->typeUses, "x -> int <1:1 1:3>"
|
||||
client->typeUses, "int x -> int <1:1 1:3>"
|
||||
));
|
||||
}
|
||||
|
||||
@@ -1386,7 +1386,7 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->typeUses, "number -> uint <2:1 2:4>"
|
||||
client->typeUses, "uint number -> uint <2:1 2:4>"
|
||||
));
|
||||
}
|
||||
|
||||
@@ -1881,7 +1881,7 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->calls, "app -> void App::App() <6:5 6:7>"
|
||||
client->calls, "App app -> void App::App() <6:5 6:7>"
|
||||
));
|
||||
}
|
||||
|
||||
@@ -1893,7 +1893,7 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->calls, "a -> int one() <2:9 2:11>"
|
||||
client->calls, "int a -> int one() <2:9 2:11>"
|
||||
));
|
||||
}
|
||||
|
||||
@@ -1950,7 +1950,7 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->usages, "int main() -> bar <5:2 5:4>"
|
||||
client->usages, "int main() -> int bar <5:2 5:4>"
|
||||
));
|
||||
}
|
||||
|
||||
@@ -1962,7 +1962,7 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->usages, "b -> a <2:12 2:12>"
|
||||
client->usages, "int [] b -> int a <2:12 2:12>"
|
||||
));
|
||||
}
|
||||
|
||||
@@ -1981,7 +1981,7 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->usages, "void App::foo() -> bar <7:3 7:5>"
|
||||
client->usages, "void App::foo() -> int bar <7:3 7:5>"
|
||||
));
|
||||
}
|
||||
|
||||
@@ -2000,10 +2000,10 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->usages, "void App::foo() -> App::bar <5:3 5:5>"
|
||||
client->usages, "void App::foo() -> int App::bar <5:3 5:5>"
|
||||
));
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->usages, "void App::foo() -> App::bar <6:9 6:11>"
|
||||
client->usages, "void App::foo() -> int App::bar <6:9 6:11>"
|
||||
));
|
||||
}
|
||||
|
||||
@@ -2020,7 +2020,7 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->usages, "void App::App() -> App::bar <4:5 4:7>"
|
||||
client->usages, "void App::App() -> int App::bar <4:5 4:7>"
|
||||
));
|
||||
}
|
||||
|
||||
@@ -2204,16 +2204,16 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->usages, "a -> A::B <6:7 6:7>"
|
||||
client->usages, "A a -> A::B <6:7 6:7>"
|
||||
));
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->typeUses, "a -> A <6:1 6:1>"
|
||||
client->typeUses, "A a -> A <6:1 6:1>"
|
||||
));
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->typeUses, "aPtr -> A <7:1 7:1>"
|
||||
client->typeUses, "A * aPtr -> A <7:1 7:1>"
|
||||
));
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->typeUses, "aPtr -> A <7:15 7:15>"
|
||||
client->typeUses, "A * aPtr -> A <7:15 7:15>"
|
||||
));
|
||||
}
|
||||
|
||||
@@ -2504,7 +2504,7 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->templateArgumentTypes, "A<&g_p> -> g_p <9:5 9:7>"
|
||||
client->templateArgumentTypes, "A<&g_p> -> P g_p <9:5 9:7>"
|
||||
));
|
||||
}
|
||||
|
||||
@@ -2524,7 +2524,7 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->templateArgumentTypes, "A<&g_p> -> g_p <9:4 9:6>"
|
||||
client->templateArgumentTypes, "A<&g_p> -> P g_p <9:4 9:6>"
|
||||
));
|
||||
}
|
||||
|
||||
@@ -2675,7 +2675,7 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->templateArgumentTypes, "A<&g_p> -> g_p <8:10 8:12>"
|
||||
client->templateArgumentTypes, "A<&g_p> -> P g_p <8:10 8:12>"
|
||||
));
|
||||
}
|
||||
|
||||
@@ -2695,7 +2695,7 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->templateArgumentTypes, "A<&g_p> -> g_p <8:9 8:11>"
|
||||
client->templateArgumentTypes, "A<&g_p> -> P g_p <8:9 8:11>"
|
||||
));
|
||||
}
|
||||
|
||||
@@ -2792,7 +2792,7 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->templateArgumentTypes, "A<&g_p, P * q> -> g_p <8:10 8:12>"
|
||||
client->templateArgumentTypes, "A<&g_p, P * q> -> P g_p <8:10 8:12>"
|
||||
));
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->templateArgumentTypes, "A<&g_p, P * q> -> A<&g_p, P * q>::q <8:15 8:15>"
|
||||
@@ -2815,7 +2815,7 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->templateArgumentTypes, "A<&g_p, P & q> -> g_p <8:9 8:11>"
|
||||
client->templateArgumentTypes, "A<&g_p, P & q> -> P g_p <8:9 8:11>"
|
||||
));
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->templateArgumentTypes, "A<&g_p, P & q> -> A<&g_p, P & q>::q <8:14 8:14>"
|
||||
@@ -2949,7 +2949,7 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->usages, "void A<typename T>::A<T>() -> A<typename T>::foo <4:7 4:9>"
|
||||
client->usages, "void A<typename T>::A<T>() -> A<typename T>::T A<typename T>::foo <4:7 4:9>"
|
||||
));
|
||||
}
|
||||
|
||||
|
||||
@@ -158,6 +158,23 @@ public:
|
||||
));
|
||||
}
|
||||
|
||||
void test_java_parser_finds_method_declaration_with_static_keyword_in_signature()
|
||||
{
|
||||
std::shared_ptr<TestParserClient> client = parseCode(
|
||||
"package foo;\n"
|
||||
"public class A\n"
|
||||
"{\n"
|
||||
" static public void bar()\n"
|
||||
" {\n"
|
||||
" };\n"
|
||||
"}\n"
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->methods, "public static void foo.A.bar() <4:2 <4:21 4:23> 6:2>"
|
||||
));
|
||||
}
|
||||
|
||||
void test_java_parser_finds_field_declaration_with_initial_assignment()
|
||||
{
|
||||
std::shared_ptr<TestParserClient> client = parseCode(
|
||||
@@ -169,7 +186,7 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->fields, "default foo.A.bar <4:6 4:8>"
|
||||
client->fields, "default int foo.A.bar <4:6 4:8>"
|
||||
));
|
||||
}
|
||||
|
||||
@@ -184,7 +201,7 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->fields, "public foo.A.bar <4:13 4:15>"
|
||||
client->fields, "public int foo.A.bar <4:13 4:15>"
|
||||
));
|
||||
}
|
||||
|
||||
@@ -199,7 +216,7 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->fields, "protected foo.A.bar <4:16 4:18>"
|
||||
client->fields, "protected int foo.A.bar <4:16 4:18>"
|
||||
));
|
||||
}
|
||||
|
||||
@@ -214,7 +231,22 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->fields, "private foo.A.bar <4:14 4:16>"
|
||||
client->fields, "private int foo.A.bar <4:14 4:16>"
|
||||
));
|
||||
}
|
||||
|
||||
void test_java_parser_finds_static_keyword_in_field_declaration()
|
||||
{
|
||||
std::shared_ptr<TestParserClient> client = parseCode(
|
||||
"package foo;\n"
|
||||
"public class A\n"
|
||||
"{\n"
|
||||
" static int bar;\n"
|
||||
"}\n"
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->fields, "default static int foo.A.bar <4:13 4:15>"
|
||||
));
|
||||
}
|
||||
|
||||
@@ -455,7 +487,7 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->typeUses, "Foo.Derived.x -> Foo.Base.X <7:10 7:10>"
|
||||
client->typeUses, "Foo.Base.X Foo.Derived.x -> Foo.Base.X <7:10 7:10>"
|
||||
));
|
||||
}
|
||||
|
||||
@@ -522,7 +554,7 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->usages, "foo.X.X(int) -> foo.X.t <7:8 7:8>"
|
||||
client->usages, "foo.X.X(int) -> int foo.X.t <7:8 7:8>"
|
||||
));
|
||||
}
|
||||
|
||||
@@ -541,7 +573,7 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->usages, "foo.X.foo() -> foo.X.foo <7:8 7:10>"
|
||||
client->usages, "foo.X.foo() -> int foo.X.foo <7:8 7:10>"
|
||||
));
|
||||
}
|
||||
|
||||
@@ -724,7 +756,7 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->typeUses, "A<T>.t -> A<T>.T <3:2 3:2>"
|
||||
client->typeUses, "A<T>.T A<T>.t -> A<T>.T <3:2 3:2>"
|
||||
));
|
||||
}
|
||||
|
||||
@@ -752,7 +784,7 @@ public:
|
||||
);
|
||||
|
||||
TS_ASSERT(utility::containsElement<std::string>(
|
||||
client->typeUses, "A<T>.t -> A<T> <3:2 3:2>"
|
||||
client->typeUses, "A<T> A<T>.t -> A<T> <3:2 3:2>"
|
||||
));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user