Categorías
Java Development Tools (JDT)

¿Cómo resolver enlaces al usar Eclipse JDT ASTParser?

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;
	}
}
  Tutorial de Eclipse JDT: carga dinámica de proyectos Java en el espacio de trabajo

Producción:

Binding activated.
------------------
binding variable declaration: ArrayList al[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]

Por Programación.Click

Más de 20 años programando en diferentes lenguajes de programación. Apasionado del code clean y el terminar lo que se empieza. ¿Programamos de verdad?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *