Example usage for org.eclipse.jdt.internal.compiler.lookup ReferenceBinding isStatic

List of usage examples for org.eclipse.jdt.internal.compiler.lookup ReferenceBinding isStatic

Introduction

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

Prototype

@Override
public final boolean isStatic() 

Source Link

Document

Answer true if the receiver is a static member type (or toplevel)

Usage

From source file:com.codenvy.ide.ext.java.server.internal.codeassist.SelectionEngine.java

License:Open Source License

private void selectMemberTypeFromImport(CompilationUnitDeclaration parsedUnit, char[] lastToken,
        ReferenceBinding ref, boolean staticOnly) {
    int fieldLength = lastToken.length;
    ReferenceBinding[] memberTypes = ref.memberTypes();
    next: for (int j = 0; j < memberTypes.length; j++) {
        ReferenceBinding memberType = memberTypes[j];

        if (fieldLength > memberType.sourceName.length)
            continue next;

        if (staticOnly && !memberType.isStatic())
            continue next;

        if (!CharOperation.equals(lastToken, memberType.sourceName, true))
            continue next;

        selectFrom(memberType, parsedUnit, false);
    }/*from   w ww.j av a2s  .co m*/
}

From source file:com.google.gwt.dev.javac.JdtUtil.java

License:Apache License

public static boolean isInnerClass(ReferenceBinding binding) {
    return binding.isNestedType() && !binding.isStatic();
}

From source file:com.google.gwt.dev.javac.Shared.java

License:Open Source License

public static int bindingToModifierBits(ReferenceBinding binding) {
    int bits = 0;
    bits |= (binding.isPublic() ? MOD_PUBLIC : 0);
    bits |= (binding.isPrivate() ? MOD_PRIVATE : 0);
    bits |= (binding.isProtected() ? MOD_PROTECTED : 0);
    bits |= (binding.isStatic() ? MOD_STATIC : 0);
    bits |= (binding.isFinal() ? MOD_FINAL : 0);
    bits |= (binding.isAbstract() ? MOD_ABSTRACT : 0);
    return bits;//from  w w  w . j ava 2 s.  c  o  m
}

From source file:com.google.gwt.dev.jdt.WebModeCompilerFrontEnd.java

License:Apache License

private void checkRebindResultInstantiable(MessageSendSite site, String typeName) {
    /*/*from   w w  w . j av  a 2  s  .  c o  m*/
     * This causes the compiler to find the additional type, possibly winding
     * its back to ask for the compilation unit from the source oracle.
     */
    ReferenceBinding type = resolvePossiblyNestedType(typeName);

    // Sanity check rebind results.
    if (type == null) {
        FindDeferredBindingSitesVisitor.reportRebindProblem(site,
                "Rebind result '" + typeName + "' could not be found");
        return;
    }
    if (!type.isClass()) {
        FindDeferredBindingSitesVisitor.reportRebindProblem(site,
                "Rebind result '" + typeName + "' must be a class");
        return;
    }
    if (type.isAbstract()) {
        FindDeferredBindingSitesVisitor.reportRebindProblem(site,
                "Rebind result '" + typeName + "' cannot be abstract");
        return;
    }
    if (type.isNestedType() && !type.isStatic()) {
        FindDeferredBindingSitesVisitor.reportRebindProblem(site,
                "Rebind result '" + typeName + "' cannot be a non-static nested class");
        return;
    }
    if (type.isLocalType()) {
        FindDeferredBindingSitesVisitor.reportRebindProblem(site,
                "Rebind result '" + typeName + "' cannot be a local class");
        return;
    }
    // Look for a noArg ctor.
    MethodBinding noArgCtor = type.getExactConstructor(Binding.NO_PARAMETERS);
    if (noArgCtor == null) {
        FindDeferredBindingSitesVisitor.reportRebindProblem(site,
                "Rebind result '" + typeName + "' has no default (zero argument) constructors");
        return;
    }
}

From source file:com.google.gwt.dev.jjs.impl.BuildTypeMap.java

License:Apache License

