blob: 65452ba6e283f29c3dc66e8c165e3182736b15c3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 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.codegen.utilities;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.ocl.examples.codegen.cgmodel.CGAccumulator;
import org.eclipse.ocl.examples.codegen.cgmodel.CGEcorePropertyCallExp;
import org.eclipse.ocl.examples.codegen.cgmodel.CGElement;
import org.eclipse.ocl.examples.codegen.cgmodel.CGValuedElement;
import org.eclipse.ocl.examples.codegen.utilities.CGUtil;
import org.eclipse.ocl.pivot.VariableDeclaration;
import org.eclipse.ocl.pivot.Property;
import org.eclipse.ocl.pivot.utilities.ClassUtil;
import org.eclipse.ocl.pivot.utilities.NameUtil;
import org.eclipse.qvtd.codegen.qvticgmodel.CGConnectionAssignment;
import org.eclipse.qvtd.codegen.qvticgmodel.CGEcoreContainerAssignment;
import org.eclipse.qvtd.codegen.qvticgmodel.CGEcorePropertyAssignment;
import org.eclipse.qvtd.codegen.qvticgmodel.CGGuardVariable;
import org.eclipse.qvtd.codegen.qvticgmodel.CGMapping;
import org.eclipse.qvtd.codegen.qvticgmodel.CGMappingCall;
import org.eclipse.qvtd.codegen.qvticgmodel.CGMappingCallBinding;
import org.eclipse.qvtd.codegen.qvticgmodel.CGMappingExp;
import org.eclipse.qvtd.codegen.qvticgmodel.CGPropertyAssignment;
import org.eclipse.qvtd.codegen.qvticgmodel.CGRealizedVariable;
import org.eclipse.qvtd.codegen.qvticgmodel.CGTransformation;
import org.eclipse.qvtd.codegen.qvticgmodel.CGTypedModel;
import org.eclipse.qvtd.pivot.qvtimperative.GuardParameter;
import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTransformation;
import org.eclipse.qvtd.pivot.qvtimperative.ImperativeTypedModel;
import org.eclipse.qvtd.pivot.qvtimperative.Mapping;
import org.eclipse.qvtd.pivot.qvtimperative.MappingCall;
import org.eclipse.qvtd.pivot.qvtimperative.MappingParameter;
import org.eclipse.qvtd.pivot.qvtimperative.SimpleParameter;
import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperativeUtil;
import org.eclipse.qvtd.pivot.qvtimperative.NewStatement;
import org.eclipse.qvtd.pivot.qvtimperative.SetStatement;
public class QVTiCGUtil extends CGUtil
{
public static @Nullable CGMapping basicGetContainingCGMapping(@NonNull CGElement cgElement) {
for (EObject eObject = cgElement; eObject != null; eObject = eObject.eContainer()) {
if (eObject instanceof CGMapping) {
return (CGMapping)eObject;
}
}
return null;
}
public static @NonNull VariableDeclaration getAST(@NonNull CGGuardVariable cgGuardVariable) {
return ClassUtil.nonNullState((VariableDeclaration)cgGuardVariable.getAst());
}
public static @NonNull Mapping getAST(@NonNull CGMapping cgMapping) {
return ClassUtil.nonNullState((Mapping)cgMapping.getAst());
}
public static @NonNull MappingCall getAST(@NonNull CGMappingCall cgMappingCall) {
return ClassUtil.nonNullState((MappingCall)cgMappingCall.getAst());
}
public static @NonNull SetStatement getAST(@NonNull CGPropertyAssignment cgPropertyAssignment) {
return ClassUtil.nonNullState((SetStatement)cgPropertyAssignment.getAst());
}
public static @NonNull NewStatement getAST(@NonNull CGRealizedVariable cgRealizedVariable) {
return ClassUtil.nonNullState((NewStatement)cgRealizedVariable.getAst());
}
public static @NonNull ImperativeTransformation getAST(@NonNull CGTransformation cgTransformation) {
return ClassUtil.nonNullState((ImperativeTransformation)cgTransformation.getAst());
}
public static @NonNull ImperativeTypedModel getAST(@NonNull CGTypedModel cgTypedModel) {
return ClassUtil.nonNullState((ImperativeTypedModel)cgTypedModel.getAst());
}
public static @NonNull CGMapping getContainingCGMapping(@NonNull CGElement cgElement) {
return ClassUtil.nonNullState(basicGetContainingCGMapping(cgElement));
}
public static @NonNull EStructuralFeature getEStructuralFeature(@NonNull CGEcoreContainerAssignment cgContainerAssignment) {
return ClassUtil.nonNullState(cgContainerAssignment.getEStructuralFeature());
}
public static @NonNull EStructuralFeature getEStructuralFeature(@NonNull CGEcorePropertyAssignment cgPropertyAssignment) {
return ClassUtil.nonNullState(cgPropertyAssignment.getEStructuralFeature());
}
public static @NonNull EStructuralFeature getEStructuralFeature(@NonNull CGEcorePropertyCallExp cgPropertyCallExp) {
return ClassUtil.nonNullState(cgPropertyCallExp.getEStructuralFeature());
}
public static @NonNull String getName(@NonNull CGAccumulator cgAccumulator) {
return ClassUtil.nonNullState(cgAccumulator.getName());
}
public static @NonNull String getName(@NonNull CGMapping cgMapping) {
return ClassUtil.nonNullState(cgMapping.getName());
}
public static @NonNull Iterable<@NonNull CGAccumulator> getOwnedAccumulators(@NonNull CGMappingExp cgMappingExp) {
return ClassUtil.nullFree(cgMappingExp.getOwnedAccumulators());
}
public static @NonNull Iterable<@NonNull CGPropertyAssignment> getOwnedAssignments(@NonNull CGMapping cgMapping) {
return ClassUtil.nullFree(cgMapping.getOwnedAssignments());
}
public static @NonNull Iterable<@NonNull CGConnectionAssignment> getOwnedConnectionAssignments(@NonNull CGMapping cgMapping) {
return ClassUtil.nullFree(cgMapping.getOwnedConnectionAssignments());
}
public static @NonNull Iterable<@NonNull CGGuardVariable> getOwnedGuardVariables(@NonNull CGMapping cgRootMapping) {
return ClassUtil.nullFree(cgRootMapping.getOwnedGuardVariables());
}
public static @NonNull CGValuedElement getOwnedInitValue(@NonNull CGConnectionAssignment cgConnectionAssignment) {
return ClassUtil.nonNullState(cgConnectionAssignment.getOwnedInitValue());
}
public static @NonNull CGValuedElement getOwnedInitValue(@NonNull CGPropertyAssignment cgPropertyAssignment) {
return ClassUtil.nonNullState(cgPropertyAssignment.getOwnedInitValue());
}
public static @NonNull Iterable<@NonNull CGMappingCallBinding> getOwnedMappingCallBindings(@NonNull CGMappingCall cgMappingCall) {
return ClassUtil.nullFree(cgMappingCall.getOwnedMappingCallBindings());
}
public static @NonNull Iterable<@NonNull CGMapping> getOwnedMappings(@NonNull CGTransformation cgTransformation) {
return ClassUtil.nullFree(cgTransformation.getOwnedMappings());
}
public static @NonNull Iterable<@NonNull CGRealizedVariable> getOwnedRealizedVariables(@NonNull CGMapping cgMapping) {
return ClassUtil.nullFree(cgMapping.getOwnedRealizedVariables());
}
public static @NonNull CGValuedElement getOwnedSlotValue(@NonNull CGPropertyAssignment cgPropertyAssignment) {
return ClassUtil.nonNullState(cgPropertyAssignment.getOwnedSlotValue());
}
public static @NonNull Iterable<@NonNull CGTypedModel> getOwnedTypedModels(@NonNull CGTransformation cgTransformation) {
return ClassUtil.nullFree(cgTransformation.getOwnedTypedModels());
}
public static @NonNull CGMapping getOwningMapping(@NonNull CGRealizedVariable cgRealizedVariable) {
return ClassUtil.nonNullState(cgRealizedVariable.getOwningMapping());
}
public static @NonNull CGTransformation getOwningTransformation(@NonNull CGMapping cgMapping) {
return ClassUtil.nonNullState(cgMapping.getOwningTransformation());
}
public static @NonNull Property getReferredProperty(@NonNull CGPropertyAssignment cgPropertyAssignment) {
return ClassUtil.nonNullState(cgPropertyAssignment.getReferredProperty());
}
public static @NonNull CGMapping getRootMapping(@NonNull CGTransformation cgTransformation) {
CGMapping cgRootMapping = NameUtil.getNameable(cgTransformation.getOwnedMappings(), QVTimperativeUtil.ROOT_MAPPING_NAME); // Obsolete relic
for (@NonNull CGMapping cgMapping : getOwnedMappings(cgTransformation)) {
Mapping asMapping = getAST(cgMapping);
boolean isRoot = true;
for (@NonNull MappingParameter asParameter : QVTimperativeUtil.getOwnedMappingParameters(asMapping)) {
if (asParameter instanceof GuardParameter) {
isRoot = false;
break;
}
else if (asParameter instanceof SimpleParameter) {
isRoot = false;
break;
}
}
if (isRoot) {
if (cgRootMapping == null) {
cgRootMapping = cgMapping;
}
else if (cgRootMapping != cgMapping) {
throw new IllegalStateException("Transformation " + cgTransformation.getName() + " has ambiguous root mappings: " + cgRootMapping + ", " + cgMapping);
}
}
}
if (cgRootMapping == null) {
throw new IllegalStateException("Transformation " + cgTransformation.getName() + " has no root mapping");
}
return cgRootMapping;
}
}