Example usage for org.eclipse.jdt.internal.compiler.lookup Binding NO_METHODS

List of usage examples for org.eclipse.jdt.internal.compiler.lookup Binding NO_METHODS

Introduction

In this page you can find the example usage for org.eclipse.jdt.internal.compiler.lookup Binding NO_METHODS.

Prototype

MethodBinding[] NO_METHODS

To view the source code for org.eclipse.jdt.internal.compiler.lookup Binding NO_METHODS.

Click Source Link

Usage

From source file:org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding.java

License:Open Source License

public MethodBinding[] getMethods(char[] selector) {
    return Binding.NO_METHODS;
}

From source file:org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding.java

License:Open Source License

public MethodBinding[] methods() {
    return Binding.NO_METHODS;
}

From source file:org.eclipse.jdt.internal.compiler.lookup.Scope.java

License:Open Source License

public MethodBinding getConstructor(ReferenceBinding receiverType, TypeBinding[] argumentTypes,
        InvocationSite invocationSite) {
    CompilationUnitScope unitScope = compilationUnitScope();
    LookupEnvironment env = unitScope.environment;
    try {/*from   ww w  . jav a2 s  .c  o  m*/
        env.missingClassFileLocation = invocationSite;
        unitScope.recordTypeReference(receiverType);
        unitScope.recordTypeReferences(argumentTypes);
        MethodBinding methodBinding = receiverType.getExactConstructor(argumentTypes);
        if (methodBinding != null && methodBinding.canBeSeenBy(invocationSite, this)) {
            // targeting a non generic constructor with type arguments ?
            if (invocationSite.genericTypeArguments() != null)
                methodBinding = computeCompatibleMethod(methodBinding, argumentTypes, invocationSite);
            return methodBinding;
        }
        MethodBinding[] methods = receiverType.getMethods(TypeConstants.INIT, argumentTypes.length);
        if (methods == Binding.NO_METHODS)
            return new ProblemMethodBinding(TypeConstants.INIT, argumentTypes, ProblemReasons.NotFound);

        MethodBinding[] compatible = new MethodBinding[methods.length];
        int compatibleIndex = 0;
        MethodBinding problemMethod = null;
        for (int i = 0, length = methods.length; i < length; i++) {
            MethodBinding compatibleMethod = computeCompatibleMethod(methods[i], argumentTypes, invocationSite);
            if (compatibleMethod != null) {
                if (compatibleMethod.isValidBinding())
                    compatible[compatibleIndex++] = compatibleMethod;
                else if (problemMethod == null)
                    problemMethod = compatibleMethod;
            }
        }
        if (compatibleIndex == 0) {
            if (problemMethod == null)
                return new ProblemMethodBinding(methods[0], TypeConstants.INIT, argumentTypes,
                        ProblemReasons.NotFound);
            return problemMethod;
        }
        // need a more descriptive error... cannot convert from X to Y

        MethodBinding[] visible = new MethodBinding[compatibleIndex];
        int visibleIndex = 0;
        for (int i = 0; i < compatibleIndex; i++) {
            MethodBinding method = compatible[i];
            if (method.canBeSeenBy(invocationSite, this))
                visible[visibleIndex++] = method;
        }
        if (visibleIndex == 1)
            return visible[0];
        if (visibleIndex == 0)
            return new ProblemMethodBinding(compatible[0], TypeConstants.INIT, compatible[0].parameters,
                    ProblemReasons.NotVisible);
        // all of visible are from the same declaringClass, even before 1.4 we can call this method instead of mostSpecificClassMethodBinding
        return mostSpecificMethodBinding(visible, visibleIndex, argumentTypes, invocationSite, receiverType);
    } catch (AbortCompilation e) {
        e.updateContext(invocationSite, referenceCompilationUnit().compilationResult);
        throw e;
    } finally {
        env.missingClassFileLocation = null;
    }
}

From source file:org.eclipse.jdt.internal.compiler.lookup.Scope.java

License:Open Source License