private boolean process(ReferenceBinding binding) {
    JDeclaredType type = (JDeclaredType) getType(binding);

    try {// w  w  w .  j  a  v  a2 s .c om
        // Create an override for getClass().
        if (type instanceof JClassType && type != program.getTypeJavaLangObject()) {

            SourceInfo info = type.getSourceInfo().makeChild();
            JMethod getClassMethod = program.createMethod(info, "getClass", type,
                    program.getTypeJavaLangClass(), false, false, false, AccessModifier.PUBLIC, false);
            assert (type.getMethods().get(2) == getClassMethod);
            getClassMethod.freezeParamTypes();
            getClassMethod.setSynthetic();
            info.addCorrelation(info.getCorrelator().by(getClassMethod));
        }

        if (binding.isNestedType() && !binding.isStatic() && !(binding instanceof BinaryTypeBinding)) {
            // TODO(tobyr) Do something here for binary types?

            // add synthetic fields for outer this and locals
            assert (type instanceof JClassType);
            NestedTypeBinding nestedBinding = (NestedTypeBinding) binding;
            if (nestedBinding.enclosingInstances != null) {
                for (int i = 0; i < nestedBinding.enclosingInstances.length; ++i) {
                    SyntheticArgumentBinding arg = nestedBinding.enclosingInstances[i];
                    createField(arg, type, Disposition.THIS_REF);
                }
            }

            if (nestedBinding.outerLocalVariables != null) {
                for (int i = 0; i < nestedBinding.outerLocalVariables.length; ++i) {
                    SyntheticArgumentBinding arg = nestedBinding.outerLocalVariables[i];
                    // See InnerClassTest.testOuterThisFromSuperCall().
                    boolean isReallyThisRef = false;
                    if (arg.actualOuterLocalVariable instanceof SyntheticArgumentBinding) {
                        SyntheticArgumentBinding outer = (SyntheticArgumentBinding) arg.actualOuterLocalVariable;
                        if (outer.matchingField != null) {
                            JField field = (JField) typeMap.get(outer.matchingField);
                            if (field.isThisRef()) {
                                isReallyThisRef = true;
                            }
                        }
                    }
                    createField(arg, type, isReallyThisRef ? Disposition.THIS_REF : Disposition.FINAL);
                }
            }
        }

        ReferenceBinding superClassBinding = binding.superclass();
        if (type instanceof JClassType && superClassBinding != null) {
            // TODO: handle separately?
            assert (binding.superclass().isClass() || binding.superclass().isEnum());
            JClassType superClass = (JClassType) getType(superClassBinding);
            ((JClassType) type).setSuperClass(superClass);
        }

        ReferenceBinding[] superInterfaces = binding.superInterfaces();
        for (ReferenceBinding superInterfaceBinding : superInterfaces) {
            assert (superInterfaceBinding.isInterface());
            JInterfaceType superInterface = (JInterfaceType) getType(superInterfaceBinding);
            type.addImplements(superInterface);
        }

        ReferenceBinding enclosingBinding = binding.enclosingType();
        if (enclosingBinding != null) {
            type.setEnclosingType((JDeclaredType) getType(enclosingBinding));
        }

        if (type instanceof JEnumType) {
            processEnumType(binding, (JEnumType) type);
        }

        return true;
    } catch (VirtualMachineError e) {
        // Always rethrow VM errors (an attempt to wrap may fail).
        throw e;
    } catch (InternalCompilerException ice) {
        ice.addNode(type);
        throw ice;
    } catch (Throwable e) {
        throw new InternalCompilerException(type, "Error building type map", e);
    }
}

From source file:com.google.gwt.dev.jjs.impl.BuildTypeMap.java

License:Apache License

