blob: 1c321d5bf98631f401eea9c50b72d403c314dcb3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013 E.D.Willink 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.build.modelspecs;
import org.eclipse.emf.codegen.ecore.genmodel.GenModel;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.ocl.examples.build.modelspecs.CGValuedElementModelSpec;
import org.eclipse.ocl.examples.codegen.cgmodel.CGInvalid;
import org.eclipse.ocl.examples.codegen.java.ImportUtils;
import org.eclipse.qvtd.codegen.qvti.cse.PredicatePlaces;
import org.eclipse.qvtd.codegen.qvticgmodel.CGAllInstancesOperationCallExp;
import org.eclipse.qvtd.codegen.qvticgmodel.CGEcoreRealizedVariable;
import org.eclipse.qvtd.codegen.qvticgmodel.CGFunction;
import org.eclipse.qvtd.codegen.qvticgmodel.CGFunctionCallExp;
import org.eclipse.qvtd.codegen.qvticgmodel.CGFunctionParameter;
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.CGMappingLoop;
import org.eclipse.qvtd.codegen.qvticgmodel.CGMiddlePropertyCallExp;
import org.eclipse.qvtd.codegen.qvticgmodel.CGPredicate;
import org.eclipse.qvtd.codegen.qvticgmodel.CGPropertyAssignment;
import org.eclipse.qvtd.codegen.qvticgmodel.CGRealizedVariable;
import org.eclipse.qvtd.codegen.qvticgmodel.CGSequence;
import org.eclipse.qvtd.codegen.utilities.QVTiEquivalenceUtils;
/**
* CGValuedElementModelSpec supports generation of the many methods that contribute to the CGValuedElement.xxxx() method hierarchy.
* <p>
* The exposition here as a two-dimensional Java table provides a readable, type-checked preserntation that would be harder to achieve
* using a spreadsheet (poor checking) or a model (no 2D tools).
*/
public class QVTdCGValuedElementModelSpec extends CGValuedElementModelSpec
{
public static final @NonNull Ctl CTL_PRED = new Ctl() { public @NonNull String generate(@NonNull CGValuedElementModelSpec cgModelSpec, @NonNull GenModel genModel) {
return "return " + classRef(PredicatePlaces.class) + ".createPredicatePlaces(element2place, this);";
}};
public static final @NonNull Inv INV_PRED = new Inv() {
@Override public @Nullable String generateGetInvalidValue(@NonNull CGValuedElementModelSpec cgModelSpec, @NonNull GenModel genModel) {
return classRef(CGInvalid.class) + " invalidValue = (conditionExpression != null) ? conditionExpression.getInvalidValue() : null;\n" +
" if (invalidValue == null) {\n" +
" invalidValue = (thenExpression != null) ? thenExpression.getInvalidValue() : null;\n" +
" }\n" +
" return invalidValue;";
}
@Override public @Nullable String generateIsInvalid(@NonNull CGValuedElementModelSpec cgModelSpec, @NonNull GenModel genModel) {
return null;
}
@Override public @Nullable String generateIsNonInvalid(@NonNull CGValuedElementModelSpec cgModelSpec, @NonNull GenModel genModel) {
return "return ((conditionExpression != null) && conditionExpression.isNonInvalid()) && ((thenExpression != null) && thenExpression.isNonInvalid());";
}
};
public static final @NonNull Log LOG_PRED = new Log() {
@Override public @NonNull String generateIsFalse(@NonNull CGValuedElementModelSpec cgModelSpec, @NonNull GenModel genModel) {
return "return ((conditionExpression != null) && conditionExpression.isFalse()) || ((thenExpression != null) && thenExpression.isFalse());";
}
@Override public @NonNull String generateIsTrue(@NonNull CGValuedElementModelSpec cgModelSpec, @NonNull GenModel genModel) {
return "return ((conditionExpression != null) && conditionExpression.isTrue()) && ((thenExpression != null) && thenExpression.isTrue());";
}
};
public static final @NonNull Eq EQ_EQUIV = new Eq() {
@Override public @Nullable String generateIsEquivalentTo(@NonNull CGValuedElementModelSpec cgModelSpec, @NonNull GenModel genModel) {
return null;
}
@Override public @Nullable String generateIsEquivalentToInternal(@NonNull CGValuedElementModelSpec cgModelSpec, @NonNull GenModel genModel) {
String equivalenceUtilsImport = ImportUtils.getAffixedName(QVTiEquivalenceUtils.class);
return "return (getClass() == thatValue.getClass()) ? "+ equivalenceUtilsImport + ".isEquivalent(this, (" + cgModelSpec.getCgClass().getSimpleName() + ")thatValue) : null;";
}
};
public static void register() {
// new CGValuedElementModelSpec(CGVariable.class, "init", null , Ref.DELEG, null , Nul.VAR , Inv.VAR , null , null , null , null , null , null , null , null , null );
new QVTdCGValuedElementModelSpec(CGGuardVariable.class, null, Box.FALSE, null , null , Nul.NEVER, null , Glo.FALSE, null , null , null , null , null , null , null , null , null , null , null );
new QVTdCGValuedElementModelSpec(CGRealizedVariable.class, null, Box.FALSE, null , null , Nul.NEVER, null , Glo.FALSE, null , null , null , null , null , null , null , null , null , null , null );
new QVTdCGValuedElementModelSpec(CGEcoreRealizedVariable.class, null, null , null , null , Nul.ASSRT, null , null , null , null , null , null , null , null , null , null , null , null , null );
new QVTdCGValuedElementModelSpec(CGAllInstancesOperationCallExp.class, null, null, null , null , null , null , null , null , null , null , null , null , null , null , null , Com.FALSE, null , null );
new QVTdCGValuedElementModelSpec(CGFunctionCallExp.class, null, Box.FALSE, null , null , null , null , Glo.FALSE, null , null , null , null , null , null , null , null , null , null , null );
new QVTdCGValuedElementModelSpec(CGFunctionParameter.class, null, Box.FALSE, null , null , null , null , Glo.FALSE, null , null , null , null , null , null , null , null , null , null , null );
new QVTdCGValuedElementModelSpec(CGMappingCallBinding.class, "value", Box.DELEG, null , null , null , null , Glo.FALSE, null , null , null , null , null , null , null , null , Com.FALSE, null , Eq.SELF );
new QVTdCGValuedElementModelSpec(CGMiddlePropertyCallExp.class, null, Box.FALSE, null , null , null , null , Glo.FALSE, null , null , null , null , null , null , null , null , null , null , null );
new QVTdCGValuedElementModelSpec(CGPredicate.class, "conditionExpression", Box.BIBOX, null , LOG_PRED , Nul.NEVER, INV_PRED , Glo.FALSE, null , null , null , null , null , null , null , CTL_PRED , null , null , Eq.SELF );
new QVTdCGValuedElementModelSpec(CGPropertyAssignment.class, "initValue", Box.DELEG, null , null , null , null , Glo.FALSE, null , null , null , null , null , null , null , null , null , null , EQ_EQUIV);
new QVTdCGValuedElementModelSpec(CGFunction.class, null, Box.TRUE , null , null , null , null , null , null , null , null , null , null , null , null , null , null , null , null );
new QVTdCGValuedElementModelSpec(CGMapping.class, null, Box.BIBOX, null , null , null , null , null , null , null , Ct.TRUE , null , null , null , Ctx.TRUE , Ctl.BODY , null , null , null );
new QVTdCGValuedElementModelSpec(CGMappingExp.class, null, Box.BIBOX, null , null , null , null , null , null , null , null , null , null , null , null , null , null , null , EQ_EQUIV);
new QVTdCGValuedElementModelSpec(CGSequence.class, null, null, null , null , null , null , null , null , null , null , null , null , null , null , null , null , null , Eq.SELF );
new QVTdCGValuedElementModelSpec(CGMappingCall.class, null, null , null , null , null , null , null , null , null , null , null , null , null , null , null , Com.FALSE, null , Eq.SELF );
new QVTdCGValuedElementModelSpec(CGMappingLoop.class, null, null , null , null , null , null , null , null , null , null , null , null , null , null , null , Com.FALSE, null , Eq.SELF );
}
protected QVTdCGValuedElementModelSpec(@NonNull Class<?> cgClass, @Nullable String delegate,
@Nullable Box box, @Nullable Ths ths, @Nullable Log log, @Nullable Nul nul, @Nullable Inv inv,
@Nullable Glo glo, @Nullable Inl inl, @Nullable Set set, @Nullable Ct ct, @Nullable Con con,
@Nullable Val val, @Nullable Cvl cvl, @Nullable Ctx ctx, @Nullable Ctl ctl, @Nullable Com com, @Nullable Rew rew, @Nullable Eq eq) {
super(cgClass, delegate, box, ths, log, nul, inv, glo, inl, set, ct, con, val, cvl, ctx, ctl, com, rew, eq);
}
}