public MethodBinding getImplicitMethod(char[] selector, TypeBinding[] argumentTypes,
        InvocationSite invocationSite) {

    boolean insideStaticContext = false;
    boolean insideConstructorCall = false;
    boolean insideTypeAnnotation = false;
    MethodBinding foundMethod = null;//from  w ww  .j  av  a  2s .  c o  m
    MethodBinding foundProblem = null;
    boolean foundProblemVisible = false;
    Scope scope = this;
    int depth = 0;
    // in 1.4 mode (inherited visible shadows enclosing)
    CompilerOptions options;
    boolean inheritedHasPrecedence = (options = compilerOptions()).complianceLevel >= ClassFileConstants.JDK1_4;

    done: while (true) { // done when a COMPILATION_UNIT_SCOPE is found
        switch (scope.kind) {
        case METHOD_SCOPE:
            MethodScope methodScope = (MethodScope) scope;
            insideStaticContext |= methodScope.isStatic;
            insideConstructorCall |= methodScope.isConstructorCall;
            insideTypeAnnotation = methodScope.insideTypeAnnotation;
            break;
        case CLASS_SCOPE:
            ClassScope classScope = (ClassScope) scope;
            ReferenceBinding receiverType = classScope.enclosingReceiverType();
            if (!insideTypeAnnotation) {
                // retrieve an exact visible match (if possible)
                // compilationUnitScope().recordTypeReference(receiverType);   not needed since receiver is the source type
                MethodBinding methodBinding = classScope.findExactMethod(receiverType, selector, argumentTypes,
                        invocationSite);
                if (methodBinding == null)
                    methodBinding = classScope.findMethod(receiverType, selector, argumentTypes,
                            invocationSite);
                if (methodBinding != null) { // skip it if we did not find anything
                    if (foundMethod == null) {
                        if (methodBinding.isValidBinding()) {
                            if (!methodBinding.isStatic() && (insideConstructorCall || insideStaticContext)) {
                                if (foundProblem != null
                                        && foundProblem.problemId() != ProblemReasons.NotVisible)
                                    return foundProblem; // takes precedence
                                return new ProblemMethodBinding(methodBinding, // closest match
                                        methodBinding.selector, methodBinding.parameters,
                                        insideConstructorCall
                                                ? ProblemReasons.NonStaticReferenceInConstructorInvocation
                                                : ProblemReasons.NonStaticReferenceInStaticContext);
                            }
                            if (inheritedHasPrecedence || receiverType == methodBinding.declaringClass
                                    || (receiverType.getMethods(selector)) != Binding.NO_METHODS) {
                                // found a valid method in the 'immediate' scope (i.e. not inherited)
                                // OR in 1.4 mode (inherited visible shadows enclosing)
                                // OR the receiverType implemented a method with the correct name
                                // return the methodBinding if it is not declared in a superclass of the scope's binding (that is, inherited)
                                if (foundProblemVisible) {
                                    return foundProblem;
                                }
                                if (depth > 0) {
                                    invocationSite.setDepth(depth);
                                    invocationSite.setActualReceiverType(receiverType);
                                }
                                // special treatment for Object.getClass() in 1.5 mode (substitute parameterized return type)
                                if (argumentTypes == Binding.NO_PARAMETERS
                                        && CharOperation.equals(selector, TypeConstants.GETCLASS)
                                        && methodBinding.returnType.isParameterizedType()/*1.5*/) {
                                    return environment().createGetClassMethod(receiverType, methodBinding,
                                            this);
                                }
                                return methodBinding;
                            }

                            if (foundProblem == null || foundProblem.problemId() == ProblemReasons.NotVisible) {
                                if (foundProblem != null)
                                    foundProblem = null;
                                // only remember the methodBinding if its the first one found
                                // remember that private methods are visible if defined directly by an enclosing class
                                if (depth > 0) {
                                    invocationSite.setDepth(depth);
                                    invocationSite.setActualReceiverType(receiverType);
                                }
                                foundMethod = methodBinding;
                            }
                        } else { // methodBinding is a problem method
                            if (methodBinding.problemId() != ProblemReasons.NotVisible
                                    && methodBinding.problemId() != ProblemReasons.NotFound)
                                return methodBinding; // return the error now
                            if (foundProblem == null) {
                                foundProblem = methodBinding; // hold onto the first not visible/found error and keep the second not found if first is not visible
                            }
                            if (!foundProblemVisible && methodBinding.problemId() == ProblemReasons.NotFound) {
                                MethodBinding closestMatch = ((ProblemMethodBinding) methodBinding).closestMatch;
                                if (closestMatch != null
                                        && closestMatch.canBeSeenBy(receiverType, invocationSite, this)) {
                                    foundProblem = methodBinding; // hold onto the first not visible/found error and keep the second not found if first is not visible
                                    foundProblemVisible = true;
                                }
                            }
                        }
                    } else { // found a valid method so check to see if this is a hiding case
                        if (methodBinding.problemId() == ProblemReasons.Ambiguous
                                || (foundMethod.declaringClass != methodBinding.declaringClass
                                        && (receiverType == methodBinding.declaringClass
                                                || receiverType.getMethods(selector) != Binding.NO_METHODS)))
                            // ambiguous case -> must qualify the method (javac generates an ambiguous error instead)
                            // otherwise if a method was found, complain when another is found in an 'immediate' enclosing type (that is, not inherited)
                            // NOTE: Unlike fields, a non visible method hides a visible method
                            return new ProblemMethodBinding(methodBinding, // closest match
                                    selector, argumentTypes, ProblemReasons.InheritedNameHidesEnclosingName);
                    }
                }
            }
            insideTypeAnnotation = false;
            depth++;
            insideStaticContext |= receiverType.isStatic();
            // 1EX5I8Z - accessing outer fields within a constructor call is permitted
            // in order to do so, we change the flag as we exit from the type, not the method
            // itself, because the class scope is used to retrieve the fields.
            MethodScope enclosingMethodScope = scope.methodScope();
            insideConstructorCall = enclosingMethodScope == null ? false
                    : enclosingMethodScope.isConstructorCall;
            break;
        case COMPILATION_UNIT_SCOPE:
            break done;
        }
        scope = scope.parent;
    }

    if (insideStaticContext && options.sourceLevel >= ClassFileConstants.JDK1_5) {
        if (foundProblem != null) {
            if (foundProblem.declaringClass != null
                    && foundProblem.declaringClass.id == TypeIds.T_JavaLangObject)
                return foundProblem; // static imports lose to methods from Object
            if (foundProblem.problemId() == ProblemReasons.NotFound && foundProblemVisible) {
                return foundProblem; // visible method selectors take precedence
            }
        }

        // at this point the scope is a compilation unit scope & need to check for imported static methods
        CompilationUnitScope unitScope = (CompilationUnitScope) scope;
        unitScope.faultInImports(); // field constants can cause static imports to be accessed before they're resolved
        ImportBinding[] imports = unitScope.imports;
        if (imports != null) {
            ObjectVector visible = null;
            boolean skipOnDemand = false; // set to true when matched static import of method name so stop looking for on demand methods
            for (int i = 0, length = imports.length; i < length; i++) {
                ImportBinding importBinding = imports[i];
                if (importBinding.isStatic()) {
                    Binding resolvedImport = importBinding.resolvedImport;
                    MethodBinding possible = null;
                    if (importBinding.onDemand) {
                        if (!skipOnDemand && resolvedImport instanceof ReferenceBinding)
                            // answers closest approximation, may not check argumentTypes or visibility
                            possible = findMethod((ReferenceBinding) resolvedImport, selector, argumentTypes,
                                    invocationSite, true);
                    } else {
                        if (resolvedImport instanceof MethodBinding) {
                            MethodBinding staticMethod = (MethodBinding) resolvedImport;
                            if (CharOperation.equals(staticMethod.selector, selector))
                                // answers closest approximation, may not check argumentTypes or visibility
                                possible = findMethod(staticMethod.declaringClass, selector, argumentTypes,
                                        invocationSite, true);
                        } else if (resolvedImport instanceof FieldBinding) {
                            // check to see if there are also methods with the same name
                            FieldBinding staticField = (FieldBinding) resolvedImport;
                            if (CharOperation.equals(staticField.name, selector)) {
                                // must find the importRef's type again since the field can be from an inherited type
                                char[][] importName = importBinding.reference.tokens;
                                TypeBinding referencedType = getType(importName, importName.length - 1);
                                if (referencedType != null)
                                    // answers closest approximation, may not check argumentTypes or visibility
                                    possible = findMethod((ReferenceBinding) referencedType, selector,
                                            argumentTypes, invocationSite, true);
                            }
                        }
                    }
                    if (possible != null && possible != foundProblem) {
                        if (!possible.isValidBinding()) {
                            if (foundProblem == null)
                                foundProblem = possible; // answer as error case match
                        } else if (possible.isStatic()) {
                            MethodBinding compatibleMethod = computeCompatibleMethod(possible, argumentTypes,
                                    invocationSite);
                            if (compatibleMethod != null) {
                                if (compatibleMethod.isValidBinding()) {
                                    if (compatibleMethod.canBeSeenBy(unitScope.fPackage)) {
                                        if (visible == null || !visible.contains(compatibleMethod)) {
                                            ImportReference importReference = importBinding.reference;
                                            if (importReference != null) {
                                                importReference.bits |= ASTNode.Used;
                                            }
                                            if (!skipOnDemand && !importBinding.onDemand) {
                                                visible = null; // forget previous matches from on demand imports
                                                skipOnDemand = true;
                                            }
                                            if (visible == null)
                                                visible = new ObjectVector(3);
                                            visible.add(compatibleMethod);
                                        }
                                    } else if (foundProblem == null) {
                                        foundProblem = new ProblemMethodBinding(compatibleMethod, selector,
                                                compatibleMethod.parameters, ProblemReasons.NotVisible);
                                    }
                                } else if (foundProblem == null) {
                                    foundProblem = compatibleMethod;
                                }
                            } else if (foundProblem == null) {
                                foundProblem = new ProblemMethodBinding(possible, selector, argumentTypes,
                                        ProblemReasons.NotFound);
                            }
                        }
                    }
                }
            }
            if (visible != null) {
                MethodBinding[] temp = new MethodBinding[visible.size];
                visible.copyInto(temp);
                foundMethod = mostSpecificMethodBinding(temp, temp.length, argumentTypes, invocationSite, null);
            }
        }
    }

    if (foundMethod != null) {
        invocationSite.setActualReceiverType(foundMethod.declaringClass);
        return foundMethod;
    }
    if (foundProblem != null)
        return foundProblem;

    return new ProblemMethodBinding(selector, argumentTypes, ProblemReasons.NotFound);
}