private JConstructor processConstructor(MethodBinding b, ConstructorDeclaration decl, SourceInfo info) {
    JClassType enclosingType = (JClassType) getType(b.declaringClass);
    JConstructor newCtor = program.createConstructor(info, enclosingType);

    // Enums have hidden arguments for name and value
    if (enclosingType.isEnumOrSubclass() != null) {
        JProgram.createParameter(info, "enum$name", program.getTypeJavaLangString(), true, false, newCtor);
        JProgram.createParameter(info, "enum$ordinal", program.getTypePrimitiveInt(), true, false, newCtor);
    }//  ww w .  ja va2  s.com

    ReferenceBinding declaringClass = b.declaringClass;
    Set<String> alreadyNamedVariables = new HashSet<String>();
    if (declaringClass.isNestedType() && !declaringClass.isStatic()) {
        // TODO(tobyr) Do we have to do the equivalent for binary types here
        // or will this just fall out correctly?

        // add synthetic args for outer this
        NestedTypeBinding nestedBinding = (NestedTypeBinding) declaringClass;
        if (nestedBinding.enclosingInstances != null) {
            for (int i = 0; i < nestedBinding.enclosingInstances.length; ++i) {
                SyntheticArgumentBinding arg = nestedBinding.enclosingInstances[i];
                String argName = String.valueOf(arg.name);
                if (alreadyNamedVariables.contains(argName)) {
                    argName += "_" + i;
                }
                createParameter(arg, argName, newCtor);
                alreadyNamedVariables.add(argName);
            }
        }
    }

    // user args
    if (decl == null) {
        mapParameters(newCtor, b, info);
    } else {
        mapParameters(newCtor, decl, info);
    }
    // original params are now frozen

    addThrownExceptions(b, newCtor);

    info.addCorrelation(info.getCorrelator().by(newCtor));

    if (declaringClass.isNestedType() && !declaringClass.isStatic()) {
        // add synthetic args for locals
        NestedTypeBinding nestedBinding = (NestedTypeBinding) declaringClass;
        // add synthetic args for outer this and locals
        if (nestedBinding.outerLocalVariables != null) {
            for (int i = 0; i < nestedBinding.outerLocalVariables.length; ++i) {
                SyntheticArgumentBinding arg = nestedBinding.outerLocalVariables[i];
                String argName = String.valueOf(arg.name);
                if (alreadyNamedVariables.contains(argName)) {
                    argName += "_" + i;
                }
                createParameter(arg, argName, newCtor);
                alreadyNamedVariables.add(argName);
            }
        }
    }

    if (enclosingType.isExternal()) {
        newCtor.setBody(null);
    }

    typeMap.put(b, newCtor);
    return newCtor;
}

From source file:com.google.gwt.dev.jjs.impl.ReferenceMapper.java

License:Apache License

JMethod createConstructor(SourceInfo info, MethodBinding b) {
    JDeclaredType enclosingType = (JDeclaredType) get(b.declaringClass);
    JMethod method = new JConstructor(info, (JClassType) enclosingType);
    enclosingType.addMethod(method);//from   ww w .  ja v a 2  s. co  m

    /*
     * Don't need to synthesize enum intrinsic args because enum ctors can only
     * be called locally.
     */

    int argPosition = 0;

    ReferenceBinding declaringClass = b.declaringClass;
    if (declaringClass.isNestedType() && !declaringClass.isStatic()) {
        // add synthetic args for outer this
        if (declaringClass.syntheticEnclosingInstanceTypes() != null) {
            for (ReferenceBinding argType : declaringClass.syntheticEnclosingInstanceTypes()) {
                createParameter(info, argType, method, argPosition++);
            }
        }
    }

    // User args.
    argPosition = mapParameters(info, method, b, argPosition);

    if (declaringClass.isNestedType() && !declaringClass.isStatic()) {
        // add synthetic args for locals
        if (declaringClass.syntheticOuterLocalVariables() != null) {
            for (SyntheticArgumentBinding arg : declaringClass.syntheticOuterLocalVariables()) {
                createParameter(info, arg.type, method, argPosition++);
            }
        }
    }

    mapExceptions(method, b);
    if (b.isSynthetic()) {
        method.setSynthetic();
    }
    return method;
}

From source file:lombok.eclipse.handlers.HandleActionFunctionAndPredicate.java

License:Open Source License

private List<TemplateData> findTemplatesFor(final AbstractMethodDeclaration methodDecl,
        final ReferenceBinding template, final String forcedReturnType) {
    final List<TemplateData> foundTemplates = new ArrayList<TemplateData>();
    final TemplateData templateData = templateDataFor(methodDecl, template, forcedReturnType);
    if (templateData != null)
        foundTemplates.add(templateData);
    for (ReferenceBinding memberType : Each.elementIn(template.memberTypes())) {
        if (!template.isInterface() && !memberType.isStatic())
            continue;
        foundTemplates.addAll(findTemplatesFor(methodDecl, memberType, forcedReturnType));
    }/*  w w w  . j  av a 2  s.  c  om*/
    return foundTemplates;
}

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

License:Open Source License

