@Override public void visitNewArray(NewArrayTree tree) { scan(tree.type()); scan(tree.dimensions()); scan(tree.initializers()); }
private static boolean hasEmptyInitializer(NewArrayTree newArrayTree) { return newArrayTree.openBraceToken() != null && newArrayTree.initializers().isEmpty(); }
private void buildNewArray(NewArrayTree tree) { currentBlock.elements.add(tree); build(tree.dimensions()); build(tree.initializers()); }
private static List<String> getRulesFromExpression(ExpressionTree expression) { List<String> args = Lists.newArrayList(); if (expression.is(Tree.Kind.NEW_ARRAY)) { for (ExpressionTree initializer : ((NewArrayTree) expression).initializers()) { args.addAll(getRulesFromExpression(initializer)); } } else { String constant = ConstantUtils.resolveAsStringConstant(expression); if (constant != null) { args.add(constant); } } return args; } }
@Override public void visitNewArray(NewArrayTree tree) { resolveAs(tree.type(), JavaSymbol.TYP); scan(tree.dimensions()); resolveAs((List<? extends Tree>) tree.initializers(), JavaSymbol.VAR); JavaType type = getType(tree.type()); if (tree.type() == null) { if (((NewArrayTreeImpl) tree).isTypeSet() && tree.symbolType().isArray()) { type = ((ArrayJavaType) tree.symbolType()).elementType; } else { registerType(tree, symbols.deferedType((AbstractTypedTree) tree)); return; } } int dimensions = tree.dimensions().size(); // TODO why? type = new ArrayJavaType(type, symbols.arrayClass); for (int i = 1; i < dimensions; i++) { type = new ArrayJavaType(type, symbols.arrayClass); } registerType(tree, type); for (ExpressionTree expressionTree : tree.initializers()) { if(((JavaType) expressionTree.symbolType()).isTagged(JavaType.DEFERRED)) { setInferedType(((ArrayJavaType) type).elementType, (DeferredType) expressionTree.symbolType()); } } }
private void checkInvokedMethod(JavaSymbol.MethodJavaSymbol methodSymbol, @Nullable MethodJavaType methodType, ExpressionTree lastArg) { if (methodSymbol.isVarArgs() && lastArg.is(Tree.Kind.NEW_ARRAY)) { if (lastParamHasSameType(methodSymbol, methodType, lastArg.symbolType())) { String message = "Remove this array creation"; NewArrayTree newArrayTree = (NewArrayTree) lastArg; if (newArrayTree.openBraceToken() == null) { ExpressionTree expression = newArrayTree.dimensions().get(0).expression(); Integer literalValue = LiteralUtils.intLiteralValue(expression); if (literalValue == null || literalValue != 0 || isCallingOverload(methodSymbol, lastArg)) { return; } } else if (!newArrayTree.initializers().isEmpty()) { message += " and simply pass the elements"; } reportIssue(lastArg, message + "."); } else { String type = ((Type.ArrayType) getLastParameterType(methodSymbol.parameterTypes())).elementType().name(); reportIssue(lastArg, "Disambiguate this call by either casting as \"" + type + "\" or \"" + type + "[]\"."); } } }
private static boolean isEmptyArray(ExpressionTree initializer) { return initializer.is(Tree.Kind.NEW_ARRAY) && !((NewArrayTree) initializer).dimensions().isEmpty() && ((NewArrayTree) initializer).dimensions().stream().allMatch(adt -> isZeroLiteralValue(adt.expression())); }
@Override public void visitNewArray(NewArrayTree tree) { checkTypes(tree.type()); super.visitNewArray(tree); }
private static boolean hasConstantInitializer(VariableTree variableTree) { ExpressionTree init = variableTree.initializer(); if (init != null) { if(ExpressionUtils.skipParentheses(init).is(Tree.Kind.METHOD_REFERENCE)) { MethodReferenceTree methodRef = (MethodReferenceTree) ExpressionUtils.skipParentheses(init); if(isInstanceIdentifier(methodRef.expression())) { return false; } } boolean arrayWithInitializer = true; if (init.is(Tree.Kind.NEW_ARRAY)) { // exclude allocations : new int[6] but allow initialization new int[]{1,2}; NewArrayTree newArrayTree = (NewArrayTree) init; arrayWithInitializer = newArrayTree.dimensions().isEmpty() || newArrayTree.openBraceToken() != null; } return arrayWithInitializer && !containsChildrenOfKind((JavaTree) init, Tree.Kind.METHOD_INVOCATION, Tree.Kind.NEW_CLASS); } return false; }
protected static boolean isNewArrayWithInitializers(ExpressionTree expression) { return expression.is(Tree.Kind.NEW_ARRAY) && ((NewArrayTree) expression).openBraceToken() != null; }
private static List<String> getRulesFromExpression(ExpressionTree expression) { List<String> args = Lists.newArrayList(); if (expression.is(Tree.Kind.NEW_ARRAY)) { for (ExpressionTree initializer : ((NewArrayTree) expression).initializers()) { args.addAll(getRulesFromExpression(initializer)); } } else { String constant = ConstantUtils.resolveAsStringConstant(expression); if (constant != null) { args.add(constant); } } return args; } }
@Override public void visitNewArray(NewArrayTree tree) { resolveAs(tree.type(), JavaSymbol.TYP); scan(tree.dimensions()); resolveAs((List<? extends Tree>) tree.initializers(), JavaSymbol.VAR); JavaType type = getType(tree.type()); if (tree.type() == null) { if (((NewArrayTreeImpl) tree).isTypeSet() && tree.symbolType().isArray()) { type = ((ArrayJavaType) tree.symbolType()).elementType; } else { registerType(tree, symbols.deferedType((AbstractTypedTree) tree)); return; } } int dimensions = tree.dimensions().size(); // TODO why? type = new ArrayJavaType(type, symbols.arrayClass); for (int i = 1; i < dimensions; i++) { type = new ArrayJavaType(type, symbols.arrayClass); } registerType(tree, type); for (ExpressionTree expressionTree : tree.initializers()) { if(((JavaType) expressionTree.symbolType()).isTagged(JavaType.DEFERRED)) { setInferedType(((ArrayJavaType) type).elementType, (DeferredType) expressionTree.symbolType()); } } }
private void buildNewArray(NewArrayTree tree) { currentBlock.elements.add(tree); build(Lists.reverse(tree.dimensions())); build(Lists.reverse(tree.initializers())); }
private void checkInvokedMethod(JavaSymbol.MethodJavaSymbol methodSymbol, @Nullable MethodJavaType methodType, ExpressionTree lastArg) { if (methodSymbol.isVarArgs() && lastArg.is(Tree.Kind.NEW_ARRAY)) { if (lastParamHasSameType(methodSymbol, methodType, lastArg.symbolType())) { String message = "Remove this array creation"; NewArrayTree newArrayTree = (NewArrayTree) lastArg; if (newArrayTree.openBraceToken() == null) { ExpressionTree expression = newArrayTree.dimensions().get(0).expression(); Integer literalValue = LiteralUtils.intLiteralValue(expression); if (literalValue == null || literalValue != 0 || isCallingOverload(methodSymbol, lastArg)) { return; } } else if (!newArrayTree.initializers().isEmpty()) { message += " and simply pass the elements"; } reportIssue(lastArg, message + "."); } else { String type = ((Type.ArrayType) getLastParameterType(methodSymbol.parameterTypes())).elementType().name(); reportIssue(lastArg, "Disambiguate this call by either casting as \"" + type + "\" or \"" + type + "[]\"."); } } }
private static boolean isEmptyArray(ExpressionTree initializer) { return initializer.is(Tree.Kind.NEW_ARRAY) && !((NewArrayTree) initializer).dimensions().isEmpty() && ((NewArrayTree) initializer).dimensions().stream().allMatch(adt -> isZeroLiteralValue(adt.expression())); }
@Override public void visitNewArray(NewArrayTree tree) { checkTypes(tree.type()); super.visitNewArray(tree); }
private static boolean hasConstantInitializer(VariableTree variableTree) { ExpressionTree init = variableTree.initializer(); if (init != null) { if(ExpressionUtils.skipParentheses(init).is(Tree.Kind.METHOD_REFERENCE)) { MethodReferenceTree methodRef = (MethodReferenceTree) ExpressionUtils.skipParentheses(init); if(isInstanceIdentifier(methodRef.expression())) { return false; } } boolean arrayWithInitializer = true; if (init.is(Tree.Kind.NEW_ARRAY)) { // exclude allocations : new int[6] but allow initialization new int[]{1,2}; NewArrayTree newArrayTree = (NewArrayTree) init; arrayWithInitializer = newArrayTree.dimensions().isEmpty() || newArrayTree.openBraceToken() != null; } return arrayWithInitializer && !containsChildrenOfKind((JavaTree) init, Tree.Kind.METHOD_INVOCATION, Tree.Kind.NEW_CLASS); } return false; }
protected static boolean isNewArrayWithInitializers(ExpressionTree expression) { return expression.is(Tree.Kind.NEW_ARRAY) && ((NewArrayTree) expression).openBraceToken() != null; }
@Override public void visitNewArray(NewArrayTree tree) { scan(tree.type()); scan(tree.dimensions()); scan(tree.initializers()); }
private static boolean isExcludeElement(AssignmentExpressionTree assignment) { ExpressionTree expression = assignment.expression(); boolean isExcludeElement = EXCLUDE_ELEMENTS.contains(assignment.variable().toString()); boolean arrayNotEmpty = expression.is(Tree.Kind.NEW_ARRAY) && !((NewArrayTree) expression).initializers().isEmpty(); return isExcludeElement && arrayNotEmpty; } }