From source file:org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding.java

License:Open Source License

public MethodBinding[] getDefaultAbstractMethods() {
    int count = 0;
    for (int i = this.methods.length; --i >= 0;)
        if (this.methods[i].isDefaultAbstract())
            count++;//from   w w w  .j  a  va2  s .c o  m
    if (count == 0)
        return Binding.NO_METHODS;

    MethodBinding[] result = new MethodBinding[count];
    count = 0;
    for (int i = this.methods.length; --i >= 0;)
        if (this.methods[i].isDefaultAbstract())
            result[count++] = this.methods[i];
    return result;
}

From source file:org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding.java

License:Open Source License

public MethodBinding[] getMethods(char[] selector) {
    if ((this.tagBits & TagBits.AreMethodsComplete) != 0) {
        long range;
        if ((range = ReferenceBinding.binarySearch(selector, this.methods)) >= 0) {
            int start = (int) range, end = (int) (range >> 32);
            int length = end - start + 1;
            MethodBinding[] result;/*  www  . j  av a 2  s. co m*/
            System.arraycopy(this.methods, start, result = new MethodBinding[length], 0, length);
            return result;
        } else {
            return Binding.NO_METHODS;
        }
    }
    // lazily sort methods
    if ((this.tagBits & TagBits.AreMethodsSorted) == 0) {
        int length = this.methods.length;
        if (length > 1)
            ReferenceBinding.sortMethods(this.methods, 0, length);
        this.tagBits |= TagBits.AreMethodsSorted;
    }
    MethodBinding[] result;
    long range;
    if ((range = ReferenceBinding.binarySearch(selector, this.methods)) >= 0) {
        int start = (int) range, end = (int) (range >> 32);
        for (int i = start; i <= end; i++) {
            MethodBinding method = this.methods[i];
            if (resolveTypesFor(method) == null || method.returnType == null) {
                methods();
                return getMethods(selector); // try again since the problem methods have been removed
            }
        }
        int length = end - start + 1;
        System.arraycopy(this.methods, start, result = new MethodBinding[length], 0, length);
    } else {
        return Binding.NO_METHODS;
    }
    boolean isSource15 = this.scope.compilerOptions().sourceLevel >= ClassFileConstants.JDK1_5;
    for (int i = 0, length = result.length - 1; i < length; i++) {
        MethodBinding method = result[i];
        for (int j = length; j > i; j--) {
            boolean paramsMatch = isSource15 ? method.areParameterErasuresEqual(result[j])
                    : method.areParametersEqual(result[j]);
            if (paramsMatch) {
                methods();
                return getMethods(selector); // try again since the duplicate methods have been removed
            }
        }
    }
    return result;
}