public Binding getBinding(char[] name, int mask, InvocationSite invocationSite, boolean needResolve) {
    CompilationUnitScope unitScope = compilationUnitScope();
    LookupEnvironment env = unitScope.environment;
    try {/*from w  w  w.  j  a  v  a  2s.  co m*/
        env.missingClassFileLocation = invocationSite;
        Binding binding = null;
        FieldBinding problemField = null;
        if ((mask & Binding.VARIABLE) != 0) {
            boolean insideStaticContext = false;
            boolean insideConstructorCall = false;
            boolean insideTypeAnnotation = false;

            FieldBinding foundField = null;
            // can be a problem field which is answered if a valid field is not found
            ProblemFieldBinding foundInsideProblem = null;
            // inside Constructor call or inside static context
            Scope scope = this;
            int depth = 0;
            int foundDepth = 0;
            ReferenceBinding foundActualReceiverType = null;
            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;

                    //$FALL-THROUGH$ could duplicate the code below to save a cast - questionable optimization
                case BLOCK_SCOPE:
                    LocalVariableBinding variableBinding = scope.findVariable(name);
                    // looks in this scope only
                    if (variableBinding != null) {
                        if (foundField != null && foundField.isValidBinding())
                            return new ProblemFieldBinding(foundField, // closest match
                                    foundField.declaringClass, name,
                                    ProblemReasons.InheritedNameHidesEnclosingName);
                        if (depth > 0)
                            invocationSite.setDepth(depth);
                        return variableBinding;
                    }
                    break;
                case CLASS_SCOPE:
                    ClassScope classScope = (ClassScope) scope;
                    ReferenceBinding receiverType = classScope.enclosingReceiverType();
                    if (!insideTypeAnnotation) {
                        FieldBinding fieldBinding = classScope.findField(receiverType, name, invocationSite,
                                needResolve);
                        // Use next line instead if willing to enable protected access accross inner types
                        // FieldBinding fieldBinding = findField(enclosingType, name, invocationSite);

                        if (fieldBinding != null) { // skip it if we did not find anything
                            if (fieldBinding.problemId() == ProblemReasons.Ambiguous) {
                                if (foundField == null || foundField.problemId() == ProblemReasons.NotVisible)
                                    // supercedes any potential InheritedNameHidesEnclosingName problem
                                    return fieldBinding;
                                // make the user qualify the field, likely wants the first inherited field (javac generates an ambiguous error instead)
                                return new ProblemFieldBinding(foundField, // closest match
                                        foundField.declaringClass, name,
                                        ProblemReasons.InheritedNameHidesEnclosingName);
                            }

                            ProblemFieldBinding insideProblem = null;
                            if (fieldBinding.isValidBinding()) {
                                if (!fieldBinding.isStatic()) {
                                    if (insideConstructorCall) {
                                        insideProblem = new ProblemFieldBinding(fieldBinding, // closest match
                                                fieldBinding.declaringClass, name,
                                                ProblemReasons.NonStaticReferenceInConstructorInvocation);
                                    } else if (insideStaticContext) {
                                        insideProblem = new ProblemFieldBinding(fieldBinding, // closest match
                                                fieldBinding.declaringClass, name,
                                                ProblemReasons.NonStaticReferenceInStaticContext);
                                    }
                                }
                                if (receiverType == fieldBinding.declaringClass
                                        || compilerOptions().complianceLevel >= ClassFileConstants.JDK1_4) {
                                    // found a valid field in the 'immediate' scope (i.e. not inherited)
                                    // OR in 1.4 mode (inherited shadows enclosing)
                                    if (foundField == null) {
                                        if (depth > 0) {
                                            invocationSite.setDepth(depth);
                                            invocationSite.setActualReceiverType(receiverType);
                                        }
                                        // return the fieldBinding if it is not declared in a superclass of the scope's binding (that is, inherited)
                                        return insideProblem == null ? fieldBinding : insideProblem;
                                    }
                                    if (foundField.isValidBinding())
                                        // if a valid field was found, complain when another is found in an 'immediate' enclosing type (that is, not inherited)
                                        // but only if "valid field" was inherited in the first place.
                                        if (foundField.declaringClass != fieldBinding.declaringClass
                                                && foundField.declaringClass != foundActualReceiverType) // https://bugs.eclipse.org/bugs/show_bug.cgi?id=316956
                                            // i.e. have we found the same field - do not trust field identity yet
                                            return new ProblemFieldBinding(foundField, // closest match
                                                    foundField.declaringClass, name,
                                                    ProblemReasons.InheritedNameHidesEnclosingName);
                                }
                            }

                            if (foundField == null || (foundField.problemId() == ProblemReasons.NotVisible
                                    && fieldBinding.problemId() != ProblemReasons.NotVisible)) {
                                // only remember the fieldBinding if its the first one found or the previous one was not visible & fieldBinding is...
                                foundDepth = depth;
                                foundActualReceiverType = receiverType;
                                foundInsideProblem = insideProblem;
                                foundField = fieldBinding;
                            }
                        }
                    }
                    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 (foundInsideProblem != null)
                return foundInsideProblem;
            if (foundField != null) {
                if (foundField.isValidBinding()) {
                    if (foundDepth > 0) {
                        invocationSite.setDepth(foundDepth);
                        invocationSite.setActualReceiverType(foundActualReceiverType);
                    }
                    return foundField;
                }
                problemField = foundField;
                foundField = null;
            }

            if (compilerOptions().sourceLevel >= ClassFileConstants.JDK1_5) {
                // at this point the scope is a compilation unit scope & need to check for imported static fields
                unitScope.faultInImports(); // ensure static imports are resolved
                ImportBinding[] imports = unitScope.imports;
                if (imports != null) {
                    // check single static imports
                    for (int i = 0, length = imports.length; i < length; i++) {
                        ImportBinding importBinding = imports[i];
                        if (importBinding.isStatic() && !importBinding.onDemand) {
                            if (CharOperation.equals(
                                    importBinding.compoundName[importBinding.compoundName.length - 1], name)) {
                                if (unitScope.resolveSingleImport(importBinding,
                                        Binding.TYPE | Binding.FIELD | Binding.METHOD) != null
                                        && importBinding.resolvedImport instanceof FieldBinding) {
                                    foundField = (FieldBinding) importBinding.resolvedImport;
                                    ImportReference importReference = importBinding.reference;
                                    if (importReference != null && needResolve) {
                                        importReference.bits |= ASTNode.Used;
                                    }
                                    invocationSite.setActualReceiverType(foundField.declaringClass);
                                    if (foundField.isValidBinding()) {
                                        return foundField;
                                    }
                                    if (problemField == null)
                                        problemField = foundField;
                                }
                            }
                        }
                    }
                    // check on demand imports
                    boolean foundInImport = false;
                    for (int i = 0, length = imports.length; i < length; i++) {
                        ImportBinding importBinding = imports[i];
                        if (importBinding.isStatic() && importBinding.onDemand) {
                            Binding resolvedImport = importBinding.resolvedImport;
                            if (resolvedImport instanceof ReferenceBinding) {
                                FieldBinding temp = findField((ReferenceBinding) resolvedImport, name,
                                        invocationSite, needResolve);
                                if (temp != null) {
                                    if (!temp.isValidBinding()) {
                                        if (problemField == null)
                                            problemField = temp;
                                    } else if (temp.isStatic()) {
                                        if (foundField == temp)
                                            continue;
                                        ImportReference importReference = importBinding.reference;
                                        if (importReference != null && needResolve) {
                                            importReference.bits |= ASTNode.Used;
                                        }
                                        if (foundInImport)
                                            // Answer error binding -- import on demand conflict; name found in two import on demand packages.
                                            return new ProblemFieldBinding(foundField, // closest match
                                                    foundField.declaringClass, name, ProblemReasons.Ambiguous);
                                        foundField = temp;
                                        foundInImport = true;
                                    }
                                }
                            }
                        }
                    }
                    if (foundField != null) {
                        invocationSite.setActualReceiverType(foundField.declaringClass);
                        return foundField;
                    }
                }
            }
        }

        // We did not find a local or instance variable.
        if ((mask & Binding.TYPE) != 0) {
            if ((binding = getBaseType(name)) != null)
                return binding;
            binding = getTypeOrPackage(name,
                    (mask & Binding.PACKAGE) == 0 ? Binding.TYPE : Binding.TYPE | Binding.PACKAGE, needResolve);
            if (binding.isValidBinding() || mask == Binding.TYPE)
                return binding;
            // answer the problem type binding if we are only looking for a type
        } else if ((mask & Binding.PACKAGE) != 0) {
            unitScope.recordSimpleReference(name);
            if ((binding = env.getTopLevelPackage(name)) != null)
                return binding;
        }
        if (problemField != null)
            return problemField;
        if (binding != null && binding.problemId() != ProblemReasons.NotFound)
            return binding; // answer the better problem binding
        return new ProblemBinding(name, enclosingSourceType(), ProblemReasons.NotFound);
    } 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;/*  w w  w  .  j  a  v a 2s .c om*/
    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);
}