Example usage for org.eclipse.jdt.internal.core.util ASTNodeFinder ASTNodeFinder

List of usage examples for org.eclipse.jdt.internal.core.util ASTNodeFinder ASTNodeFinder

Introduction

In this page you can find the example usage for org.eclipse.jdt.internal.core.util ASTNodeFinder ASTNodeFinder.

Prototype

public ASTNodeFinder(CompilationUnitDeclaration unit) 

Source Link

Usage

From source file:com.codenvy.ide.ext.java.server.internal.core.search.matching.MatchLocator.java

License:Open Source License

public MethodBinding getMethodBinding(MethodPattern methodPattern) {
    MethodBinding methodBinding = getMethodBinding0(methodPattern);
    if (methodBinding != null)
        return methodBinding; // known to be valid.
    // special handling for methods of anonymous/local types. Since these cannot be looked up in the environment the usual way ...
    if (methodPattern.focus instanceof SourceMethod) {
        char[] typeName = PatternLocator.qualifiedPattern(methodPattern.declaringSimpleName,
                methodPattern.declaringQualification);
        if (CharOperation.indexOf(IIndexConstants.ONE_STAR, typeName, true) >= 0) { // See org.eclipse.jdt.core.search.SearchPattern.enclosingTypeNames(IType)
            IType type = methodPattern.declaringType;
            IType enclosingType = type.getDeclaringType();
            while (enclosingType != null) {
                type = enclosingType;//  ww w. jav  a2s. c  o  m
                enclosingType = type.getDeclaringType();
            }
            typeName = type.getFullyQualifiedName().toCharArray();
            TypeBinding declaringTypeBinding = getType(typeName, typeName);
            if (declaringTypeBinding instanceof SourceTypeBinding) {
                SourceTypeBinding sourceTypeBinding = ((SourceTypeBinding) declaringTypeBinding);
                ClassScope skope = sourceTypeBinding.scope;
                if (skope != null) {
                    CompilationUnitDeclaration unit = skope.referenceCompilationUnit();
                    if (unit != null) {
                        AbstractMethodDeclaration amd = new ASTNodeFinder(unit)
                                .findMethod((IMethod) methodPattern.focus);
                        if (amd != null && amd.binding != null && amd.binding.isValidBinding()) {
                            this.bindings.put(methodPattern, amd.binding);
                            return amd.binding;
                        }
                    }
                }
            }
        }
    }
    return null;
}

From source file:com.codenvy.ide.ext.java.server.internal.core.search.matching.SuperTypeNamesCollector.java

License:Open Source License

public char[][][] collect() throws JavaModelException {
    if (this.type != null) {
        // Collect the paths of the cus that are in the hierarchy of the given type
        this.result = new char[1][][];
        this.resultIndex = 0;
        JavaProject javaProject = (JavaProject) this.type.getJavaProject();
        this.locator.initialize(javaProject, 0);
        try {/*from  w  w  w . j a  va  2s.  c o  m*/
            if (this.type.isBinary()) {
                BinaryTypeBinding binding = this.locator.cacheBinaryType(this.type, null);
                if (binding != null)
                    collectSuperTypeNames(binding, null);
            } else {
                ICompilationUnit unit = this.type.getCompilationUnit();
                SourceType sourceType = (SourceType) this.type;
                boolean isTopLevelOrMember = sourceType.getOuterMostLocalContext() == null;
                CompilationUnitDeclaration parsedUnit = buildBindings(unit, isTopLevelOrMember);
                if (parsedUnit != null) {
                    TypeDeclaration typeDecl = new ASTNodeFinder(parsedUnit).findType(this.type);
                    if (typeDecl != null && typeDecl.binding != null)
                        collectSuperTypeNames(typeDecl.binding, null);
                }
            }
        } catch (AbortCompilation e) {
            // problem with classpath: report inaccurate matches
            return null;
        }
        if (this.result.length > this.resultIndex)
            System.arraycopy(this.result, 0, this.result = new char[this.resultIndex][][], 0, this.resultIndex);
        return this.result;
    }

    // Collect the paths of the cus that declare a type which matches declaringQualification + declaringSimpleName
    String[] paths = getPathsOfDeclaringType();
    if (paths == null)
        return null;

    // Create bindings from source types and binary types and collect super type names of the type declaration
    // that match the given declaring type
    Util.sort(paths); // sort by projects
    JavaProject previousProject = null;
    this.result = new char[1][][];
    this.samePackageSuperTypeName = new char[1][][];
    this.resultIndex = 0;
    for (int i = 0, length = paths.length; i < length; i++) {
        try {
            //todo Openable
            Openable openable = null;//this.locator.handleFactory.createOpenable(paths[i], this.locator.scope);
            if (openable == null)
                continue; // outside classpath

            IJavaProject project = openable.getJavaProject();
            if (!project.equals(previousProject)) {
                previousProject = (JavaProject) project;
                this.locator.initialize(previousProject, 0);
            }
            if (openable instanceof ICompilationUnit) {
                ICompilationUnit unit = (ICompilationUnit) openable;
                CompilationUnitDeclaration parsedUnit = buildBindings(unit,
                        true /*only top level and member types are visible to the focus type*/);
                if (parsedUnit != null)
                    parsedUnit.traverse(new TypeDeclarationVisitor(), parsedUnit.scope);
            } else if (openable instanceof IClassFile) {
                IClassFile classFile = (IClassFile) openable;
                BinaryTypeBinding binding = this.locator.cacheBinaryType(classFile.getType(), null);
                if (matches(binding))
                    collectSuperTypeNames(binding, binding.compoundName);
            }
        } catch (AbortCompilation e) {
            // ignore: continue with next element
        } catch (JavaModelException e) {
            // ignore: continue with next element
        }
    }
    if (this.result.length > this.resultIndex)
        System.arraycopy(this.result, 0, this.result = new char[this.resultIndex][][], 0, this.resultIndex);
    return this.result;
}

