From 783e0ac060e8263d2fa734a147be37d317549881 Mon Sep 17 00:00:00 2001 From: malte_langkabel Date: Tue, 16 Aug 2016 15:22:59 +0200 Subject: [PATCH] data: recording braces in java * implemented recording of scope braces as local symbols for java --- java_indexer/build/build.sh | 2 - java_indexer/src/io/coati/ASTDumper.java | 4 +- java_indexer/src/io/coati/FileContent.java | 49 ++++++ java_indexer/src/io/coati/JavaAstVisitor.java | 41 ++++- java_indexer/src/io/coati/JavaIndexer.java | 6 +- src/test/JavaParserTestSuite.h | 159 +++++++++++++++++- 6 files changed, 244 insertions(+), 17 deletions(-) create mode 100644 java_indexer/src/io/coati/FileContent.java diff --git a/java_indexer/build/build.sh b/java_indexer/build/build.sh index 4a76f73a..49322f57 100755 --- a/java_indexer/build/build.sh +++ b/java_indexer/build/build.sh @@ -46,8 +46,6 @@ fi javac -d ./classes -classpath $CLASSPATH src/io/coati/*.java -echo $CLASSPATH - mkdir -p bin cd classes diff --git a/java_indexer/src/io/coati/ASTDumper.java b/java_indexer/src/io/coati/ASTDumper.java index bcf7bd3f..d4c7966e 100644 --- a/java_indexer/src/io/coati/ASTDumper.java +++ b/java_indexer/src/io/coati/ASTDumper.java @@ -11,8 +11,8 @@ import me.tomassetti.symbolsolver.model.resolution.TypeSolver; public class ASTDumper extends JavaAstVisitor{ - public ASTDumper(int callbackId, String filePath, TypeSolver typeSolver) { - super(callbackId, filePath, typeSolver); + public ASTDumper(int callbackId, String filePath, FileContent fileContent, TypeSolver typeSolver) { + super(callbackId, filePath, fileContent, typeSolver); } int indent = 0; diff --git a/java_indexer/src/io/coati/FileContent.java b/java_indexer/src/io/coati/FileContent.java new file mode 100644 index 00000000..f6b50f35 --- /dev/null +++ b/java_indexer/src/io/coati/FileContent.java @@ -0,0 +1,49 @@ +package io.coati; + +import java.util.Arrays; +import java.util.List; + +public class FileContent +{ + public class Location + { + public int line; + public int column; + + Location(int line, int column) + { + this.line = line; + this.column = column; + } + } + + private List m_lines; + + public FileContent(String text) + { + m_lines = Arrays.asList(text.split("\\r?\\n")); + } + + public Location find(String s) + { + return find(s, 1, 1); + } + + public Location find(String s, int fromLine, int fromColumn) + { + int lineIndex = fromLine - 1; + int startColumn = fromColumn - 1; + int column = -1; + while (lineIndex < m_lines.size()) + { + column = m_lines.get(lineIndex).indexOf(s, startColumn); + if (column != -1) + { + return new Location(lineIndex + 1, column + 1); + } + startColumn = 0; + lineIndex++; + } + return new Location(0, 0); + } +} diff --git a/java_indexer/src/io/coati/JavaAstVisitor.java b/java_indexer/src/io/coati/JavaAstVisitor.java index 8657a568..28b4c2dc 100644 --- a/java_indexer/src/io/coati/JavaAstVisitor.java +++ b/java_indexer/src/io/coati/JavaAstVisitor.java @@ -16,9 +16,12 @@ import com.github.javaparser.ast.body.VariableDeclarator; import com.github.javaparser.ast.body.VariableDeclaratorId; import com.github.javaparser.ast.comments.BlockComment; 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.VariableDeclarationExpr; +import com.github.javaparser.ast.stmt.BlockStmt; +import com.github.javaparser.ast.stmt.SwitchStmt; import com.github.javaparser.ast.type.ClassOrInterfaceType; import com.github.javaparser.ast.type.PrimitiveType; import com.github.javaparser.ast.type.Type; @@ -44,14 +47,16 @@ public class JavaAstVisitor extends JavaAstVisitorAdapter { private int m_callbackId = -1; private String m_filePath; + private FileContent m_fileContent; private TypeSolver m_typeSolver; private List m_context = new ArrayList(); private boolean m_verbose = false; - public JavaAstVisitor(int callbackId, String filePath, TypeSolver typeSolver) + public JavaAstVisitor(int callbackId, String filePath, FileContent fileContent, TypeSolver typeSolver) { m_callbackId = callbackId; m_filePath = filePath; + m_fileContent = fileContent; m_typeSolver = typeSolver; String[] filePathParts = filePath.split("/"); @@ -90,6 +95,9 @@ public class JavaAstVisitor extends JavaAstVisitorAdapter n.getBeginLine(), n.getBeginColumn(), n.getEndLine(), n.getEndColumn(), AccessKind.fromAccessSpecifier(ModifierSet.getAccessSpecifier(n.getModifiers())), false ); + + FileContent.Location scopeStartLocation = m_fileContent.find("{", n.getBeginLine(), n.getBeginColumn()); + recordScope(scopeStartLocation.line, scopeStartLocation.column, n.getEndLine(), n.getEndColumn()); List parentContext = m_context; m_context = new ArrayList(); @@ -139,6 +147,9 @@ public class JavaAstVisitor extends JavaAstVisitorAdapter AccessKind.fromAccessSpecifier(ModifierSet.getAccessSpecifier(n.getModifiers())), false ); + FileContent.Location scopeStartLocation = m_fileContent.find("{", n.getBeginLine(), n.getBeginColumn()); + recordScope(scopeStartLocation.line, scopeStartLocation.column, n.getEndLine(), n.getEndColumn()); + List parentContext = m_context; m_context = new ArrayList(); m_context.add(new DeclContext(qualifiedName)); @@ -754,12 +765,39 @@ public class JavaAstVisitor extends JavaAstVisitorAdapter return qualifiedName; } + @Override public void visit(final BlockStmt n, final Void v) + { + recordScope(n.getBeginLine(), n.getBeginColumn(), n.getEndLine(), n.getEndColumn()); + super.visit(n, v); + } + + @Override public void visit(final ArrayInitializerExpr n, final Void v) + { + recordScope(n.getBeginLine(), n.getBeginColumn(), n.getEndLine(), n.getEndColumn()); + super.visit(n, v); + } + + @Override public void visit(final SwitchStmt n, final Void v) + { + FileContent.Location scopeStartLocation = m_fileContent.find("{", n.getBeginLine(), n.getBeginColumn()); + recordScope(scopeStartLocation.line, scopeStartLocation.column, n.getEndLine(), n.getEndColumn()); + super.visit(n, v); + } + + private void recordScope(int beginLine, int beginColumn, int endLine, int endColumn) + { + String qualifiedName = m_filePath + "<" + beginLine + ":" + beginColumn + ">"; + JavaIndexer.recordLocalSymbol(m_callbackId, qualifiedName, beginLine, beginColumn, beginLine, beginColumn); + JavaIndexer.recordLocalSymbol(m_callbackId, qualifiedName, endLine, endColumn, endLine, endColumn); + } + @Override public void visit(final LineComment n, final Void v) { JavaIndexer.recordComment( m_callbackId, n.getBeginLine(), n.getBeginColumn(), n.getEndLine(), n.getEndColumn() ); + super.visit(n, v); } @Override public void visit(final BlockComment n, final Void v) @@ -768,5 +806,6 @@ public class JavaAstVisitor extends JavaAstVisitorAdapter m_callbackId, n.getBeginLine(), n.getBeginColumn(), n.getEndLine(), n.getEndColumn() ); + super.visit(n, v); } } \ No newline at end of file diff --git a/java_indexer/src/io/coati/JavaIndexer.java b/java_indexer/src/io/coati/JavaIndexer.java index 426d3273..ce5a28c6 100644 --- a/java_indexer/src/io/coati/JavaIndexer.java +++ b/java_indexer/src/io/coati/JavaIndexer.java @@ -48,9 +48,9 @@ public class JavaIndexer } } CompilationUnit cu = JavaParser.parse(new StringReader(fileContent), true); - - JavaAstVisitor astVisitor = new JavaAstVisitor(address, filePath, typeSolver); - // JavaAstVisitor astVisitor = new ASTDumper(address, filePath, typeSolver); + + // JavaAstVisitor astVisitor = new JavaAstVisitor(address, filePath, new FileContent(fileContent), typeSolver); + JavaAstVisitor astVisitor = new ASTDumper(address, filePath, new FileContent(fileContent), typeSolver); cu.accept(astVisitor, null); } catch (ParseException e) diff --git a/src/test/JavaParserTestSuite.h b/src/test/JavaParserTestSuite.h index 5e6529a8..0d2addc3 100644 --- a/src/test/JavaParserTestSuite.h +++ b/src/test/JavaParserTestSuite.h @@ -207,8 +207,12 @@ public: "}\n" ); - TS_ASSERT_EQUALS(client->localSymbols.size(), 1); - TS_ASSERT_EQUALS(client->localSymbols[0], "input.cc<4:15> <4:15 4:15>"); + TS_ASSERT_EQUALS(client->localSymbols.size(), 5); + TS_ASSERT_EQUALS(client->localSymbols[0], "input.cc<3:1> <3:1 3:1>"); + TS_ASSERT_EQUALS(client->localSymbols[1], "input.cc<3:1> <7:1 7:1>"); + TS_ASSERT_EQUALS(client->localSymbols[2], "input.cc<4:15> <4:15 4:15>"); + TS_ASSERT_EQUALS(client->localSymbols[3], "input.cc<5:2> <5:2 5:2>"); + TS_ASSERT_EQUALS(client->localSymbols[4], "input.cc<5:2> <6:2 6:2>"); } void test_java_parser_finds_definition_of_local_variable() @@ -224,8 +228,12 @@ public: "}\n" ); - TS_ASSERT_EQUALS(client->localSymbols.size(), 1); - TS_ASSERT_EQUALS(client->localSymbols[0], "input.cc<6:7> <6:7 6:7>"); + TS_ASSERT_EQUALS(client->localSymbols.size(), 5); + TS_ASSERT_EQUALS(client->localSymbols[0], "input.cc<3:1> <3:1 3:1>"); + TS_ASSERT_EQUALS(client->localSymbols[1], "input.cc<3:1> <8:1 8:1>"); + TS_ASSERT_EQUALS(client->localSymbols[2], "input.cc<5:2> <5:2 5:2>"); + TS_ASSERT_EQUALS(client->localSymbols[3], "input.cc<5:2> <7:2 7:2>"); + TS_ASSERT_EQUALS(client->localSymbols[4], "input.cc<6:7> <6:7 6:7>"); } void test_java_parser_finds_type_argument_name_in_signature_of_method() @@ -549,9 +557,13 @@ public: "}\n" ); - TS_ASSERT_EQUALS(client->localSymbols.size(), 2); - TS_ASSERT_EQUALS(client->localSymbols[0], "input.cc<4:15> <4:15 4:15>"); - TS_ASSERT_EQUALS(client->localSymbols[1], "input.cc<4:15> <6:3 6:3>"); + TS_ASSERT_EQUALS(client->localSymbols.size(), 6); + TS_ASSERT_EQUALS(client->localSymbols[0], "input.cc<3:1> <3:1 3:1>"); + TS_ASSERT_EQUALS(client->localSymbols[1], "input.cc<3:1> <8:1 8:1>"); + TS_ASSERT_EQUALS(client->localSymbols[2], "input.cc<4:15> <4:15 4:15>"); + TS_ASSERT_EQUALS(client->localSymbols[3], "input.cc<5:2> <5:2 5:2>"); + TS_ASSERT_EQUALS(client->localSymbols[4], "input.cc<5:2> <7:2 7:2>"); + TS_ASSERT_EQUALS(client->localSymbols[5], "input.cc<4:15> <6:3 6:3>"); } void test_java_parser_finds_assignment_of_local_variable() @@ -568,9 +580,138 @@ public: "}\n" ); + TS_ASSERT_EQUALS(client->localSymbols.size(), 6); + TS_ASSERT_EQUALS(client->localSymbols[0], "input.cc<3:1> <3:1 3:1>"); + TS_ASSERT_EQUALS(client->localSymbols[1], "input.cc<3:1> <9:1 9:1>"); + TS_ASSERT_EQUALS(client->localSymbols[2], "input.cc<5:2> <5:2 5:2>"); + TS_ASSERT_EQUALS(client->localSymbols[3], "input.cc<5:2> <8:2 8:2>"); + TS_ASSERT_EQUALS(client->localSymbols[4], "input.cc<6:7> <6:7 6:7>"); + TS_ASSERT_EQUALS(client->localSymbols[5], "input.cc<6:7> <7:3 7:3>"); + } + + void test_java_parser_finds_scope_of_class_declaration() + { + std::shared_ptr client = parseCode( + "public class A\n" + "{\n" + "}\n" + ); + TS_ASSERT_EQUALS(client->localSymbols.size(), 2); - TS_ASSERT_EQUALS(client->localSymbols[0], "input.cc<6:7> <6:7 6:7>"); - TS_ASSERT_EQUALS(client->localSymbols[1], "input.cc<6:7> <7:3 7:3>"); + TS_ASSERT_EQUALS(client->localSymbols[0], "input.cc<2:1> <2:1 2:1>"); + TS_ASSERT_EQUALS(client->localSymbols[1], "input.cc<2:1> <3:1 3:1>"); + } + + void test_java_parser_finds_scope_of_enum_declaration() + { + std::shared_ptr client = parseCode( + "public enum A\n" + "{\n" + "}\n" + ); + + TS_ASSERT_EQUALS(client->localSymbols.size(), 2); + TS_ASSERT_EQUALS(client->localSymbols[0], "input.cc<2:1> <2:1 2:1>"); + TS_ASSERT_EQUALS(client->localSymbols[1], "input.cc<2:1> <3:1 3:1>"); + } + + void test_java_parser_finds_scope_of_constructor_declaration() + { + std::shared_ptr client = parseCode( + "public class A\n" + "{\n" + " public A()\n" + " {\n" + " }\n" + "}\n" + ); + + TS_ASSERT_EQUALS(client->localSymbols.size(), 4); + TS_ASSERT_EQUALS(client->localSymbols[0], "input.cc<2:1> <2:1 2:1>"); + TS_ASSERT_EQUALS(client->localSymbols[1], "input.cc<2:1> <6:1 6:1>"); + TS_ASSERT_EQUALS(client->localSymbols[2], "input.cc<4:2> <4:2 4:2>"); + TS_ASSERT_EQUALS(client->localSymbols[3], "input.cc<4:2> <5:2 5:2>"); + } + + void test_java_parser_finds_scope_of_method_declaration() + { + std::shared_ptr client = parseCode( + "public class A\n" + "{\n" + " public void a()\n" + " {\n" + " }\n" + "}\n" + ); + + TS_ASSERT_EQUALS(client->localSymbols.size(), 4); + TS_ASSERT_EQUALS(client->localSymbols[0], "input.cc<2:1> <2:1 2:1>"); + TS_ASSERT_EQUALS(client->localSymbols[1], "input.cc<2:1> <6:1 6:1>"); + TS_ASSERT_EQUALS(client->localSymbols[2], "input.cc<4:2> <4:2 4:2>"); + TS_ASSERT_EQUALS(client->localSymbols[3], "input.cc<4:2> <5:2 5:2>"); + } + + void test_java_parser_finds_scope_of_switch_statement() + { + std::shared_ptr client = parseCode( + "public class A\n" + "{\n" + " public void a()\n" + " {\n" + " switch(2)\n" + " {\n" + " case 1:\n" + " break;\n" + " }\n" + " }\n" + "}\n" + ); + + TS_ASSERT_EQUALS(client->localSymbols.size(), 6); + TS_ASSERT_EQUALS(client->localSymbols[0], "input.cc<2:1> <2:1 2:1>"); + TS_ASSERT_EQUALS(client->localSymbols[1], "input.cc<2:1> <11:1 11:1>"); + TS_ASSERT_EQUALS(client->localSymbols[2], "input.cc<4:2> <4:2 4:2>"); + TS_ASSERT_EQUALS(client->localSymbols[3], "input.cc<4:2> <10:2 10:2>"); + TS_ASSERT_EQUALS(client->localSymbols[4], "input.cc<6:3> <6:3 6:3>"); + TS_ASSERT_EQUALS(client->localSymbols[5], "input.cc<6:3> <9:3 9:3>"); + } + + void test_java_parser_finds_scope_of_block_statement() + { + std::shared_ptr client = parseCode( + "public class A\n" + "{\n" + " public void a()\n" + " {\n" + " {\n" + " }\n" + " }\n" + "}\n" + ); + + TS_ASSERT_EQUALS(client->localSymbols.size(), 6); + TS_ASSERT_EQUALS(client->localSymbols[0], "input.cc<2:1> <2:1 2:1>"); + TS_ASSERT_EQUALS(client->localSymbols[1], "input.cc<2:1> <8:1 8:1>"); + TS_ASSERT_EQUALS(client->localSymbols[2], "input.cc<4:2> <4:2 4:2>"); + TS_ASSERT_EQUALS(client->localSymbols[3], "input.cc<4:2> <7:2 7:2>"); + TS_ASSERT_EQUALS(client->localSymbols[4], "input.cc<5:3> <5:3 5:3>"); + TS_ASSERT_EQUALS(client->localSymbols[5], "input.cc<5:3> <6:3 6:3>"); + } + + void test_java_parser_finds_scope_of_array_initialization_list() + { + std::shared_ptr client = parseCode( + "public class A\n" + "{\n" + " private int[] array = {1, 2};\n" + "}\n" + ); + + TS_ASSERT_EQUALS(client->localSymbols.size(), 4); + TS_ASSERT_EQUALS(client->localSymbols[0], "input.cc<2:1> <2:1 2:1>"); + TS_ASSERT_EQUALS(client->localSymbols[1], "input.cc<2:1> <4:1 4:1>"); + TS_ASSERT_EQUALS(client->localSymbols[2], "input.cc<3:24> <3:24 3:24>"); + TS_ASSERT_EQUALS(client->localSymbols[3], "input.cc<3:24> <3:29 3:29>"); } void test_java_parser_finds_usage_of_type_parameter_of_class()