Cuando usamos ASTParser, a menudo necesitamos encontrar el tipo de variable en el código. Esta información está contenida en el enlace. El siguiente código muestra cómo escribir un ASTParser independiente para analizar un archivo Java y obtener la información de tipo de las variables en el código.
El código de destino para analizar:
package test; import java.util.ArrayList; public class Apple { public static void main(String[] args) { ArrayList<String> al = null; int j =0; System.out.println(j); System.out.println(al); } } |
Resuelva los enlaces utilizando Eclipse JDT ASTParser:
package test; import greenblocks.util.Util; import java.io.File; import java.util.Iterator; import java.util.Map; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.dom.AST; 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.IVariableBinding; import org.eclipse.jdt.core.dom.VariableDeclarationFragment; import org.eclipse.jdt.core.dom.VariableDeclarationStatement; public class ASTTester { public static void main(String[] args) { String path ="C:UserspcworkspaceasttestersrctestApple.java"; File file = new File(path); String str = Util.readFileToString(file); ASTParser parser = ASTParser.newParser(AST.JLS8); parser.setResolveBindings(true); parser.setKind(ASTParser.K_COMPILATION_UNIT); parser.setBindingsRecovery(true); Map options = JavaCore.getOptions(); parser.setCompilerOptions(options); String unitName = "Apple.java"; parser.setUnitName(unitName); String[] sources = { "C:Userspcworkspaceasttestersrc" }; String[] classpath = {"C:Program FilesJavajre1.8.0_25librt.jar"}; parser.setEnvironment(classpath, sources, new String[] { "UTF-8"}, true); parser.setSource(str.toCharArray()); CompilationUnit cu = (CompilationUnit) parser.createAST(null); if (cu.getAST().hasBindingsRecovery()) { System.out.println("Binding activated."); } TypeFinderVisitor v = new TypeFinderVisitor(); cu.accept(v); } } class TypeFinderVisitor extends ASTVisitor{ public boolean visit(VariableDeclarationStatement node){ for (Iterator iter = node.fragments().iterator(); iter.hasNext();) { System.out.println("------------------"); VariableDeclarationFragment fragment = (VariableDeclarationFragment) iter.next(); IVariableBinding binding = fragment.resolveBinding(); System.out.println("binding variable declaration: " +binding.getVariableDeclaration()); System.out.println("binding: " +binding); } return true; } } |
Producción:
Binding activated. ------------------ binding variable declaration: ArrayListal[pos: unused][id:1] binding: ArrayList al[pos: unused][id:1] ------------------ binding variable declaration: int j[pos: unused][id:2] binding: int j[pos: unused][id:2]