From source file:org.eclipse.che.jdt.internal.core.search.matching.MatchLocator.java

License:Open Source License

public MethodBinding getMethodBinding(MethodPattern methodPattern) {
    MethodBinding methodBinding = getMethodBinding0(methodPattern);
    if (methodBinding != null)
        return methodBinding; // known to be valid.
    // special handling for methods of anonymous/local types. Since these cannot be looked up in the environment the usual way ...
    if (methodPattern.focus instanceof SourceMethod) {
        char[] typeName = PatternLocator.qualifiedPattern(methodPattern.declaringSimpleName,
                methodPattern.declaringQualification);
        if (typeName != null && CharOperation.indexOf(IIndexConstants.ONE_STAR, typeName, true) >= 0) { // See org.eclipse.jdt.core.search.SearchPattern.enclosingTypeNames(IType)
            IType type = methodPattern.declaringType;
            IType enclosingType = type.getDeclaringType();
            while (enclosingType != null) {
                type = enclosingType;/*from   ww w .  ja  v a 2  s  . c  o  m*/
                enclosingType = type.getDeclaringType();
            }
            typeName = type.getFullyQualifiedName().toCharArray();
            TypeBinding declaringTypeBinding = getType(typeName, typeName);
            if (declaringTypeBinding instanceof SourceTypeBinding) {
                SourceTypeBinding sourceTypeBinding = ((SourceTypeBinding) declaringTypeBinding);
                ClassScope skope = sourceTypeBinding.scope;
                if (skope != null) {
                    CompilationUnitDeclaration unit = skope.referenceCompilationUnit();
                    if (unit != null) {
                        AbstractMethodDeclaration amd = new ASTNodeFinder(unit)
                                .findMethod((IMethod) methodPattern.focus);
                        if (amd != null && amd.binding != null && amd.binding.isValidBinding()) {
                            this.bindings.put(methodPattern, amd.binding);
                            return amd.binding;
                        }
                    }
                }
            }
        }
    }
    return null;
}

From source file:org.eclipse.che.jdt.internal.core.search.matching.SuperTypeNamesCollector.java

License:Open Source License

