@Override public void visitEnd() { super.visitEnd(); JavaType typeArgument; switch (wildcard) { case EXTENDS: typeArgument = parametrizedTypeCache.getWildcardType(this.typeRead, WildCardType.BoundType.EXTENDS); break; case SUPER: typeArgument = parametrizedTypeCache.getWildcardType(this.typeRead, WildCardType.BoundType.SUPER); break; case INSTANCEOF: default: typeArgument = this.typeRead; break; } ReadType.this.typeArguments.add(typeArgument); } };
@Override public void visitEnd() { super.visitEnd(); JavaType typeArgument; switch (wildcard) { case EXTENDS: typeArgument = parametrizedTypeCache.getWildcardType(this.typeRead, JavaType.WildCardType.BoundType.EXTENDS); break; case SUPER: typeArgument = parametrizedTypeCache.getWildcardType(this.typeRead, JavaType.WildCardType.BoundType.SUPER); break; case INSTANCEOF: default: typeArgument = this.typeRead; break; } ReadType.this.typeArguments.add(typeArgument); } };
private JavaType lctaOneWildcard(JavaType rawType, WildCardType wildcardType) { if (wildcardType.boundType == WildCardType.BoundType.SUPER) { JavaType glb = (JavaType) greatestLowerBound(Lists.newArrayList(rawType, wildcardType.bound)); return parametrizedTypeCache.getWildcardType(glb, WildCardType.BoundType.SUPER); } JavaType lub = (JavaType) cachedLeastUpperBound(Sets.newHashSet(rawType, wildcardType.bound)); return parametrizedTypeCache.getWildcardType(lub, WildCardType.BoundType.EXTENDS); }
private JavaType substituteInWildCardType(WildCardType wildcard, TypeSubstitution substitution) { JavaType substitutedType = applySubstitution(wildcard.bound, substitution); if (substitutedType != wildcard.bound) { return parametrizedTypeCache.getWildcardType(substitutedType, wildcard.boundType); } return wildcard; }
private JavaType lctaOneWildcard(JavaType rawType, WildCardType wildcardType) { if (wildcardType.boundType == WildCardType.BoundType.SUPER) { JavaType glb = (JavaType) greatestLowerBound(Lists.newArrayList(rawType, wildcardType.bound)); return parametrizedTypeCache.getWildcardType(glb, WildCardType.BoundType.SUPER); } JavaType lub = (JavaType) cachedLeastUpperBound(Sets.newHashSet(rawType, wildcardType.bound)); return parametrizedTypeCache.getWildcardType(lub, WildCardType.BoundType.EXTENDS); }
@Override public void visitEnd() { super.visitEnd(); JavaType typeArgument; switch (wildcard) { case EXTENDS: typeArgument = parametrizedTypeCache.getWildcardType(this.typeRead, WildCardType.BoundType.EXTENDS); break; case SUPER: typeArgument = parametrizedTypeCache.getWildcardType(this.typeRead, WildCardType.BoundType.SUPER); break; case INSTANCEOF: default: typeArgument = this.typeRead; break; } ReadType.this.typeArguments.add(typeArgument); } };
private JavaType substituteInWildCardType(WildCardType wildcard, TypeSubstitution substitution) { JavaType substitutedType = applySubstitution(wildcard.bound, substitution); if (substitutedType != wildcard.bound) { return parametrizedTypeCache.getWildcardType(substitutedType, wildcard.boundType); } return wildcard; }
private JavaType lctaNoWildcard(JavaType type1, JavaType type2) { JavaType lub = (JavaType) cachedLeastUpperBound(Sets.newHashSet(type1, type2)); return parametrizedTypeCache.getWildcardType(lub, WildCardType.BoundType.EXTENDS); }
private JavaType lctaNoWildcard(JavaType type1, JavaType type2) { JavaType lub = (JavaType) cachedLeastUpperBound(Sets.newHashSet(type1, type2)); return parametrizedTypeCache.getWildcardType(lub, WildCardType.BoundType.EXTENDS); }
private JavaType lctaBothWildcards(WildCardType type1, WildCardType type2) { if (type1.boundType == WildCardType.BoundType.SUPER && type2.boundType == WildCardType.BoundType.SUPER) { JavaType glb = (JavaType) greatestLowerBound(Lists.newArrayList(type1.bound, type2.bound)); return parametrizedTypeCache.getWildcardType(glb, WildCardType.BoundType.SUPER); } if (type1.boundType == WildCardType.BoundType.EXTENDS && type2.boundType == WildCardType.BoundType.EXTENDS) { JavaType lub = (JavaType) cachedLeastUpperBound(Sets.newHashSet(type1.bound, type2.bound)); return parametrizedTypeCache.getWildcardType(lub, WildCardType.BoundType.EXTENDS); } if (type1.bound.equals(type2.bound)) { return type1.bound; } return symbols.unboundedWildcard; }
private JavaType lctaBothWildcards(WildCardType type1, WildCardType type2) { if (type1.boundType == WildCardType.BoundType.SUPER && type2.boundType == WildCardType.BoundType.SUPER) { JavaType glb = (JavaType) greatestLowerBound(Lists.newArrayList(type1.bound, type2.bound)); return parametrizedTypeCache.getWildcardType(glb, WildCardType.BoundType.SUPER); } if (type1.boundType == WildCardType.BoundType.EXTENDS && type2.boundType == WildCardType.BoundType.EXTENDS) { JavaType lub = (JavaType) cachedLeastUpperBound(Sets.newHashSet(type1.bound, type2.bound)); return parametrizedTypeCache.getWildcardType(lub, WildCardType.BoundType.EXTENDS); } if (type1.bound.equals(type2.bound)) { return type1.bound; } return symbols.unboundedWildcard; }
@Override public void visitWildcard(WildcardTree tree) { if (tree.is(Tree.Kind.UNBOUNDED_WILDCARD)) { registerType(tree, symbols.unboundedWildcard); } else { resolveAs(tree.bound(), JavaSymbol.TYP); JavaType bound = getType(tree.bound()); WildCardType.BoundType boundType = tree.is(Tree.Kind.SUPER_WILDCARD) ? WildCardType.BoundType.SUPER : WildCardType.BoundType.EXTENDS; registerType(tree, parametrizedTypeCache.getWildcardType(bound, boundType)); } }
@Override public void visitWildcard(WildcardTree tree) { if (tree.is(Tree.Kind.UNBOUNDED_WILDCARD)) { registerType(tree, symbols.unboundedWildcard); } else { resolveAs(tree.bound(), JavaSymbol.TYP); JavaType bound = getType(tree.bound()); WildCardType.BoundType boundType = tree.is(Tree.Kind.SUPER_WILDCARD) ? WildCardType.BoundType.SUPER : WildCardType.BoundType.EXTENDS; registerType(tree, parametrizedTypeCache.getWildcardType(bound, boundType)); } }
@Override public void visitWildcard(WildcardTree tree) { if (tree.is(Tree.Kind.UNBOUNDED_WILDCARD)) { registerType(tree, symbols.unboundedWildcard); } else { resolveAs(tree.bound(), JavaSymbol.TYP); JavaType bound = getType(tree.bound()); JavaType.WildCardType.BoundType boundType = tree.is(Tree.Kind.SUPER_WILDCARD) ? JavaType.WildCardType.BoundType.SUPER : JavaType.WildCardType.BoundType.EXTENDS; registerType(tree, parametrizedTypeCache.getWildcardType(bound, boundType)); } }
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; }