From source file:org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding.java

License:Open Source License

public MethodBinding[] methods() {
    if ((this.tagBits & TagBits.AreMethodsComplete) != 0)
        return this.methods;

    // lazily sort methods
    if ((this.tagBits & TagBits.AreMethodsSorted) == 0) {
        int length = this.methods.length;
        if (length > 1)
            ReferenceBinding.sortMethods(this.methods, 0, length);
        this.tagBits |= TagBits.AreMethodsSorted;
    }//from  w w w . jav  a  2  s.co m

    int failed = 0;
    MethodBinding[] resolvedMethods = this.methods;
    try {
        for (int i = 0, length = this.methods.length; i < length; i++) {
            if (resolveTypesFor(this.methods[i]) == null) {
                // do not alter original method array until resolution is over, due to reentrance (143259)
                if (resolvedMethods == this.methods) {
                    System.arraycopy(this.methods, 0, resolvedMethods = new MethodBinding[length], 0, length);
                }
                resolvedMethods[i] = null; // unable to resolve parameters
                failed++;
            }
        }

        // find & report collision cases
        boolean complyTo15OrAbove = this.scope.compilerOptions().sourceLevel >= ClassFileConstants.JDK1_5;
        boolean compliance16 = this.scope.compilerOptions().complianceLevel == ClassFileConstants.JDK1_6;

        for (int i = 0, length = this.methods.length; i < length; i++) {
            int severity = ProblemSeverities.Error;
            MethodBinding method = resolvedMethods[i];
            if (method == null)
                continue;
            char[] selector = method.selector;
            AbstractMethodDeclaration methodDecl = null;
            nextSibling: for (int j = i + 1; j < length; j++) {
                MethodBinding method2 = resolvedMethods[j];
                if (method2 == null)
                    continue nextSibling;
                if (!CharOperation.equals(selector, method2.selector))
                    break nextSibling; // methods with same selector are contiguous

                if (complyTo15OrAbove) {
                    if (method.areParameterErasuresEqual(method2)) {
                        // we now ignore return types in 1.7 when detecting duplicates, just as we did before 1.5 
                        // Only in 1.6, we have to make sure even return types are different
                        // https://bugs.eclipse.org/bugs/show_bug.cgi?id=317719
                        if (compliance16 && method.returnType != null && method2.returnType != null) {
                            if (method.returnType.erasure() != method2.returnType.erasure()) {
                                // check to see if the erasure of either method is equal to the other
                                // if not, then change severity to WARNING
                                TypeBinding[] params1 = method.parameters;
                                TypeBinding[] params2 = method2.parameters;
                                int pLength = params1.length;
                                TypeVariableBinding[] vars = method.typeVariables;
                                TypeVariableBinding[] vars2 = method2.typeVariables;
                                boolean equalTypeVars = vars == vars2;
                                MethodBinding subMethod = method2;
                                if (!equalTypeVars) {
                                    MethodBinding temp = method.computeSubstitutedMethod(method2,
                                            this.scope.environment());
                                    if (temp != null) {
                                        equalTypeVars = true;
                                        subMethod = temp;
                                    }
                                }
                                boolean equalParams = method.areParametersEqual(subMethod);
                                if (equalParams && equalTypeVars) {
                                    // duplicates regardless of return types
                                } else if (vars != Binding.NO_TYPE_VARIABLES
                                        && vars2 != Binding.NO_TYPE_VARIABLES) {
                                    // both have type arguments. Erasure of signature of one cannot be equal to signature of other
                                    severity = ProblemSeverities.Warning;
                                } else if (pLength > 0) {
                                    int index = pLength;
                                    // is erasure of signature of m2 same as signature of m1?
                                    for (; --index >= 0;) {
                                        if (params1[index] != params2[index].erasure())
                                            break;
                                        if (params1[index] == params2[index]) {
                                            TypeBinding type = params1[index].leafComponentType();
                                            if (type instanceof SourceTypeBinding
                                                    && type.typeVariables() != Binding.NO_TYPE_VARIABLES) {
                                                index = pLength; // handle comparing identical source types like X<T>... its erasure is itself BUT we need to answer false
                                                break;
                                            }
                                        }
                                    }
                                    if (index >= 0 && index < pLength) {
                                        // is erasure of signature of m1 same as signature of m2?
                                        for (index = pLength; --index >= 0;)
                                            if (params1[index].erasure() != params2[index])
                                                break;

                                    }
                                    if (index >= 0) {
                                        // erasure of neither is equal to signature of other
                                        severity = ProblemSeverities.Warning;
                                    }
                                } else if (pLength != 0) {
                                    severity = ProblemSeverities.Warning;
                                } // pLength = 0 automatically makes erasure of arguments one equal to arguments of other.
                            }
                            // else return types also equal. All conditions satisfied
                            // to give error in 1.6 compliance as well.
                        }
                    } else {
                        continue nextSibling;
                    }
                } else if (!method.areParametersEqual(method2)) {
                    // prior to 1.5, parameters identical meant a collision case
                    continue nextSibling;
                }
                // otherwise duplicates / name clash
                boolean isEnumSpecialMethod = isEnum() && (CharOperation.equals(selector, TypeConstants.VALUEOF)
                        || CharOperation.equals(selector, TypeConstants.VALUES));
                // report duplicate
                boolean removeMethod2 = (severity == ProblemSeverities.Error) ? true : false; // do not remove if in 1.6 and just a warning given
                if (methodDecl == null) {
                    methodDecl = method.sourceMethod(); // cannot be retrieved after binding is lost & may still be null if method is special
                    if (methodDecl != null && methodDecl.binding != null) { // ensure its a valid user defined method
                        boolean removeMethod = method.returnType == null && method2.returnType != null;
                        if (isEnumSpecialMethod) {
                            this.scope.problemReporter().duplicateEnumSpecialMethod(this, methodDecl);
                            // remove user defined methods & keep the synthetic
                            removeMethod = true;
                        } else {
                            this.scope.problemReporter().duplicateMethodInType(this, methodDecl,
                                    method.areParametersEqual(method2), severity);
                        }
                        if (removeMethod) {
                            removeMethod2 = false;
                            methodDecl.binding = null;
                            // do not alter original method array until resolution is over, due to reentrance (143259)
                            if (resolvedMethods == this.methods)
                                System.arraycopy(this.methods, 0, resolvedMethods = new MethodBinding[length],
                                        0, length);
                            resolvedMethods[i] = null;
                            failed++;
                        }
                    }
                }
                AbstractMethodDeclaration method2Decl = method2.sourceMethod();
                if (method2Decl != null && method2Decl.binding != null) { // ensure its a valid user defined method
                    if (isEnumSpecialMethod) {
                        this.scope.problemReporter().duplicateEnumSpecialMethod(this, method2Decl);
                        removeMethod2 = true;
                    } else {
                        this.scope.problemReporter().duplicateMethodInType(this, method2Decl,
                                method.areParametersEqual(method2), severity);
                    }
                    if (removeMethod2) {
                        method2Decl.binding = null;
                        // do not alter original method array until resolution is over, due to reentrance (143259)
                        if (resolvedMethods == this.methods)
                            System.arraycopy(this.methods, 0, resolvedMethods = new MethodBinding[length], 0,
                                    length);
                        resolvedMethods[j] = null;
                        failed++;
                    }
                }
            }
            if (method.returnType == null && resolvedMethods[i] != null) { // forget method with invalid return type... was kept to detect possible collisions
                methodDecl = method.sourceMethod();
                if (methodDecl != null)
                    methodDecl.binding = null;
                // do not alter original method array until resolution is over, due to reentrance (143259)
                if (resolvedMethods == this.methods)
                    System.arraycopy(this.methods, 0, resolvedMethods = new MethodBinding[length], 0, length);
                resolvedMethods[i] = null;
                failed++;
            }
        }
    } finally {
        if (failed > 0) {
            int newSize = resolvedMethods.length - failed;
            if (newSize == 0) {
                this.methods = Binding.NO_METHODS;
            } else {
                MethodBinding[] newMethods = new MethodBinding[newSize];
                for (int i = 0, j = 0, length = resolvedMethods.length; i < length; i++)
                    if (resolvedMethods[i] != null)
                        newMethods[j++] = resolvedMethods[i];
                this.methods = newMethods;
            }
        }

        // handle forward references to potential default abstract methods
        addDefaultAbstractMethods();
        this.tagBits |= TagBits.AreMethodsComplete;
    }
    return this.methods;
}

