blob: 14d670e14307f9d181bd159c29279ab7e2e7fc60 [file] [log] [blame]
package org.eclipse.gymnast.generators.embeddeddsl.templates;
import java.util.Iterator;
import org.eclipse.emf.codegen.ecore.genmodel.GenClass;
import org.eclipse.emf.codegen.ecore.genmodel.GenFeature;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EReference;
public class LiftedRef extends Modder {
LiftedRef(GenFeature gSF) {
super(gSF);
this.eR = (EReference) gSF.getEcoreFeature();
}
public EReference eR; // its refed type has no subtypes
/* derive a get non-null, set one by one args */
// derive unset if unsettable
@Override
public String toString() {
EClass refed = (EClass) eR.getEType();
GenClass genRefed = gSF.getTypeGenClass();
String jInstantiate = beingBuilt.jInstantiateFor(genRefed);
String jSetStmt = "this.myExpr.set" + gSF.getAccessorName() + "( " + jInstantiate + " );";
String jGetNonNull = String.format("if ( this.myExpr.get%1s() == null ) { %2s }", gSF.getAccessorName(), jSetStmt);
// all struct features are str, char, or int
assert refed.getEAllAttributes().equals(refed.getEAllStructuralFeatures());
String jAssignments = "";
Iterator<GenFeature> iF = gSF.getTypeGenClass().getAllGenFeatures().iterator();
while (iF.hasNext()) {
GenFeature attr = iF.next();
String jArgName = ExprBuilder.escapeJavaKeyword(attr.getName());
// make an assignment
String jAssignment;
if (attr.getEcoreFeature().isMany()) {
String prefix = "this.myExpr.get" + gSF.getAccessorName() + "().get" + attr.getAccessorName() + "()";
jAssignment = prefix + ".clear();";
jAssignment += newLine + prefix + ".addAll(" + jArgName + "); /*isManyLiftedRef*/ ";
} else {
jAssignment = "this.myExpr.get" + gSF.getAccessorName() + "().set" + attr.getAccessorName() + "(" + jArgName
+ "); /*LiftedRef*/ ";
}
jAssignments += newLine + jAssignment;
}
String res = newLine + removeLastSemicolon(signatureDecl()) + " { ";
res += newLine + jGetNonNull;
res += newLine + jAssignments;
res += newLine + " return this; }";
return res;
}
@Override
public String signatureDecl() {
String jFormalParamsList = "";
Iterator<GenFeature> iF = gSF.getTypeGenClass().getAllGenFeatures().iterator();
while (iF.hasNext()) {
GenFeature attr = iF.next();
String jArgName = ExprBuilder.escapeJavaKeyword(attr.getName());
String jParamDecl = PrimitiveSF.javaTypeForPrimitiveFeature(attr) + " " + jArgName;
// make a formal parameter
jFormalParamsList += jParamDecl + (iF.hasNext() ? ", " : "");
}
String methodName = ExprBuilder.escapeJavaKeyword(eR.getName());
String jSignature = "public " + getReturnType() + " " + methodName + "( " + jFormalParamsList + " ); ";
return jSignature;
}
}