@Override public void visitEnd() { if (!typeArguments.isEmpty()) { JavaSymbol.TypeJavaSymbol readSymbol = typeRead.symbol; readSymbol.complete(); //Mismatch between type variable and type arguments means we are lacking some pieces of bytecode to resolve substitution properly. if (typeArguments.size() == readSymbol.typeVariableTypes.size()) { TypeSubstitution substitution = new TypeSubstitution(); int i = 0; for (JavaType typeArgument : typeArguments) { substitution.add(readSymbol.typeVariableTypes.get(i), typeArgument); i++; } typeRead = parametrizedTypeCache.getParametrizedTypeType(readSymbol, substitution); } } } }
@Override public void visitEnd() { if (!typeArguments.isEmpty()) { JavaSymbol.TypeJavaSymbol readSymbol = typeRead.symbol; readSymbol.complete(); //Mismatch between type variable and type arguments means we are lacking some pieces of bytecode to resolve substitution properly. if (typeArguments.size() == readSymbol.typeVariableTypes.size()) { TypeSubstitution substitution = new TypeSubstitution(); int i = 0; for (JavaType typeArgument : typeArguments) { substitution.add(readSymbol.typeVariableTypes.get(i), typeArgument); i++; } typeRead = parametrizedTypeCache.getParametrizedTypeType(readSymbol, substitution); } } } }
@Override public void visitEnd() { if (!typeArguments.isEmpty()) { JavaSymbol.TypeJavaSymbol readSymbol = typeRead.symbol; readSymbol.complete(); //Mismatch between type variable and type arguments means we are lacking some pieces of bytecode to resolve substitution properly. if (typeArguments.size() == readSymbol.typeVariableTypes.size()) { TypeSubstitution substitution = new TypeSubstitution(); int i = 0; for (JavaType typeArgument : typeArguments) { substitution.add(readSymbol.typeVariableTypes.get(i), typeArgument); i++; } typeRead = parametrizedTypeCache.getParametrizedTypeType(readSymbol, substitution); } } } }
JavaType erasureSubstitution(ParametrizedTypeJavaType type) { TypeSubstitution substitution = new TypeSubstitution(); for (Map.Entry<TypeVariableJavaType, JavaType> entry : type.typeSubstitution.substitutionEntries()) { TypeVariableJavaType typeVar = entry.getKey(); JavaType subs = entry.getValue(); if (typeVar == subs) { subs = subs.erasure(); } substitution.add(typeVar, subs); } return parametrizedTypeCache.getParametrizedTypeType(type.symbol, substitution); }
JavaType erasureSubstitution(ParametrizedTypeJavaType type) { TypeSubstitution substitution = new TypeSubstitution(); for (Map.Entry<TypeVariableJavaType, JavaType> entry : type.typeSubstitution.substitutionEntries()) { TypeVariableJavaType typeVar = entry.getKey(); JavaType subs = entry.getValue(); if (typeVar == subs) { subs = subs.erasure(); } substitution.add(typeVar, subs); } return parametrizedTypeCache.getParametrizedTypeType(type.symbol, substitution); }
private JavaType substituteInParametrizedType(ParametrizedTypeJavaType type, TypeSubstitution substitution) { TypeSubstitution newSubstitution = new TypeSubstitution(); for (Map.Entry<TypeVariableJavaType, JavaType> entry : type.typeSubstitution.substitutionEntries()) { newSubstitution.add(entry.getKey(), applySubstitution(entry.getValue(), substitution)); } return parametrizedTypeCache.getParametrizedTypeType(type.rawType.getSymbol(), newSubstitution); }
private JavaType substituteInParametrizedType(ParametrizedTypeJavaType type, TypeSubstitution substitution) { TypeSubstitution newSubstitution = new TypeSubstitution(); for (Map.Entry<TypeVariableJavaType, JavaType> entry : type.typeSubstitution.substitutionEntries()) { newSubstitution.add(entry.getKey(), applySubstitution(entry.getValue(), substitution)); } return parametrizedTypeCache.getParametrizedTypeType(type.rawType.getSymbol(), newSubstitution); }
private JavaType parametrizedTypeWithTypeArguments(JavaSymbol.TypeJavaSymbol symbol, TypeArguments typeArguments) { TypeSubstitution typeSubstitution = new TypeSubstitution(); if (typeArguments.size() <= symbol.typeVariableTypes.size()) { for (int i = 0; i < typeArguments.size(); i++) { typeSubstitution.add(symbol.typeVariableTypes.get(i), getType(typeArguments.get(i))); } } return parametrizedTypeCache.getParametrizedTypeType(symbol, typeSubstitution); }
private JavaType parametrizedTypeWithTypeArguments(JavaSymbol.TypeJavaSymbol symbol, TypeArguments typeArguments) { TypeSubstitution typeSubstitution = new TypeSubstitution(); if (typeArguments.size() <= symbol.typeVariableTypes.size()) { for (int i = 0; i < typeArguments.size(); i++) { typeSubstitution.add(symbol.typeVariableTypes.get(i), getType(typeArguments.get(i))); } } return parametrizedTypeCache.getParametrizedTypeType(symbol, typeSubstitution); }
private JavaType substituteTypeParameter(JavaType type, TypeSubstitution substitution) { JavaType substitutedType = substitution.substitutedType(type); if (substitutedType != null) { return substitutedType; } if(type instanceof JavaType.ParametrizedTypeJavaType) { JavaType.ParametrizedTypeJavaType ptt = (JavaType.ParametrizedTypeJavaType) type; TypeSubstitution newSubstitution = new TypeSubstitution(); for (Map.Entry<JavaType.TypeVariableJavaType, JavaType> entry : ptt.typeSubstitution.substitutionEntries()) { newSubstitution.add(entry.getKey(), substituteTypeParameter(entry.getValue(), substitution)); } return parametrizedTypeCache.getParametrizedTypeType(ptt.rawType.getSymbol(), newSubstitution); } return type; }
private JavaType substituteTypeParameter(JavaType type, TypeSubstitution substitution) { JavaType substitutedType = substitution.substitutedType(type); if (substitutedType != null) { return substitutedType; } if(type instanceof JavaType.ParametrizedTypeJavaType) { JavaType.ParametrizedTypeJavaType ptt = (JavaType.ParametrizedTypeJavaType) type; TypeSubstitution newSubstitution = new TypeSubstitution(); for (Map.Entry<JavaType.TypeVariableJavaType, JavaType> entry : ptt.typeSubstitution.substitutionEntries()) { newSubstitution.add(entry.getKey(), substituteTypeParameter(entry.getValue(), substitution)); } return parametrizedTypeCache.getParametrizedTypeType(ptt.rawType.getSymbol(), newSubstitution); } return type; }
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; }
private Type leastContainingTypeArgument(JavaType type1, JavaType type2) { Preconditions.checkArgument(type1.isTagged(JavaType.PARAMETERIZED) && type2.isTagged(JavaType.PARAMETERIZED)); TypeSubstitution typeSubstitution1 = ((ParametrizedTypeJavaType) type1).typeSubstitution; TypeSubstitution typeSubstitution2 = ((ParametrizedTypeJavaType) type2).typeSubstitution; TypeSubstitution newTypeSubstitution = new TypeSubstitution(); for (TypeVariableJavaType typeVar : typeSubstitution1.typeVariables()) { JavaType subs1 = typeSubstitution1.substitutedType(typeVar); JavaType subs2 = typeSubstitution2.substitutedType(typeVar); JavaType newSubs = getNewTypeArgumentType(subs1, subs2); newTypeSubstitution.add(typeVar, newSubs); } return parametrizedTypeCache.getParametrizedTypeType(type1.symbol, newTypeSubstitution); }
@Override public void visitParameterizedType(ParameterizedTypeTree tree) { resolveAs(tree.type(), JavaSymbol.TYP); resolveAs(tree.typeArguments(), JavaSymbol.TYP); JavaType type = getType(tree.type()); //Type substitution for parametrized type. TypeSubstitution typeSubstitution = new TypeSubstitution(); if (tree.typeArguments().size() <= type.getSymbol().typeVariableTypes.size()) { for (int i = 0; i < tree.typeArguments().size(); i++) { typeSubstitution.add(type.getSymbol().typeVariableTypes.get(i), getType(tree.typeArguments().get(i))); } } registerType(tree, parametrizedTypeCache.getParametrizedTypeType(type.getSymbol(), typeSubstitution)); }
private Type leastContainingTypeArgument(JavaType type1, JavaType type2) { Preconditions.checkArgument(type1.isTagged(JavaType.PARAMETERIZED) && type2.isTagged(JavaType.PARAMETERIZED)); TypeSubstitution typeSubstitution1 = ((ParametrizedTypeJavaType) type1).typeSubstitution; TypeSubstitution typeSubstitution2 = ((ParametrizedTypeJavaType) type2).typeSubstitution; TypeSubstitution newTypeSubstitution = new TypeSubstitution(); for (TypeVariableJavaType typeVar : typeSubstitution1.typeVariables()) { JavaType subs1 = typeSubstitution1.substitutedType(typeVar); JavaType subs2 = typeSubstitution2.substitutedType(typeVar); JavaType newSubs = getNewTypeArgumentType(subs1, subs2); newTypeSubstitution.add(typeVar, newSubs); } return parametrizedTypeCache.getParametrizedTypeType(type1.symbol, newTypeSubstitution); }
private JavaSymbol resolveClassType(Tree tree, Resolve.Env resolveEnv, MemberSelectExpressionTree mse) { resolveAs(mse.expression(), JavaSymbol.TYP, resolveEnv); // member select ending with .class JavaType expressionType = getType(mse.expression()); if (expressionType.isPrimitive()) { expressionType = expressionType.primitiveWrapperType(); } TypeSubstitution typeSubstitution = new TypeSubstitution(); typeSubstitution.add(symbols.classType.getSymbol().typeVariableTypes.get(0), expressionType); JavaType parametrizedClassType = parametrizedTypeCache.getParametrizedTypeType(symbols.classType.symbol, typeSubstitution); registerType(tree, parametrizedClassType); return parametrizedClassType.symbol; }
private JavaSymbol resolveClassType(Tree tree, Resolve.Env resolveEnv, MemberSelectExpressionTree mse) { resolveAs(mse.expression(), JavaSymbol.TYP, resolveEnv); // member select ending with .class JavaType expressionType = getType(mse.expression()); if (expressionType.isPrimitive()) { expressionType = expressionType.primitiveWrapperType(); } TypeSubstitution typeSubstitution = new TypeSubstitution(); typeSubstitution.add(symbols.classType.getSymbol().typeVariableTypes.get(0), expressionType); JavaType parametrizedClassType = parametrizedTypeCache.getParametrizedTypeType(symbols.classType.symbol, typeSubstitution); registerType(tree, parametrizedClassType); return parametrizedClassType.symbol; }
private void populateSuperclass(JavaSymbol.TypeJavaSymbol symbol, Resolve.Env env, ClassJavaType type) { ClassTree tree = symbol.declaration; Tree superClassTree = tree.superClass(); if (superClassTree != null) { type.supertype = resolveType(env, superClassTree); checkHierarchyCycles(symbol.type); } else if (tree.is(Tree.Kind.ENUM)) { // JLS8 8.9: The direct superclass of an enum type E is Enum<E>. Scope enumParameters = ((JavaSymbol.TypeJavaSymbol) symbols.enumType.symbol()).typeParameters(); TypeVariableJavaType enumParameter = (TypeVariableJavaType) enumParameters.lookup("E").get(0).type(); type.supertype = parametrizedTypeCache.getParametrizedTypeType(symbols.enumType.symbol, new TypeSubstitution().add(enumParameter, type)); } else if (tree.is(Tree.Kind.CLASS, Tree.Kind.INTERFACE)) { // For CLASS JLS8 8.1.4: the direct superclass of the class type C<F1,...,Fn> is // the type given in the extends clause of the declaration of C // if an extends clause is present, or Object otherwise. // For INTERFACE JLS8 9.1.3: While every class is an extension of class Object, there is no single interface of which all interfaces are // extensions. // but we can call object method on any interface type. type.supertype = symbols.objectType; } }
@Override public void visitParameterizedType(ParameterizedTypeTree tree) { resolveAs(tree.type(), JavaSymbol.TYP); resolveAs((List<Tree>) tree.typeArguments(), JavaSymbol.TYP); JavaType type = getType(tree.type()); //Type substitution for parametrized type. TypeSubstitution typeSubstitution = new TypeSubstitution(); if (tree.typeArguments().size() <= type.getSymbol().typeVariableTypes.size()) { for (int i = 0; i < tree.typeArguments().size(); i++) { typeSubstitution.add(type.getSymbol().typeVariableTypes.get(i), getType(tree.typeArguments().get(i))); } } registerType(tree, parametrizedTypeCache.getParametrizedTypeType(type.getSymbol(), typeSubstitution)); }