private Iterable<ProgramState> startingStates(MethodTree tree, ProgramState currentState) { Stream<ProgramState> stateStream = Stream.of(currentState); boolean isEqualsMethod = EQUALS.matches(tree); boolean nonNullParameters = isGloballyAnnotatedParameterNonNull(methodTree.symbol()); boolean nullableParameters = isGloballyAnnotatedParameterNullable(methodTree.symbol()); boolean hasMethodBehavior = methodBehavior != null; for (final VariableTree variableTree : tree.parameters()) { // create final SymbolicValue sv = constraintManager.createSymbolicValue(variableTree); Symbol variableSymbol = variableTree.symbol(); if (hasMethodBehavior) { methodBehavior.addParameter(sv); } stateStream = stateStream.map(ps -> ps.put(variableSymbol, sv)); if (isEqualsMethod || parameterCanBeNull(variableSymbol, nullableParameters)) { stateStream = stateStream.flatMap((ProgramState ps) -> Stream.concat( sv.setConstraint(ps, ObjectConstraint.NULL).stream(), sv.setConstraint(ps, ObjectConstraint.NOT_NULL).stream() )); } else if (nonNullParameters || isAnnotatedNonNull(variableSymbol)) { stateStream = stateStream.flatMap(ps -> sv.setConstraint(ps, ObjectConstraint.NOT_NULL).stream()); } } return stateStream.collect(Collectors.toList()); }
private Iterable<ProgramState> startingStates(MethodTree tree, ProgramState currentState) { Stream<ProgramState> stateStream = Stream.of(currentState); boolean isEqualsMethod = EQUALS.matches(tree); boolean nonNullParameters = isGloballyAnnotatedParameterNonNull(methodTree.symbol()); boolean nullableParameters = isGloballyAnnotatedParameterNullable(methodTree.symbol()); boolean hasMethodBehavior = methodBehavior != null; for (final VariableTree variableTree : tree.parameters()) { // create final SymbolicValue sv = constraintManager.createSymbolicValue(variableTree); Symbol variableSymbol = variableTree.symbol(); if (hasMethodBehavior) { methodBehavior.addParameter(sv); } stateStream = stateStream.map(ps -> ps.put(variableSymbol, sv)); if (isEqualsMethod || parameterCanBeNull(variableSymbol, nullableParameters)) { stateStream = stateStream.flatMap((ProgramState ps) -> Stream.concat( sv.setConstraint(ps, ObjectConstraint.NULL).stream(), sv.setConstraint(ps, ObjectConstraint.NOT_NULL).stream() )); } else if (nonNullParameters || isAnnotatedNonNull(variableSymbol)) { stateStream = stateStream.flatMap(ps -> sv.setConstraint(ps, ObjectConstraint.NOT_NULL).stream()); } } return stateStream.collect(Collectors.toList()); }