private static boolean isRawTypeOfParametrizedType(JavaType site) { return !site.isParameterized() && !site.symbol.typeVariableTypes.isEmpty(); }
private static boolean isRawTypeOfParametrizedType(JavaType site) { return !site.isParameterized() && !site.symbol.typeVariableTypes.isEmpty(); }
JavaType applySiteSubstitution(JavaType type, JavaType site) { if (site.isParameterized()) { return applySubstitution(type, ((ParametrizedTypeJavaType) site).typeSubstitution); } return type; }
JavaType applySiteSubstitution(JavaType type, JavaType site) { if (site.isParameterized()) { return applySubstitution(type, ((ParametrizedTypeJavaType) site).typeSubstitution); } return type; }
private boolean callWithRawType(JavaType arg, JavaType formal) { return formal.isParameterized() && !arg.isParameterized() && types.isSubtype(arg, formal.erasure()); }
private boolean callWithRawType(JavaType arg, JavaType formal) { return formal.isParameterized() && !arg.isParameterized() && types.isSubtype(arg, formal.erasure()); }
private List<List<Type>> computeChains(Symbol m, Type type) { Symbol.TypeSymbol typeSymbol = type.symbol(); Set<ClassJavaType> superTypes = ((JavaSymbol.TypeJavaSymbol) typeSymbol).directSuperTypes(); List<List<Type>> result = superTypes.stream() .flatMap(superType -> computeChains(m, superType).stream()) .peek(c -> c.add(type)) .collect(Collectors.toList()); boolean definesSymbol = definesSymbol(m, typeSymbol); boolean isSpecialization = !((JavaType) startType).isParameterized() && ((JavaType) type).isParameterized(); if (definesSymbol && !isSpecialization && result.isEmpty()) { result.add(Lists.newArrayList(type)); } return result; }
private List<List<Type>> computeChains(Symbol m, Type type) { Symbol.TypeSymbol typeSymbol = type.symbol(); Set<ClassJavaType> superTypes = ((JavaSymbol.TypeJavaSymbol) typeSymbol).directSuperTypes(); List<List<Type>> result = superTypes.stream() .flatMap(superType -> computeChains(m, superType).stream()) .peek(c -> c.add(type)) .collect(Collectors.toList()); boolean definesSymbol = definesSymbol(m, typeSymbol); boolean isSpecialization = !((JavaType) startType).isParameterized() && ((JavaType) type).isParameterized(); if (definesSymbol && !isSpecialization && result.isEmpty()) { result.add(Lists.newArrayList(type)); } return result; }
private static boolean constructParametrizedTypeWithoutSubstitution(JavaSymbol.MethodJavaSymbol method, JavaType site) { return method.isConstructor() && site.isParameterized() && ((ParametrizedTypeJavaType) site).typeSubstitution.isIdentity(); }
private static boolean constructParametrizedTypeWithoutSubstitution(JavaSymbol.MethodJavaSymbol method, JavaType site) { return method.isConstructor() && site.isParameterized() && ((ParametrizedTypeJavaType) site).typeSubstitution.isIdentity(); }
public JavaType resolveTypeSubstitutionWithDiamondOperator(ParametrizedTypeJavaType type, JavaType definition) { ParametrizedTypeJavaType result = type; if (definition.isParameterized()) { TypeSubstitution substitution = TypeSubstitutionSolver.substitutionFromSuperType(type, (ParametrizedTypeJavaType) definition); result = (ParametrizedTypeJavaType) typeSubstitutionSolver.applySubstitution(type, substitution); } return typeSubstitutionSolver.erasureSubstitution(result); }
private static boolean isSerializableAndValueBased(Type type) { // we check first the ParametrizedTypeJavaType, in order to filter out the non-serializable // generic value-based class Optional<T> JavaType javaType = (JavaType) type; if (javaType.isParameterized()) { ParametrizedTypeJavaType parameterizedType = (ParametrizedTypeJavaType) javaType; return isSubtypeOfCollectionApi(parameterizedType) && parameterizedType.typeParameters().stream() .anyMatch(t -> isSerializableAndValueBased(parameterizedType.substitution(t))); } return ValueBasedUtils.isValueBased(javaType); }
public JavaType resolveTypeSubstitutionWithDiamondOperator(ParametrizedTypeJavaType type, JavaType definition) { ParametrizedTypeJavaType result = type; if (definition.isParameterized()) { TypeSubstitution substitution = TypeSubstitutionSolver.substitutionFromSuperType(type, (ParametrizedTypeJavaType) definition); result = (ParametrizedTypeJavaType) typeSubstitutionSolver.applySubstitution(type, substitution); } return typeSubstitutionSolver.erasureSubstitution(result); }
private static boolean isSerializableAndValueBased(Type type) { // we check first the ParametrizedTypeJavaType, in order to filter out the non-serializable // generic value-based class Optional<T> JavaType javaType = (JavaType) type; if (javaType.isParameterized()) { ParametrizedTypeJavaType parameterizedType = (ParametrizedTypeJavaType) javaType; return isSubtypeOfCollectionApi(parameterizedType) && parameterizedType.typeParameters().stream() .anyMatch(t -> isSerializableAndValueBased(parameterizedType.substitution(t))); } return ValueBasedUtils.isValueBased(javaType); }
private JavaType refinedTypeForConstructor(JavaType capturedReturnType, JavaType refinedReturnType) { JavaType sanitizedCaptured = capturedReturnType; JavaType refinedConstructorType = refinedReturnType; if (refinedConstructorType.symbol().isTypeSymbol() && !((JavaSymbol.TypeJavaSymbol) refinedConstructorType.symbol()).typeParameters().scopeSymbols().isEmpty()) { refinedConstructorType = parametrizedTypeCache.getParametrizedTypeType(refinedConstructorType.symbol, new TypeSubstitution()); } if (sanitizedCaptured.isTagged(JavaType.TYPEVAR)) { sanitizedCaptured = ((TypeVariableJavaType) sanitizedCaptured).bounds.get(0); } if (refinedConstructorType.isParameterized()) { refinedConstructorType = resolve.resolveTypeSubstitutionWithDiamondOperator((ParametrizedTypeJavaType) refinedConstructorType, sanitizedCaptured); } return refinedConstructorType; }
private JavaType refinedTypeForConstructor(JavaType capturedReturnType, JavaType refinedReturnType) { JavaType sanitizedCaptured = capturedReturnType; JavaType refinedConstructorType = refinedReturnType; if (refinedConstructorType.symbol().isTypeSymbol() && !((JavaSymbol.TypeJavaSymbol) refinedConstructorType.symbol()).typeParameters().scopeSymbols().isEmpty()) { refinedConstructorType = parametrizedTypeCache.getParametrizedTypeType(refinedConstructorType.symbol, new TypeSubstitution()); } if (sanitizedCaptured.isTagged(JavaType.TYPEVAR)) { sanitizedCaptured = ((TypeVariableJavaType) sanitizedCaptured).bounds.get(0); } if (refinedConstructorType.isParameterized()) { refinedConstructorType = resolve.resolveTypeSubstitutionWithDiamondOperator((ParametrizedTypeJavaType) refinedConstructorType, sanitizedCaptured); } return refinedConstructorType; }
@Override public boolean isSubtypeOf(Type superType) { if (((JavaType) superType).isTagged(TYPEVAR)) { return false; } if (erasure() == superType.erasure()) { return !((JavaType) superType).isParameterized() || checkSubstitutedTypesCompatibility((ParametrizedTypeJavaType) superType); } if (verifySuperTypes(superType)) { return true; } return ((JavaType) superType).isTagged(WILDCARD) && ((WildCardType) superType).isSubtypeOfBound(this); }
@Override public boolean isSubtypeOf(Type superType) { if (((JavaType) superType).isTagged(TYPEVAR)) { return false; } if (erasure() == superType.erasure()) { return !((JavaType) superType).isParameterized() || checkSubstitutedTypesCompatibility((ParametrizedTypeJavaType) superType); } if (verifySuperTypes(superType)) { return true; } return ((JavaType) superType).isTagged(WILDCARD) && ((WildCardType) superType).isSubtypeOfBound(this); }
private void setInferedType(Type infered, DeferredType deferredType) { AbstractTypedTree inferedExpression = deferredType.tree(); Type newType = infered; if (inferedExpression.is(Tree.Kind.NEW_CLASS)) { Type newClassType = ((NewClassTree) inferedExpression).identifier().symbolType(); if(((JavaType) newClassType).isParameterized()) { newType = resolve.resolveTypeSubstitutionWithDiamondOperator((ParametrizedTypeJavaType) newClassType, (JavaType) infered); } } inferedExpression.setInferedType(newType); inferedExpression.accept(this); if (inferedExpression.is(Tree.Kind.VAR_TYPE)) { // change type of the variable JavaSymbol.VariableJavaSymbol variableSymbol = ((VariableTreeImpl) inferedExpression.parent()).getSymbol(); variableSymbol.type = (JavaType) newType; } }
private boolean isAcceptableType(JavaType arg, JavaType formal, boolean autoboxing) { if(arg.isTagged(JavaType.DEFERRED)) { return isAcceptableDeferredType((DeferredType) arg, formal); } if(formal.isTagged(JavaType.TYPEVAR) && !arg.isTagged(JavaType.TYPEVAR)) { return subtypeOfTypeVar(arg, (TypeVariableJavaType) formal); } if (formal.isArray() && arg.isArray()) { return isAcceptableType(((ArrayJavaType) arg).elementType(), ((ArrayJavaType) formal).elementType(), autoboxing); } if (arg.isParameterized() || formal.isParameterized() || isWilcardType(arg) || isWilcardType(formal)) { return callWithRawType(arg, formal) || types.isSubtype(arg, formal) || isAcceptableByAutoboxing(arg, formal.erasure()); } // fall back to behavior based on erasure return types.isSubtype(arg.erasure(), formal.erasure()) || (autoboxing && isAcceptableByAutoboxing(arg, formal.erasure())); }