package org.jnario.feature.jvmmodel;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EcoreUtil.Copier;
import org.eclipse.xtend.core.xtend.XtendField;
import org.eclipse.xtext.common.types.JvmIdentifiableElement;
import org.eclipse.xtext.xbase.XAbstractFeatureCall;
import org.eclipse.xtext.xbase.XExpression;
import org.eclipse.xtext.xbase.XFeatureCall;
import org.eclipse.xtext.xbase.XMemberFeatureCall;
import org.eclipse.xtext.xbase.jvmmodel.IJvmModelAssociator;
import org.jnario.util.SourceAdapter;
import com.google.inject.Inject;
@SuppressWarnings("serial")
public class ExpressionCopier{
private class Implementation extends Copier{
public Implementation() {
super(true);
}
@Override
public EObject copy(EObject source) {
EObject target = super.copy(source);
// modelAssociator.associate(source, target);
if (source instanceof XAbstractFeatureCall) {
XAbstractFeatureCall sourceFeatureCall = (XAbstractFeatureCall) source;
XAbstractFeatureCall targetFeatureCall = (XAbstractFeatureCall) target;
targetFeatureCall.setFeature(sourceFeatureCall.getFeature());
targetFeatureCall.setImplicitFirstArgument((XExpression) copy(sourceFeatureCall.getImplicitFirstArgument()));
targetFeatureCall.setImplicitReceiver((XExpression) copy(sourceFeatureCall.getImplicitReceiver()));
}
if (source instanceof XMemberFeatureCall) {
XMemberFeatureCall sourceFeatureCall = (XMemberFeatureCall) source;
XMemberFeatureCall targetFeatureCall = (XMemberFeatureCall) target;
targetFeatureCall.setExplicitOperationCall(sourceFeatureCall.isExplicitOperationCall());
targetFeatureCall.setExplicitStatic(sourceFeatureCall.isExplicitStatic());
targetFeatureCall.setTypeLiteral(sourceFeatureCall.isTypeLiteral());
targetFeatureCall.setStaticWithDeclaringType(sourceFeatureCall.isStaticWithDeclaringType());
}
if (source instanceof XFeatureCall) {
XFeatureCall sourceFeatureCall = (XFeatureCall) source;
XFeatureCall targetFeatureCall = (XFeatureCall) target;
targetFeatureCall.setExplicitOperationCall(sourceFeatureCall.isExplicitOperationCall());
targetFeatureCall.setTypeLiteral(sourceFeatureCall.isTypeLiteral());
}
if(source instanceof XExpression || source instanceof XtendField){
SourceAdapter.adapt(target, source);
}
return target;
}
}
@Inject IJvmModelAssociator modelAssociator;
public <T extends EObject> T cloneWithProxies(T original) {
if (original == null)
return original;
Implementation copier = new Implementation();
@SuppressWarnings("unchecked")
T copy = (T) copier.copy(original);
copier.copyReferences();
return copy;
}
}