blob: 984fb4eed68058900e1105242c65915b98ba72da [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2015 Willink Transformations and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* E.D.Willink - initial API and implementation
*******************************************************************************/
package org.eclipse.qvtd.xtext.qvtrelation.cs2as;
import java.util.List;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.ocl.pivot.CollectionType;
import org.eclipse.ocl.pivot.Element;
import org.eclipse.ocl.pivot.Property;
import org.eclipse.ocl.pivot.Type;
import org.eclipse.ocl.pivot.Variable;
import org.eclipse.ocl.pivot.utilities.PivotUtil;
import org.eclipse.ocl.xtext.base.cs2as.BasicContinuation;
import org.eclipse.ocl.xtext.base.cs2as.CS2ASConversion;
import org.eclipse.ocl.xtext.base.cs2as.Continuation;
import org.eclipse.ocl.xtext.base.cs2as.PivotDependency;
import org.eclipse.ocl.xtext.base.cs2as.SingleContinuation;
import org.eclipse.ocl.xtext.basecs.PathNameCS;
import org.eclipse.qvtd.pivot.qvtbase.Transformation;
import org.eclipse.qvtd.pivot.qvtrelation.RelationDomainAssignment;
import org.eclipse.qvtd.pivot.qvttemplate.CollectionTemplateExp;
import org.eclipse.qvtd.pivot.qvttemplate.ObjectTemplateExp;
import org.eclipse.qvtd.pivot.qvttemplate.PropertyTemplateItem;
import org.eclipse.qvtd.xtext.qvtrelationcs.CollectionTemplateCS;
import org.eclipse.qvtd.xtext.qvtrelationcs.DefaultValueCS;
import org.eclipse.qvtd.xtext.qvtrelationcs.ObjectTemplateCS;
import org.eclipse.qvtd.xtext.qvtrelationcs.PropertyTemplateCS;
import org.eclipse.qvtd.xtext.qvtrelationcs.TransformationCS;
import org.eclipse.qvtd.xtext.qvtrelationcs.util.AbstractQVTrelationCSPreOrderVisitor;
public class QVTrelationCSPreOrderVisitor extends AbstractQVTrelationCSPreOrderVisitor
{
public static class CollectionTemplateCompletion extends SingleContinuation<CollectionTemplateCS>
{
public CollectionTemplateCompletion(@NonNull CS2ASConversion context, @NonNull CollectionTemplateCS csElement) {
super(context, null, null, csElement, new PivotDependency(csElement.getOwnedType()));
}
@Override
public BasicContinuation<?> execute() {
CollectionTemplateExp pivotElement = PivotUtil.getPivot(CollectionTemplateExp.class, csElement);
if (pivotElement != null) {
CollectionType type = PivotUtil.getPivot(CollectionType.class, csElement.getOwnedType());
pivotElement.setReferredCollectionType(type);
pivotElement.setType(type);
Variable variable = pivotElement.getBindsTo();
if (variable != null) {
variable.setType(type);
}
}
return null;
}
}
public static class ObjectTemplateCompletion extends SingleContinuation<ObjectTemplateCS>
{
public ObjectTemplateCompletion(@NonNull CS2ASConversion context, @NonNull ObjectTemplateCS csElement) {
super(context, null, null, csElement, new PivotDependency(csElement.getOwnedType()));
}
@Override
public BasicContinuation<?> execute() {
ObjectTemplateExp pivotElement = PivotUtil.getPivot(ObjectTemplateExp.class, csElement);
if (pivotElement != null) {
org.eclipse.ocl.pivot.Class type = PivotUtil.getPivot(org.eclipse.ocl.pivot.Class.class, csElement.getOwnedType());
pivotElement.setReferredClass(type);
pivotElement.setType(type);
Variable variable = pivotElement.getBindsTo();
if (variable != null) {
variable.setType(type);
}
}
return null;
}
}
public static class PropertyTemplateCompletion extends SingleContinuation<PropertyTemplateCS>
{
public PropertyTemplateCompletion(@NonNull CS2ASConversion context, @NonNull PropertyTemplateCS csElement) {
super(context, null, null, csElement);
}
@Override
public boolean canExecute() {
if (!super.canExecute()) {
return false;
}
ObjectTemplateExp pivotElement = PivotUtil.getPivot(ObjectTemplateExp.class, csElement.getOwningObjectTemplate());
if (pivotElement == null) {
return false;
}
Type type = pivotElement.getType();
return type != null;
}
@Override
public BasicContinuation<?> execute() {
PropertyTemplateItem pivotElement = PivotUtil.getPivot(PropertyTemplateItem.class, csElement);
if (pivotElement != null) {
Property propertyId = csElement.getPropertyId();
if (propertyId != null) {
pivotElement.setReferredProperty(propertyId);
pivotElement.setIsOpposite(false);
}
else {
PathNameCS oppositePropertyId = csElement.getOwnedOppositePropertyId();
Element element = oppositePropertyId.getReferredElement();
if (element instanceof Property) {
pivotElement.setReferredProperty((Property) element);
pivotElement.setIsOpposite(true);
}
}
}
return null;
}
}
public QVTrelationCSPreOrderVisitor(@NonNull CS2ASConversion context) {
super(context);
}
@Override
public Continuation<?> visitCollectionTemplateCS(@NonNull CollectionTemplateCS csElement) {
return new CollectionTemplateCompletion(context, csElement);
}
@Override
public Continuation<?> visitDefaultValueCS(@NonNull DefaultValueCS csElement) {
RelationDomainAssignment pivotElement = PivotUtil.getPivot(RelationDomainAssignment.class, csElement);
if (pivotElement != null) {
pivotElement.setVariable(csElement.getPropertyId());
}
return null;
}
@Override
public Continuation<?> visitObjectTemplateCS(@NonNull ObjectTemplateCS csElement) {
return new ObjectTemplateCompletion(context, csElement);
}
@Override
public Continuation<?> visitPropertyTemplateCS(@NonNull PropertyTemplateCS csElement) {
return new PropertyTemplateCompletion(context, csElement);
}
@Override
public Continuation<?> visitTransformationCS(@NonNull TransformationCS csElement) {
Transformation pivotElement = PivotUtil.getPivot(Transformation.class, csElement);
if (pivotElement != null) {
List<org.eclipse.ocl.pivot.Class> superClasses = pivotElement.getSuperClasses();
// context.refreshList(Type.class, superClasses, csElement.getOwnedSuperType());
if (superClasses.isEmpty()) {
org.eclipse.ocl.pivot.Class oclElementType = context.getMetamodelManager().getStandardLibrary().getOclElementType();
pivotElement.getSuperClasses().add(oclElementType);
}
}
return null;
}
}