@Override public String toString() { StringBuilder sb = new StringBuilder(); if (parameter) { sb.append("Variable: "); } else { sb.append("Parameter: "); } sb.append("<"); Joiner joiner = Joiner.on(", "); joiner.appendTo(sb, getVariables()); sb.append("> "); joiner.withKeyValueSeparator("=").appendTo(sb, counters); sb.append(" ---- Total: "); sb.append(size); return sb.toString(); } }
for (Variable var : body.getVariables()) { boolean isParameter = var instanceof ParameterRef; individualRefCounters.put(var, new VariableReferenceCount(Collections.singleton(var), isParameter)); unifiedRefCounters.put(partition, new VariableReferenceCount(partition, isParameter)); for (Variable var : PatternLanguageHelper.getReferencedPatternVariablesOfXExpression(expression, associations)) { individualRefCounters.get(var).incrementCounter(ReferenceType.READ_ONLY); unifiedRefCounters.get(variableUnions.getPartition(var)).incrementCounter(ReferenceType.READ_ONLY); final Variable var = ref.getVariable(); final ReferenceType referenceClass = classifyReference(ref); individualRefCounters.get(var).incrementCounter(referenceClass); unifiedRefCounters.get(variableUnions.getPartition(var)).incrementCounter(referenceClass);
private void checkParameterUsageCounter(ParameterRef var, Map<Variable, VariableReferenceCount> individualCounters, Map<Set<Variable>, VariableReferenceCount> unifiedRefCounters, UnionFind<Variable> variableUnions, PatternBody body) { Variable parameter = var.getReferredParam(); VariableReferenceCount individualCounter = individualCounters.get(var); VariableReferenceCount unifiedCounter = unifiedRefCounters.get(variableUnions.getPartition(var)); if (individualCounter.getReferenceCount() == 0) { error(String.format("Parameter '%s' is never referenced in body '%s'.", parameter.getName(), getPatternBodyName(body)), parameter, PatternLanguagePackage.Literals.VARIABLE__NAME, IssueCodes.SYMBOLIC_VARIABLE_NEVER_REFERENCED); } else if (unifiedCounter.getReferenceCount(ReferenceType.POSITIVE) == 0) { error(String.format("Parameter '%s' has no enumerable reference in body '%s'.", var.getName(), getPatternBodyName(body)), parameter, PatternLanguagePackage.Literals.VARIABLE__NAME, IssueCodes.SYMBOLIC_VARIABLE_NO_POSITIVE_REFERENCE); } }
VariableReferenceCount individualCounter = individualCounters.get(var); VariableReferenceCount unifiedCounter = unifiedRefCounters.get(variableUnions.getPartition(var)); if (individualCounter.getReferenceCount(ReferenceType.POSITIVE) == 1 && individualCounter.getReferenceCount() == 1 && !PatternLanguageHelper.isNamedSingleUse(var) && !PatternLanguageHelper.isUnnamedSingleUseVariable(var)) { warning(String.format( var.getName()), PatternLanguageHelper.getReferences(var).findAny().get(), PatternLanguagePackage.Literals.VARIABLE_REFERENCE__VAR, IssueCodes.LOCAL_VARIABLE_REFERENCED_ONCE); } else if (individualCounter.getReferenceCount() > 1 && PatternLanguageHelper.isNamedSingleUse(var)) { PatternLanguageHelper.getReferences(var) .forEach(ref -> error( PatternLanguagePackage.Literals.VARIABLE_REFERENCE__VAR, IssueCodes.ANONYM_VARIABLE_MULTIPLE_REFERENCE)); } else if (unifiedCounter.getReferenceCount(ReferenceType.POSITIVE) == 0) { if (unifiedCounter.getReferenceCount(ReferenceType.NEGATIVE) == 0) { error(String.format( "Local variable '%s' appears in uncountable reference(s) only, thus its value cannot be determined.", var.getName()), var, PatternLanguagePackage.Literals.VARIABLE__NAME, IssueCodes.LOCAL_VARIABLE_READONLY); } else if (individualCounter.getReferenceCount(ReferenceType.NEGATIVE) == 1 && individualCounter.getReferenceCount() == 1 && !PatternLanguageHelper.isNamedSingleUse(var) && !PatternLanguageHelper.isUnnamedSingleUseVariable(var)) { warning(String.format( PatternLanguagePackage.Literals.VARIABLE_REFERENCE__VAR, IssueCodes.LOCAL_VARIABLE_QUANTIFIED_REFERENCE); } else if (unifiedCounter.getReferenceCount() > 1) {