Search in sources :

Example 1 with ISyntaxConstraint

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;
}
Also used : ISyntaxConstraint(org.eclipse.xtext.validation.IConcreteSyntaxConstraintProvider.ISyntaxConstraint) ISyntaxConstraint(org.eclipse.xtext.validation.IConcreteSyntaxConstraintProvider.ISyntaxConstraint)

Example 2 with ISyntaxConstraint

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;
}
Also used : ISyntaxConstraint(org.eclipse.xtext.validation.IConcreteSyntaxConstraintProvider.ISyntaxConstraint) ArrayList(java.util.ArrayList) IQuantities(org.eclipse.xtext.validation.IAssignmentQuantityAllocator.IQuantities) IConcreteSyntaxDiagnostic(org.eclipse.xtext.validation.IConcreteSyntaxDiagnosticProvider.IConcreteSyntaxDiagnostic)

Example 3 with ISyntaxConstraint

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();
}
Also used : ISyntaxConstraint(org.eclipse.xtext.validation.IConcreteSyntaxConstraintProvider.ISyntaxConstraint) IQuantities(org.eclipse.xtext.validation.IAssignmentQuantityAllocator.IQuantities)

Example 4 with ISyntaxConstraint

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
}
Also used : EStructuralFeature(org.eclipse.emf.ecore.EStructuralFeature) ISyntaxConstraint(org.eclipse.xtext.validation.IConcreteSyntaxConstraintProvider.ISyntaxConstraint) ISyntaxConstraint(org.eclipse.xtext.validation.IConcreteSyntaxConstraintProvider.ISyntaxConstraint) EAttribute(org.eclipse.emf.ecore.EAttribute) Collection(java.util.Collection) Map(java.util.Map)

Example 5 with ISyntaxConstraint

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;
}
Also used : ArrayList(java.util.ArrayList) EStructuralFeature(org.eclipse.emf.ecore.EStructuralFeature) IConcreteSyntaxDiagnostic(org.eclipse.xtext.validation.IConcreteSyntaxDiagnosticProvider.IConcreteSyntaxDiagnostic) ISyntaxConstraint(org.eclipse.xtext.validation.IConcreteSyntaxConstraintProvider.ISyntaxConstraint) ISyntaxConstraint(org.eclipse.xtext.validation.IConcreteSyntaxConstraintProvider.ISyntaxConstraint) Collection(java.util.Collection) Map(java.util.Map) Pair(org.eclipse.xtext.util.Pair) HashSet(java.util.HashSet)

Aggregations

ISyntaxConstraint (org.eclipse.xtext.validation.IConcreteSyntaxConstraintProvider.ISyntaxConstraint)6 ArrayList (java.util.ArrayList)3 IConcreteSyntaxDiagnostic (org.eclipse.xtext.validation.IConcreteSyntaxDiagnosticProvider.IConcreteSyntaxDiagnostic)3 Collection (java.util.Collection)2 Map (java.util.Map)2 EStructuralFeature (org.eclipse.emf.ecore.EStructuralFeature)2 IQuantities (org.eclipse.xtext.validation.IAssignmentQuantityAllocator.IQuantities)2 HashSet (java.util.HashSet)1 EAttribute (org.eclipse.emf.ecore.EAttribute)1 Pair (org.eclipse.xtext.util.Pair)1