Example usage for org.eclipse.jdt.internal.compiler.ast ASTNode HasAllMethodBodies

List of usage examples for org.eclipse.jdt.internal.compiler.ast ASTNode HasAllMethodBodies

Introduction

In this page you can find the example usage for org.eclipse.jdt.internal.compiler.ast ASTNode HasAllMethodBodies.

Prototype

int HasAllMethodBodies

To view the source code for org.eclipse.jdt.internal.compiler.ast ASTNode HasAllMethodBodies.

Click Source Link

Usage

From source file:lombok.core.debug.DebugSnapshot.java

License:Open Source License

public String shortToString() {
    StringBuilder out = new StringBuilder();
    out.append(String.format("WHEN: %14d THREAD: %s AST: %s HAMB: %b -- ", when, threadName, ownerName(),
            0 != (bits & ASTNode.HasAllMethodBodies)));
    if (message != null)
        out.append(" ").append(String.format(message, params));
    return out.toString();
}

From source file:lombok.eclipse.EclipseAST.java

License:Open Source License

private static boolean isComplete(CompilationUnitDeclaration unit) {
    return (unit.bits & ASTNode.HasAllMethodBodies) != 0;
}

From source file:org.eclipse.jdt.internal.compiler.parser.Parser.java

License:Open Source License

public void getMethodBodies(CompilationUnitDeclaration unit) {
    //fill the methods bodies in order for the code to be generated

    if (unit == null)
        return;/*from   w w  w .java  2 s  .c o  m*/

    if (unit.ignoreMethodBodies) {
        unit.ignoreFurtherInvestigation = true;
        return;
        // if initial diet parse did not work, no need to dig into method bodies.
    }

    if ((unit.bits & ASTNode.HasAllMethodBodies) != 0)
        return; //work already done ...

    // save existing values to restore them at the end of the parsing process
    // see bug 47079 for more details
    int[] oldLineEnds = this.scanner.lineEnds;
    int oldLinePtr = this.scanner.linePtr;

    //real parse of the method....
    CompilationResult compilationResult = unit.compilationResult;
    char[] contents = this.readManager != null ? this.readManager.getContents(compilationResult.compilationUnit)
            : compilationResult.compilationUnit.getContents();
    this.scanner.setSource(contents, compilationResult);

    if (this.javadocParser != null && this.javadocParser.checkDocComment) {
        this.javadocParser.scanner.setSource(contents);
    }
    if (unit.types != null) {
        for (int i = 0, length = unit.types.length; i < length; i++)
            unit.types[i].parseMethods(this, unit);
    }

    // tag unit has having read bodies
    unit.bits |= ASTNode.HasAllMethodBodies;

    // this is done to prevent any side effects on the compilation unit result
    // line separator positions array.
    this.scanner.lineEnds = oldLineEnds;
    this.scanner.linePtr = oldLinePtr;
}

From source file:org.eclipse.jdt.internal.compiler.parser.Parser.java

License:Open Source License

public CompilationUnitDeclaration parse(ICompilationUnit sourceUnit, CompilationResult compilationResult,
        int start, int end) {
    // parses a compilation unit and manages error handling (even bugs....)

    CompilationUnitDeclaration unit;/*from w w w.j  a  va  2  s .  co  m*/
    try {
        /* automaton initialization */
        initialize(true);
        goForCompilationUnit();

        /* unit creation */
        this.referenceContext = this.compilationUnit = new CompilationUnitDeclaration(this.problemReporter,
                compilationResult, 0);

        /* scanners initialization */
        char[] contents;
        try {
            contents = this.readManager != null ? this.readManager.getContents(sourceUnit)
                    : sourceUnit.getContents();
        } catch (AbortCompilationUnit abortException) {
            problemReporter().cannotReadSource(this.compilationUnit, abortException, this.options.verbose);
            contents = CharOperation.NO_CHAR; // pretend empty from thereon
        }
        this.scanner.setSource(contents);
        this.compilationUnit.sourceEnd = this.scanner.source.length - 1;
        if (end != -1)
            this.scanner.resetTo(start, end);
        if (this.javadocParser != null && this.javadocParser.checkDocComment) {
            this.javadocParser.scanner.setSource(contents);
            if (end != -1) {
                this.javadocParser.scanner.resetTo(start, end);
            }
        }
        /* run automaton */
        parse();
    } finally {
        unit = this.compilationUnit;
        this.compilationUnit = null; // reset parser
        // tag unit has having read bodies
        if (!this.diet)
            unit.bits |= ASTNode.HasAllMethodBodies;
    }
    return unit;
}

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://  w  ww  . j a  v  a 2s . c om
 *    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();
    }
}