From 54a34858378aecdc35c3a2834a524c6eeda3fbfd Mon Sep 17 00:00:00 2001 From: Benjamin Attal Date: Tue, 10 Jun 2014 13:15:28 -0400 Subject: [PATCH] Add parsing for import statements in java. --- bitshift/parser/python.py | 1 + .../com/bitshift/parsing/parsers/JavaParser.java | 14 ++++++++++++ .../com/bitshift/parsing/symbols/JavaSymbols.java | 25 ++++++++++++++++++++++ parsers/ruby/lib/parser.rb | 4 ++++ 4 files changed, 44 insertions(+) diff --git a/bitshift/parser/python.py b/bitshift/parser/python.py index 117b852..7284bac 100644 --- a/bitshift/parser/python.py +++ b/bitshift/parser/python.py @@ -178,6 +178,7 @@ class _TreeWalker(ast.NodeVisitor): def visit_Import(self, node): pos = self.block_position(node) + # look through aliases def parse_py(codelet): """ diff --git a/parsers/java/src/main/java/com/bitshift/parsing/parsers/JavaParser.java b/parsers/java/src/main/java/com/bitshift/parsing/parsers/JavaParser.java index dc83154..e84895e 100644 --- a/parsers/java/src/main/java/com/bitshift/parsing/parsers/JavaParser.java +++ b/parsers/java/src/main/java/com/bitshift/parsing/parsers/JavaParser.java @@ -15,6 +15,7 @@ import org.eclipse.jdt.core.dom.ASTParser; import org.eclipse.jdt.core.dom.ASTVisitor; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.ClassInstanceCreation; +import org.eclipse.jdt.core.dom.ImportDeclaration; import org.eclipse.jdt.core.dom.MethodDeclaration; import org.eclipse.jdt.core.dom.MethodInvocation; import org.eclipse.jdt.core.dom.Name; @@ -192,5 +193,18 @@ public class JavaParser extends Parser { return true; } + public boolean visit(ImportDeclaration node) { + HashMap data = new HashMap(); + + data.put("coord", this.blockPosition(node)); + this._cache.push(data); + return true; + } + + public void endVisit(ImportDeclaration node) { + HashMap data = this._cache.pop(); + String name = (String)data.remove("name"); + this.symbols.insertImportStatement("\"" + name + "\"", data); + } } } diff --git a/parsers/java/src/main/java/com/bitshift/parsing/symbols/JavaSymbols.java b/parsers/java/src/main/java/com/bitshift/parsing/symbols/JavaSymbols.java index 9c36d6b..8dd81c8 100644 --- a/parsers/java/src/main/java/com/bitshift/parsing/symbols/JavaSymbols.java +++ b/parsers/java/src/main/java/com/bitshift/parsing/symbols/JavaSymbols.java @@ -12,6 +12,7 @@ public class JavaSymbols extends Symbols { private HashMap> _interfaces; private HashMap> _methods; private HashMap> _vars; + private HashMap> _imports; private final String assignKey = "\"assignments\""; private final String useKey = "\"uses\""; @@ -22,6 +23,7 @@ public class JavaSymbols extends Symbols { _interfaces = new HashMap>(); _methods = new HashMap>(); _vars = new HashMap>(); + _imports = new HashMap>(); } public boolean setPackage(String name) { @@ -116,6 +118,7 @@ public class JavaSymbols extends Symbols { this._vars.put(name, var); return true; } + public boolean insertVariableAccess(String name, HashMap data) { HashMap var = this._vars.get(name); if (var == null) { @@ -137,12 +140,34 @@ public class JavaSymbols extends Symbols { return true; } + public boolean insertImportStatement(String name, HashMap data) { + HashMap lib = this._imports.get(name); + if (lib == null) { + lib = new HashMap(); + ArrayList assignments = new ArrayList(10); + ArrayList uses = new ArrayList(10); + + uses.add(data.get("coord")); + lib.put(assignKey, assignments); + lib.put(useKey, uses); + } else { + ArrayList uses = (ArrayList)lib.get(useKey); + + uses.add(data.get("coord")); + lib.put(useKey, uses); + } + + this._imports.put(name, lib); + return true; + } + public String toString() { StringBuilder builder = new StringBuilder(); builder.append("\"classes\":" + this._classes + ","); builder.append("\"interfaces\":" + this._interfaces + ","); builder.append("\"functions\":" + this._methods + ","); builder.append("\"vars\":" + this._vars + ","); + builder.append("\"imports\":" + this._imports + ","); String s = builder.toString().replaceAll("=", ":"); s = s.substring(0, s.length() - 1); diff --git a/parsers/ruby/lib/parser.rb b/parsers/ruby/lib/parser.rb index 5d5d699..087a317 100644 --- a/parsers/ruby/lib/parser.rb +++ b/parsers/ruby/lib/parser.rb @@ -123,6 +123,10 @@ module Bitshift return node end + def on_command(*node) + # catch require statements + end + def to_s new_symbols = Hash.new {|hash, key| hash[key] = Hash.new}