use of org.eclipse.xtext.serializer.analysis.IGrammarConstraintProvider.IConstraintElement in project xtext-core by eclipse.
the class PartialSerializer method trySerializeSingleValue.
protected List<SerializationStrategy> trySerializeSingleValue(EObject owner, FeatureChange change, IEObjectRegion ownerRegion, IConstraint constraint) {
List<SerializationStrategy> result = Lists.newArrayList();
EStructuralFeature feature = change.getFeature();
IFeatureInfo featureInfo = constraint.getFeatures()[owner.eClass().getFeatureID(feature)];
List<IConstraintElement> assignments = featureInfo.getAssignments();
if (assignments.size() != 1) {
return null;
}
boolean optional = assignments.get(0).isOptional();
IAstRegion featureRegion = findRegion(ownerRegion, change);
ValueTransient valueTransient = transientValues.isValueTransient(owner, feature);
switch(valueTransient) {
case YES:
if (featureRegion != null) {
if (optional) {
result.add(new DeleteRegionStrategy(featureRegion));
} else {
return null;
}
}
break;
case PREFERABLY:
if (featureRegion != null) {
if (optional) {
result.add(new DeleteRegionStrategy(featureRegion));
} else {
SerializationStrategy update = updateSingleValue(owner, feature, featureRegion);
if (update != null) {
result.add(update);
} else {
return null;
}
}
}
break;
case NO:
if (featureRegion == null) {
return null;
}
SerializationStrategy update = updateSingleValue(owner, feature, featureRegion);
if (update != null) {
result.add(update);
} else {
return null;
}
break;
}
return result;
}
use of org.eclipse.xtext.serializer.analysis.IGrammarConstraintProvider.IConstraintElement in project xtext-core by eclipse.
the class PartialSerializer method trySerializeMultiValue.
protected List<SerializationStrategy> trySerializeMultiValue(EObject owner, FeatureChange change, IEObjectRegion ownerRegion, IConstraint constraint) {
EStructuralFeature feature = change.getFeature();
List<SerializationStrategy> result = Lists.newArrayList();
IFeatureInfo featureInfo = constraint.getFeatures()[owner.eClass().getFeatureID(feature)];
List<IConstraintElement> assignments = featureInfo.getAssignments();
if (assignments.size() != 1) {
return null;
}
IConstraintElement assignment = assignments.get(0);
if (!assignment.isMany()) {
return null;
}
List<IAstRegion> originals = findRegions(ownerRegion, change);
EList<ListChange> listChanges = change.getListChanges();
if (listChanges.isEmpty() && originals.isEmpty()) {
ISerializationContext ctx = getSerializationContext(owner);
AbstractElement ins = assignment.getGrammarElement();
IHiddenRegion insertAt = insertionPointFinder.findInsertionPoint(ctx, ownerRegion, ins);
if (insertAt == null) {
return null;
}
for (Object value : (List<?>) owner.eGet(feature)) {
EObject obj = (EObject) value;
ISerializationContext context = getSerializationContext(obj);
result.add(new SerializeRecursiveStrategy(insertAt, obj, context));
}
return result;
}
// ListTransient listTransient = transientValues.isListTransient(owner, feature);
List<Object> modifying = Lists.newArrayList(((List<?>) owner.eGet(feature)));
for (ListChange lc : listChanges) {
ChangeKind kind = lc.getKind();
if (kind == ADD_LITERAL) {
IAstRegion region = originals.get(lc.getIndex());
result.add(new DeleteRegionStrategy(region));
} else if (kind == MOVE_LITERAL || kind == REMOVE_LITERAL) {
if (originals.isEmpty()) {
return null;
}
int index = lc.getIndex();
IHiddenRegion insertAt;
if (index >= originals.size()) {
insertAt = ((ISequentialRegion) originals.get(originals.size() - 1)).getNextHiddenRegion();
} else {
insertAt = ((ISequentialRegion) originals.get(index)).getPreviousHiddenRegion();
}
EObject value = (EObject) modifying.get(index);
modifying.remove(index);
if (kind == REMOVE_LITERAL) {
ISerializationContext context = getSerializationContext(value);
result.add(new SerializeRecursiveStrategy(insertAt, value, context));
} else if (kind == ChangeKind.MOVE_LITERAL) {
int moveToIndex = lc.getMoveToIndex();
IAstRegion source = originals.get(moveToIndex);
result.add(new DeleteRegionStrategy(source));
result.add(new InsertRegionStrategy(insertAt, source));
}
}
}
return result;
}
use of org.eclipse.xtext.serializer.analysis.IGrammarConstraintProvider.IConstraintElement in project xtext-core by eclipse.
the class ContextFinder method collectAssignments.
protected Multimap<AbstractElement, ISerializationContext> collectAssignments(Multimap<IConstraint, ISerializationContext> constraints, EStructuralFeature feature) {
Multimap<AbstractElement, ISerializationContext> result = ArrayListMultimap.create();
for (Entry<IConstraint, Collection<ISerializationContext>> e : constraints.asMap().entrySet()) {
IConstraint constraint = e.getKey();
Collection<ISerializationContext> contexts = e.getValue();
IFeatureInfo featureInfo = constraint.getFeatures()[constraint.getType().getFeatureID(feature)];
List<IConstraintElement> assignments = featureInfo.getAssignments();
for (IConstraintElement assignment : assignments) {
result.putAll(assignment.getGrammarElement(), contexts);
}
}
return result;
}
Aggregations