Resolution resolution = new Resolution(new AccessErrorJavaSymbol(candidate, Symbols.unknownType)); resolution.type = Symbols.unknownType; return resolution;
Resolution resolution = new Resolution(new AccessErrorJavaSymbol(candidate, Symbols.unknownType)); resolution.type = Symbols.unknownType; return resolution;
private JavaSymbol findMemberType(Env env, JavaSymbol.TypeJavaSymbol site, String name, JavaSymbol.TypeJavaSymbol c) { JavaSymbol bestSoFar = symbolNotFound; for (JavaSymbol symbol : c.members().lookup(name)) { if (symbol.kind == JavaSymbol.TYP) { return isAccessible(env, site, symbol) ? symbol : new AccessErrorJavaSymbol(symbol, Symbols.unknownType); } } if (c.getSuperclass() != null) { JavaSymbol symbol = findMemberType(env, site, name, c.getSuperclass().symbol); if (symbol.kind < bestSoFar.kind) { bestSoFar = symbol; } } if (c.getInterfaces() == null) { // Invariant to check that interfaces are not set only when we are looking into the symbol we are currently completing. // required for generics Preconditions.checkState(c.completing, "interfaces of a symbol not currently completing are not set."); Preconditions.checkState(c == site); } else { for (JavaType interfaceType : c.getInterfaces()) { JavaSymbol symbol = findMemberType(env, site, name, interfaceType.symbol); if (symbol.kind < bestSoFar.kind) { bestSoFar = symbol; } } } return bestSoFar; }
return resolution; } else { return Resolution.resolution(new AccessErrorJavaSymbol(symbol, symbols.unknownType));
return resolution; } else { return Resolution.resolution(new AccessErrorJavaSymbol(symbol, Symbols.unknownType));
private JavaSymbol findMemberType(Env env, JavaSymbol.TypeJavaSymbol site, String name, JavaSymbol.TypeJavaSymbol c) { JavaSymbol bestSoFar = symbolNotFound; for (JavaSymbol symbol : c.members().lookup(name)) { if (symbol.kind == JavaSymbol.TYP) { return isAccessible(env, site, symbol) ? symbol : new AccessErrorJavaSymbol(symbol, Symbols.unknownType); } } if (c.getSuperclass() != null) { JavaSymbol symbol = findMemberType(env, site, name, c.getSuperclass().symbol); if (symbol.kind < bestSoFar.kind) { bestSoFar = symbol; } } if (c.getInterfaces() == null) { // Invariant to check that interfaces are not set only when we are looking into the symbol we are currently completing. // required for generics Preconditions.checkState(c.completing, "interfaces of a symbol not currently completing are not set."); Preconditions.checkState(c == site); } else { for (JavaType interfaceType : c.getInterfaces()) { JavaSymbol symbol = findMemberType(env, site, name, interfaceType.symbol); if (symbol.kind < bestSoFar.kind) { bestSoFar = symbol; } } } return bestSoFar; }
private JavaSymbol findMemberType(Env env, JavaSymbol.TypeJavaSymbol site, String name, JavaSymbol.TypeJavaSymbol c) { JavaSymbol bestSoFar = symbolNotFound; for (JavaSymbol symbol : c.members().lookup(name)) { if (symbol.kind == JavaSymbol.TYP) { return isAccessible(env, site, symbol) ? symbol : new AccessErrorJavaSymbol(symbol, Symbols.unknownType); } } if (c.getSuperclass() != null) { JavaSymbol symbol = findMemberType(env, site, name, c.getSuperclass().symbol); if (symbol.kind < bestSoFar.kind) { bestSoFar = symbol; } } if (c.getInterfaces() == null) { // Invariant to check that interfaces are not set only when we are looking into the symbol we are currently completing. // required for generics Preconditions.checkState(c.completing, "interfaces of a symbol not currently completing are not set."); Preconditions.checkState(c == site); } else { for (JavaType interfaceType : c.getInterfaces()) { JavaSymbol symbol = findMemberType(env, site, name, interfaceType.symbol); if (symbol.kind < bestSoFar.kind) { bestSoFar = symbol; } } } return bestSoFar; }
/** * @param candidate candidate * @param bestSoFar previously found best match */ private JavaSymbol selectBest(Env env, JavaSymbol.TypeJavaSymbol site, List<JavaType> argTypes, JavaSymbol candidate, JavaSymbol bestSoFar, boolean autoboxing) { // TODO get rid of null check if (candidate.kind >= JavaSymbol.ERRONEOUS || !isInheritedIn(candidate, site) || candidate.type == null) { return bestSoFar; } JavaSymbol.MethodJavaSymbol methodJavaSymbol = (JavaSymbol.MethodJavaSymbol) candidate; boolean isVarArgs = methodJavaSymbol.isVarArgs(); boolean usesTypeParameter = usesTypeParameter(methodJavaSymbol); if (!isArgumentsAcceptable(argTypes, ((JavaType.MethodJavaType) candidate.type).argTypes, isVarArgs, autoboxing, usesTypeParameter)) { return bestSoFar; } // TODO ambiguity, errors, ... if (!isAccessible(env, site, candidate)) { return new AccessErrorJavaSymbol(candidate, Symbols.unknownType); } JavaSymbol mostSpecific = selectMostSpecific(candidate, bestSoFar); if (mostSpecific.isKind(JavaSymbol.AMBIGUOUS)) { // same signature, we keep the first symbol found (overrides the other one). mostSpecific = bestSoFar; } return mostSpecific; }
/** * @param symbol candidate * @param bestSoFar previously found best match */ private JavaSymbol selectBest(Env env, JavaSymbol.TypeJavaSymbol site, List<JavaType> argTypes, JavaSymbol symbol, JavaSymbol bestSoFar, boolean autoboxing) { // TODO get rid of null check if (symbol.kind >= JavaSymbol.ERRONEOUS || !isInheritedIn(symbol, site) || symbol.type == null) { return bestSoFar; } boolean isVarArgs = ((JavaSymbol.MethodJavaSymbol) symbol).isVarArgs(); if (!isArgumentsAcceptable(argTypes, ((JavaType.MethodJavaType) symbol.type).argTypes, isVarArgs, autoboxing)) { return bestSoFar; } // TODO ambiguity, errors, ... if (!isAccessible(env, site, symbol)) { return new AccessErrorJavaSymbol(symbol, symbols.unknownType); } JavaSymbol mostSpecific = selectMostSpecific(symbol, bestSoFar, argTypes); if (mostSpecific.isKind(JavaSymbol.AMBIGUOUS)) { //same signature, we keep the first symbol found (overrides the other one). mostSpecific = bestSoFar; } return mostSpecific; }
private JavaSymbol findMemberType(Env env, JavaSymbol.TypeJavaSymbol site, String name, JavaSymbol.TypeJavaSymbol c) { JavaSymbol bestSoFar = symbolNotFound; for (JavaSymbol symbol : c.members().lookup(name)) { if (symbol.kind == JavaSymbol.TYP) { return isAccessible(env, site, symbol) ? symbol : new AccessErrorJavaSymbol(symbol, symbols.unknownType); } } if (c.getSuperclass() != null) { JavaSymbol symbol = findMemberType(env, site, name, c.getSuperclass().symbol); if (symbol.kind < bestSoFar.kind) { bestSoFar = symbol; } } for (JavaType interfaceType : c.getInterfaces()) { JavaSymbol symbol = findMemberType(env, site, name, interfaceType.symbol); if (symbol.kind < bestSoFar.kind) { bestSoFar = symbol; } } return bestSoFar; }
private Resolution resolveField(Env env, JavaSymbol.TypeJavaSymbol site, JavaSymbol.TypeJavaSymbol owner, JavaSymbol field) { if (isAccessible(env, site, field)) { Resolution resolution = Resolution.resolution(field); if (field.type != null) { // type may not have been resolved yet, but will be in 2nd pass resolution.type = typeSubstitutionSolver.applySiteSubstitution(field.type, owner.type); } return resolution; } return Resolution.resolution(new AccessErrorJavaSymbol(field, Symbols.unknownType)); }
private Resolution resolveField(Env env, JavaSymbol.TypeJavaSymbol site, JavaSymbol.TypeJavaSymbol owner, JavaSymbol field) { if (isAccessible(env, site, field)) { Resolution resolution = Resolution.resolution(field); if (field.type != null) { // type may not have been resolved yet, but will be in 2nd pass resolution.type = typeSubstitutionSolver.applySiteSubstitution(field.type, owner.type); } return resolution; } return Resolution.resolution(new AccessErrorJavaSymbol(field, Symbols.unknownType)); }