From source file:org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding.java

License:Open Source License

public String toString() {
    StringBuffer buffer = new StringBuffer(30);
    buffer.append("(id="); //$NON-NLS-1$
    if (this.id == TypeIds.NoId)
        buffer.append("NoId"); //$NON-NLS-1$
    else//  www.java2  s  . com
        buffer.append(this.id);
    buffer.append(")\n"); //$NON-NLS-1$
    if (isDeprecated())
        buffer.append("deprecated "); //$NON-NLS-1$
    if (isPublic())
        buffer.append("public "); //$NON-NLS-1$
    if (isProtected())
        buffer.append("protected "); //$NON-NLS-1$
    if (isPrivate())
        buffer.append("private "); //$NON-NLS-1$
    if (isAbstract() && isClass())
        buffer.append("abstract "); //$NON-NLS-1$
    if (isStatic() && isNestedType())
        buffer.append("static "); //$NON-NLS-1$
    if (isFinal())
        buffer.append("final "); //$NON-NLS-1$

    if (isEnum())
        buffer.append("enum "); //$NON-NLS-1$
    else if (isAnnotationType())
        buffer.append("@interface "); //$NON-NLS-1$
    else if (isClass())
        buffer.append("class "); //$NON-NLS-1$
    else
        buffer.append("interface "); //$NON-NLS-1$
    buffer.append((this.compoundName != null) ? CharOperation.toString(this.compoundName) : "UNNAMED TYPE"); //$NON-NLS-1$

    if (this.typeVariables == null) {
        buffer.append("<NULL TYPE VARIABLES>"); //$NON-NLS-1$
    } else if (this.typeVariables != Binding.NO_TYPE_VARIABLES) {
        buffer.append("<"); //$NON-NLS-1$
        for (int i = 0, length = this.typeVariables.length; i < length; i++) {
            if (i > 0)
                buffer.append(", "); //$NON-NLS-1$
            if (this.typeVariables[i] == null) {
                buffer.append("NULL TYPE VARIABLE"); //$NON-NLS-1$
                continue;
            }
            char[] varChars = this.typeVariables[i].toString().toCharArray();
            buffer.append(varChars, 1, varChars.length - 2);
        }
        buffer.append(">"); //$NON-NLS-1$
    }
    buffer.append("\n\textends "); //$NON-NLS-1$
    buffer.append((this.superclass != null) ? this.superclass.debugName() : "NULL TYPE"); //$NON-NLS-1$

    if (this.superInterfaces != null) {
        if (this.superInterfaces != Binding.NO_SUPERINTERFACES) {
            buffer.append("\n\timplements : "); //$NON-NLS-1$
            for (int i = 0, length = this.superInterfaces.length; i < length; i++) {
                if (i > 0)
                    buffer.append(", "); //$NON-NLS-1$
                buffer.append(
                        (this.superInterfaces[i] != null) ? this.superInterfaces[i].debugName() : "NULL TYPE"); //$NON-NLS-1$
            }
        }
    } else {
        buffer.append("NULL SUPERINTERFACES"); //$NON-NLS-1$
    }

    if (enclosingType() != null) {
        buffer.append("\n\tenclosing type : "); //$NON-NLS-1$
        buffer.append(enclosingType().debugName());
    }

    if (this.fields != null) {
        if (this.fields != Binding.NO_FIELDS) {
            buffer.append("\n/*   fields   */"); //$NON-NLS-1$
            for (int i = 0, length = this.fields.length; i < length; i++)
                buffer.append('\n').append((this.fields[i] != null) ? this.fields[i].toString() : "NULL FIELD"); //$NON-NLS-1$
        }
    } else {
        buffer.append("NULL FIELDS"); //$NON-NLS-1$
    }

    if (this.methods != null) {
        if (this.methods != Binding.NO_METHODS) {
            buffer.append("\n/*   methods   */"); //$NON-NLS-1$
            for (int i = 0, length = this.methods.length; i < length; i++)
                buffer.append('\n')
                        .append((this.methods[i] != null) ? this.methods[i].toString() : "NULL METHOD"); //$NON-NLS-1$
        }
    } else {
        buffer.append("NULL METHODS"); //$NON-NLS-1$
    }

    if (this.memberTypes != null) {
        if (this.memberTypes != Binding.NO_MEMBER_TYPES) {
            buffer.append("\n/*   members   */"); //$NON-NLS-1$
            for (int i = 0, length = this.memberTypes.length; i < length; i++)
                buffer.append('\n')
                        .append((this.memberTypes[i] != null) ? this.memberTypes[i].toString() : "NULL TYPE"); //$NON-NLS-1$
        }
    } else {
        buffer.append("NULL MEMBER TYPES"); //$NON-NLS-1$
    }

    buffer.append("\n\n"); //$NON-NLS-1$
    return buffer.toString();
}