public char[][][] collect() throws JavaModelException {
    if (this.type != null) {
        // Collect the paths of the cus that are in the hierarchy of the given type
        this.result = new char[1][][];
        this.resultIndex = 0;
        JavaProject javaProject = (JavaProject) this.type.getJavaProject();
        this.locator.initialize(javaProject, 0);
        try {//from w  w w.  ja  va  2 s  .c  o  m
            if (this.type.isBinary()) {
                BinaryTypeBinding binding = this.locator.cacheBinaryType(this.type, null);
                if (binding != null)
                    collectSuperTypeNames(binding, null);
            } else {
                ICompilationUnit unit = this.type.getCompilationUnit();
                SourceType sourceType = (SourceType) this.type;
                boolean isTopLevelOrMember = sourceType.getOuterMostLocalContext() == null;
                CompilationUnitDeclaration parsedUnit = buildBindings(unit, isTopLevelOrMember);
                if (parsedUnit != null) {
                    TypeDeclaration typeDecl = new ASTNodeFinder(parsedUnit).findType(this.type);
                    if (typeDecl != null && typeDecl.binding != null)
                        collectSuperTypeNames(typeDecl.binding, null);
                }
            }
        } catch (AbortCompilation e) {
            // problem with classpath: report inaccurate matches
            return null;
        }
        if (this.result.length > this.resultIndex)
            System.arraycopy(this.result, 0, this.result = new char[this.resultIndex][][], 0, this.resultIndex);
        return this.result;
    }

    // Collect the paths of the cus that declare a type which matches declaringQualification + declaringSimpleName
    String[] paths = getPathsOfDeclaringType();
    if (paths == null)
        return null;

    // Create bindings from source types and binary types and collect super type names of the type declaration
    // that match the given declaring type
    Util.sort(paths); // sort by projects
    JavaProject previousProject = null;
    this.result = new char[1][][];
    this.samePackageSuperTypeName = new char[1][][];
    this.resultIndex = 0;
    for (int i = 0, length = paths.length; i < length; i++) {
        try {
            Openable openable = this.locator.handleFactory.createOpenable(paths[i], this.locator.scope);
            if (openable == null)
                continue; // outside classpath

            IJavaProject project = openable.getJavaProject();
            if (!project.equals(previousProject)) {
                previousProject = (JavaProject) project;
                this.locator.initialize(previousProject, 0);
            }
            if (openable instanceof ICompilationUnit) {
                ICompilationUnit unit = (ICompilationUnit) openable;
                CompilationUnitDeclaration parsedUnit = buildBindings(unit,
                        true /*only top level and member types are visible to the focus type*/);
                if (parsedUnit != null)
                    parsedUnit.traverse(new TypeDeclarationVisitor(), parsedUnit.scope);
            } else if (openable instanceof IClassFile) {
                IClassFile classFile = (IClassFile) openable;
                BinaryTypeBinding binding = this.locator.cacheBinaryType(classFile.getType(), null);
                if (matches(binding))
                    collectSuperTypeNames(binding, binding.compoundName);
            }
        } catch (AbortCompilation e) {
            // ignore: continue with next element
        } catch (JavaModelException e) {
            // ignore: continue with next element
        }
    }
    if (this.result.length > this.resultIndex)
        System.arraycopy(this.result, 0, this.result = new char[this.resultIndex][][], 0, this.resultIndex);
    return this.result;
}

From source file:org.eclipse.jdt.internal.core.hierarchy.HierarchyResolver.java

License:Open Source License

/**
 * Resolve the supertypes for the types contained in the given openables (ICompilationUnits and/or IClassFiles).
 * Inform the requestor of the resolved supertypes for each
 * supplied source type using:/*from   ww  w  . java2s.  com*/
 *    connect(ISourceType suppliedType, IGenericType superclass, IGenericType[] superinterfaces)
 *
 * Also inform the requestor of the supertypes of each
 * additional requested super type which is also a source type
 * instead of a binary type.
 * @param openables
 * @param localTypes
 * @param monitor
 */
