@Override public StringBuilder appendSignature(final StringBuilder sb) { final List<ParameterDefinition> parameters = getParameters(); StringBuilder s = sb; s.append('('); for (int i = 0, n = parameters.size(); i < n; ++i) { final ParameterDefinition p = parameters.get(i); s = p.getParameterType().appendSignature(s); } s.append(')'); s = getReturnType().appendSignature(s); return s; }
@Override public StringBuilder appendErasedSignature(final StringBuilder sb) { StringBuilder s = sb; s.append('('); final List<ParameterDefinition> parameterTypes = getParameters(); for (int i = 0, n = parameterTypes.size(); i < n; ++i) { s = parameterTypes.get(i).getParameterType().appendErasedSignature(s); } s.append(')'); s = getReturnType().appendErasedSignature(s); return s; }
@Override public StringBuilder appendErasedSignature(final StringBuilder sb) { StringBuilder s = sb; s.append('('); final List<ParameterDefinition> parameterTypes = getParameters(); for (int i = 0, n = parameterTypes.size(); i < n; ++i) { s = parameterTypes.get(i).getParameterType().appendErasedSignature(s); } s.append(')'); s = getReturnType().appendErasedSignature(s); return s; }
@Override public StringBuilder appendSignature(final StringBuilder sb) { final List<ParameterDefinition> parameters = getParameters(); StringBuilder s = sb; s.append('('); for (int i = 0, n = parameters.size(); i < n; ++i) { final ParameterDefinition p = parameters.get(i); s = p.getParameterType().appendSignature(s); } s.append(')'); s = getReturnType().appendSignature(s); return s; }
@AstVisitor(nodes=AstNodes.EXPRESSIONS, minVersion=8) public void visit(Expression expr, MethodContext mc) { if(expr.getCode() == AstCode.InvokeInterface) { MethodReference mr = (MethodReference) expr.getOperand(); if(mr.getReturnType().getPackageName().equals("java.util.stream") && Types.isBaseStream(mr.getReturnType())) { // intermediate stream operation if(mc.isAnnotated() && !Inf.BACKLINK.findTransitiveUsages(expr, true).findAny().isPresent()) { // .parallel()/.sequential()/.onClose()/.unordered() excluded as may return itself if(Types.is(mr.getReturnType(), BaseStream.class)) { mc.report("StreamMethodMayNotReturnItself", 0, expr); } else { mc.report("AbandonedStream", 0, expr); } } } } } }
@Override public boolean containsGenericParameters() { if (super.containsGenericParameters() || hasGenericParameters()) { return true; } if (getReturnType().containsGenericParameters()) { return true; } if (hasParameters()) { final List<ParameterDefinition> parameters = getParameters(); for (int i = 0, n = parameters.size(); i < n; i++) { if (parameters.get(i).getParameterType().containsGenericParameters()) { return true; } } } return false; }
void checkOnlyOnce(Expression node, MethodContext ctx) { if (node.getCode() != AstCode.InvokeVirtual || node.getArguments().get(0).getCode() != AstCode.InitObject) return; MethodReference ctor = (MethodReference) node.getArguments().get(0).getOperand(); TypeReference type = ctor.getDeclaringType(); if (!Types.isRandomClass(type) || type.getInternalName().equals("java/security/SecureRandom")) return; MethodReference mr = (MethodReference) node.getOperand(); if(mr.getReturnType().getPackageName().equals("java.util.stream")) return; if(Inf.BACKLINK.findTransitiveUsages(node, true).allMatch(this::isRandomInit)) return; ctx.report("RandomUsedOnlyOnce", 0, node, RANDOM_TYPE.create(type)); }
@Override public boolean containsGenericParameters() { if (super.containsGenericParameters() || hasGenericParameters()) { return true; } if (getReturnType().containsGenericParameters()) { return true; } if (hasParameters()) { final List<ParameterDefinition> parameters = getParameters(); for (int i = 0, n = parameters.size(); i < n; i++) { if (parameters.get(i).getParameterType().containsGenericParameters()) { return true; } } } return false; }
@Override public boolean containsGenericParameters() { if (super.containsGenericParameters() || hasGenericParameters()) { return true; } if (getReturnType().containsGenericParameters()) { return true; } if (hasParameters()) { final List<ParameterDefinition> parameters = getParameters(); for (int i = 0, n = parameters.size(); i < n; i++) { if (parameters.get(i).getParameterType().containsGenericParameters()) { return true; } } } return false; }
private boolean isCompare(Expression child) { if (child.getCode() == AstCode.InvokeVirtual || child.getCode() == AstCode.InvokeSpecial || child.getCode() == AstCode.InvokeInterface) { MethodReference mr = (MethodReference) child.getOperand(); if (mr.getReturnType().getSimpleType() == JvmType.Integer && ((mr.getName().equals("compare") && Types.isInstance(mr.getDeclaringType(), "java/util/Comparator")) || mr .getName().equals("compareTo"))) { return true; } } return false; } }
private static MethodReference ensureReturnType( final MethodReference originalMethod, final MethodReference method, final TypeReference returnType, final TypeReference declaringType) { if (isSameType(method.getReturnType(), returnType, true)) { return method; } final MethodDefinition resolvedMethod = originalMethod.resolve(); final List<TypeReference> typeArguments; if (method instanceof IGenericInstance && method.isGenericMethod()) { typeArguments = ((IGenericInstance) method).getTypeArguments(); } else { typeArguments = Collections.emptyList(); } return new GenericMethodInstance( declaringType, resolvedMethod != null ? resolvedMethod : originalMethod, returnType, copyParameters(method.getParameters()), typeArguments ); }
private void performUnboxingRemoval(final InvocationExpression e, final MemberReferenceExpression target) { final Expression boxedValue = target.getTarget(); final MethodReference unboxMethod = (MethodReference) e.getUserData(Keys.MEMBER_REFERENCE); final AstBuilder astBuilder = context.getUserData(Keys.AST_BUILDER); boxedValue.remove(); e.replaceWith( new CastExpression( astBuilder.convertType(unboxMethod.getReturnType()), boxedValue ) ); }
private static ResolveResult resolveTypeFromMember(final MemberReference member) { if (member == null) { return null; } if (member instanceof FieldReference) { return new ResolveResult(((FieldReference) member).getFieldType()); } if (member instanceof MethodReference) { final MethodReference method = (MethodReference) member; if (method.isConstructor()) { return new ResolveResult(method.getDeclaringType()); } return new ResolveResult(method.getReturnType()); } return null; }
private static ResolveResult resolveTypeFromMember(final MemberReference member) { if (member == null) { return null; } if (member instanceof FieldReference) { return new ResolveResult(((FieldReference) member).getFieldType()); } if (member instanceof MethodReference) { final MethodReference method = (MethodReference) member; if (method.isConstructor()) { return new ResolveResult(method.getDeclaringType()); } return new ResolveResult(method.getReturnType()); } return null; }
private static ResolveResult resolveTypeFromMember(final MemberReference member) { if (member == null) { return null; } if (member instanceof FieldReference) { return new ResolveResult(((FieldReference) member).getFieldType()); } if (member instanceof MethodReference) { final MethodReference method = (MethodReference) member; if (method.isConstructor()) { return new ResolveResult(method.getDeclaringType()); } return new ResolveResult(method.getReturnType()); } return null; }
private static MethodReference ensureReturnType( final MethodReference originalMethod, final MethodReference method, final TypeReference returnType, final TypeReference declaringType) { if (isSameType(method.getReturnType(), returnType, true)) { return method; } final MethodDefinition resolvedMethod = originalMethod.resolve(); final List<TypeReference> typeArguments; if (method instanceof IGenericInstance && method.isGenericMethod()) { typeArguments = ((IGenericInstance) method).getTypeArguments(); } else { typeArguments = Collections.emptyList(); } return new GenericMethodInstance( declaringType, resolvedMethod != null ? resolvedMethod : originalMethod, returnType, copyParameters(method.getParameters()), typeArguments ); }
private void performUnboxingRemoval(final InvocationExpression e, final MemberReferenceExpression target) { final Expression boxedValue = target.getTarget(); final MethodReference unboxMethod = (MethodReference) e.getUserData(Keys.MEMBER_REFERENCE); final AstBuilder astBuilder = context.getUserData(Keys.AST_BUILDER); boxedValue.remove(); e.replaceWith( new CastExpression( astBuilder.convertType(unboxMethod.getReturnType()), boxedValue ) ); }
public RawMethod(final MethodReference baseMethod) { VerifyArgument.notNull(baseMethod, "baseMethod"); final TypeReference declaringType = baseMethod.getDeclaringType(); _baseMethod = baseMethod; _declaringType = MetadataHelper.eraseRecursive(declaringType); _returnType = MetadataHelper.eraseRecursive(baseMethod.getReturnType()); _parameters = new ParameterDefinitionCollection(this); for (final ParameterDefinition parameter : baseMethod.getParameters()) { if (parameter.hasName()) { _parameters.add( new ParameterDefinition( parameter.getSlot(), parameter.getName(), MetadataHelper.eraseRecursive(parameter.getParameterType()) ) ); } else { _parameters.add( new ParameterDefinition( parameter.getSlot(), MetadataHelper.eraseRecursive(parameter.getParameterType()) ) ); } } _parameters.freeze(); }
public RawMethod(final MethodReference baseMethod) { VerifyArgument.notNull(baseMethod, "baseMethod"); final TypeReference declaringType = baseMethod.getDeclaringType(); _baseMethod = baseMethod; _declaringType = MetadataHelper.eraseRecursive(declaringType); _returnType = MetadataHelper.eraseRecursive(baseMethod.getReturnType()); _parameters = new ParameterDefinitionCollection(this); for (final ParameterDefinition parameter : baseMethod.getParameters()) { if (parameter.hasName()) { _parameters.add( new ParameterDefinition( parameter.getSlot(), parameter.getName(), MetadataHelper.eraseRecursive(parameter.getParameterType()) ) ); } else { _parameters.add( new ParameterDefinition( parameter.getSlot(), MetadataHelper.eraseRecursive(parameter.getParameterType()) ) ); } } _parameters.freeze(); }
public RawMethod(final MethodReference baseMethod) { VerifyArgument.notNull(baseMethod, "baseMethod"); final TypeReference declaringType = baseMethod.getDeclaringType(); _baseMethod = baseMethod; _declaringType = MetadataHelper.eraseRecursive(declaringType); _returnType = MetadataHelper.eraseRecursive(baseMethod.getReturnType()); _parameters = new ParameterDefinitionCollection(this); for (final ParameterDefinition parameter : baseMethod.getParameters()) { if (parameter.hasName()) { _parameters.add( new ParameterDefinition( parameter.getSlot(), parameter.getName(), MetadataHelper.eraseRecursive(parameter.getParameterType()) ) ); } else { _parameters.add( new ParameterDefinition( parameter.getSlot(), MetadataHelper.eraseRecursive(parameter.getParameterType()) ) ); } } _parameters.freeze(); }