From 01b1e0d6f16f73c38c3c444f8f2fdbf1364f01eb Mon Sep 17 00:00:00 2001 From: malte_langkabel Date: Fri, 28 Jul 2017 09:12:32 +0200 Subject: [PATCH] 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. --- bin/test/data/log/test_log.txt | 2 + .../main/java/com/sourcetrail/AstVisitor.java | 40 +++++----- .../sourcetrail/CallableConstructorDecl.java | 7 +- .../java/com/sourcetrail/CallableDecl.java | 1 + .../com/sourcetrail/CallableMethodDecl.java | 7 +- .../JavaSymbolSolverDeclNameResolver.java | 9 ++- .../JavaSymbolSolverTypeNameResolver.java | 4 +- .../JavaparserDeclNameResolver.java | 28 +++++-- .../JavaparserTypeNameResolver.java | 3 +- .../sourcetrail/{ => name}/JavaDeclName.java | 58 +++----------- .../name/JavaFunctionDeclName.java | 76 +++++++++++++++++++ .../sourcetrail/{ => name}/JavaTypeName.java | 18 +++-- .../name/JavaVariableDeclName.java | 42 ++++++++++ .../com/sourcetrail/name/NameElement.java | 52 +++++++++++++ .../com/sourcetrail/name/NameHierarchy.java | 69 +++++++++++++++++ src/lib_cxx/CMakeLists.txt | 2 + .../parser/cxx/name/CxxVariableDeclName.cpp | 53 +++++++++++++ .../parser/cxx/name/CxxVariableDeclName.h | 37 +++++++++ .../cxx/name_resolver/CxxDeclNameResolver.cpp | 31 ++++++++ src/test/CxxParserTestSuite.h | 72 +++++++++--------- src/test/JavaParserTestSuite.h | 50 +++++++++--- 21 files changed, 526 insertions(+), 135 deletions(-) rename java_indexer/src/main/java/com/sourcetrail/{ => name}/JavaDeclName.java (55%) create mode 100644 java_indexer/src/main/java/com/sourcetrail/name/JavaFunctionDeclName.java rename java_indexer/src/main/java/com/sourcetrail/{ => name}/JavaTypeName.java (85%) create mode 100644 java_indexer/src/main/java/com/sourcetrail/name/JavaVariableDeclName.java create mode 100644 java_indexer/src/main/java/com/sourcetrail/name/NameElement.java create mode 100644 java_indexer/src/main/java/com/sourcetrail/name/NameHierarchy.java create mode 100644 src/lib_cxx/data/parser/cxx/name/CxxVariableDeclName.cpp create mode 100644 src/lib_cxx/data/parser/cxx/name/CxxVariableDeclName.h diff --git a/bin/test/data/log/test_log.txt b/bin/test/data/log/test_log.txt index 3db407a5..aeae7ed8 100644 --- a/bin/test/data/log/test_log.txt +++ b/bin/test/data/log/test_log.txt @@ -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 diff --git a/java_indexer/src/main/java/com/sourcetrail/AstVisitor.java b/java_indexer/src/main/java/com/sourcetrail/AstVisitor.java index 38004cdd..5f19b941 100644 --- a/java_indexer/src/main/java/com/sourcetrail/AstVisitor.java +++ b/java_indexer/src/main/java/com/sourcetrail/AstVisitor.java @@ -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 { diff --git a/java_indexer/src/main/java/com/sourcetrail/CallableConstructorDecl.java b/java_indexer/src/main/java/com/sourcetrail/CallableConstructorDecl.java index 7ebd456f..825e23d4 100644 --- a/java_indexer/src/main/java/com/sourcetrail/CallableConstructorDecl.java +++ b/java_indexer/src/main/java/com/sourcetrail/CallableConstructorDecl.java @@ -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(); + } } diff --git a/java_indexer/src/main/java/com/sourcetrail/CallableDecl.java b/java_indexer/src/main/java/com/sourcetrail/CallableDecl.java index 279e89da..320cd1b5 100644 --- a/java_indexer/src/main/java/com/sourcetrail/CallableDecl.java +++ b/java_indexer/src/main/java/com/sourcetrail/CallableDecl.java @@ -13,4 +13,5 @@ public interface CallableDecl public NodeList getTypeParameters(); public NodeList getParameters(); public Type getType(); + public boolean isStatic(); } diff --git a/java_indexer/src/main/java/com/sourcetrail/CallableMethodDecl.java b/java_indexer/src/main/java/com/sourcetrail/CallableMethodDecl.java index 31836545..d5b19669 100644 --- a/java_indexer/src/main/java/com/sourcetrail/CallableMethodDecl.java +++ b/java_indexer/src/main/java/com/sourcetrail/CallableMethodDecl.java @@ -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(); + } } diff --git a/java_indexer/src/main/java/com/sourcetrail/JavaSymbolSolverDeclNameResolver.java b/java_indexer/src/main/java/com/sourcetrail/JavaSymbolSolverDeclNameResolver.java index 061ef9b7..a0e07cf3 100644 --- a/java_indexer/src/main/java/com/sourcetrail/JavaSymbolSolverDeclNameResolver.java +++ b/java_indexer/src/main/java/com/sourcetrail/JavaSymbolSolverDeclNameResolver.java @@ -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 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( diff --git a/java_indexer/src/main/java/com/sourcetrail/JavaSymbolSolverTypeNameResolver.java b/java_indexer/src/main/java/com/sourcetrail/JavaSymbolSolverTypeNameResolver.java index 01d72683..2892aa92 100644 --- a/java_indexer/src/main/java/com/sourcetrail/JavaSymbolSolverTypeNameResolver.java +++ b/java_indexer/src/main/java/com/sourcetrail/JavaSymbolSolverTypeNameResolver.java @@ -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 ignoredContexts) diff --git a/java_indexer/src/main/java/com/sourcetrail/JavaparserDeclNameResolver.java b/java_indexer/src/main/java/com/sourcetrail/JavaparserDeclNameResolver.java index ae9a1dde..d52c96e3 100644 --- a/java_indexer/src/main/java/com/sourcetrail/JavaparserDeclNameResolver.java +++ b/java_indexer/src/main/java/com/sourcetrail/JavaparserDeclNameResolver.java @@ -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 ignoredContexts) @@ -129,7 +134,17 @@ public class JavaparserDeclNameResolver extends JavaNameResolver public JavaDeclName getDeclName(VariableDeclarator decl) { - return new JavaDeclName(decl.getNameAsString()); + ArrayList ignoredContextsForTypes = new ArrayList(m_ignoredContexts); + JavaTypeName typeName = JavaparserTypeNameResolver.getQualifiedTypeName(decl.getType(), m_typeSolver, ignoredContextsForTypes); + + boolean isStatic = false; + Optional 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 ignoredContextsForTypes = new ArrayList(m_ignoredContexts); ignoredContextsForTypes.add(decl.getWrappedNode()); // adding own decl - String name = decl.getName(); - List typeParameterNames = getTypeParameterNames(decl.getTypeParameters()); - JavaTypeName returnTypeName = JavaparserTypeNameResolver.getQualifiedTypeName(decl.getType(), m_typeSolver, ignoredContextsForTypes); List 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) diff --git a/java_indexer/src/main/java/com/sourcetrail/JavaparserTypeNameResolver.java b/java_indexer/src/main/java/com/sourcetrail/JavaparserTypeNameResolver.java index e87badef..cf819b64 100644 --- a/java_indexer/src/main/java/com/sourcetrail/JavaparserTypeNameResolver.java +++ b/java_indexer/src/main/java/com/sourcetrail/JavaparserTypeNameResolver.java @@ -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 ignoredContexts) diff --git a/java_indexer/src/main/java/com/sourcetrail/JavaDeclName.java b/java_indexer/src/main/java/com/sourcetrail/name/JavaDeclName.java similarity index 55% rename from java_indexer/src/main/java/com/sourcetrail/JavaDeclName.java rename to java_indexer/src/main/java/com/sourcetrail/name/JavaDeclName.java index d5f32dfb..d6cff73e 100644 --- a/java_indexer/src/main/java/com/sourcetrail/JavaDeclName.java +++ b/java_indexer/src/main/java/com/sourcetrail/name/JavaDeclName.java @@ -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 m_typeParameterNames = null; - private JavaTypeName m_returnTypeName = null; - private List 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 parameterNames) - { - m_name = name; - m_returnTypeName = returnTypeName; - m_parameterNames = parameterNames; - } - public JavaDeclName(String name, List typeParameterNames) { m_name = name; m_typeParameterNames = typeParameterNames; } - public JavaDeclName(String name, List typeParameterNames, JavaTypeName returnTypeName, List 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 = ""; diff --git a/java_indexer/src/main/java/com/sourcetrail/name/JavaFunctionDeclName.java b/java_indexer/src/main/java/com/sourcetrail/name/JavaFunctionDeclName.java new file mode 100644 index 00000000..38373fb4 --- /dev/null +++ b/java_indexer/src/main/java/com/sourcetrail/name/JavaFunctionDeclName.java @@ -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 m_parameterNames = null; + private boolean m_isStatic = false; + + public JavaFunctionDeclName(String name, JavaTypeName returnTypeName, List parameterNames, boolean isStatic) + { + super(name); + + m_returnTypeName = returnTypeName; + m_parameterNames = parameterNames; + m_isStatic = isStatic; + } + + public JavaFunctionDeclName(String name, List typeParameterNames, JavaTypeName returnTypeName, List 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 = 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; + } +} diff --git a/java_indexer/src/main/java/com/sourcetrail/JavaTypeName.java b/java_indexer/src/main/java/com/sourcetrail/name/JavaTypeName.java similarity index 85% rename from java_indexer/src/main/java/com/sourcetrail/JavaTypeName.java rename to java_indexer/src/main/java/com/sourcetrail/name/JavaTypeName.java index 18d5b1f1..35011503 100644 --- a/java_indexer/src/main/java/com/sourcetrail/JavaTypeName.java +++ b/java_indexer/src/main/java/com/sourcetrail/name/JavaTypeName.java @@ -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; } diff --git a/java_indexer/src/main/java/com/sourcetrail/name/JavaVariableDeclName.java b/java_indexer/src/main/java/com/sourcetrail/name/JavaVariableDeclName.java new file mode 100644 index 00000000..bdaf8240 --- /dev/null +++ b/java_indexer/src/main/java/com/sourcetrail/name/JavaVariableDeclName.java @@ -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 = nameHierarchy.peek(); + if (nameElement.isPresent()) + { + String name = nameElement.get().getName(); + + nameHierarchy.pop(); + nameHierarchy.push(new NameElement(name, prefix, "")); + } + return nameHierarchy; + } +} \ No newline at end of file diff --git a/java_indexer/src/main/java/com/sourcetrail/name/NameElement.java b/java_indexer/src/main/java/com/sourcetrail/name/NameElement.java new file mode 100644 index 00000000..19d6d7e6 --- /dev/null +++ b/java_indexer/src/main/java/com/sourcetrail/name/NameElement.java @@ -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; + } +} diff --git a/java_indexer/src/main/java/com/sourcetrail/name/NameHierarchy.java b/java_indexer/src/main/java/com/sourcetrail/name/NameHierarchy.java new file mode 100644 index 00000000..dc163324 --- /dev/null +++ b/java_indexer/src/main/java/com/sourcetrail/name/NameHierarchy.java @@ -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 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 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 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; + } + +} diff --git a/src/lib_cxx/CMakeLists.txt b/src/lib_cxx/CMakeLists.txt index d583e4e1..efb47c57 100644 --- a/src/lib_cxx/CMakeLists.txt +++ b/src/lib_cxx/CMakeLists.txt @@ -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 diff --git a/src/lib_cxx/data/parser/cxx/name/CxxVariableDeclName.cpp b/src/lib_cxx/data/parser/cxx/name/CxxVariableDeclName.cpp new file mode 100644 index 00000000..6dbeba5c --- /dev/null +++ b/src/lib_cxx/data/parser/cxx/name/CxxVariableDeclName.cpp @@ -0,0 +1,53 @@ +#include "data/parser/cxx/name/CxxVariableDeclName.h" + +CxxVariableDeclName::CxxVariableDeclName( + std::string name, + std::vector templateParameterNames, + std::shared_ptr typeName, + bool isStatic +) + : CxxDeclName(name, templateParameterNames) + , m_typeName(typeName) + , m_isStatic(isStatic) +{ +} + +CxxVariableDeclName::CxxVariableDeclName( + std::string name, + std::vector templateParameterNames, + std::shared_ptr typeName, + bool isStatic, + std::shared_ptr 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 = std::make_shared( + ret.back()->getName(), + NameElement::Signature(signaturePrefix, signaturePostfix) + ); + + ret.pop(); + ret.push(nameElement); + + return ret; +} diff --git a/src/lib_cxx/data/parser/cxx/name/CxxVariableDeclName.h b/src/lib_cxx/data/parser/cxx/name/CxxVariableDeclName.h new file mode 100644 index 00000000..8e356bd9 --- /dev/null +++ b/src/lib_cxx/data/parser/cxx/name/CxxVariableDeclName.h @@ -0,0 +1,37 @@ +#ifndef CXX_VARIABLE_DECL_NAME_H +#define CXX_VARIABLE_DECL_NAME_H + +#include +#include + +#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 templateParameterNames, + std::shared_ptr typeName, + bool isStatic + ); + + CxxVariableDeclName( + std::string name, + std::vector templateParameterNames, + std::shared_ptr typeName, + bool isStatic, + std::shared_ptr parent + ); + + virtual ~CxxVariableDeclName(); + + virtual NameHierarchy toNameHierarchy() const; + +private: + std::shared_ptr m_typeName; + bool m_isStatic; +}; + +#endif // CXX_VARIABLE_DECL_NAME_H diff --git a/src/lib_cxx/data/parser/cxx/name_resolver/CxxDeclNameResolver.cpp b/src/lib_cxx/data/parser/cxx/name_resolver/CxxDeclNameResolver.cpp index bb6fbfba..ebef59af 100644 --- a/src/lib_cxx/data/parser/cxx/name_resolver/CxxDeclNameResolver.cpp +++ b/src/lib_cxx/data/parser/cxx/name_resolver/CxxDeclNameResolver.cpp @@ -4,6 +4,7 @@ #include #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 CxxDeclNameResolver::getDeclName(const clang::Named } return std::make_shared(declNameString, templateParameters); } + else if (clang::isa(declaration)) + { + const clang::FieldDecl* fieldDecl = clang::dyn_cast(declaration); + CxxTypeNameResolver typenNameResolver(getIgnoredContextDecls()); + typenNameResolver.ignoreContextDecl(fieldDecl); + std::shared_ptr typeName = CxxTypeName::makeUnsolvedIfNull(typenNameResolver.getName(fieldDecl->getType())); + return std::make_shared(declNameString, std::vector(), typeName, false); + } else if (clang::isa(declaration) && clang::dyn_cast(declaration)->isAnonymousNamespace()) { const clang::SourceManager& sourceManager = declaration->getASTContext().getSourceManager(); @@ -299,6 +308,28 @@ std::shared_ptr CxxDeclNameResolver::getDeclName(const clang::Named const clang::PresumedLoc& presumedBegin = sourceManager.getPresumedLoc(declaration->getLocStart()); return std::make_shared(getNameForAnonymousSymbol("parameter", presumedBegin), std::vector()); } + else if (clang::isa(declaration)) + { + const clang::VarDecl* varDecl = clang::dyn_cast(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 typeName = CxxTypeName::makeUnsolvedIfNull(typenNameResolver.getName(varDecl->getType())); + return std::make_shared(declNameString, std::vector(), typeName, isStatic); + } + } if (declNameString.size() > 0) { diff --git a/src/test/CxxParserTestSuite.h b/src/test/CxxParserTestSuite.h index 4f72e3a5..417e8868 100644 --- a/src/test/CxxParserTestSuite.h +++ b/src/test/CxxParserTestSuite.h @@ -28,7 +28,7 @@ public: ); TS_ASSERT(utility::containsElement( - 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( - 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( - client->globalVariables, "x <1:5 1:5>" + client->globalVariables, "int x <1:5 1:5>" )); } @@ -130,16 +130,16 @@ public: ); TS_ASSERT(utility::containsElement( - client->fields, "private A::a <3:6 3:6>" + client->fields, "private int A::a <3:6 3:6>" )); TS_ASSERT(utility::containsElement( - client->fields, "public A::b <6:6 6:6>" + client->fields, "public int A::b <6:6 6:6>" )); TS_ASSERT(utility::containsElement( - client->fields, "protected A::c <8:13 8:13>" + client->fields, "protected static int A::c <8:13 8:13>" )); TS_ASSERT(utility::containsElement( - 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( - client->fields, "private A::foo <4:6 4:8>" + client->fields, "private int A::foo <4:6 4:8>" )); } @@ -814,7 +814,7 @@ public: ); TS_ASSERT(utility::containsElement( - client->typeUses, "A::foo -> A::T <4:2 4:2>" + client->typeUses, "A::T A::foo -> A::T <4:2 4:2>" )); } @@ -1124,7 +1124,7 @@ public: ); TS_ASSERT(utility::containsElement( - 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( - 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( - client->typeUses, "A::foo -> A::TestType <9:2 9:9>" - )); + client->typeUses, "A::TestType A::foo -> A::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( - client->typeUses, "A::B::foo -> A::T <6:3 6:3>" - )); + client->typeUses, "A::T A::B::foo -> A::T <6:3 6:3>" + )); } void test_cxx_parser_finds_type_usage_of_global_variable() @@ -1348,7 +1348,7 @@ public: ); TS_ASSERT(utility::containsElement( - 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( - 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( - 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( - 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( - 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( - 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( - 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( - 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( - 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( - 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( - client->usages, "a -> A::B <6:7 6:7>" + client->usages, "A a -> A::B <6:7 6:7>" )); TS_ASSERT(utility::containsElement( - client->typeUses, "a -> A <6:1 6:1>" + client->typeUses, "A a -> A <6:1 6:1>" )); TS_ASSERT(utility::containsElement( - client->typeUses, "aPtr -> A <7:1 7:1>" + client->typeUses, "A * aPtr -> A <7:1 7:1>" )); TS_ASSERT(utility::containsElement( - 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( - 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( - 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( - 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( - 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( - 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( 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( - 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( 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( - client->usages, "void A::A() -> A::foo <4:7 4:9>" + client->usages, "void A::A() -> A::T A::foo <4:7 4:9>" )); } diff --git a/src/test/JavaParserTestSuite.h b/src/test/JavaParserTestSuite.h index 09a58ee6..9519e383 100644 --- a/src/test/JavaParserTestSuite.h +++ b/src/test/JavaParserTestSuite.h @@ -158,6 +158,23 @@ public: )); } + void test_java_parser_finds_method_declaration_with_static_keyword_in_signature() + { + std::shared_ptr client = parseCode( + "package foo;\n" + "public class A\n" + "{\n" + " static public void bar()\n" + " {\n" + " };\n" + "}\n" + ); + + TS_ASSERT(utility::containsElement( + 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 client = parseCode( @@ -169,7 +186,7 @@ public: ); TS_ASSERT(utility::containsElement( - 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( - 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( - 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( - 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 client = parseCode( + "package foo;\n" + "public class A\n" + "{\n" + " static int bar;\n" + "}\n" + ); + + TS_ASSERT(utility::containsElement( + client->fields, "default static int foo.A.bar <4:13 4:15>" )); } @@ -455,7 +487,7 @@ public: ); TS_ASSERT(utility::containsElement( - 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( - 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( - 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( - client->typeUses, "A.t -> A.T <3:2 3:2>" + client->typeUses, "A.T A.t -> A.T <3:2 3:2>" )); } @@ -752,7 +784,7 @@ public: ); TS_ASSERT(utility::containsElement( - client->typeUses, "A.t -> A <3:2 3:2>" + client->typeUses, "A A.t -> A <3:2 3:2>" )); }