public void resolve(Openable[] openables, HashSet localTypes, IProgressMonitor monitor) {
    try {
        int openablesLength = openables.length;
        CompilationUnitDeclaration[] parsedUnits = new CompilationUnitDeclaration[openablesLength];
        boolean[] hasLocalType = new boolean[openablesLength];
        org.eclipse.jdt.core.ICompilationUnit[] cus = new org.eclipse.jdt.core.ICompilationUnit[openablesLength];
        int unitsIndex = 0;

        CompilationUnitDeclaration focusUnit = null;
        ReferenceBinding focusBinaryBinding = null;
        IType focus = this.builder.getType();
        Openable focusOpenable = null;
        if (focus != null) {
            if (focus.isBinary()) {
                focusOpenable = (Openable) focus.getClassFile();
            } else {
                focusOpenable = (Openable) focus.getCompilationUnit();
            }
        }

        // build type bindings

        // GROOVY start: ensure downstream groovy parses share the same compilationunit
        /* old {
        Parser parser = new Parser(this.lookupEnvironment.problemReporter, true);
        } new */
        Parser parser = LanguageSupportFactory.getParser(this, this.lookupEnvironment.globalOptions,
                this.lookupEnvironment.problemReporter, true, 1);
        // GROOVY end
        for (int i = 0; i < openablesLength; i++) {
            Openable openable = openables[i];
            if (openable instanceof org.eclipse.jdt.core.ICompilationUnit) {
                org.eclipse.jdt.core.ICompilationUnit cu = (org.eclipse.jdt.core.ICompilationUnit) openable;

                // contains a potential subtype as a local or anonymous type?
                boolean containsLocalType = false;
                if (localTypes == null) { // case of hierarchy on region
                    containsLocalType = true;
                } else {
                    IPath path = cu.getPath();
                    containsLocalType = localTypes.contains(path.toString());
                }

                // build parsed unit
                CompilationUnitDeclaration parsedUnit = null;
                if (cu.isOpen()) {
                    // create parsed unit from source element infos
                    CompilationResult result = new CompilationResult((ICompilationUnit) cu, i, openablesLength,
                            this.options.maxProblemsPerUnit);
                    SourceTypeElementInfo[] typeInfos = null;
                    try {
                        IType[] topLevelTypes = cu.getTypes();
                        int topLevelLength = topLevelTypes.length;
                        if (topLevelLength == 0)
                            continue; // empty cu: no need to parse (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=65677)
                        typeInfos = new SourceTypeElementInfo[topLevelLength];
                        for (int j = 0; j < topLevelLength; j++) {
                            IType topLevelType = topLevelTypes[j];
                            typeInfos[j] = (SourceTypeElementInfo) ((JavaElement) topLevelType)
                                    .getElementInfo();
                        }
                    } catch (JavaModelException e) {
                        // types/cu exist since cu is opened
                    }
                    int flags = !containsLocalType ? SourceTypeConverter.MEMBER_TYPE
                            : SourceTypeConverter.FIELD_AND_METHOD | SourceTypeConverter.MEMBER_TYPE
                                    | SourceTypeConverter.LOCAL_TYPE;
                    parsedUnit = SourceTypeConverter.buildCompilationUnit(typeInfos, flags,
                            this.lookupEnvironment.problemReporter, result);

                    // We would have got all the necessary local types by now and hence there is no further need 
                    // to parse the method bodies. Parser.getMethodBodies, which is called latter in this function, 
                    // will not parse the method statements if ASTNode.HasAllMethodBodies is set. 
                    if (containsLocalType)
                        parsedUnit.bits |= ASTNode.HasAllMethodBodies;
                } else {
                    // create parsed unit from file
                    IFile file = (IFile) cu.getResource();
                    ICompilationUnit sourceUnit = this.builder.createCompilationUnitFromPath(openable, file);

                    CompilationResult unitResult = new CompilationResult(sourceUnit, i, openablesLength,
                            this.options.maxProblemsPerUnit);
                    parsedUnit = parser.dietParse(sourceUnit, unitResult);
                }

                if (parsedUnit != null) {
                    hasLocalType[unitsIndex] = containsLocalType;
                    cus[unitsIndex] = cu;
                    parsedUnits[unitsIndex++] = parsedUnit;
                    try {
                        this.lookupEnvironment.buildTypeBindings(parsedUnit, null /*no access restriction*/);
                        if (openable.equals(focusOpenable)) {
                            focusUnit = parsedUnit;
                        }
                    } catch (AbortCompilation e) {
                        // classpath problem for this type: ignore
                    }
                }
            } else {
                // cache binary type binding
                ClassFile classFile = (ClassFile) openable;
                IBinaryType binaryType = (IBinaryType) JavaModelManager.getJavaModelManager()
                        .getInfo(classFile.getType());
                if (binaryType == null) {
                    // create binary type from file
                    if (classFile.getPackageFragmentRoot().isArchive()) {
                        binaryType = this.builder.createInfoFromClassFileInJar(classFile);
                    } else {
                        IResource file = classFile.resource();
                        binaryType = this.builder.createInfoFromClassFile(classFile, file);
                    }
                }
                if (binaryType != null) {
                    try {
                        BinaryTypeBinding binaryTypeBinding = this.lookupEnvironment.cacheBinaryType(binaryType,
                                false/*don't need field and method (bug 125067)*/,
                                null /*no access restriction*/);
                        remember(binaryType, binaryTypeBinding);
                        if (openable.equals(focusOpenable)) {
                            focusBinaryBinding = binaryTypeBinding;
                        }
                    } catch (AbortCompilation e) {
                        // classpath problem for this type: ignore
                    }
                }
            }
        }

        // remember type declaration of focus if local/anonymous early (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=210498)
        TypeDeclaration focusLocalType = null;
        if (focus != null && focusBinaryBinding == null && focusUnit != null
                && ((Member) focus).getOuterMostLocalContext() != null) {
            focusLocalType = new ASTNodeFinder(focusUnit).findType(focus);
        }

        for (int i = 0; i <= this.typeIndex; i++) {
            IGenericType suppliedType = this.typeModels[i];
            if (suppliedType != null && suppliedType.isBinaryType()) {
                CompilationUnitDeclaration previousUnitBeingCompleted = this.lookupEnvironment.unitBeingCompleted;
                // fault in its hierarchy...
                try {
                    // ensure that unitBeingCompleted is set so that we don't get an AbortCompilation for a missing type
                    // (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=213249 )
                    if (previousUnitBeingCompleted == null) {
                        this.lookupEnvironment.unitBeingCompleted = FakeUnit;
                    }
                    ReferenceBinding typeBinding = this.typeBindings[i];
                    typeBinding.superclass();
                    typeBinding.superInterfaces();
                } catch (AbortCompilation e) {
                    // classpath problem for this type: ignore
                } finally {
                    this.lookupEnvironment.unitBeingCompleted = previousUnitBeingCompleted;
                }
            }
        }

        // complete type bindings (i.e. connect super types)
        for (int i = 0; i < unitsIndex; i++) {
            CompilationUnitDeclaration parsedUnit = parsedUnits[i];
            if (parsedUnit != null) {
                try {
                    if (hasLocalType[i]) { // NB: no-op if method bodies have been already parsed
                        if (monitor != null && monitor.isCanceled())
                            throw new OperationCanceledException();
                        parser.getMethodBodies(parsedUnit);
                    }
                } catch (AbortCompilation e) {
                    // classpath problem for this type: don't try to resolve (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=49809)
                    hasLocalType[i] = false;
                }
            }
        }
        // complete type bindings and build fields and methods only for local types
        // (in this case the constructor is needed when resolving local types)
        // (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=145333)
        try {
            this.lookupEnvironment.completeTypeBindings(parsedUnits, hasLocalType, unitsIndex);
            // remember type bindings
            for (int i = 0; i < unitsIndex; i++) {
                CompilationUnitDeclaration parsedUnit = parsedUnits[i];
                if (parsedUnit != null && !parsedUnit.hasErrors()) {
                    boolean containsLocalType = hasLocalType[i];
                    if (containsLocalType) {
                        if (monitor != null && monitor.isCanceled())
                            throw new OperationCanceledException();
                        parsedUnit.scope.faultInTypes();
                        parsedUnit.resolve();
                    }

                    rememberAllTypes(parsedUnit, cus[i], containsLocalType);
                }
            }
        } catch (AbortCompilation e) {
            // skip it silently
        }
        worked(monitor, 1);

        // if no potential subtype was a real subtype of the binary focus type, no need to go further
        // (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=54043)
        if (focusBinaryBinding == null && focus != null && focus.isBinary()) {
            char[] fullyQualifiedName = focus.getFullyQualifiedName().toCharArray();
            focusBinaryBinding = this.lookupEnvironment
                    .getCachedType(CharOperation.splitOn('.', fullyQualifiedName));
            if (focusBinaryBinding == null)
                return;
        }

        reportHierarchy(focus, focusLocalType, focusBinaryBinding);

    } catch (ClassCastException e) { // work-around for 1GF5W1S - can happen in case duplicates are fed to the hierarchy with binaries hiding sources
    } catch (AbortCompilation e) { // ignore this exception for now since it typically means we cannot find java.lang.Object
        if (TypeHierarchy.DEBUG)
            e.printStackTrace();
    } finally {
        reset();
    }
}