From source file:org.eclipse.objectteams.otdt.internal.core.compiler.bytecode.ConstantPoolObjectReader.java

License:Open Source License

private MethodBinding doFindMethodBinding(ReferenceBinding class_rb, char[] name, char[] descriptor) {
    MethodBinding[] mbs = class_rb.getMethods(name);

    if (mbs != Binding.NO_METHODS) {
        for (int i = 0; i < mbs.length; i++) {
            MethodBinding binding = mbs[i];
            if (binding != null) {
                if (isEqual(binding, name, descriptor))
                    return binding;
            }//from  w  ww  . j a  va  2s .  co  m
        }
        // TODO(SH): currently this may happen, if a role file is not recompiled which
        // required e.g., a getter access$n, while a setter access$n is being generated.
        if (isSynthMethodName(name))
            throw new InternalCompilerError(
                    "synthetic method " + new String(name) + " has unexpected signature"); //$NON-NLS-1$ //$NON-NLS-2$
    }
    if (isSynthMethodName(name) || SyntheticBaseCallSurrogate.isBaseCallSurrogateName(name)) {
        // for normal access methods class_rb should not be a BinaryTypeBinding, 
        // because in that case the above loop should have found the method
        // (access$n are stored like normal methods).
        if (class_rb.isBinaryBinding()) {
            if (SyntheticBaseCallSurrogate.isBaseCallSurrogateName(name)) { // surrogate might be inherited
                ReferenceBinding current = class_rb;
                while ((current = current.superclass()) != null) {
                    MethodBinding candidate = doFindMethodBinding(current, name, descriptor);
                    if (candidate != null)
                        return candidate;
                }
            }
            // TODO(SH): but when T has been compiled only with T.R1 while T.R2
            //           requires a synth.method, than this method will be missing!
        } else {
            SourceTypeBinding stb = (SourceTypeBinding) class_rb.erasure();
            SyntheticMethodBinding[] accessMethods = stb.syntheticMethods();
            if (accessMethods != null) {
                for (int i = 0; i < accessMethods.length; i++) {
                    if (CharOperation.equals(accessMethods[i].selector, name))
                        return accessMethods[i];
                }
            }
        }
    }
    if (SyntheticRoleFieldAccess.isRoleFieldAccess(AccSynthetic, name)) {
        if (class_rb.isBinaryBinding())
            return null; // should have been found within methods
        SourceTypeBinding sourceType = (SourceTypeBinding) class_rb.erasure();
        SyntheticMethodBinding[] synthetics = sourceType.syntheticMethods();
        if (synthetics == null)
            return null;
        for (SyntheticMethodBinding methodBinding : synthetics) {
            if (CharOperation.equals(methodBinding.selector, name))
                return methodBinding;
        }
    }
    int modifiers = isFakedOTREMethod(name);
    if (modifiers != 0) {
        // These methods will be generated by the OTRE,
        // may safely be faked during compilation:
        MethodBinding fakedMethod = createMethodFromSignature(class_rb, modifiers, name, descriptor);
        class_rb.addMethod(fakedMethod);
        return fakedMethod;
    }
    // since Eclipse 3.0 and for JDK >= 1.2 the declaring class is changed to the
    // declared receiver (see SourceTypeBinding.getUpdatedMethodBinding()).
    // need to search super class/interfaces to really find the method.
    ReferenceBinding currentType = class_rb.superclass();
    if (currentType != null) {
        MethodBinding mb = findMethodBinding(currentType, name, descriptor);
        if (mb != null)
            return mb;
    }
    ReferenceBinding[] superIfcs = class_rb.superInterfaces();
    if (superIfcs != null) {
        for (int i = 0; i < class_rb.superInterfaces().length; i++) {
            MethodBinding mb = findMethodBinding(superIfcs[i], name, descriptor);
            if (mb != null) {
                if (!class_rb.isInterface())
                    return new MethodBinding(mb, class_rb); // need a class method!
                return mb;
            }
        }
    }
    return null;
}

