private static boolean subtypeOfTypeVar(JavaType arg, TypeVariableJavaType formal) { for (JavaType bound : formal.bounds()) { if ((bound.isTagged(JavaType.TYPEVAR) && !subtypeOfTypeVar(arg, (TypeVariableJavaType) bound)) || !arg.isSubtypeOf(bound)) { return false; } } return true; }
private static boolean subtypeOfTypeVar(JavaType arg, TypeVariableJavaType formal) { for (JavaType bound : formal.bounds()) { if ((bound.isTagged(JavaType.TYPEVAR) && !subtypeOfTypeVar(arg, (TypeVariableJavaType) bound)) || !arg.isSubtypeOf(bound)) { return false; } } return true; }
@Override public boolean isSubtypeOf(Type superType) { JavaType supType = (JavaType) superType; if (supType.isTagged(WILDCARD)) { return ((WildCardType) supType).isSubtypeOfBound(this); } if (supType == this) { return true; } for (JavaType bound : bounds()) { if (bound.isSubtypeOf(supType) || (supType.isParameterized() && bound == supType.erasure())) { return true; } } return false; } }
@Override public boolean isSubtypeOf(Type superType) { JavaType supType = (JavaType) superType; if (supType.isTagged(WILDCARD)) { return ((WildCardType) supType).isSubtypeOfBound(this); } if (supType == this) { return true; } for (JavaType bound : bounds()) { if (bound.isSubtypeOf(supType) || (supType.isParameterized() && bound == supType.erasure())) { return true; } } return false; } }
private static boolean requiredForMemberAccess(TypeCastTree typeCastTree) { ExpressionTree expression = typeCastTree.expression(); if (!expression.is(Tree.Kind.METHOD_INVOCATION)) { Tree parent = typeCastTree.parent(); return expression.is(Tree.Kind.METHOD_REFERENCE) && parent != null && skipParentheses(parent).is(Tree.Kind.MEMBER_SELECT); } Symbol symbol = ((MethodInvocationTree) expression).symbol(); if (!symbol.isMethodSymbol()) { return false; } Type returnType = ((Symbol.MethodSymbol) symbol).returnType().type(); if (!(returnType instanceof TypeVariableJavaType) || ((TypeVariableJavaType) returnType).bounds().get(0).is("java.lang.Object")) { return false; } // consider REQUIRED as soon as the parent expression is a member access (killing the noise), without checking if cast could have been avoided // as the member accessed could have also been part of initial type return skipParentheses(typeCastTree.parent()).is(Tree.Kind.MEMBER_SELECT); }
private static boolean requiredForMemberAccess(TypeCastTree typeCastTree) { ExpressionTree expression = typeCastTree.expression(); if (!expression.is(Tree.Kind.METHOD_INVOCATION)) { Tree parent = typeCastTree.parent(); return expression.is(Tree.Kind.METHOD_REFERENCE) && parent != null && skipParentheses(parent).is(Tree.Kind.MEMBER_SELECT); } Symbol symbol = ((MethodInvocationTree) expression).symbol(); if (!symbol.isMethodSymbol()) { return false; } Type returnType = ((Symbol.MethodSymbol) symbol).returnType().type(); if (!(returnType instanceof TypeVariableJavaType) || ((TypeVariableJavaType) returnType).bounds().get(0).is("java.lang.Object")) { return false; } // consider REQUIRED as soon as the parent expression is a member access (killing the noise), without checking if cast could have been avoided // as the member accessed could have also been part of initial type return skipParentheses(typeCastTree.parent()).is(Tree.Kind.MEMBER_SELECT); }