use of org.eclipse.xtext.validation.IConcreteSyntaxConstraintProvider.ISyntaxConstraint in project xtext-core by eclipse.
the class AssignmentQuantityIntervalProvider method getMinForChild.
protected int getMinForChild(IQuantities ctx, ISyntaxConstraint child, Set<ISyntaxConstraint> involved) {
if (child.getSemanticTypesToCheck() != null && !child.getSemanticTypesToCheck().contains(ctx.getEObject().eClass()))
return 0;
int count = UNDEF;
switch(child.getType()) {
case ASSIGNMENT:
involved.add(child);
count = ctx.getAssignmentQuantity(child);
break;
case GROUP:
for (ISyntaxConstraint a : child.getContents()) {
int c = getMinForChild(ctx, a, involved);
if (c > count)
count = c;
}
break;
case ALTERNATIVE:
for (ISyntaxConstraint a : child.getContents()) {
int c = getMinForChild(ctx, a, involved);
count = count == UNDEF ? c : c + count;
}
break;
case ACTION:
return 1;
}
if (child.isMultiple() && count > 1)
count = 1;
return count;
}
use of org.eclipse.xtext.validation.IConcreteSyntaxConstraintProvider.ISyntaxConstraint in project xtext-core by eclipse.
the class ConcreteSyntaxValidator method validateRule.
protected List<IConcreteSyntaxDiagnostic> validateRule(EObject obj, ISyntaxConstraint rule) {
List<IConcreteSyntaxDiagnostic> allDiags = new ArrayList<IConcreteSyntaxDiagnostic>();
Set<ISyntaxConstraint> expectedTypes = collectUnfulfilledSemanticElements(obj.eClass(), rule);
if (expectedTypes.size() > 0)
allDiags.add(diagnosticProvider.createUnexpectedTypeDiagnostic(rule, obj, expectedTypes));
if (!allDiags.isEmpty())
return allDiags;
IQuantities quantities = quantityProvider.getAssignmentQuantities(obj, rule, allDiags);
if (quantities == null || !allDiags.isEmpty())
return allDiags;
List<IConcreteSyntaxDiagnostic> diags = validateQuantities(quantities, rule);
if (diags.isEmpty())
return diags;
allDiags.addAll(diags);
return allDiags;
}
use of org.eclipse.xtext.validation.IConcreteSyntaxConstraintProvider.ISyntaxConstraint in project xtext-core by eclipse.
the class AssignmentAllocatorTest method getAllocation.
private String getAllocation(EObject object) {
ISyntaxConstraint c = constraints.getConstraints(object.eClass()).iterator().next();
IQuantities q = allocator.getAssignmentQuantities(object, c, Lists.<IConcreteSyntaxDiagnostic>newArrayList());
return q.toString();
}
use of org.eclipse.xtext.validation.IConcreteSyntaxConstraintProvider.ISyntaxConstraint in project xtext-core by eclipse.
the class AssignmentQuantityAllocator method getAssignmentQuantities.
@Override
public IQuantities getAssignmentQuantities(EObject obj, ISyntaxConstraint rule, List<IConcreteSyntaxDiagnostic> acceptor) {
Multimap<EStructuralFeature, ISyntaxConstraint> assignments = HashMultimap.create();
collectAssignments(rule, obj, rule, assignments, acceptor);
// Map<EStructuralFeature, Integer> quantities = Maps.newHashMap();
Quantities quants = createQuantities(obj);
for (EStructuralFeature f : obj.eClass().getEAllStructuralFeatures()) {
int quantity = getFeatureQuantity(obj, f);
if (quantity > 0 && !assignments.containsKey(f))
acceptor.add(diagnosticProvider.createAssignmentMissingDiagnostic(rule, obj, f, Collections.<ISyntaxConstraint>emptySet()));
else
quants.setFeatureQuantity(f, quantity);
}
Multimap<EStructuralFeature, ISyntaxConstraint> multipleAssignments = HashMultimap.create();
Multimap<EStructuralFeature, ISyntaxConstraint> allowTransients = HashMultimap.create();
for (Map.Entry<EStructuralFeature, Integer> f : quants.getFeatureQuantities().entrySet()) {
Collection<ISyntaxConstraint> ass = assignments.get(f.getKey());
if (ass.isEmpty())
continue;
boolean allowTransient = f.getKey() instanceof EAttribute && !f.getKey().isMany() && f.getValue() == 0 && allowTransient(obj, f.getKey(), ass);
boolean multiNeeded = ass.size() > 1 && f.getValue() != 0;
if (allowTransient)
allowTransients.putAll(f.getKey(), ass);
if (multiNeeded)
multipleAssignments.putAll(f.getKey(), ass);
if (!allowTransient && !multiNeeded)
for (ISyntaxConstraint a : ass) quants.setAssignmentQuantity(a, f.getValue());
}
if (multipleAssignments.isEmpty() && allowTransients.isEmpty())
return quants;
for (Map.Entry<EStructuralFeature, Collection<ISyntaxConstraint>> e : allowTransients.asMap().entrySet()) {
int min = 0;
for (ISyntaxConstraint x : e.getValue()) min += intervalProvider.getMin(quants, x, Sets.<ISyntaxConstraint>newHashSet());
int val = min > 0 ? 1 : 0;
quants.setFeatureQuantity(e.getKey(), val);
if (e.getValue().size() == 1)
quants.setAssignmentQuantity(e.getValue().iterator().next(), val);
}
// System.out.println("AllowTransientsQuantities: " + quants.toString());
if (multipleAssignments.isEmpty())
return quants;
return null;
// TODO: implement an algorithm to handle multipleAssignments. For details, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=310454
}
use of org.eclipse.xtext.validation.IConcreteSyntaxConstraintProvider.ISyntaxConstraint in project xtext-core by eclipse.
the class ConcreteSyntaxValidator method validateQuantities.
protected List<IConcreteSyntaxDiagnostic> validateQuantities(IQuantities quants, ISyntaxConstraint rule) {
List<IConcreteSyntaxDiagnostic> diag = new ArrayList<IConcreteSyntaxDiagnostic>();
Map<ISyntaxConstraint, Pair<Integer, Integer>> minmax = Maps.newHashMap();
for (Map.Entry<EStructuralFeature, Collection<ISyntaxConstraint>> e : quants.groupByFeature().entrySet()) {
int min = UNDEF, max = 0;
Set<ISyntaxConstraint> involved = new HashSet<ISyntaxConstraint>();
for (ISyntaxConstraint a : e.getValue()) {
involved.add(a);
int mi = intervalProvider.getMin(quants, a, involved);
if (mi != UNDEF)
min = min == UNDEF ? mi : mi + min;
int ma = intervalProvider.getMax(quants, a, involved, null);
if (ma != UNDEF && max != MAX)
max = ma == MAX ? ma : max + ma;
minmax.put(a, Tuples.create(mi, ma));
}
int actual = quants.getFeatureQuantity(e.getKey());
if (actual < min || actual > max)
diag.add(diagnosticProvider.createFeatureQuantityDiagnostic(rule, quants, e.getKey(), actual, min, max, involved));
}
// System.out.println("Validation: " + obj.toString(minmax));
return diag;
}
Aggregations