public JavaType resolveTypeSubstitution(JavaType type, JavaType definition) { return typeSubstitutionSolver.applySiteSubstitution(type, definition); } public List<JavaType> resolveTypeSubstitution(List<JavaType> formals, TypeSubstitution substitution) {
returnType = typeSubstitutionSolver.getReturnType(returnType, defSite, callSite, substitution, mostSpecificMethod); thrownTypes = thrownTypes.stream() .map(t -> typeSubstitutionSolver.applySiteSubstitution(t, callSite)) .map(t -> typeSubstitutionSolver.applySubstitution(t, substitution)) .collect(Collectors.toList());
public JavaType resolveTypeSubstitution(JavaType type, JavaType definition) { return typeSubstitutionSolver.applySiteSubstitution(type, definition); } public List<JavaType> resolveTypeSubstitution(List<JavaType> formals, TypeSubstitution substitution) {
returnType = typeSubstitutionSolver.getReturnType(returnType, defSite, callSite, substitution, mostSpecificMethod); thrownTypes = thrownTypes.stream() .map(t -> typeSubstitutionSolver.applySiteSubstitution(t, callSite)) .map(t -> typeSubstitutionSolver.applySubstitution(t, substitution)) .collect(Collectors.toList());
JavaType applySiteSubstitution(@Nullable JavaType resolvedType, JavaType callSite, JavaType resolvedTypeDefinition) { if (resolvedType == null) { // case of constructors return null; } if(resolvedType.isTagged(JavaType.METHOD)) { MethodJavaType methodType = (MethodJavaType) resolvedType; JavaType resultType = applySiteSubstitution(methodType.resultType, callSite, resolvedTypeDefinition); List<JavaType> argTypes = methodType.argTypes.stream().map(argType -> applySiteSubstitution(argType, callSite, resolvedTypeDefinition)).collect(Collectors.toList()); return new MethodJavaType(argTypes, resultType, methodType.thrown, methodType.symbol); } return applySiteSubstitution(applySiteSubstitution(resolvedType, resolvedTypeDefinition), callSite); }
JavaType applySiteSubstitution(@Nullable JavaType resolvedType, JavaType callSite, JavaType resolvedTypeDefinition) { if (resolvedType == null) { // case of constructors return null; } if(resolvedType.isTagged(JavaType.METHOD)) { MethodJavaType methodType = (MethodJavaType) resolvedType; JavaType resultType = applySiteSubstitution(methodType.resultType, callSite, resolvedTypeDefinition); List<JavaType> argTypes = methodType.argTypes.stream().map(argType -> applySiteSubstitution(argType, callSite, resolvedTypeDefinition)).collect(Collectors.toList()); return new MethodJavaType(argTypes, resultType, methodType.thrown, methodType.symbol); } return applySiteSubstitution(applySiteSubstitution(resolvedType, resolvedTypeDefinition), callSite); }
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)); }
Resolution best = selectBest(env, superclass, callSite, argTypes, typeParams, method.symbol, bestSoFar, looseInvocation); if (best.symbol == method.symbol) { method.type = typeSubstitutionSolver.applySiteSubstitution(method.type, site, superclass); bestSoFar = method; Resolution best = selectBest(env, interfaceType, callSite, argTypes, typeParams, method.symbol, bestSoFar, looseInvocation); if (best.symbol == method.symbol) { method.type = typeSubstitutionSolver.applySiteSubstitution(method.type, site, interfaceType); bestSoFar = method;
Resolution best = selectBest(env, superclass, callSite, argTypes, typeParams, method.symbol, bestSoFar, looseInvocation); if (best.symbol == method.symbol) { method.type = typeSubstitutionSolver.applySiteSubstitution(method.type, site, superclass); bestSoFar = method; Resolution best = selectBest(env, interfaceType, callSite, argTypes, typeParams, method.symbol, bestSoFar, looseInvocation); if (best.symbol == method.symbol) { method.type = typeSubstitutionSolver.applySiteSubstitution(method.type, site, interfaceType); bestSoFar = method;
JavaType getReturnType(@Nullable JavaType returnType, JavaType defSite, JavaType callSite, TypeSubstitution substitution, JavaSymbol.MethodJavaSymbol method) { JavaType resultType = returnType; if (method.isConstructor()) { if (constructParametrizedTypeWithoutSubstitution(method, defSite)) { resultType = applySubstitution(defSite, substitution); } else { return defSite; } } // As per getClass javadoc: // The actual result type [of getClass] is Class<? extends |X|> where |X| is the erasure of the static type of the expression on which getClass is called. if(defSite == symbols.objectType && "getClass".equals(method.name())) { TypeJavaSymbol classSymbol = symbols.classType.symbol; JavaType wildcardType = parametrizedTypeCache.getWildcardType(callSite.erasure(), WildCardType.BoundType.EXTENDS); resultType = parametrizedTypeCache.getParametrizedTypeType(classSymbol, new TypeSubstitution().add(classSymbol.typeVariableTypes.get(0), wildcardType)); } resultType = applySiteSubstitution(resultType, defSite); if (callSite != defSite) { resultType = applySiteSubstitution(resultType, callSite); } resultType = applySubstitution(resultType, substitution); if (!isReturnTypeCompletelySubstituted(resultType, method.typeVariableTypes) || (method.isConstructor() && !isReturnTypeCompletelySubstituted(resultType, defSite.symbol.typeVariableTypes))) { resultType = symbols.deferedType(resultType); } return resultType; }
JavaType getReturnType(@Nullable JavaType returnType, JavaType defSite, JavaType callSite, TypeSubstitution substitution, JavaSymbol.MethodJavaSymbol method) { JavaType resultType = returnType; if (method.isConstructor()) { if (constructParametrizedTypeWithoutSubstitution(method, defSite)) { resultType = applySubstitution(defSite, substitution); } else { return defSite; } } // As per getClass javadoc: // The actual result type [of getClass] is Class<? extends |X|> where |X| is the erasure of the static type of the expression on which getClass is called. if(defSite == symbols.objectType && "getClass".equals(method.name())) { TypeJavaSymbol classSymbol = symbols.classType.symbol; JavaType wildcardType = parametrizedTypeCache.getWildcardType(callSite.erasure(), WildCardType.BoundType.EXTENDS); resultType = parametrizedTypeCache.getParametrizedTypeType(classSymbol, new TypeSubstitution().add(classSymbol.typeVariableTypes.get(0), wildcardType)); } resultType = applySiteSubstitution(resultType, defSite); if (callSite != defSite) { resultType = applySiteSubstitution(resultType, callSite); } resultType = applySubstitution(resultType, substitution); if (!isReturnTypeCompletelySubstituted(resultType, method.typeVariableTypes) || (method.isConstructor() && !isReturnTypeCompletelySubstituted(resultType, defSite.symbol.typeVariableTypes))) { resultType = symbols.deferedType(resultType); } return resultType; }
/** * Finds field with given name. */ private Resolution findField(Env env, JavaSymbol.TypeJavaSymbol site, String name, JavaSymbol.TypeJavaSymbol c) { Resolution bestSoFar = unresolved(); for (JavaSymbol symbol : c.members().lookup(name)) { if (symbol.kind == JavaSymbol.VAR) { return resolveField(env, site, c, symbol); } } Resolution resolution; if (c.getSuperclass() != null) { resolution = findField(env, site, name, c.getSuperclass().symbol); if (resolution.symbol.kind < bestSoFar.symbol.kind) { resolution.type = typeSubstitutionSolver.applySiteSubstitution(resolution.type(), c.getSuperclass()); bestSoFar = resolution; } } for (JavaType interfaceType : c.getInterfaces()) { resolution = findField(env, site, name, interfaceType.symbol); if (resolution.symbol.kind < bestSoFar.symbol.kind) { bestSoFar = resolution; } } return bestSoFar; }
/** * Finds field with given name. */ private Resolution findField(Env env, JavaSymbol.TypeJavaSymbol site, String name, JavaSymbol.TypeJavaSymbol c) { Resolution bestSoFar = unresolved(); for (JavaSymbol symbol : c.members().lookup(name)) { if (symbol.kind == JavaSymbol.VAR) { return resolveField(env, site, c, symbol); } } Resolution resolution; if (c.getSuperclass() != null) { resolution = findField(env, site, name, c.getSuperclass().symbol); if (resolution.symbol.kind < bestSoFar.symbol.kind) { resolution.type = typeSubstitutionSolver.applySiteSubstitution(resolution.type(), c.getSuperclass()); bestSoFar = resolution; } } for (JavaType interfaceType : c.getInterfaces()) { resolution = findField(env, site, name, interfaceType.symbol); if (resolution.symbol.kind < bestSoFar.symbol.kind) { bestSoFar = resolution; } } return bestSoFar; }