package de.ovgu.cide.typing.jdt.checks.resolutions; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.IBinding; import org.eclipse.jdt.core.dom.IMethodBinding; import org.eclipse.jdt.core.dom.ITypeBinding; import cide.gast.IASTNode; import cide.gparser.ParseException; import de.ovgu.cide.language.jdt.ASTBridge; import de.ovgu.cide.language.jdt.JDTParserWrapper; /** * to resolve a binding, we need to parse (JDT) the target file and find the * according node, then convert it back to an IASTNode */ public class ASTBindingFinderHelper { public static IASTNode getFieldDecl(IBinding binding) { CompilationUnit ast = getAST(binding); if (ast == null) return null; ASTBindingFinder bindingFinder = new ASTBindingFinder(binding.getKey()); ast.accept(bindingFinder); ASTNode result = bindingFinder.getResult(); if (result == null) return null; return ASTBridge.bridge(result); } public static IASTNode getMethodDecl(IMethodBinding binding) { CompilationUnit ast = getAST(binding); if (ast == null) return null; ASTBindingFinder bindingFinder = new ASTBindingFinder(binding.getKey()); ast.accept(bindingFinder); ASTNode result = bindingFinder.getResult(); if (result == null) return null; return ASTBridge.bridge(result); } public static IASTNode getTypeDecl(ITypeBinding binding) { CompilationUnit ast = getAST(binding); if (ast == null) return null; ASTBindingFinder bindingFinder = new ASTBindingFinder(binding.getKey()); ast.accept(bindingFinder); ASTNode result = bindingFinder.getResult(); if (result == null) return null; return ASTBridge.bridge(result); } private static CompilationUnit getAST(IBinding binding) { IJavaElement element = binding.getJavaElement(); if (element == null) return null; IResource res = element.getResource(); if (!(res instanceof IFile)) return null; try { return JDTParserWrapper.parseJavaFile((IFile) res); } catch (ParseException e) { e.printStackTrace(); // if in doubt no error return null; } } }