@Check public void checkRecursivePatternCall(PatternCall call) { Map<PatternCall, Set<PatternCall>> graph = cache.get(call.eResource(), call.eResource(), new CallGraphProvider(call.eResource())); LinkedList<PatternCall> result = dfsCheckCycle(call, graph); if (result != null) { StringBuilder buffer = new StringBuilder(); boolean first = true; for (PatternCall elem : result) { if (first) { first = false; } else { buffer.append(" -> "); } buffer.append(prettyPrintPatternCall(elem)); } if (isNegativePatternCall(call)) { error(String.format(RECURSIVE_PATTERN_CALL_NEGATIVE, buffer.toString()), call, PatternLanguagePackage.Literals.PATTERN_CALL__PATTERN_REF, IssueCodes.RECURSIVE_PATTERN_CALL); } else if (PatternLanguageHelper.isTransitive(call)) { error(String.format(RECURSIVE_PATTERN_CALL_TRANSITIVE, buffer.toString()), call, PatternLanguagePackage.Literals.PATTERN_CALL__PATTERN_REF, IssueCodes.RECURSIVE_PATTERN_CALL); } else { warning(String.format(RECURSIVE_PATTERN_CALL, buffer.toString()), call, PatternLanguagePackage.Literals.PATTERN_CALL__PATTERN_REF, IssueCodes.RECURSIVE_PATTERN_CALL); } } }