ParseException (PsiMethod method, String text) { List<StandardMethodContract> contracts; try { contracts = parseContract(text); } catch (ParseException e) { return e; } PsiParameter[] parameters = method.getParameterList().getParameters(); int paramCount = parameters.length; List<StandardMethodContract> possibleContracts = Collections.singletonList(StandardMethodContract.trivialContract(paramCount, ContractReturnValue.returnAny())); for (int clauseIndex = 0; clauseIndex < contracts.size(); clauseIndex++) { StandardMethodContract contract = contracts.get(clauseIndex); if (contract.getParameterCount() != paramCount) { String message = JavaAnalysisBundle .message("inspection.contract.checker.parameter.count.mismatch", paramCount, contract, contract.getParameterCount()); return ParseException.forClause(message, text, clauseIndex); } for (int i = 0; i < parameters.length; i++) { ValueConstraint constraint = contract.getParameterConstraint(i); PsiParameter parameter = parameters[i]; String message = getConstraintProblem(method, contract, constraint, parameter); if (message != null) { return ParseException.forConstraint(message, text, clauseIndex, i); } } String problem = contract.getReturnValue().getMethodCompatibilityProblem(method); if (problem != null) { return ParseException.forReturnValue(problem, text, clauseIndex); } if (possibleContracts != null) { if (possibleContracts.isEmpty()) { return ParseException .forClause(JavaAnalysisBundle.message("inspection.contract.checker.unreachable.contract.clause", contract), text, clauseIndex); } if (ContainerUtil.and(possibleContracts, c -> c.intersect(contract) == null)) { return ParseException.forClause( JavaAnalysisBundle.message("inspection.contract.checker.contract.clause.never.satisfied", contract), text, clauseIndex); } possibleContracts = StreamEx.of(possibleContracts).flatMap(c -> c.excludeContract(contract)) .limit(StandardDataFlowInterpreter.DEFAULT_MAX_STATES_PER_BRANCH).toList(); if (possibleContracts.size() >= StandardDataFlowInterpreter.DEFAULT_MAX_STATES_PER_BRANCH) { possibleContracts = null; } } } return null; }