From source file:org.eclipse.objectteams.otdt.internal.core.compiler.lifting.DeclaredLifting.java

License:Open Source License

/**
 * This method generates a lift method suitable for lifting an argument typed to a base-bounded type variable (B base R).
 * The generated method will be added to the team type and resolved if suitable (team already in state >= resolving).
 * @param teamDecl/*from w  w w  .  j a  v  a2 s.  com*/
 * @param ref
 * @param roleType
 * @param needMethodBody
 */
public static void genLiftDynamicMethod(TypeDeclaration teamDecl, ASTNode ref, TypeBinding roleType,
        boolean needMethodBody) {
    char[] dynamicLiftingSelector = dynamicLiftSelector(roleType);
    if (teamDecl.binding.getMethods(dynamicLiftingSelector) != Binding.NO_METHODS)
        return; // already present

    if (roleType.isArrayType()) {
        teamDecl.scope.problemReporter().missingImplementation(ref,
                "Generic lifting of array not yet implemented.");
    } else if (roleType.isBaseType()) {
        teamDecl.scope.problemReporter().primitiveTypeNotAllowedForLifting(teamDecl, ref, roleType);
    } else {
        // reference type
        AstGenerator gen = new AstGenerator(ref);
        MethodDeclaration dynLiftMeth = gen.method(teamDecl.compilationResult(),
                ClassFileConstants.AccProtected, roleType.erasure(), dynamicLiftingSelector,
                new Argument[] { gen.argument(IOTConstants.BASE,
                        gen.qualifiedTypeReference(TypeConstants.JAVA_LANG_OBJECT)) });

        dynLiftMeth.statements = new Statement[] { gen.emptyStatement() }; // to be replaced below
        int problemId = teamDecl.getTeamModel().canLiftingFail((ReferenceBinding) roleType.erasure());
        if (problemId == 0) {
            // look harder, in "<B base R>" the role R could be unbound
            // yet otherwise unrelated sub-roles could bind to the same base B'
            HashSet<ReferenceBinding> mappedBases = new HashSet<ReferenceBinding>();
            for (ReferenceBinding boundRole : ((ReferenceBinding) roleType).roleModel.getBoundDescendants())
                if (mappedBases.contains(boundRole.baseclass())) {
                    problemId = IProblem.CallinDespiteBindingAmbiguity;
                    break;
                } else {
                    mappedBases.add(boundRole.baseclass());
                }
        }

        if (problemId != 0)
            AstEdit.addException(dynLiftMeth,
                    gen.qualifiedTypeReference(IOTConstants.O_O_LIFTING_FAILED_EXCEPTION), false/*resolve*/);

        dynLiftMeth.hasParsedStatements = true;
        AstEdit.addMethod(teamDecl, dynLiftMeth);
        dynLiftMeth.binding.returnType = ((ReferenceBinding) roleType).getRealType().erasure(); // force erased type after signature resolve
        if (needMethodBody) {
            dynLiftMeth.statements[0] = DeclaredLifting.generateDynamicSwitch(dynLiftMeth.scope,
                    (ReferenceBinding) roleType, problemId, gen);
            if (StateMemento.hasMethodResolveStarted(teamDecl.binding))
                dynLiftMeth.statements[0].resolve(dynLiftMeth.scope);
        }
    }
}