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())); }
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())); }
private void buildNewArray(NewArrayTree tree) { currentBlock.elements.add(tree); build(Lists.reverse(tree.dimensions())); build(Lists.reverse(tree.initializers())); }
private void buildNewArray(NewArrayTree tree) { currentBlock.elements.add(tree); build(tree.dimensions()); build(tree.initializers()); }
private boolean hasConstantInitializer(VariableTree variableTree) { Tree init = variableTree.initializer(); if (init != null) { if (init.is(Tree.Kind.NEW_ARRAY)) { //exclude allocations : new int[6] but allow initialization new int[]{1,2}; return ((NewArrayTree) init).dimensions().isEmpty(); } return !containsChildrenOfKind((JavaTree) init, Tree.Kind.METHOD_INVOCATION, Tree.Kind.NEW_CLASS); } return false; }
private void buildNewArray(NewArrayTree tree) { currentBlock.elements.add(tree); build(tree.dimensions()); build(tree.initializers()); }
private void executeNewArray(NewArrayTree newArrayTree) { int numberDimensions = (int) newArrayTree.dimensions().stream().map(ArrayDimensionTree::expression).filter(Objects::nonNull).count(); programState = programState.unstackValue(numberDimensions).state; programState = programState.unstackValue(newArrayTree.initializers().size()).state; SymbolicValue svNewArray = constraintManager.createSymbolicValue(newArrayTree); programState = programState.stackValue(svNewArray); programState = svNewArray.setSingleConstraint(programState, ObjectConstraint.NOT_NULL); }
private static boolean isEmptyArray(ExpressionTree expression) { if (!expression.is(Tree.Kind.NEW_ARRAY)) { return false; } NewArrayTree nat = (NewArrayTree) expression; return hasEmptyInitializer(nat) || hasOnlyZeroDimensions(nat.dimensions()); }
private void executeNewArray(NewArrayTree newArrayTree) { int numberDimensions = (int) newArrayTree.dimensions().stream().map(ArrayDimensionTree::expression).filter(Objects::nonNull).count(); programState = programState.unstackValue(numberDimensions).state; programState = programState.unstackValue(newArrayTree.initializers().size()).state; SymbolicValue svNewArray = constraintManager.createSymbolicValue(newArrayTree); programState = programState.stackValue(svNewArray); programState = svNewArray.setSingleConstraint(programState, ObjectConstraint.NOT_NULL); }
private static boolean isEmptyArray(ExpressionTree expression) { if (!expression.is(Tree.Kind.NEW_ARRAY)) { return false; } NewArrayTree nat = (NewArrayTree) expression; return hasEmptyInitializer(nat) || hasOnlyZeroDimensions(nat.dimensions()); }
@Override public void visitNewArray(NewArrayTree tree) { resolveAs(tree.type(), JavaSymbol.TYP); resolveAs(tree.dimensions(), JavaSymbol.VAR); resolveAs(tree.initializers(), JavaSymbol.VAR); JavaType type = getType(tree.type()); int dimensions = tree.dimensions().size(); // TODO why? type = new JavaType.ArrayJavaType(type, symbols.arrayClass); for (int i = 1; i < dimensions; i++) { type = new JavaType.ArrayJavaType(type, symbols.arrayClass); } registerType(tree, type); }
@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()); int dimensions = tree.dimensions().size(); // TODO why? type = new JavaType.ArrayJavaType(type, symbols.arrayClass); for (int i = 1; i < dimensions; i++) { type = new JavaType.ArrayJavaType(type, symbols.arrayClass); } registerType(tree, type); }
@Override public void visitNewArray(NewArrayTree tree) { scan(tree.type()); scan(tree.dimensions()); scan(tree.initializers()); }
@Override public void visitNewArray(NewArrayTree tree) { scan(tree.type()); scan(tree.dimensions()); scan(tree.initializers()); }
@Override public void visitNewArray(NewArrayTree tree) { scan(tree.type()); scan(tree.dimensions()); scan(tree.initializers()); }
@Override public void visitNewArray(NewArrayTree tree) { scan(tree.type()); scan(tree.dimensions()); scan(tree.initializers()); }
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; }
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; }
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 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 + "[]\"."); } } }