private static ProgramState closeResource( ProgramState programState, @Nullable final SymbolicValue target) { if (target != null) { ObjectConstraint oConstraint = openedConstraint(programState, target); if (oConstraint != null) { return programState.addConstraint( target.wrappedValue(), oConstraint.withStatus(Status.CLOSED)); } } return programState; }
private static ObjectConstraint openedConstraint( ProgramState programState, SymbolicValue value) { final Object constraint = programState.getConstraint(value.wrappedValue()); if (constraint instanceof ObjectConstraint) { ObjectConstraint oConstraint = (ObjectConstraint) constraint; if (oConstraint.hasStatus(Status.OPENED)) { return oConstraint; } } return null; }
@Override public void checkEndOfExecutionPath(CheckerContext context, ConstraintManager constraintManager) { final List<ObjectConstraint> constraints = context.getState().getFieldConstraints(Status.OPENED); for (ObjectConstraint constraint : constraints) { Tree syntaxNode = constraint.syntaxNode(); String name = null; if (syntaxNode.is(Tree.Kind.NEW_CLASS)) { name = ((NewClassTree) syntaxNode).identifier().symbolType().name(); } else if (syntaxNode.is(Tree.Kind.METHOD_INVOCATION)) { name = ((MethodInvocationTree) syntaxNode).symbolType().name(); } if (name != null) { context.reportIssue(syntaxNode, this, "Close this \"" + name + "\"."); } } }