blob: c13952c07febd79464f4f49457d9fa52abdb32ce [file] [log] [blame]
/**
* Copyright (c) 2011-2012 Eclipse contributors 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
*/
package org.eclipse.emf.ecore.xcore.util;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.codegen.ecore.genmodel.GenBase;
import org.eclipse.emf.codegen.ecore.genmodel.GenClass;
import org.eclipse.emf.codegen.ecore.genmodel.GenClassifier;
import org.eclipse.emf.codegen.ecore.genmodel.GenDataType;
import org.eclipse.emf.codegen.ecore.genmodel.GenEnum;
import org.eclipse.emf.codegen.ecore.genmodel.GenEnumLiteral;
import org.eclipse.emf.codegen.ecore.genmodel.GenFeature;
import org.eclipse.emf.codegen.ecore.genmodel.GenModel;
import org.eclipse.emf.codegen.ecore.genmodel.GenOperation;
import org.eclipse.emf.codegen.ecore.genmodel.GenPackage;
import org.eclipse.emf.codegen.ecore.genmodel.GenParameter;
import org.eclipse.emf.codegen.ecore.genmodel.GenProviderKind;
import org.eclipse.emf.codegen.ecore.genmodel.GenRuntimeVersion;
import org.eclipse.emf.codegen.ecore.genmodel.GenTypeParameter;
import org.eclipse.emf.codegen.util.CodeGenUtil;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.common.util.CommonUtil;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EGenericType;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.ETypeParameter;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.util.EcoreValidator;
import org.eclipse.emf.ecore.xcore.XDataType;
import org.eclipse.emf.ecore.xcore.XNamedElement;
import org.eclipse.emf.ecore.xcore.XOperation;
import org.eclipse.emf.ecore.xcore.XStructuralFeature;
import org.eclipse.emf.ecore.xcore.XcorePlugin;
import org.eclipse.emf.ecore.xcore.mappings.ToXcoreMapping;
import org.eclipse.emf.ecore.xcore.mappings.XClassMapping;
import org.eclipse.emf.ecore.xcore.mappings.XDataTypeMapping;
import org.eclipse.emf.ecore.xcore.mappings.XFeatureMapping;
import org.eclipse.emf.ecore.xcore.mappings.XOperationMapping;
import org.eclipse.emf.ecore.xcore.mappings.XcoreMapper;
import org.eclipse.emf.ecore.xcore.scoping.LazyCreationProxyURIConverter;
import org.eclipse.xtext.common.types.JvmConstructor;
import org.eclipse.xtext.common.types.JvmDeclaredType;
import org.eclipse.xtext.common.types.JvmEnumerationLiteral;
import org.eclipse.xtext.common.types.JvmEnumerationType;
import org.eclipse.xtext.common.types.JvmField;
import org.eclipse.xtext.common.types.JvmFormalParameter;
import org.eclipse.xtext.common.types.JvmGenericArrayTypeReference;
import org.eclipse.xtext.common.types.JvmGenericType;
import org.eclipse.xtext.common.types.JvmIdentifiableElement;
import org.eclipse.xtext.common.types.JvmLowerBound;
import org.eclipse.xtext.common.types.JvmMember;
import org.eclipse.xtext.common.types.JvmOperation;
import org.eclipse.xtext.common.types.JvmParameterizedTypeReference;
import org.eclipse.xtext.common.types.JvmTypeConstraint;
import org.eclipse.xtext.common.types.JvmTypeParameter;
import org.eclipse.xtext.common.types.JvmTypeParameterDeclarator;
import org.eclipse.xtext.common.types.JvmTypeReference;
import org.eclipse.xtext.common.types.JvmUpperBound;
import org.eclipse.xtext.common.types.JvmVisibility;
import org.eclipse.xtext.common.types.JvmWildcardTypeReference;
import org.eclipse.xtext.common.types.TypesFactory;
import org.eclipse.xtext.common.types.TypesPackage;
import org.eclipse.xtext.naming.IQualifiedNameConverter;
import org.eclipse.xtext.naming.QualifiedName;
import org.eclipse.xtext.util.IResourceScopeCache;
import org.eclipse.xtext.xbase.XBlockExpression;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
@Singleton
public class XcoreJvmInferrer
{
public static List<JvmIdentifiableElement> getInferredElements(GenBase genBase)
{
List<JvmIdentifiableElement> result = Lists.newArrayList();
Adapter adapter = EcoreUtil.getAdapter(genBase.eAdapters(), InferenceAdapter.class);
if (adapter != null)
{
for (JvmElementInferrer<?> jvmElementInferrer : ((InferenceAdapter)adapter).jvmElementInferrers)
{
result.add(jvmElementInferrer.getInferredElement());
}
}
return result;
}
public static void inferName(GenBase genBase)
{
Adapter adapter = EcoreUtil.getAdapter(genBase.eAdapters(), InferenceAdapter.class);
if (adapter != null)
{
for (JvmElementInferrer<?> jvmElementInferrer : ((InferenceAdapter)adapter).jvmElementInferrers)
{
jvmElementInferrer.inferName();
}
}
}
protected static class InferenceAdapter extends AdapterImpl
{
protected List<JvmElementInferrer<? extends JvmIdentifiableElement>> jvmElementInferrers = Lists.newArrayList();
@Override
public boolean isAdapterForType(Object type)
{
return type == InferenceAdapter.class;
}
}
protected static final int X_VERY_LOW = 2;
protected static final int X_LOW = 1;
protected static final int X_MEDIUM = 0;
protected static final int X_HIGH = -1;
protected static final int X_VERY_HIGH = -2;
protected static abstract class JvmElementInferrer<T extends JvmIdentifiableElement>
{
protected T inferredElement;
protected int priority;
public JvmElementInferrer(int priority)
{
this.priority = priority;
inferredElement = inferStructure();
inferName();
}
public final T getInferredElement()
{
return inferredElement;
}
protected void resolveTypeParameterReferences()
{
for (Iterator<EObject> i = inferredElement.eAllContents(); i.hasNext(); )
{
EObject eObject = i.next();
if (eObject instanceof JvmParameterizedTypeReference)
{
InternalEObject type = (InternalEObject)eObject.eGet(TypesPackage.Literals.JVM_PARAMETERIZED_TYPE_REFERENCE__TYPE, false);
if (type != null)
{
URI eProxyURI = type.eProxyURI();
if (eProxyURI != null && eProxyURI.scheme() == TYPE_PARAMETER_REFERENCE_SCHEME)
{
String name = eProxyURI.fragment();
for (EObject eContainer = eObject.eContainer(); eContainer != null; eContainer = eContainer.eContainer())
{
if (eContainer instanceof JvmTypeParameterDeclarator)
{
for (JvmTypeParameter jvmTypeParameter : ((JvmTypeParameterDeclarator)eContainer).getTypeParameters())
{
if (name.equals(jvmTypeParameter.getName()))
{
((JvmParameterizedTypeReference)eObject).setType(jvmTypeParameter);
break;
}
}
}
}
}
}
}
}
}
protected void inferDeepStructure()
{
// There is no deep structure by default.
}
protected abstract T inferStructure();
public abstract void inferName();
}
@Inject
private LazyCreationProxyURIConverter proxyURIConverter;
@Inject
private IQualifiedNameConverter nameConverter;
@Inject
private XcoreMapper mapper;
@Inject
private IResourceScopeCache cache;
public List<? extends JvmDeclaredType> inferElements(GenModel genModel)
{
final ArrayList<JvmDeclaredType> result = new ArrayList<JvmDeclaredType>();
for (GenPackage genPackage : genModel.getGenPackages())
{
result.addAll(getDeclaredTypes(genPackage));
}
return result;
}
public void inferDeepStructure(GenModel genModel)
{
for (GenPackage genPackage : genModel.getGenPackages())
{
inferDeepStructure(genPackage);
for (GenClassifier genClassifier : genPackage.getGenClassifiers())
{
inferDeepStructure(genClassifier);
}
}
cache.clear(genModel.eResource());
}
protected void inferDeepStructure(GenBase genBase)
{
Adapter adapter = EcoreUtil.getAdapter(genBase.eAdapters(), InferenceAdapter.class);
if (adapter != null)
{
for (JvmElementInferrer<?> jvmElementInferrer : Lists.newArrayList(((InferenceAdapter)adapter).jvmElementInferrers))
{
try
{
jvmElementInferrer.inferDeepStructure();
jvmElementInferrer.resolveTypeParameterReferences();
}
catch (Throwable throwable)
{
XcorePlugin.INSTANCE.log(throwable);
}
}
}
}
protected List<? extends JvmDeclaredType> getDeclaredTypes(final GenPackage genPackage)
{
final ArrayList<JvmDeclaredType> result = new ArrayList<JvmDeclaredType>();
final GenModel genModel = genPackage.getGenModel();
if (genPackage.hasClassifiers())
{
if (!genModel.isSuppressEMFMetaData() && !genModel.isSuppressInterfaces())
{
JvmGenericType packageInterface = getPackage(genPackage, true, false);
result.add(packageInterface);
}
JvmGenericType packageClass = getPackage(genPackage, genModel.isSuppressEMFMetaData() || genModel.isSuppressInterfaces(), true);
result.add(packageClass);
}
if (genPackage.hasClassifiers())
{
if (!genModel.isSuppressInterfaces())
{
JvmGenericType factoryInterface = getFactory(genPackage, true, false);
result.add(factoryInterface);
}
JvmGenericType factoryClass = getFactory(genPackage, genModel.isSuppressInterfaces(), true);
result.add(factoryClass);
}
if (genPackage.hasClassifiers() && genPackage.isAdapterFactory() && !genPackage.getGenClasses().isEmpty())
{
JvmElementInferrer<JvmGenericType> switchClassInferrer =
new JvmElementInferrer<JvmGenericType>(X_MEDIUM)
{
@Override
protected JvmGenericType inferStructure()
{
JvmGenericType switchClass = TypesFactory.eINSTANCE.createJvmGenericType();
switchClass.setInterface(false);
switchClass.setVisibility(JvmVisibility.PUBLIC);
return switchClass;
}
@Override
protected void inferDeepStructure()
{
final JvmTypeParameter typeParameter = TypesFactory.eINSTANCE.createJvmTypeParameter();
typeParameter.setName("T");
final JvmUpperBound upperBound = TypesFactory.eINSTANCE.createJvmUpperBound();
JvmTypeReference objectReference = getJvmTypeReference("java.lang.Object", genPackage);
upperBound.setTypeReference(objectReference);
typeParameter.getConstraints().add(upperBound);
inferredElement.getTypeParameters().add(typeParameter);
JvmParameterizedTypeReference typeParameterReference = TypesFactory.eINSTANCE.createJvmParameterizedTypeReference();
typeParameterReference.setType(typeParameter);
JvmParameterizedTypeReference switchTypeReference = (JvmParameterizedTypeReference)getJvmTypeReference("org.eclipse.emf.ecore.util.Switch", genPackage);
switchTypeReference.getArguments().add(typeParameterReference);
inferredElement.getSuperTypes().add(switchTypeReference);
EList<JvmMember> members = inferredElement.getMembers();
members.add(createJvmField(genPackage, JvmVisibility.PROTECTED, true, false, "modelPackage", getJvmTypeReference(genPackage.getReflectionPackageName() + "." + genPackage.getPackageInterfaceName(), genPackage)));
{
JvmElementInferrer<JvmConstructor> constructorInferrer =
new JvmElementInferrer<JvmConstructor>(X_LOW)
{
@Override
protected JvmConstructor inferStructure()
{
JvmConstructor jvmConstructor = TypesFactory.eINSTANCE.createJvmConstructor();
jvmConstructor.setVisibility(JvmVisibility.PUBLIC);
return jvmConstructor;
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genPackage.getSwitchClassName());
}
};
associate(genPackage, constructorInferrer);
members.add(constructorInferrer.getInferredElement());
}
{
JvmOperation isSwitchFor = createJvmOperation(genPackage, JvmVisibility.PROTECTED, false, "isSwitchFor", getJvmTypeReference("boolean", genPackage));
JvmFormalParameter ePackage = createJvmFormalParameter(genPackage, "ePackage", getJvmTypeReference("org.eclipse.emf.ecore.EPackage", genPackage));
isSwitchFor.getParameters().add(ePackage);
members.add(isSwitchFor);
}
{
JvmParameterizedTypeReference doSwitchResult = TypesFactory.eINSTANCE.createJvmParameterizedTypeReference();
doSwitchResult.setType(typeParameter);
JvmOperation doSwitch = createJvmOperation(genPackage, JvmVisibility.PROTECTED, false, "doSwitch", doSwitchResult);
JvmFormalParameter classifierID = createJvmFormalParameter(genPackage, "ePackage", getJvmTypeReference("org.eclipse.emf.ecore.EPackage", genPackage));
doSwitch.getParameters().add(classifierID);
JvmFormalParameter theEObject = createJvmFormalParameter(genPackage, "theEObject", getJvmTypeReference("org.eclipse.emf.ecore.EObject", genPackage));
doSwitch.getParameters().add(theEObject);
members.add(doSwitch);
}
for (final GenClass genClass : genPackage.getAllSwitchGenClasses())
{
if (!genClass.isAbstract())
{
JvmElementInferrer<JvmOperation> caseMethodInferrer =
new JvmElementInferrer<JvmOperation>(X_MEDIUM)
{
@Override
protected JvmOperation inferStructure()
{
JvmOperation jvmOperation = TypesFactory.eINSTANCE.createJvmOperation();
jvmOperation.setVisibility(JvmVisibility.PUBLIC);
JvmParameterizedTypeReference typeParameterReference = TypesFactory.eINSTANCE.createJvmParameterizedTypeReference();
typeParameterReference.setType(typeParameter);
jvmOperation.setReturnType(typeParameterReference);
JvmFormalParameter jvmFormalParameter = createJvmFormalParameter(genClass, "object", getJvmTypeReference(genClass.getQualifiedInterfaceName(), genPackage));
jvmOperation.getParameters().add(jvmFormalParameter);
populateTypeParameters(null, genClass.getGenTypeParameters(), jvmOperation.getTypeParameters());
return jvmOperation;
}
protected boolean rename = false;
@Override
public void inferName()
{
if (rename)
{
genPackage.clearCache();
}
else
{
rename = true;
}
inferredElement.setSimpleName("case" + genPackage.getClassUniqueName(genClass));
}
};
associate(genClass, caseMethodInferrer);
members.add(caseMethodInferrer.getInferredElement());
}
}
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genPackage.getSwitchClassName());
inferredElement.setPackageName(genPackage.getUtilitiesPackageName());
}
};
associate(genPackage, switchClassInferrer);
result.add(switchClassInferrer.getInferredElement());
}
if (genPackage.hasClassifiers() && genPackage.hasConstraints())
{
JvmElementInferrer<JvmGenericType> validatorClassInferrer =
new JvmElementInferrer<JvmGenericType>(X_MEDIUM)
{
@Override
protected JvmGenericType inferStructure()
{
JvmGenericType switchClass = TypesFactory.eINSTANCE.createJvmGenericType();
switchClass.setInterface(false);
switchClass.setVisibility(JvmVisibility.PUBLIC);
return switchClass;
}
@Override
protected void inferDeepStructure()
{
final String map = genModel.useGenerics() ? "java.util.Map<java.lang.Object, java.lang.Object>" : "java.util.Map";
inferredElement.getSuperTypes().add(getJvmTypeReference("org.eclipse.emf.ecore.util.EObjectValidator", genPackage));
EList<JvmMember> members = inferredElement.getMembers();
members.add(createJvmField(genPackage, JvmVisibility.PUBLIC, true, true, "INSTANCE", getJvmTypeReference(genPackage.getQualifiedValidatorClassName(), genPackage)));
members.add(createJvmField(genPackage, JvmVisibility.PUBLIC, true, true, "DIAGNOSTIC_SOURCE", getJvmTypeReference("java.lang.String", genPackage)));
for (final GenClass genClass : genPackage.getGenClasses())
{
for (final GenOperation genOperation : genClass.getInvariantOperations())
{
JvmElementInferrer<JvmField> operationIDInferrer =
new JvmElementInferrer<JvmField>(X_LOW)
{
@Override
protected JvmField inferStructure()
{
return createJvmField(genClass, JvmVisibility.PUBLIC, true, true, getJvmTypeReference("int", genClass));
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genClass.getOperationID(genOperation));
}
};
associate(genOperation, operationIDInferrer);
members.add(operationIDInferrer.getInferredElement());
}
}
members.add(createJvmField(genPackage, JvmVisibility.PRIVATE, true, true, "GENERATED_DIAGNOSTIC_CODE_COUNT", getJvmTypeReference("int", genPackage)));
members.add(createJvmField(genPackage, JvmVisibility.PROTECTED, true, true, "DIAGNOSTIC_CODE_COUNT", getJvmTypeReference("int", genPackage)));
for (final GenPackage baseGenPackage : genPackage.getAllValidatorBaseGenPackages())
{
JvmElementInferrer<JvmField> baseValidatorInferrer =
new JvmElementInferrer<JvmField>(X_LOW)
{
@Override
protected JvmField inferStructure()
{
return createJvmField(genPackage, JvmVisibility.PROTECTED, true, true, getJvmTypeReference(baseGenPackage.getQualifiedValidatorClassName(), genPackage));
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genPackage.getValidatorPackageUniqueSafeName(baseGenPackage) + "Validator");
}
};
associate(baseGenPackage, baseValidatorInferrer);
members.add(baseValidatorInferrer.getInferredElement());
}
if (genPackage.hasInvariantExpressions())
{
JvmOperation validateOperation = createJvmOperation(genPackage, JvmVisibility.PUBLIC, true, "validate", getJvmTypeReference("boolean", genPackage));
EList<JvmFormalParameter> parameters = validateOperation.getParameters();
parameters.add(createJvmFormalParameter(genPackage, "eClass", getJvmTypeReference("org.eclipse.emf.ecore.EClass", genPackage)));
parameters.add(createJvmFormalParameter(genPackage, "eObject", getJvmTypeReference("org.eclipse.emf.ecore.EObject", genPackage)));
parameters.add(createJvmFormalParameter(genPackage, "diagnostics", getJvmTypeReference("org.eclipse.emf.common.util.DiagnosticChain", genPackage)));
parameters.add(createJvmFormalParameter(genPackage, "context", getJvmTypeReference(map, genPackage)));
parameters.add(createJvmFormalParameter(genPackage, "validationDelegate", getJvmTypeReference("java.lang.String", genPackage)));
parameters.add(createJvmFormalParameter(genPackage, "invariant", getJvmTypeReference("org.eclipse.emf.ecore.EOperation", genPackage)));
parameters.add(createJvmFormalParameter(genPackage, "expression", getJvmTypeReference("java.lang.String", genPackage)));
parameters.add(createJvmFormalParameter(genPackage, "severity", getJvmTypeReference("int", genPackage)));
parameters.add(createJvmFormalParameter(genPackage, "source", getJvmTypeReference("java.lang.String", genPackage)));
parameters.add(createJvmFormalParameter(genPackage, "code", getJvmTypeReference("int", genPackage)));
members.add(validateOperation);
}
members.add(createJvmOperation(genPackage, JvmVisibility.PROTECTED, false, "getEPackage", getJvmTypeReference("org.eclipse.emf.ecore.EPackage", genPackage)));
JvmOperation validateOperation = createJvmOperation(genPackage, JvmVisibility.PROTECTED, false, "validate", getJvmTypeReference("boolean", genPackage));
EList<JvmFormalParameter> parameters = validateOperation.getParameters();
parameters.add(createJvmFormalParameter(genPackage, "classifierID", getJvmTypeReference("int", genPackage)));
parameters.add(createJvmFormalParameter(genPackage, "value", getJvmTypeReference("java.lang.Object", genPackage)));
parameters.add(createJvmFormalParameter(genPackage, "diagnostics", getJvmTypeReference("org.eclipse.emf.common.util.DiagnosticChain", genPackage)));
parameters.add(createJvmFormalParameter(genPackage, "context", getJvmTypeReference(map, genPackage)));
members.add(validateOperation);
for (final GenClassifier genClassifier : genPackage.getGenClassifiers())
{
final String diagnostics = "diagnostics".equals(genClassifier.getSafeUncapName()) ? "theDiagnostics" : "diagnostics";
final String context = "context".equals(genClassifier.getSafeUncapName()) ? "theContext" : "context";
JvmElementInferrer<JvmOperation> validateClassifierOperationInferrer =
new JvmElementInferrer<JvmOperation>(X_MEDIUM)
{
@Override
protected JvmOperation inferStructure()
{
JvmOperation validateClassifierOperation = createJvmOperation(genPackage, JvmVisibility.PUBLIC, false, getJvmTypeReference("boolean", genPackage));
EList<JvmFormalParameter> parameters = validateClassifierOperation.getParameters();
JvmElementInferrer<JvmFormalParameter> classifierParameterInferrer =
new JvmElementInferrer<JvmFormalParameter>(X_LOW)
{
@Override
protected JvmFormalParameter inferStructure()
{
return createJvmFormalParameter(genPackage, getJvmTypeReference(genClassifier.getImportedWildcardInstanceClassName(), genPackage));
}
@Override
public void inferName()
{
inferredElement.setName(genClassifier.getSafeUncapName());
}
};
associate(genClassifier, classifierParameterInferrer);
parameters.add(classifierParameterInferrer.getInferredElement());
parameters.add(createJvmFormalParameter(genPackage, diagnostics, getJvmTypeReference("org.eclipse.emf.common.util.DiagnosticChain", genPackage)));
parameters.add(createJvmFormalParameter(genPackage, context, getJvmTypeReference(map, genPackage)));
return validateClassifierOperation;
}
@Override
public void inferName()
{
inferredElement.setSimpleName("validate" + genClassifier.getName());
}
};
associate(genClassifier, validateClassifierOperationInferrer);
members.add(validateClassifierOperationInferrer.getInferredElement());
for (final String constraint : genClassifier.getGenConstraints())
{
if (genClassifier instanceof GenDataType)
{
final GenDataType genDataType = (GenDataType)genClassifier;
if (constraint.equals("Min") && genDataType.getMinLiteral() != null || constraint.equals("Max") && genDataType.getMaxLiteral() != null)
{
JvmElementInferrer<JvmField> valueInferrer =
new JvmElementInferrer<JvmField>(X_VERY_LOW)
{
@Override
protected JvmField inferStructure()
{
return createJvmField(genPackage, JvmVisibility.PUBLIC, true, true, getJvmTypeReference(genDataType.getImportedInstanceClassName(), genPackage));
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genClassifier.getClassifierID() + "__" + CodeGenUtil.format(constraint, '_', null, false, false).toUpperCase(genClassifier.getGenModel().getLocale()) + "__VALUE");
}
};
associate(genClassifier, valueInferrer);
members.add(valueInferrer.getInferredElement());
}
else if (constraint.equals("TotalDigits") && genDataType.getTotalDigits() != -1 && !"java.math.BigDecimal".equals(genDataType.getQualifiedInstanceClassName()))
{
JvmElementInferrer<JvmField> upperBoundInferrer =
new JvmElementInferrer<JvmField>(X_VERY_LOW)
{
@Override
protected JvmField inferStructure()
{
return createJvmField(genPackage, JvmVisibility.PUBLIC, true, true, getJvmTypeReference(genDataType.getImportedInstanceClassName(), genPackage));
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genClassifier.getClassifierID() + "__" + CodeGenUtil.format(constraint, '_', null, false, false).toUpperCase(genClassifier.getGenModel().getLocale()) + "__UPPER_BOUND");
}
};
associate(genClassifier, upperBoundInferrer);
members.add(upperBoundInferrer.getInferredElement());
JvmElementInferrer<JvmField> lowerBoundInferrer =
new JvmElementInferrer<JvmField>(X_VERY_LOW)
{
@Override
protected JvmField inferStructure()
{
return createJvmField(genPackage, JvmVisibility.PUBLIC, true, true, getJvmTypeReference(genDataType.getImportedInstanceClassName(), genPackage));
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genClassifier.getClassifierID() + "__" + CodeGenUtil.format(constraint, '_', null, false, false).toUpperCase(genClassifier.getGenModel().getLocale()) + "__LOWER_BOUND");
}
};
associate(genClassifier, lowerBoundInferrer);
members.add(lowerBoundInferrer.getInferredElement());
}
else if (constraint.equals("Pattern") && !genDataType.getPatterns().isEmpty())
{
JvmElementInferrer<JvmField> valuesInferrer =
new JvmElementInferrer<JvmField>(X_VERY_LOW)
{
@Override
protected JvmField inferStructure()
{
return createJvmField(genPackage, JvmVisibility.PUBLIC, true, true, getJvmTypeReference("org.eclipse.emf.ecore.EValidator$PatternMatcher", genPackage));
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genClassifier.getClassifierID() + "__" + CodeGenUtil.format(constraint, '_', null, false, false).toUpperCase(genClassifier.getGenModel().getLocale()) + "__VALUES");
}
};
associate(genClassifier, valuesInferrer);
members.add(valuesInferrer.getInferredElement());
}
else if (constraint.equals("Enumeration") && !genDataType.getEnumerationLiterals().isEmpty())
{
JvmElementInferrer<JvmField> valueInferrer =
new JvmElementInferrer<JvmField>(X_VERY_LOW)
{
@Override
protected JvmField inferStructure()
{
return createJvmField(genPackage, JvmVisibility.PUBLIC, true, true, getJvmTypeReference(genModel.useGenerics() ? "java.util.Collection<java.lang.Object>" : "java.util.Collection", genPackage));
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genClassifier.getClassifierID() + "__" + CodeGenUtil.format(constraint, '_', null, false, false).toUpperCase(genClassifier.getGenModel().getLocale()) + "__VALUES");
}
};
associate(genClassifier, valueInferrer);
members.add(valueInferrer.getInferredElement());
}
if (genClassifier.hasConstraintExpression(constraint))
{
JvmElementInferrer<JvmField> expressionInferrer =
new JvmElementInferrer<JvmField>(X_VERY_LOW)
{
@Override
protected JvmField inferStructure()
{
return createJvmField(genPackage, JvmVisibility.PUBLIC, true, true, getJvmTypeReference(genModel.useGenerics() ? "java.util.Collection<java.lang.Object>" : "java.util.Collection", genPackage));
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genClassifier.getClassifierID() + "__" + CodeGenUtil.upperName(constraint) + "__EEXPRESSION");
}
};
associate(genClassifier, expressionInferrer);
members.add(expressionInferrer.getInferredElement());
}
}
final GenOperation genOperation = (genClassifier instanceof GenClass) ? ((GenClass)genClassifier).getInvariantOperation(constraint) : null;
JvmElementInferrer<JvmOperation> validateConstraintInferrer =
new JvmElementInferrer<JvmOperation>(X_LOW)
{
@Override
protected JvmOperation inferStructure()
{
JvmOperation validateConstraintOperation = createJvmOperation(genPackage, JvmVisibility.PUBLIC, false, getJvmTypeReference("boolean", genPackage));
EList<JvmFormalParameter> parameters = validateConstraintOperation.getParameters();
JvmElementInferrer<JvmFormalParameter> classifierParameterInferrer =
new JvmElementInferrer<JvmFormalParameter>(X_VERY_LOW)
{
@Override
protected JvmFormalParameter inferStructure()
{
return createJvmFormalParameter(genPackage, getJvmTypeReference(genClassifier.getImportedWildcardInstanceClassName(), genPackage));
}
@Override
public void inferName()
{
inferredElement.setName(genClassifier.getSafeUncapName());
}
};
associate(genClassifier, classifierParameterInferrer);
parameters.add(classifierParameterInferrer.getInferredElement());
parameters.add(createJvmFormalParameter(genPackage, diagnostics, getJvmTypeReference("org.eclipse.emf.common.util.DiagnosticChain", genPackage)));
parameters.add(createJvmFormalParameter(genPackage, context, getJvmTypeReference(map, genPackage)));
return validateConstraintOperation;
}
@Override
public void inferName()
{
inferredElement.setSimpleName("validate" + genClassifier.getName() + "_" + (genOperation == null ? constraint : genOperation.getName()));
}
};
associate(genClassifier, validateConstraintInferrer);
if (genOperation != null)
{
associate(genOperation, validateConstraintInferrer);
}
members.add(validateConstraintInferrer.getInferredElement());
}
}
if (genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF24_VALUE)
{
members.add(createJvmOperation(genPackage, JvmVisibility.PUBLIC, false, "getResourceLocator", getJvmTypeReference("org.eclipse.emf.common.util.ResourceLocator", genPackage)));
}
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genPackage.getValidatorClassName());
inferredElement.setPackageName(genPackage.getUtilitiesPackageName());
}
};
associate(genPackage, validatorClassInferrer);
result.add(validatorClassInferrer.getInferredElement());
}
if (genPackage.hasClassifiers() && genPackage.isAdapterFactory() && !genPackage.getGenClasses().isEmpty())
{
JvmElementInferrer<JvmGenericType> adapterFactoryClassInferrer =
new JvmElementInferrer<JvmGenericType>(X_MEDIUM)
{
@Override
protected JvmGenericType inferStructure()
{
JvmGenericType adapterFactoryClass = TypesFactory.eINSTANCE.createJvmGenericType();
adapterFactoryClass.setInterface(false);
adapterFactoryClass.setVisibility(JvmVisibility.PUBLIC);
return adapterFactoryClass;
}
@Override
protected void inferDeepStructure()
{
for (GenClassifier genClassifier : genPackage.getGenClassifiers())
{
if (genClassifier instanceof GenClass)
{
final GenClass genClass = (GenClass)genClassifier;
if (!genClass.isAbstract())
{
JvmElementInferrer<JvmOperation> createMethodInferrer =
new JvmElementInferrer<JvmOperation>(X_MEDIUM)
{
@Override
protected JvmOperation inferStructure()
{
JvmOperation jvmOperation = TypesFactory.eINSTANCE.createJvmOperation();
jvmOperation.setVisibility(JvmVisibility.PUBLIC);
jvmOperation.setReturnType(getJvmTypeReference("org.eclipse.emf.common.notify.Adapter", genClass));
return jvmOperation;
}
@Override
public void inferName()
{
inferredElement.setSimpleName("create" + genClass.getName() + "Adapter");
}
};
associate(genClass, createMethodInferrer);
inferredElement.getMembers().add(createMethodInferrer.getInferredElement());
}
}
}
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genPackage.getAdapterFactoryClassName());
inferredElement.setPackageName(genPackage.getUtilitiesPackageName());
}
};
associate(genPackage, adapterFactoryClassInferrer);
result.add(adapterFactoryClassInferrer.getInferredElement());
}
if (genPackage.getGenModel().canGenerateEdit() && !genPackage.getGenClasses().isEmpty())
{
JvmElementInferrer<JvmGenericType> itemProviderAdapterFactoryClassInferrer =
new JvmElementInferrer<JvmGenericType>(X_MEDIUM)
{
@Override
protected JvmGenericType inferStructure()
{
JvmGenericType itemProviderAdapterFactoryClass = TypesFactory.eINSTANCE.createJvmGenericType();
itemProviderAdapterFactoryClass.setInterface(false);
itemProviderAdapterFactoryClass.setVisibility(JvmVisibility.PUBLIC);
return itemProviderAdapterFactoryClass;
}
@Override
protected void inferDeepStructure()
{
EList<JvmMember> members = inferredElement.getMembers();
for (GenClassifier genClassifier : genPackage.getGenClassifiers())
{
if (genClassifier instanceof GenClass)
{
final GenClass genClass = (GenClass)genClassifier;
if (!genClass.isAbstract() && genClass.getProvider() != GenProviderKind.NONE_LITERAL)
{
if (genClass.isProviderSingleton())
{
JvmElementInferrer<JvmField> fieldInferrer =
new JvmElementInferrer<JvmField>(X_VERY_LOW)
{
@Override
protected JvmField inferStructure()
{
JvmField jvmField = TypesFactory.eINSTANCE.createJvmField();
jvmField.setVisibility(JvmVisibility.PROTECTED);
jvmField.setType(getJvmTypeReference(genClass.getQualifiedProviderClassName(), genClass));
return jvmField;
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genClass.getUncapName() + "ItemProvider");
}
};
associate(genClass, fieldInferrer);
members.add(fieldInferrer.getInferredElement());
}
JvmElementInferrer<JvmOperation> createMethodInferrer =
new JvmElementInferrer<JvmOperation>(X_LOW)
{
@Override
protected JvmOperation inferStructure()
{
JvmOperation jvmOperation = TypesFactory.eINSTANCE.createJvmOperation();
jvmOperation.setVisibility(JvmVisibility.PUBLIC);
jvmOperation.setReturnType(getJvmTypeReference("org.eclipse.emf.common.notify.Adapter", genClass));
return jvmOperation;
}
@Override
public void inferName()
{
inferredElement.setSimpleName("create" + genClass.getName() + "Adapter");
}
};
associate(genClass, createMethodInferrer);
members.add(createMethodInferrer.getInferredElement());
}
}
}
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genPackage.getItemProviderAdapterFactoryClassName());
inferredElement.setPackageName(genPackage.getProviderPackageName());
}
};
associate(genPackage, itemProviderAdapterFactoryClassInferrer);
result.add(itemProviderAdapterFactoryClassInferrer.getInferredElement());
for (GenClassifier genClassifier : genPackage.getGenClassifiers())
{
if (genClassifier instanceof GenClass)
{
final GenClass genClass = (GenClass)genClassifier;
if (!genClass.isAbstract() && genClass.getProvider() != GenProviderKind.NONE_LITERAL)
{
JvmElementInferrer<JvmGenericType> itemProviderClassInferrer =
new JvmElementInferrer<JvmGenericType>(X_MEDIUM)
{
@Override
protected JvmGenericType inferStructure()
{
JvmGenericType itemProviderClass = TypesFactory.eINSTANCE.createJvmGenericType();
itemProviderClass.setInterface(false);
itemProviderClass.setVisibility(JvmVisibility.PUBLIC);
return itemProviderClass;
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genClass.getProviderClassName());
inferredElement.setPackageName(genPackage.getProviderPackageName());
}
};
associate(genClass, itemProviderClassInferrer);
result.add(itemProviderClassInferrer.getInferredElement());
}
}
}
}
if (genPackage.canGenerateTests() && genPackage.hasClassifiers())
{
JvmElementInferrer<JvmGenericType> testSuiteClassInferrer =
new JvmElementInferrer<JvmGenericType>(X_LOW)
{
@Override
protected JvmGenericType inferStructure()
{
JvmGenericType adapterFactoryClass = TypesFactory.eINSTANCE.createJvmGenericType();
adapterFactoryClass.setInterface(false);
adapterFactoryClass.setVisibility(JvmVisibility.PUBLIC);
return adapterFactoryClass;
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genPackage.getTestSuiteClassName());
inferredElement.setPackageName(genPackage.getTestsPackageName());
}
};
associate(genPackage, testSuiteClassInferrer);
result.add(testSuiteClassInferrer.getInferredElement());
for (GenClassifier genClassifier : genPackage.getGenClassifiers())
{
if (genClassifier instanceof GenClass)
{
final GenClass genClass = (GenClass)genClassifier;
JvmElementInferrer<JvmGenericType> testCaseClassInferrer =
new JvmElementInferrer<JvmGenericType>(X_VERY_LOW)
{
@Override
protected JvmGenericType inferStructure()
{
JvmGenericType testCaseClass = TypesFactory.eINSTANCE.createJvmGenericType();
testCaseClass.setInterface(false);
testCaseClass.setVisibility(JvmVisibility.PUBLIC);
return testCaseClass;
}
@Override
protected void inferDeepStructure()
{
EList<JvmMember> members = inferredElement.getMembers();
for (final GenOperation genOperation : genClass.getImplementedGenOperations())
{
JvmElementInferrer<JvmOperation> operationTestInferrer =
new JvmElementInferrer<JvmOperation>(X_VERY_LOW)
{
@Override
protected JvmOperation inferStructure()
{
JvmOperation jvmOperation = createJvmOperation(genOperation, JvmVisibility.PUBLIC, false, getJvmTypeReference("void", genOperation));
return jvmOperation;
}
protected boolean rename = false;
@Override
public void inferName()
{
if (rename)
{
genClass.clearCache();
}
else
{
rename = true;
}
inferredElement.setSimpleName("test" + genClass.getUniqueName(genOperation));
}
};
associate(genOperation, operationTestInferrer);
for (GenParameter genParameter : genOperation.getGenParameters())
{
associate(genParameter.getTypeGenClassifier(), operationTestInferrer);
}
members.add(operationTestInferrer.getInferredElement());
}
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genClass.getTestCaseClassName());
inferredElement.setPackageName(genPackage.getTestsPackageName());
}
};
associate(genClass, testCaseClassInferrer);
result.add(testCaseClassInferrer.getInferredElement());
}
}
}
for (GenClassifier genClassifier : genPackage.getGenClassifiers())
{
result.addAll(getDeclaredTypes(genClassifier));
}
return result;
}
protected JvmGenericType getFactory(final GenPackage genPackage, final boolean isInterface, final boolean isImplementation)
{
JvmElementInferrer<JvmGenericType> factoryClassInferrer =
new JvmElementInferrer<JvmGenericType>(isInterface ? X_VERY_HIGH : X_HIGH)
{
@Override
protected JvmGenericType inferStructure()
{
JvmGenericType factoryClass = TypesFactory.eINSTANCE.createJvmGenericType();
factoryClass.setInterface(!isImplementation);
factoryClass.setVisibility(JvmVisibility.PUBLIC);
return factoryClass;
}
@Override
protected void inferDeepStructure()
{
GenModel genModel = genPackage.getGenModel();
EList<JvmTypeReference> superTypes = inferredElement.getSuperTypes();
if (isImplementation)
{
superTypes.add(getJvmTypeReference("org.eclipse.emf.ecore.impl.EFactoryImpl", genPackage));
if (!genModel.isSuppressInterfaces())
{
superTypes.add(getJvmTypeReference(genPackage.getQualifiedFactoryInterfaceName(), genPackage));
}
}
else if (!genModel.isSuppressEMFMetaData())
{
superTypes.add(getJvmTypeReference("org.eclipse.emf.ecore.EFactory", genPackage));
}
EList<JvmMember> members = inferredElement.getMembers();
if (isImplementation && (genModel.isSuppressEMFMetaData() || genModel.isSuppressInterfaces()))
{
members.add(createJvmField(genPackage, JvmVisibility.PUBLIC, true, "INSTANCE", getJvmTypeReference(genPackage.getQualifiedFactoryClassName(), genPackage)));
}
if (isInterface)
{
if (genModel.isSuppressEMFMetaData())
{
members.add(createJvmField(genPackage, JvmVisibility.PUBLIC, true, "INSTANCE", getJvmTypeReference(genPackage.getQualifiedFactoryInterfaceName(), genPackage)));
}
else if (!genModel.isSuppressInterfaces())
{
members.add(createJvmField(genPackage, JvmVisibility.PUBLIC, true, "eINSTANCE", getJvmTypeReference(genPackage.getQualifiedFactoryInterfaceName(), genPackage)));
}
}
boolean isDataTypeConverters = genPackage.isDataTypeConverters();
for (GenClassifier genClassifier : genPackage.getGenClassifiers())
{
if (genClassifier instanceof GenDataType)
{
final GenDataType genDataType = (GenDataType)genClassifier;
// During prelinking inference, the instance class name won't be set.
//
if (genDataType.isSerializable() && genDataType.getRawInstanceClassName() != null)
{
if (isDataTypeConverters || isImplementation)
{
final XDataType xDataType = mapper.getXDataType(genClassifier);
final XBlockExpression createBody = xDataType.getCreateBody();
final XDataTypeMapping mapping = mapper.getMapping(xDataType);
if (createBody != null || isDataTypeConverters)
{
JvmElementInferrer<JvmOperation> createMethodInferrer =
new JvmElementInferrer<JvmOperation>(isInterface ? X_VERY_HIGH : X_HIGH)
{
@Override
protected JvmOperation inferStructure()
{
JvmOperation jvmOperation = createJvmOperation(genPackage,JvmVisibility.PUBLIC, false, getJvmTypeReference(genDataType.getImportedParameterizedInstanceClassName(), genDataType));
JvmFormalParameter jvmFormalParameter = createJvmFormalParameter(genPackage, createBody == null ? "literal" : "it", getJvmTypeReference("java.lang.String", genPackage));
jvmOperation.getParameters().add(jvmFormalParameter);
mapping.setCreator(jvmOperation);
return jvmOperation;
}
@Override
public void inferName()
{
inferredElement.setSimpleName("create" + genDataType.getName());
}
};
associate(genDataType, createMethodInferrer);
members.add(createMethodInferrer.getInferredElement());
}
if (isImplementation)
{
JvmElementInferrer<JvmOperation> genericCreateMethodInferrer =
new JvmElementInferrer<JvmOperation>(X_MEDIUM)
{
@Override
protected JvmOperation inferStructure()
{
JvmOperation jvmOperation = createJvmOperation(genPackage,JvmVisibility.PUBLIC, false, getJvmTypeReference(genDataType.getImportedParameterizedObjectInstanceClassName(), genDataType));
EList<JvmFormalParameter> parameters = jvmOperation.getParameters();
parameters.add(createJvmFormalParameter(genPackage, "eDataType", getJvmTypeReference("org.eclipse.emf.ecore.EDataType", genPackage)));
parameters.add(createJvmFormalParameter(genPackage, "initialValue", getJvmTypeReference("java.lang.String", genPackage)));
return jvmOperation;
}
@Override
public void inferName()
{
inferredElement.setSimpleName("create" + genDataType.getName() + "FromString");
}
};
associate(genDataType, genericCreateMethodInferrer);
members.add(genericCreateMethodInferrer.getInferredElement());
}
final XBlockExpression convertBody = xDataType.getConvertBody();
if (convertBody != null || isDataTypeConverters)
{
JvmElementInferrer<JvmOperation> convertMethodInferrer =
new JvmElementInferrer<JvmOperation>(isInterface ? X_VERY_HIGH: X_HIGH)
{
@Override
protected JvmOperation inferStructure()
{
JvmOperation jvmOperation = createJvmOperation(genPackage,JvmVisibility.PUBLIC, false, getJvmTypeReference("java.lang.String", genPackage));
JvmFormalParameter jvmFormalParameter = createJvmFormalParameter(genPackage, convertBody == null ? "instanceValue" : "it", getJvmTypeReference(genDataType.getImportedBoundedWildcardInstanceClassName(), genDataType));
jvmOperation.getParameters().add(jvmFormalParameter);
XDataTypeMapping mapping = mapper.getMapping(xDataType);
mapping.setConverter(jvmOperation);
return jvmOperation;
}
@Override
public void inferName()
{
inferredElement.setSimpleName("convert" + genDataType.getName());
}
};
associate(genDataType, convertMethodInferrer);
members.add(convertMethodInferrer.getInferredElement());
}
if (isImplementation)
{
JvmElementInferrer<JvmOperation> convertMethodInferrer =
new JvmElementInferrer<JvmOperation>(X_MEDIUM)
{
@Override
protected JvmOperation inferStructure()
{
JvmOperation jvmOperation = createJvmOperation(genPackage,JvmVisibility.PUBLIC, false, getJvmTypeReference("java.lang.String", genPackage));
EList<JvmFormalParameter> parameters = jvmOperation.getParameters();
parameters.add(createJvmFormalParameter(genPackage, "eDataType", getJvmTypeReference("org.eclipse.emf.ecore.EDataType", genPackage)));
parameters.add(createJvmFormalParameter(genPackage, "instanceValue", getJvmTypeReference("java.lang.Object", genPackage)));
return jvmOperation;
}
@Override
public void inferName()
{
inferredElement.setSimpleName("convert" + genDataType.getName() + "ToString");
}
};
associate(genDataType, convertMethodInferrer);
members.add(convertMethodInferrer.getInferredElement());
}
}
}
}
else
{
final GenClass genClass = (GenClass)genClassifier;
if (!genClass.isAbstract())
{
if (isImplementation || genClass.hasFactoryInterfaceCreateMethod())
{
JvmElementInferrer<JvmOperation> createMethodInferrer =
new JvmElementInferrer<JvmOperation>(isInterface ? X_HIGH : X_LOW)
{
@Override
protected JvmOperation inferStructure()
{
JvmOperation jvmOperation = TypesFactory.eINSTANCE.createJvmOperation();
jvmOperation.setVisibility(JvmVisibility.PUBLIC);
jvmOperation.setReturnType(getJvmTypeReference(genClass.getQualifiedInterfaceName() + genClass.getInterfaceTypeArguments(), genClass));
populateTypeParameters(null, genClass.getGenTypeParameters(), jvmOperation.getTypeParameters());
return jvmOperation;
}
@Override
public void inferName()
{
inferredElement.setSimpleName("create" + genClass.getName());
}
};
associate(genClass, createMethodInferrer);
members.add(createMethodInferrer.getInferredElement());
}
}
}
}
}
@Override
public void inferName()
{
if (isImplementation)
{
inferredElement.setSimpleName(genPackage.getFactoryClassName());
inferredElement.setPackageName(genPackage.getReflectionClassPackageName());
}
else
{
inferredElement.setSimpleName(genPackage.getFactoryInterfaceName());
inferredElement.setPackageName(genPackage.getReflectionPackageName());
}
}
};
associate(genPackage, factoryClassInferrer);
return factoryClassInferrer.getInferredElement();
}
protected JvmGenericType getPackage(final GenPackage genPackage, final boolean isInterface, final boolean isImplementation)
{
JvmElementInferrer<JvmGenericType> packageClassInferrer =
new JvmElementInferrer<JvmGenericType>(X_HIGH)
{
JvmElementInferrer<JvmGenericType> packageLiteralsInterfaceInferrer;
@Override
protected JvmGenericType inferStructure()
{
JvmGenericType packageClass = TypesFactory.eINSTANCE.createJvmGenericType();
packageClass.setInterface(!isImplementation);
packageClass.setVisibility(JvmVisibility.PUBLIC);
if (isInterface && genPackage.isLiteralsInterface())
{
packageLiteralsInterfaceInferrer =
new JvmElementInferrer<JvmGenericType>(X_LOW)
{
@Override
protected JvmGenericType inferStructure()
{
JvmGenericType packageLiteralsInterface = TypesFactory.eINSTANCE.createJvmGenericType();
packageLiteralsInterface.setInterface(true);
packageLiteralsInterface.setVisibility(JvmVisibility.PUBLIC);
return packageLiteralsInterface;
}
@Override
protected void inferDeepStructure()
{
for (final GenClassifier genClassifier : genPackage.getOrderedGenClassifiers())
{
JvmElementInferrer<JvmField> classifierFieldInferrer =
new JvmElementInferrer<JvmField>(X_MEDIUM)
{
@Override
protected JvmField inferStructure()
{
return createJvmField(genClassifier, JvmVisibility.PUBLIC, true, getJvmTypeReference(genClassifier.getImportedMetaType(), genClassifier));
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genPackage.getClassifierID(genClassifier));
}
};
associate(genClassifier, classifierFieldInferrer);
EList<JvmMember> members = inferredElement.getMembers();
members.add(classifierFieldInferrer.getInferredElement());
if (genClassifier instanceof GenClass)
{
final GenClass genClass = (GenClass)genClassifier;
for (final GenFeature genFeature : genClass.getGenFeatures())
{
JvmElementInferrer<JvmField> featureFieldInferrer =
new JvmElementInferrer<JvmField>(X_MEDIUM)
{
@Override
protected JvmField inferStructure()
{
return createJvmField(genClassifier, JvmVisibility.PUBLIC, true, getJvmTypeReference(genFeature.getImportedMetaType(), genClassifier));
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genClass.getFeatureID(genFeature));
}
};
associate(genFeature, featureFieldInferrer);
associate(genClass, featureFieldInferrer);
members.add(featureFieldInferrer.getInferredElement());
}
if (genPackage.getGenModel().isOperationReflection())
{
for (final GenOperation genOperation : genClass.getGenOperations())
{
JvmElementInferrer<JvmField> operationFieldInferrer =
new JvmElementInferrer<JvmField>(X_LOW)
{
@Override
protected JvmField inferStructure()
{
return createJvmField(genClassifier, JvmVisibility.PUBLIC, true, getJvmTypeReference(genOperation.getImportedMetaType(), genClassifier));
}
protected boolean rename = false;
@Override
public void inferName()
{
if (rename)
{
genClass.clearCache();
}
else
{
rename = true;
}
inferredElement.setSimpleName(genClass.getOperationID(genOperation, false));
}
};
associate(genOperation, operationFieldInferrer);
associate(genClass, operationFieldInferrer);
for (GenParameter genParameter : genOperation.getGenParameters())
{
associate(genParameter.getTypeGenClassifier(), operationFieldInferrer);
}
members.add(operationFieldInferrer.getInferredElement());
}
}
}
}
}
@Override
public void inferName()
{
inferredElement.setSimpleName("Literals");
}
};
packageClass.getMembers().add(packageLiteralsInterfaceInferrer.getInferredElement());
}
return packageClass;
}
@Override
protected void inferDeepStructure()
{
EList<JvmTypeReference> superTypes = inferredElement.getSuperTypes();
if (isImplementation)
{
superTypes.add(getJvmTypeReference("org.eclipse.emf.ecore.impl.EPackageImpl", genPackage));
superTypes.add(getJvmTypeReference(genPackage.getQualifiedPackageInterfaceName(), genPackage));
}
else
{
superTypes.add(getJvmTypeReference("org.eclipse.emf.ecore.EPackage", genPackage));
}
EList<JvmMember> members = inferredElement.getMembers();
if (isInterface)
{
members.add(createJvmField(genPackage, JvmVisibility.PUBLIC, true, "eNS_URI", getJvmTypeReference("java.lang.String", genPackage)));
members.add(createJvmField(genPackage, JvmVisibility.PUBLIC, true, "eNAME", getJvmTypeReference("java.lang.String", genPackage)));
members.add(createJvmField(genPackage, JvmVisibility.PUBLIC, true, "eNS_PREFIX", getJvmTypeReference("java.lang.String", genPackage)));
if (genPackage.isContentType())
{
members.add(createJvmField(genPackage, JvmVisibility.PUBLIC, true, "eCONTENT_TYPE", getJvmTypeReference("java.lang.String", genPackage)));
}
members.add(createJvmField(genPackage, JvmVisibility.PUBLIC, true, "eINSTANCE", getJvmTypeReference(genPackage.getQualifiedPackageInterfaceName(), genPackage)));
}
for (final GenClassifier genClassifier : genPackage.getOrderedGenClassifiers())
{
if (isInterface)
{
JvmElementInferrer<JvmField> classifierFieldInferrer =
new JvmElementInferrer<JvmField>(X_LOW)
{
@Override
protected JvmField inferStructure()
{
return createJvmField(genClassifier, JvmVisibility.PUBLIC, true, getJvmTypeReference("int", genClassifier));
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genPackage.getClassifierID(genClassifier));
}
};
associate(genClassifier, classifierFieldInferrer);
members.add(classifierFieldInferrer.getInferredElement());
}
if (genClassifier instanceof GenClass)
{
final GenClass genClass = (GenClass)genClassifier;
if (isInterface)
{
JvmElementInferrer<JvmField> featureCountFieldInferrer =
new JvmElementInferrer<JvmField>(X_VERY_LOW)
{
@Override
protected JvmField inferStructure()
{
return createJvmField(genClassifier, JvmVisibility.PUBLIC, true, getJvmTypeReference("int", genClassifier));
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genClass.getFeatureCountID());
}
};
associate(genClass, featureCountFieldInferrer);
members.add(featureCountFieldInferrer.getInferredElement());
for (final GenFeature genFeature : genClass.getAllGenFeatures())
{
JvmElementInferrer<JvmField> featureFieldInferrer =
new JvmElementInferrer<JvmField>(X_LOW)
{
@Override
protected JvmField inferStructure()
{
return createJvmField(genClassifier, JvmVisibility.PUBLIC, true, getJvmTypeReference("int", genClassifier));
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genClass.getFeatureID(genFeature));
}
};
associate(genFeature, featureFieldInferrer);
associate(genClass, featureFieldInferrer);
members.add(featureFieldInferrer.getInferredElement());
}
for (final GenFeature genFeature : genClass.getGenFeatures())
{
JvmElementInferrer<JvmOperation> featureAccessorInferrer =
new JvmElementInferrer<JvmOperation>(X_VERY_LOW)
{
@Override
protected JvmOperation inferStructure()
{
JvmOperation featureAccessor = createJvmOperation(genFeature, JvmVisibility.PUBLIC, false, getJvmTypeReference(genFeature.getImportedMetaType(), genFeature));
return featureAccessor;
}
@Override
public void inferName()
{
inferredElement.setSimpleName("get" + genFeature.getFeatureAccessorName());
}
};
associate(genFeature, featureAccessorInferrer);
associate(genClass, featureAccessorInferrer);
members.add(featureAccessorInferrer.getInferredElement());
}
}
if (isInterface && genPackage.getGenModel().isOperationReflection())
{
JvmElementInferrer<JvmField> operationCountFieldInferrer =
new JvmElementInferrer<JvmField>(X_VERY_LOW)
{
@Override
protected JvmField inferStructure()
{
return createJvmField(genClassifier, JvmVisibility.PUBLIC, true, getJvmTypeReference("int", genClassifier));
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genClass.getOperationCountID());
}
};
associate(genClass, operationCountFieldInferrer);
members.add(operationCountFieldInferrer.getInferredElement());
for (final GenOperation genOperation : genClass.getAllGenOperations(false))
{
if (genClass.getOverrideGenOperation(genOperation) == null)
{
JvmElementInferrer<JvmField> operationFieldInferrer =
new JvmElementInferrer<JvmField>(X_LOW)
{
@Override
protected JvmField inferStructure()
{
return createJvmField(genClassifier, JvmVisibility.PUBLIC, true, getJvmTypeReference("int", genClassifier));
}
protected boolean rename = false;
@Override
public void inferName()
{
if (rename)
{
genClass.clearCache();
}
else
{
rename = true;
}
inferredElement.setSimpleName(genClass.getOperationID(genOperation, false));
}
};
associate(genOperation, operationFieldInferrer);
associate(genClass, operationFieldInferrer);
for (GenParameter genParameter : genOperation.getGenParameters())
{
associate(genParameter.getTypeGenClassifier(), operationFieldInferrer);
}
members.add(operationFieldInferrer.getInferredElement());
JvmElementInferrer<JvmOperation> operationAccessorInferrer =
new JvmElementInferrer<JvmOperation>(X_VERY_LOW)
{
@Override
protected JvmOperation inferStructure()
{
JvmOperation featureAccessor = createJvmOperation(genClass, JvmVisibility.PUBLIC, false, getJvmTypeReference(genOperation.getImportedMetaType(), genClass));
return featureAccessor;
}
protected boolean rename = false;
@Override
public void inferName()
{
if (rename)
{
genClass.clearCache();
}
else
{
rename = true;
}
inferredElement.setSimpleName("get" + genOperation.getOperationAccessorName());
}
};
associate(genOperation, operationAccessorInferrer);
associate(genClass, operationAccessorInferrer);
for (GenParameter genParameter : genOperation.getGenParameters())
{
associate(genParameter.getTypeGenClassifier(), operationAccessorInferrer);
}
members.add(operationAccessorInferrer.getInferredElement());
}
}
}
}
JvmElementInferrer<JvmOperation> classifierAccessorInferrer =
new JvmElementInferrer<JvmOperation>(X_VERY_LOW)
{
@Override
protected JvmOperation inferStructure()
{
return createJvmOperation(genClassifier, JvmVisibility.PUBLIC, false, getJvmTypeReference(genClassifier.getImportedMetaType(), genClassifier));
}
@Override
public void inferName()
{
inferredElement.setSimpleName("get" + genClassifier.getClassifierAccessorName());
}
};
associate(genClassifier, classifierAccessorInferrer);
members.add(classifierAccessorInferrer.getInferredElement());
}
if (packageLiteralsInterfaceInferrer != null)
{
packageLiteralsInterfaceInferrer.inferDeepStructure();
}
}
@Override
public void inferName()
{
if (isImplementation)
{
inferredElement.setSimpleName(genPackage.getPackageClassName());
inferredElement.setPackageName(genPackage.getReflectionClassPackageName());
}
else
{
inferredElement.setSimpleName(genPackage.getPackageInterfaceName());
inferredElement.setPackageName(genPackage.getReflectionPackageName());
}
}
};
associate(genPackage, packageClassInferrer);
JvmGenericType packageClass = packageClassInferrer.getInferredElement();
return packageClass;
}
protected List<? extends JvmDeclaredType> getDeclaredTypes(GenClassifier genClassifier)
{
ArrayList<JvmDeclaredType> result = new ArrayList<JvmDeclaredType>();
if (genClassifier instanceof GenClass)
{
result.addAll(getDeclaredTypes((GenClass)genClassifier));
}
else if (genClassifier instanceof GenEnum)
{
result.add(getDeclaredType((GenEnum)genClassifier));
}
return result;
}
protected JvmDeclaredType getDeclaredType(final GenEnum genEnum)
{
if (genEnum.getGenModel().useGenerics())
{
JvmElementInferrer<JvmEnumerationType> enumTypeInferrer =
new JvmElementInferrer<JvmEnumerationType>(X_VERY_HIGH)
{
@Override
protected JvmEnumerationType inferStructure()
{
final JvmEnumerationType jvmEnumerationType = TypesFactory.eINSTANCE.createJvmEnumerationType();
jvmEnumerationType.getSuperTypes().add(getJvmTypeReference("java.lang.Enum<" + genEnum.getQualifiedInstanceClassName() + ">", genEnum));
jvmEnumerationType.getSuperTypes().add(getJvmTypeReference("org.eclipse.emf.common.util.Enumerator", genEnum));
jvmEnumerationType.setFinal(true);
jvmEnumerationType.setVisibility(JvmVisibility.PUBLIC);
final EList<JvmMember> members = jvmEnumerationType.getMembers();
{
JvmParameterizedTypeReference componentType = TypesFactory.eINSTANCE.createJvmParameterizedTypeReference();
componentType.setType(jvmEnumerationType);
JvmGenericArrayTypeReference arrayTypeReference = TypesFactory.eINSTANCE.createJvmGenericArrayTypeReference();
arrayTypeReference.setComponentType(componentType);
JvmOperation values = createJvmOperation(genEnum, JvmVisibility.PUBLIC, true, "values", arrayTypeReference);
members.add(values);
}
{
JvmParameterizedTypeReference returnType = TypesFactory.eINSTANCE.createJvmParameterizedTypeReference();
returnType.setType(jvmEnumerationType);
JvmOperation valueOf = createJvmOperation(genEnum, JvmVisibility.PUBLIC, true, "valueOf", returnType);
JvmFormalParameter param = createJvmFormalParameter(genEnum, "name", getJvmTypeReference("java.lang.String", genEnum));
valueOf.getParameters().add(param);
members.add(valueOf);
}
{
JvmParameterizedTypeReference returnType = TypesFactory.eINSTANCE.createJvmParameterizedTypeReference();
returnType.setType(jvmEnumerationType);
JvmOperation get = createJvmOperation(genEnum, JvmVisibility.PUBLIC, true, "get", returnType);
JvmFormalParameter param = createJvmFormalParameter(genEnum, "literal", getJvmTypeReference("java.lang.String", genEnum));
get.getParameters().add(param);
members.add(get);
}
{
JvmParameterizedTypeReference returnType = TypesFactory.eINSTANCE.createJvmParameterizedTypeReference();
returnType.setType(jvmEnumerationType);
JvmOperation get = createJvmOperation(genEnum, JvmVisibility.PUBLIC, true, "get", returnType);
JvmFormalParameter param = createJvmFormalParameter(genEnum, "literal", getJvmTypeReference("int", genEnum));
get.getParameters().add(param);
members.add(get);
}
{
JvmParameterizedTypeReference returnType = TypesFactory.eINSTANCE.createJvmParameterizedTypeReference();
returnType.setType(jvmEnumerationType);
JvmOperation getByName = createJvmOperation(genEnum, JvmVisibility.PUBLIC, true, "getByName", returnType);
JvmFormalParameter param = createJvmFormalParameter(genEnum, "name", getJvmTypeReference("java.lang.String", genEnum));
getByName.getParameters().add(param);
members.add(getByName);
}
{
JvmGenericArrayTypeReference fieldType = TypesFactory.eINSTANCE.createJvmGenericArrayTypeReference();
JvmParameterizedTypeReference componentType = TypesFactory.eINSTANCE.createJvmParameterizedTypeReference();
componentType.setType(jvmEnumerationType);
fieldType.setComponentType(componentType);
JvmField VALUES = createJvmField(genEnum, JvmVisibility.PUBLIC, true, true, "VALUES", fieldType);
members.add(VALUES);
}
{
JvmOperation getName = createJvmOperation(genEnum, JvmVisibility.PUBLIC, true, "getName", getJvmTypeReference("java.lang.String", genEnum));
members.add(getName);
}
{
JvmOperation getLiteral = createJvmOperation(genEnum, JvmVisibility.PUBLIC, true, "getLiteral", getJvmTypeReference("java.lang.String", genEnum));
members.add(getLiteral);
}
{
JvmOperation getValue = createJvmOperation(genEnum, JvmVisibility.PUBLIC, true, "getValue", getJvmTypeReference("int", genEnum));
members.add(getValue);
}
for (final GenEnumLiteral genEnumLiteral : genEnum.getGenEnumLiterals())
{
JvmElementInferrer<JvmEnumerationLiteral> enumLiteralInferrer =
new JvmElementInferrer<JvmEnumerationLiteral>(X_VERY_HIGH)
{
@Override
protected JvmEnumerationLiteral inferStructure()
{
JvmEnumerationLiteral jvmEnumerationLiteral = TypesFactory.eINSTANCE.createJvmEnumerationLiteral();
jvmEnumerationLiteral.setStatic(true);
jvmEnumerationLiteral.setFinal(true);
jvmEnumerationLiteral.setVisibility(JvmVisibility.PUBLIC);
JvmParameterizedTypeReference jvmParameterizedTypeReference = TypesFactory.eINSTANCE.createJvmParameterizedTypeReference();
jvmParameterizedTypeReference.setType(jvmEnumerationType);
jvmEnumerationLiteral.setType(jvmParameterizedTypeReference);
return jvmEnumerationLiteral;
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genEnumLiteral.getEnumLiteralInstanceConstantName());
}
};
associate(genEnumLiteral, enumLiteralInferrer);
members.add(enumLiteralInferrer.getInferredElement());
JvmElementInferrer<JvmField> enumLiteralValueInferrer =
new JvmElementInferrer<JvmField>(X_VERY_HIGH)
{
@Override
protected JvmField inferStructure()
{
return createJvmField(genEnumLiteral, JvmVisibility.PUBLIC, true, true, getJvmTypeReference("int", genEnumLiteral));
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genEnumLiteral.getEnumLiteralValueConstantName());
}
};
associate(genEnumLiteral, enumLiteralValueInferrer);
members.add(enumLiteralValueInferrer.getInferredElement());
}
return jvmEnumerationType;
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genEnum.getName());
inferredElement.setPackageName(genEnum.getGenPackage().getInterfacePackageName());
}
};
associate(genEnum, enumTypeInferrer);
return enumTypeInferrer.getInferredElement();
}
else
{
JvmElementInferrer<JvmGenericType> typeSafeEnumInferrer =
new JvmElementInferrer<JvmGenericType>(X_VERY_HIGH)
{
@Override
protected JvmGenericType inferStructure()
{
final JvmGenericType typeSafeEnumType = TypesFactory.eINSTANCE.createJvmGenericType();
typeSafeEnumType.getSuperTypes().add(getJvmTypeReference("org.eclipse.emf.common.util.Enumerator", genEnum));
typeSafeEnumType.setFinal(true);
typeSafeEnumType.setVisibility(JvmVisibility.PUBLIC);
final EList<JvmMember> members = typeSafeEnumType.getMembers();
for (final GenEnumLiteral genEnumLiteral : genEnum.getGenEnumLiterals())
{
JvmElementInferrer<JvmField> enumLiteralValueInferrer =
new JvmElementInferrer<JvmField>(X_VERY_HIGH)
{
@Override
protected JvmField inferStructure()
{
JvmElementInferrer<JvmField> enumLiteralInferrer =
new JvmElementInferrer<JvmField>(X_VERY_HIGH)
{
@Override
protected JvmField inferStructure()
{
JvmParameterizedTypeReference jvmParameterizedTypeReference = TypesFactory.eINSTANCE.createJvmParameterizedTypeReference();
jvmParameterizedTypeReference.setType(typeSafeEnumType);
return createJvmField(genEnum, JvmVisibility.PUBLIC, true, true, jvmParameterizedTypeReference);
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genEnumLiteral.getEnumLiteralInstanceConstantName());
}
};
associate(genEnumLiteral, enumLiteralInferrer);
members.add(enumLiteralInferrer.getInferredElement());
return createJvmField(genEnumLiteral, JvmVisibility.PUBLIC, true, true, getJvmTypeReference("int", genEnumLiteral));
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genEnumLiteral.getEnumLiteralValueConstantName());
}
};
associate(genEnumLiteral, enumLiteralValueInferrer);
members.add(enumLiteralValueInferrer.getInferredElement());
}
return typeSafeEnumType;
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genEnum.getName());
inferredElement.setPackageName(genEnum.getGenPackage().getInterfacePackageName());
}
};
associate(genEnum, typeSafeEnumInferrer);
return typeSafeEnumInferrer.getInferredElement();
}
}
protected List<? extends JvmDeclaredType> getDeclaredTypes(GenClass genClass)
{
ArrayList<JvmDeclaredType> result = new ArrayList<JvmDeclaredType>();
boolean isSuppressInterfaces = genClass.getGenModel().isSuppressInterfaces();
boolean isInterface = genClass.isInterface();
if (genClass.isExternalInterface() || !isSuppressInterfaces || isInterface)
{
// Infer the interface even for external interfaces we don't actually generate.
// They're needed to provide a context for operation bodies.
//
JvmGenericType jvmGenericType = getDeclaredType(genClass, true, false);
result.add(jvmGenericType);
}
if (!isInterface)
{
JvmGenericType jvmGenericType = getDeclaredType(genClass, isSuppressInterfaces, true);
result.add(jvmGenericType);
}
return result;
}
protected JvmGenericType getDeclaredType(final GenClass genClass, final boolean isInterface, final boolean isImplementation)
{
JvmElementInferrer<JvmGenericType> modelClassInferrer =
new JvmElementInferrer<JvmGenericType>(isInterface ? X_VERY_HIGH : X_HIGH)
{
@Override
protected JvmGenericType inferStructure()
{
JvmGenericType modelClass = TypesFactory.eINSTANCE.createJvmGenericType();
modelClass.setInterface(!isImplementation);
modelClass.setVisibility(JvmVisibility.PUBLIC);
XClassMapping mapping = mapper.getMapping(mapper.getXClass(genClass));
if (isInterface)
{
mapping.setInterfaceType(modelClass);
}
if (isImplementation)
{
mapping.setClassType(modelClass);
}
return modelClass;
}
@Override
protected void inferDeepStructure()
{
// Infer the name based on the external interface name, which wasn't resolved yet when the shallow structure was first build.
//
if (isInterface && genClass.isExternalInterface())
{
String externalInterfaceName = "$" + genClass.getGenPackage().getQualifiedPackageName() + "." + genClass.getName() + "$" + genClass.getEcoreClass().getInstanceClassName();
int index = externalInterfaceName.lastIndexOf('.');
if (index == -1)
{
inferredElement.setSimpleName(genClass.getInterfaceName());
}
else
{
inferredElement.setSimpleName(externalInterfaceName.substring(index + 1));
inferredElement.setPackageName(externalInterfaceName.substring(0, index));
}
}
populateTypeParameters(null, genClass.getGenTypeParameters(), inferredElement.getTypeParameters());
EList<JvmTypeReference> superTypes = inferredElement.getSuperTypes();
if (isImplementation)
{
String qualifiedClassExtends = genClass.getQualifiedClassExtends();
if ("".equals(qualifiedClassExtends))
{
superTypes.add(getJvmTypeReference("org.eclipse.emf.ecore.impl.BasicEObjectImpl", genClass));
}
else
{
superTypes.add(getJvmTypeReference(qualifiedClassExtends, genClass));
}
List<String> qualifiedClassImplementsList = genClass.getQualifiedClassImplementsList();
for (String instanceTypeName : qualifiedClassImplementsList)
{
superTypes.add(getJvmTypeReference(instanceTypeName, genClass));
}
}
else
{
if (genClass.isExternalInterface())
{
// For the interface inferred for an external interface, we want to make that actual interface the super type of this "fake" inferred interface.
// This will ensure that operations in the real interface that aren't declared in the XClass are still in scope.
//
String instanceTypeName = genClass.getEcoreClass().getInstanceTypeName();
if (instanceTypeName != null)
{
JvmTypeReference jvmTypeReference = getJvmTypeReference(instanceTypeName, genClass);
if (jvmTypeReference != null)
{
superTypes.add(jvmTypeReference);
}
}
}
List<String> qualifiedInterfaceExtendsList = genClass.getQualifiedInterfaceExtendsList();
for (String instanceTypeName : qualifiedInterfaceExtendsList)
{
superTypes.add(getJvmTypeReference(instanceTypeName, genClass));
}
if (superTypes.isEmpty())
{
if (genClass.isEObject())
{
superTypes.add(getJvmTypeReference("org.eclipse.emf.common.notify.Notifier", genClass));
}
else
{
superTypes.add(getJvmTypeReference("java.lang.Object", genClass));
}
}
}
EList<JvmMember> members = inferredElement.getMembers();
final GenModel genModel = genClass.getGenModel();
if (isImplementation)
{
JvmElementInferrer<JvmConstructor> constructorInferrer =
new JvmElementInferrer<JvmConstructor>(X_LOW)
{
@Override
protected JvmConstructor inferStructure()
{
JvmConstructor jvmConstructor = TypesFactory.eINSTANCE.createJvmConstructor();
jvmConstructor.setVisibility(genModel.isPublicConstructors() ? JvmVisibility.PUBLIC : JvmVisibility.PROTECTED);
return jvmConstructor;
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genClass.getClassName());
}
};
associate(genClass, constructorInferrer);
members.add(constructorInferrer.getInferredElement());
}
if (isImplementation && !genModel.isReflectiveDelegation())
{
for (final GenFeature genFeature : genClass.getDeclaredFieldGenFeatures())
{
if (genFeature.getEcoreFeature().getEType() != null)
{
if (genFeature.hasSettingDelegate())
{
JvmElementInferrer<JvmField> settingDelegateFieldInferrer =
new JvmElementInferrer<JvmField>(X_LOW)
{
@Override
protected JvmField inferStructure()
{
JvmField settingDelegateField = createJvmField(genFeature, JvmVisibility.PROTECTED, false, getJvmTypeReference("org.eclipse.emf.ecore.EStructuralFeature.Internal.SettingDelegate", genFeature));
return settingDelegateField;
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genFeature.getUpperName() + "__ESETTING_DELEGATE");
}
};
associate(genFeature, settingDelegateFieldInferrer);
members.add(settingDelegateFieldInferrer.getInferredElement());
}
else if (genFeature.isListType() || genFeature.isReferenceType())
{
if (genClass.isField(genFeature))
{
JvmElementInferrer<JvmField> fieldInferrer =
new JvmElementInferrer<JvmField>(X_LOW)
{
@Override
protected JvmField inferStructure()
{
JvmField settingDelegateField = createJvmField(genFeature, JvmVisibility.PROTECTED, false, getJvmTypeReference(genFeature.getImportedInternalType(genClass), genFeature));
return settingDelegateField;
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genFeature.getSafeName());
}
};
associate(genFeature, fieldInferrer);
members.add(fieldInferrer.getInferredElement());
}
if (genModel.isArrayAccessors() && genFeature.isListType() && !genFeature.isFeatureMapType() && !genFeature.isMapType())
{
JvmElementInferrer<JvmField> emptyArrayFieldInferrer =
new JvmElementInferrer<JvmField>(X_LOW)
{
@Override
protected JvmField inferStructure()
{
JvmField settingDelegateField = createJvmField(genFeature, JvmVisibility.PROTECTED, true, getJvmTypeReference(genFeature.getRawListItemType() + "[]", genFeature));
return settingDelegateField;
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genFeature.getUpperName() + "_EEMPTY_ARRAY");
}
};
associate(genFeature, emptyArrayFieldInferrer);
members.add(emptyArrayFieldInferrer.getInferredElement());
}
}
else
{
if (genFeature.hasEDefault() && (!genFeature.isVolatile() || !genModel.isReflectiveDelegation() && (!genFeature.hasDelegateFeature() || !genFeature.isUnsettable())))
{
JvmElementInferrer<JvmField> defaultFieldInferrer =
new JvmElementInferrer<JvmField>(X_LOW)
{
@Override
protected JvmField inferStructure()
{
JvmField settingDelegateField = createJvmField(genFeature, JvmVisibility.PROTECTED, true, getJvmTypeReference(genFeature.getImportedType(genClass), genFeature));
return settingDelegateField;
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genFeature.getEDefault());
}
};
associate(genFeature, defaultFieldInferrer);
members.add(defaultFieldInferrer.getInferredElement());
}
if (genClass.isField(genFeature))
{
if (genClass.isFlag(genFeature))
{
int flagIndex = genClass.getFlagIndex(genFeature);
if (flagIndex > 31 && flagIndex % 32 == 0)
{
JvmElementInferrer<JvmField> flagFieldInferrer =
new JvmElementInferrer<JvmField>(X_LOW)
{
@Override
protected JvmField inferStructure()
{
JvmField settingDelegateField = createJvmField(genFeature, JvmVisibility.PROTECTED, false, getJvmTypeReference("int", genFeature));
return settingDelegateField;
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genClass.getFlagsField(genFeature));
}
};
associate(genFeature, flagFieldInferrer);
members.add(flagFieldInferrer.getInferredElement());
}
if (genFeature.isEnumType())
{
JvmElementInferrer<JvmField> flagOffsetFieldInferrer =
new JvmElementInferrer<JvmField>(X_LOW)
{
@Override
protected JvmField inferStructure()
{
JvmField settingDelegateField = createJvmField(genFeature, JvmVisibility.PROTECTED, true, getJvmTypeReference("int", genFeature));
return settingDelegateField;
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genFeature.getUpperName() + "_EFLAG_OFFSET");
}
};
associate(genFeature, flagOffsetFieldInferrer);
members.add(flagOffsetFieldInferrer.getInferredElement());
JvmElementInferrer<JvmField> flagsDefaultFieldInferrer =
new JvmElementInferrer<JvmField>(X_LOW)
{
@Override
protected JvmField inferStructure()
{
JvmField settingDelegateField = createJvmField(genFeature, JvmVisibility.PROTECTED, true, getJvmTypeReference("int", genFeature));
return settingDelegateField;
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genFeature.getUpperName() + "_EFLAG_DEFAULT");
}
};
associate(genFeature, flagsDefaultFieldInferrer);
members.add(flagsDefaultFieldInferrer.getInferredElement());
JvmElementInferrer<JvmField> flagValuesFieldInferrer =
new JvmElementInferrer<JvmField>(X_LOW)
{
@Override
protected JvmField inferStructure()
{
JvmField settingDelegateField = createJvmField(genFeature, JvmVisibility.PRIVATE, true, getJvmTypeReference("int", genFeature));
return settingDelegateField;
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genFeature.getUpperName() + "_EFLAG_VALUES");
}
};
associate(genFeature, flagValuesFieldInferrer);
members.add(flagValuesFieldInferrer.getInferredElement());
}
JvmElementInferrer<JvmField> flagOffsetFieldInferrer =
new JvmElementInferrer<JvmField>(X_LOW)
{
@Override
protected JvmField inferStructure()
{
JvmField settingDelegateField = createJvmField(genFeature, JvmVisibility.PROTECTED, true, getJvmTypeReference("int", genFeature));
return settingDelegateField;
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genFeature.getUpperName() + "_EFLAG");
}
};
associate(genFeature, flagOffsetFieldInferrer);
members.add(flagOffsetFieldInferrer.getInferredElement());
}
else
{
JvmElementInferrer<JvmField> fieldInferrer =
new JvmElementInferrer<JvmField>(X_LOW)
{
@Override
protected JvmField inferStructure()
{
JvmField settingDelegateField = createJvmField(genFeature, JvmVisibility.PROTECTED, false, getJvmTypeReference(genFeature.getImportedType(genClass), genFeature));
return settingDelegateField;
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genFeature.getSafeName());
}
};
associate(genFeature, fieldInferrer);
members.add(fieldInferrer.getInferredElement());
}
}
}
if (genClass.isESetField(genFeature))
{
if (genClass.isESetFlag(genFeature))
{
int flagIndex = genClass.getESetFlagIndex(genFeature);
if (flagIndex > 31 && flagIndex % 32 == 0)
{
JvmElementInferrer<JvmField> eSetFlagsFieldInferrer =
new JvmElementInferrer<JvmField>(X_LOW)
{
@Override
protected JvmField inferStructure()
{
JvmField settingDelegateField = createJvmField(genFeature, JvmVisibility.PROTECTED, false, getJvmTypeReference("int", genFeature));
return settingDelegateField;
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genClass.getESetFlagsField(genFeature));
}
};
associate(genFeature, eSetFlagsFieldInferrer);
members.add(eSetFlagsFieldInferrer.getInferredElement());
}
JvmElementInferrer<JvmField> eSetFlagFieldInferrer =
new JvmElementInferrer<JvmField>(X_LOW)
{
@Override
protected JvmField inferStructure()
{
JvmField settingDelegateField = createJvmField(genFeature, JvmVisibility.PROTECTED, true, getJvmTypeReference("int", genFeature));
return settingDelegateField;
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genFeature.getUpperName() + "_ESETFLAG");
}
};
associate(genFeature, eSetFlagFieldInferrer);
members.add(eSetFlagFieldInferrer.getInferredElement());
}
else
{
JvmElementInferrer<JvmField> eSetFlagFieldInferrer =
new JvmElementInferrer<JvmField>(X_LOW)
{
@Override
protected JvmField inferStructure()
{
JvmField settingDelegateField = createJvmField(genFeature, JvmVisibility.PROTECTED, false, getJvmTypeReference("boolean", genFeature));
return settingDelegateField;
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genFeature.getUncapName() + "ESet");
}
};
associate(genFeature, eSetFlagFieldInferrer);
members.add(eSetFlagFieldInferrer.getInferredElement());
}
}
}
}
}
if (isImplementation && genClass.hasOffsetCorrection() && !genClass.getImplementedGenFeatures().isEmpty())
{
// private static final int <%=genClass.getOffsetCorrectionField(null)%>
}
if (isImplementation && !genModel.isReflectiveDelegation())
{
for (final GenFeature genFeature : genClass.getImplementedGenFeatures())
{
final GenFeature reverseFeature = genFeature.getReverse();
if (reverseFeature != null && reverseFeature.getGenClass().hasOffsetCorrection())
{
// private static final int <%=genClass.getOffsetCorrectionField(genFeature)%>
JvmElementInferrer<JvmField> offsetCorrectionFieldInferrer =
new JvmElementInferrer<JvmField>(X_LOW)
{
@Override
protected JvmField inferStructure()
{
JvmField settingDelegateField = createJvmField(genFeature, JvmVisibility.PRIVATE, true, getJvmTypeReference("int", genFeature));
return settingDelegateField;
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genClass.getOffsetCorrectionField(genFeature));
}
};
associate(genFeature, offsetCorrectionFieldInferrer);
members.add(offsetCorrectionFieldInferrer.getInferredElement());
}
}
}
if (genModel.isOperationReflection() && isImplementation && genClass.hasOffsetCorrection() && !genClass.getImplementedGenOperations().isEmpty())
{
// private static final int "EOPERATION_OFFSET_CORRECTION";
}
for (GenFeature genFeature : isImplementation ? genClass.getImplementedGenFeatures() : genClass.getDeclaredGenFeatures())
{
EStructuralFeature eStructuralFeature = genFeature.getEcoreFeature();
if (eStructuralFeature.getName() != null && eStructuralFeature.getEGenericType() != null)
{
members.addAll(getJvmFeatureAccessors(genClass, genFeature, isInterface, isImplementation));
}
}
// This uses !isInterface because with suppressed interface both isInteface and isImplementation could be true.
// In that case, we want to infer operations only if the class actually declares the GenOperation.
//
for (GenOperation genOperation : !isInterface ? genClass.getImplementedGenOperations() : genClass.getDeclaredGenOperations())
{
members.add(getJvmOperation(genClass, genOperation, isInterface, isImplementation));
}
}
@Override
public void inferName()
{
if (isImplementation)
{
inferredElement.setSimpleName(genClass.getClassName());
inferredElement.setPackageName(genClass.getGenPackage().getClassPackageName());
}
// Don't infer the name for an external interface because its name isn't resolved until after the shallow structure has been derived.
//
else if (!genClass.isExternalInterface())
{
inferredElement.setSimpleName(genClass.getInterfaceName());
inferredElement.setPackageName(genClass.getGenPackage().getInterfacePackageName());
}
}
};
associate(genClass, modelClassInferrer);
return modelClassInferrer.getInferredElement();
}
protected List<JvmOperation> getJvmFeatureAccessors(final GenClass genClass, final GenFeature genFeature, final boolean isInterface, final boolean isImplementation)
{
List<JvmOperation> result = new ArrayList<JvmOperation>();
GenModel genModel = genFeature.getGenModel();
if (genModel.isArrayAccessors() && genFeature.isListType() && !genFeature.isFeatureMapType() && !genFeature.isMapType())
{
// public <%=genFeature.getListItemType(genClass)%>[] <%=genFeature.getGetArrayAccessor()%>()
// public <%=genFeature.getListItemType(genClass)%> get<%=genFeature.getAccessorName()%>(int index)
// public int get<%=genFeature.getAccessorName()%>Length()
// public void set<%=genFeature.getAccessorName()%>(<%=genFeature.getListItemType(genClass)%>[] new<%=genFeature.getCapName()%>)
// public void set<%=genFeature.getAccessorName()%>(int index, <%=genFeature.getListItemType(genClass)%> element)
}
XStructuralFeature xStructuralFeature = mapper.getXFeature(genFeature);
final XFeatureMapping mapping = mapper.getMapping(xStructuralFeature);
if (genFeature.isGet() && (isImplementation || !genFeature.isSuppressedGetVisibility()))
{
JvmElementInferrer<JvmOperation> getAccessorInferrer =
new JvmElementInferrer<JvmOperation>(isInterface ? X_VERY_HIGH : X_HIGH)
{
@Override
protected JvmOperation inferStructure()
{
JvmOperation jvmOperation = createJvmOperation(genFeature, JvmVisibility.PUBLIC, false, getJvmTypeReference(genFeature.getType(genFeature.getGenClass()), genFeature));
if (isInterface)
{
mapping.setGetter(jvmOperation);
}
return jvmOperation;
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genFeature.getGetAccessor() + (isImplementation && genClass.hasCollidingGetAccessorOperation(genFeature) ? "_" : ""));
}
};
associate(genFeature, getAccessorInferrer);
result.add(getAccessorInferrer.getInferredElement());
}
if (isImplementation && !genModel.isReflectiveDelegation() && genFeature.isBasicGet())
{
JvmElementInferrer<JvmOperation> basicGetAccessorInferrer =
new JvmElementInferrer<JvmOperation>(X_MEDIUM)
{
@Override
protected JvmOperation inferStructure()
{
JvmOperation jvmOperation = createJvmOperation(genFeature, JvmVisibility.PUBLIC, false, getJvmTypeReference(genFeature.getType(genFeature.getGenClass()), genFeature));
return jvmOperation;
}
@Override
public void inferName()
{
inferredElement.setSimpleName("basicGet" + genFeature.getAccessorName());
}
};
associate(genFeature, basicGetAccessorInferrer);
result.add(basicGetAccessorInferrer.getInferredElement());
}
if (isImplementation && !genModel.isReflectiveDelegation() && genFeature.isBasicSet())
{
JvmElementInferrer<JvmOperation> basicSetAccessorInferrer =
new JvmElementInferrer<JvmOperation>(X_MEDIUM)
{
@Override
protected JvmOperation inferStructure()
{
JvmOperation jvmOperation = createJvmOperation(genFeature, JvmVisibility.PUBLIC, false, getJvmTypeReference("org.eclipse.emf.common.notify.NotificationChain", genFeature));
EList<JvmFormalParameter> parameters = jvmOperation.getParameters();
JvmElementInferrer<JvmFormalParameter> valueParameterInferrefer =
new JvmElementInferrer<JvmFormalParameter>(X_MEDIUM)
{
@Override
protected JvmFormalParameter inferStructure()
{
return createJvmFormalParameter(genFeature, getJvmTypeReference(genFeature.getImportedInternalType(genClass), genFeature));
}
@Override
public void inferName()
{
inferredElement.setName("new" + genFeature.getCapName());
}
};
associate(genFeature, valueParameterInferrefer);
parameters.add(valueParameterInferrefer.getInferredElement());
parameters.add(createJvmFormalParameter(genFeature, "msgs", getJvmTypeReference("org.eclipse.emf.common.notify.NotificationChain", genFeature)));
return jvmOperation;
}
@Override
public void inferName()
{
inferredElement.setSimpleName("basicSet" + genFeature.getAccessorName());
}
};
associate(genFeature, basicSetAccessorInferrer);
result.add(basicSetAccessorInferrer.getInferredElement());
}
if (genFeature.isSet() && (isImplementation || !genFeature.isSuppressedSetVisibility()))
{
JvmElementInferrer<JvmOperation> setAccessorInferrer =
new JvmElementInferrer<JvmOperation>(isInterface ? X_VERY_HIGH : X_HIGH)
{
@Override
protected JvmOperation inferStructure()
{
JvmOperation jvmOperation = createJvmOperation(genFeature, JvmVisibility.PUBLIC, false, getJvmTypeReference("void", genFeature));
JvmElementInferrer<JvmFormalParameter> valueParameterInferrefer =
new JvmElementInferrer<JvmFormalParameter>(X_MEDIUM)
{
@Override
protected JvmFormalParameter inferStructure()
{
return createJvmFormalParameter(genFeature, getJvmTypeReference(genFeature.getImportedInternalType(genClass), genFeature));
}
@Override
public void inferName()
{
inferredElement.setName(isImplementation ? "new" + genFeature.getCapName() : "value");
}
};
if (isImplementation)
{
associate(genFeature, valueParameterInferrefer);
}
jvmOperation.getParameters().add(valueParameterInferrefer.getInferredElement());
if (isInterface)
{
mapping.setSetter(jvmOperation);
}
return jvmOperation;
}
@Override
public void inferName()
{
inferredElement.setSimpleName("set" + genFeature.getAccessorName() + (isImplementation && genClass.hasCollidingSetAccessorOperation(genFeature) ? "_" : ""));
}
};
associate(genFeature, setAccessorInferrer);
result.add(setAccessorInferrer.getInferredElement());
}
if (isImplementation && !genModel.isReflectiveDelegation() && genFeature.isBasicUnset())
{
JvmElementInferrer<JvmOperation> basicSetAccessorInferrer =
new JvmElementInferrer<JvmOperation>(X_MEDIUM)
{
@Override
protected JvmOperation inferStructure()
{
JvmOperation jvmOperation = createJvmOperation(genFeature, JvmVisibility.PUBLIC, false, getJvmTypeReference("org.eclipse.emf.common.notify.NotificationChain", genFeature));
EList<JvmFormalParameter> parameters = jvmOperation.getParameters();
parameters.add(createJvmFormalParameter(genFeature, "msgs", getJvmTypeReference("org.eclipse.emf.common.notify.NotificationChain", genFeature)));
return jvmOperation;
}
@Override
public void inferName()
{
inferredElement.setSimpleName("basicUnset" + genFeature.getAccessorName());
}
};
associate(genFeature, basicSetAccessorInferrer);
result.add(basicSetAccessorInferrer.getInferredElement());
}
if (genFeature.isUnset() && (isImplementation || !genFeature.isSuppressedUnsetVisibility()))
{
JvmElementInferrer<JvmOperation> unsetAccessorInferrer =
new JvmElementInferrer<JvmOperation>(isInterface ? X_VERY_HIGH : X_HIGH)
{
@Override
protected JvmOperation inferStructure()
{
JvmOperation jvmOperation = createJvmOperation(genFeature, JvmVisibility.PUBLIC, false, getJvmTypeReference("void", genFeature));
if (isInterface)
{
mapping.setUnsetter(jvmOperation);
}
return jvmOperation;
}
@Override
public void inferName()
{
inferredElement.setSimpleName("unset" + genFeature.getAccessorName() + (isImplementation && genClass.hasCollidingUnsetAccessorOperation(genFeature) ? "_" : ""));
}
};
associate(genFeature, unsetAccessorInferrer);
result.add(unsetAccessorInferrer.getInferredElement());
}
if (genFeature.isIsSet() && (isImplementation || !genFeature.isSuppressedIsSetVisibility()))
{
JvmElementInferrer<JvmOperation> isSetAccessorInferrer =
new JvmElementInferrer<JvmOperation>(isInterface ? X_VERY_HIGH : X_HIGH)
{
@Override
protected JvmOperation inferStructure()
{
JvmOperation jvmOperation = createJvmOperation(genFeature, JvmVisibility.PUBLIC, false, getJvmTypeReference("boolean", genFeature));
if (isInterface)
{
mapping.setIsSetter(jvmOperation);
}
return jvmOperation;
}
@Override
public void inferName()
{
inferredElement.setSimpleName("isSet" + genFeature.getAccessorName() + (isImplementation && genClass.hasCollidingIsSetAccessorOperation(genFeature) ? "_" : ""));
}
};
associate(genFeature, isSetAccessorInferrer);
result.add(isSetAccessorInferrer.getInferredElement());
}
return result;
}
protected JvmOperation getJvmOperation(final GenClass genClass, final GenOperation genOperation, final boolean isInterface, boolean isImplementation)
{
if (isImplementation)
{
if (genOperation.isInvariant() && genOperation.hasInvariantExpression())
{
// protected static final <%=genModel.getImportedName("java.lang.String")%> <%=CodeGenUtil.upperName(genClass.getUniqueName(genOperation), genModel.getLocale())%>__EEXPRESSION
}
else if (genOperation.hasInvocationDelegate())
{
// protected static final <%=genModel.getImportedName("org.eclipse.emf.ecore.EOperation")%>.Internal.InvocationDelegate <%=CodeGenUtil.upperName(genClass.getUniqueName(genOperation), genModel.getLocale())%>__EINVOCATION_DELEGATE = ((<%=genModel.getImportedName("org.eclipse.emf.ecore.EOperation")%>.Internal)<%=genOperation.getQualifiedOperationAccessor()%>).getInvocationDelegate();
}
}
JvmElementInferrer<JvmOperation> operationInferrer =
new JvmElementInferrer<JvmOperation>(X_HIGH)
{
@Override
protected JvmOperation inferStructure()
{
JvmOperation jvmOperation = createJvmOperation(genOperation, JvmVisibility.PUBLIC, false, getJvmTypeReference(genOperation.getType(genClass), genClass));
populateTypeParameters(genOperation.getTypeParameters(genClass), genOperation.getGenTypeParameters(), jvmOperation.getTypeParameters());
EList<JvmFormalParameter> parameters = jvmOperation.getParameters();
for (GenParameter genParameter : genOperation.getGenParameters())
{
parameters.add(getJvmFormalParameter(genParameter));
}
EList<JvmTypeReference> exceptions = jvmOperation.getExceptions();
for (EGenericType eGenericException : genOperation.getEcoreOperation().getEGenericExceptions())
{
exceptions.add(getJvmTypeReference(eGenericException, genOperation));
}
if (isInterface)
{
XOperation xOperation = mapper.getXOperation(genOperation);
XOperationMapping mapping = mapper.getMapping(xOperation);
mapping.setJvmOperation(jvmOperation);
}
return jvmOperation;
}
@Override
public void inferName()
{
inferredElement.setSimpleName(genOperation.getName());
}
};
associate(genOperation, operationInferrer);
return operationInferrer.getInferredElement();
}
protected JvmFormalParameter getJvmFormalParameter(final GenParameter genParameter)
{
JvmElementInferrer<JvmFormalParameter> parameterInferrer =
new JvmElementInferrer<JvmFormalParameter>(X_HIGH)
{
@Override
protected JvmFormalParameter inferStructure()
{
JvmFormalParameter jvmFormalParameter = createJvmFormalParameter(genParameter, getJvmTypeReference(genParameter.getType(genParameter.getGenOperation().getGenClass()), genParameter));
return jvmFormalParameter;
}
@Override
public void inferName()
{
inferredElement.setName(genParameter.getName());
}
};
associate(genParameter, parameterInferrer);
return parameterInferrer.getInferredElement();
}
protected static final String TYPE_PARAMETER_REFERENCE_SCHEME = CommonUtil.javaIntern("type_parameter_reference");
protected static final URI TYPE_PARAMETER_REFERENCE_SCHEME_BASE_URI = URI.createURI(TYPE_PARAMETER_REFERENCE_SCHEME + "://");
protected static class TypeReferenceHelper
{
private URI uri;
private IQualifiedNameConverter nameConverter;
private LazyCreationProxyURIConverter proxyURIConverter;
private Map<String, EGenericType> eGenericTypes = Maps.newHashMap();
private Map<String, JvmGenericType> jvmGenericTypeProxies = Maps.newHashMap();
public TypeReferenceHelper(URI uri, LazyCreationProxyURIConverter proxyURIConverter, IQualifiedNameConverter nameConverter)
{
this.uri = uri;
this.proxyURIConverter = proxyURIConverter;
this.nameConverter = nameConverter;
}
public EGenericType getEGenericType(String instanceTypeName)
{
EGenericType eGenericType = eGenericTypes.get(instanceTypeName);
if (eGenericType == null)
{
Diagnostic diagnostic = EcoreValidator.EGenericTypeBuilder.INSTANCE.parseInstanceTypeName(instanceTypeName);
eGenericType = (EGenericType)diagnostic.getData().get(0);
eGenericTypes.put(instanceTypeName, eGenericType);
}
return eGenericType;
}
public JvmGenericType getJvmGenericTypeProxy(String instanceTypeName)
{
JvmGenericType jvmGenericType = jvmGenericTypeProxies.get(instanceTypeName);
if (jvmGenericType == null)
{
jvmGenericType = TypesFactory.eINSTANCE.createJvmGenericType();
QualifiedName qualifiedName = nameConverter.toQualifiedName(instanceTypeName);
proxyURIConverter.installProxyURI(uri, jvmGenericType, qualifiedName);
jvmGenericTypeProxies.put(instanceTypeName, jvmGenericType);
}
return jvmGenericType;
}
public JvmGenericType getJvmGenericTypeParameterProxy(String typeParameterName)
{
JvmGenericType jvmGenericType = jvmGenericTypeProxies.get(typeParameterName);
if (jvmGenericType == null)
{
jvmGenericType = TypesFactory.eINSTANCE.createJvmGenericType();
jvmGenericType.setSimpleName(typeParameterName);
((InternalEObject)jvmGenericType).eSetProxyURI(TYPE_PARAMETER_REFERENCE_SCHEME_BASE_URI.appendFragment(typeParameterName));
jvmGenericTypeProxies.put(typeParameterName, jvmGenericType);
}
return jvmGenericType;
}
}
protected TypeReferenceHelper getCache(EObject context)
{
return getCache(context.eResource());
}
protected TypeReferenceHelper getCache(final Resource resource)
{
return
cache.get
(TypeReferenceHelper.class,
resource,
new Provider<TypeReferenceHelper>()
{
public TypeReferenceHelper get()
{
return new TypeReferenceHelper(resource.getURI(), proxyURIConverter, nameConverter);
}
});
}
protected JvmTypeReference getJvmTypeReference(String instanceTypeName, EObject context)
{
if (instanceTypeName.contains("<"))
{
return getJvmTypeReference(getCache(context).getEGenericType(instanceTypeName), context);
}
else if (instanceTypeName.endsWith("[]"))
{
JvmGenericArrayTypeReference jvmGenericArrayTypeReference = TypesFactory.eINSTANCE.createJvmGenericArrayTypeReference();
jvmGenericArrayTypeReference.setComponentType(getJvmTypeReference(instanceTypeName.substring(0, instanceTypeName.length() - 2), context));
return jvmGenericArrayTypeReference;
}
else
{
if ("void".equals(instanceTypeName) || CodeGenUtil.isJavaPrimitiveType(instanceTypeName))
{
JvmParameterizedTypeReference jvmParameterizedTypeReference = TypesFactory.eINSTANCE.createJvmParameterizedTypeReference();
jvmParameterizedTypeReference.setType(getCache(context).getJvmGenericTypeProxy(instanceTypeName));
return jvmParameterizedTypeReference;
}
else if ("?".equals(instanceTypeName))
{
JvmWildcardTypeReference jvmWildcardTypeReference = TypesFactory.eINSTANCE.createJvmWildcardTypeReference();
return jvmWildcardTypeReference;
}
else if (instanceTypeName.indexOf('.') == -1)
{
JvmParameterizedTypeReference jvmParameterizedTypeReference = TypesFactory.eINSTANCE.createJvmParameterizedTypeReference();
jvmParameterizedTypeReference.setType(getCache(context).getJvmGenericTypeParameterProxy(instanceTypeName));
return jvmParameterizedTypeReference;
}
else
{
JvmParameterizedTypeReference jvmParameterizedTypeReference = TypesFactory.eINSTANCE.createJvmParameterizedTypeReference();
jvmParameterizedTypeReference.setType(getCache(context).getJvmGenericTypeProxy(instanceTypeName));
return jvmParameterizedTypeReference;
}
}
}
protected JvmTypeReference getJvmTypeReference(EGenericType eGenericType, EObject context)
{
EClassifier eClassifier = eGenericType.getEClassifier();
if (eClassifier == null)
{
ETypeParameter eTypeParameter = eGenericType.getETypeParameter();
if (eTypeParameter == null)
{
JvmWildcardTypeReference jvmWildcardTypeReference = TypesFactory.eINSTANCE.createJvmWildcardTypeReference();
EGenericType eLowerBound = eGenericType.getELowerBound();
if (eLowerBound != null)
{
JvmLowerBound jvmLowerBound = TypesFactory.eINSTANCE.createJvmLowerBound();
jvmLowerBound.setTypeReference(getJvmTypeReference(eLowerBound, context));
jvmWildcardTypeReference.getConstraints().add(jvmLowerBound);
}
EGenericType eUpperBound = eGenericType.getEUpperBound();
if (eUpperBound != null)
{
JvmUpperBound jvmUpperBound = TypesFactory.eINSTANCE.createJvmUpperBound();
jvmUpperBound.setTypeReference(getJvmTypeReference(eUpperBound, context));
jvmWildcardTypeReference.getConstraints().add(jvmUpperBound);
}
return jvmWildcardTypeReference;
}
else
{
return getJvmTypeReference(eTypeParameter.getName(), context);
}
}
else
{
List<JvmTypeReference> arguments = getJvmTypeReferences(eGenericType.getETypeArguments(), context);
String instanceTypeName = eClassifier.getInstanceTypeName();
JvmTypeReference jvmTypeReference =
instanceTypeName == null ?
getJvmTypeReference((GenClassifier)mapper.getGen(mapper.getToXcoreMapping(eClassifier).getXcoreElement())):
getJvmTypeReference(instanceTypeName, context);
if (jvmTypeReference instanceof JvmParameterizedTypeReference)
{
((JvmParameterizedTypeReference)jvmTypeReference).getArguments().addAll(arguments);
}
return jvmTypeReference;
}
}
protected JvmTypeReference getJvmTypeReference(GenClassifier genClassifier)
{
if (genClassifier == null)
{
return null;
}
else
{
String instanceTypeName;
if (genClassifier instanceof GenClass)
{
instanceTypeName = ((GenClass)genClassifier).getQualifiedInterfaceName();
}
else
{
instanceTypeName = ((GenDataType)genClassifier).getQualifiedInstanceClassName();
}
return getJvmTypeReference(instanceTypeName, genClassifier);
}
}
protected List<JvmTypeReference> getJvmTypeReferences(List<EGenericType> eGenericTypes, EObject context)
{
if (eGenericTypes.isEmpty())
{
return Collections.emptyList();
}
else
{
List<JvmTypeReference> result = new ArrayList<JvmTypeReference>();
for (EGenericType eGenericType : eGenericTypes)
{
result.add(getJvmTypeReference(eGenericType, context));
}
return result;
}
}
protected JvmFormalParameter createJvmFormalParameter(EObject context, JvmTypeReference jvmTypeReference)
{
JvmFormalParameter jvmFormalParameter = TypesFactory.eINSTANCE.createJvmFormalParameter();
jvmFormalParameter.setParameterType(jvmTypeReference);
return jvmFormalParameter;
}
protected JvmFormalParameter createJvmFormalParameter(EObject context, String name, JvmTypeReference jvmTypeReference)
{
JvmFormalParameter jvmFormalParameter = createJvmFormalParameter(context, jvmTypeReference);
jvmFormalParameter.setName(name);
return jvmFormalParameter;
}
protected JvmField createJvmField(EObject context, JvmVisibility jvmVisibility, boolean isStatic, JvmTypeReference jvmTypeReference)
{
JvmField jvmField = TypesFactory.eINSTANCE.createJvmField();
jvmField.setVisibility(JvmVisibility.PUBLIC);
jvmField.setStatic(isStatic);
jvmField.setType(jvmTypeReference);
return jvmField;
}
protected JvmField createJvmField(EObject context, JvmVisibility jvmVisibility, boolean isStatic, boolean isFinal, JvmTypeReference jvmTypeReference)
{
JvmField jvmField = createJvmField(context, jvmVisibility, isStatic, jvmTypeReference);
jvmField.setFinal(isFinal);
return jvmField;
}
protected JvmField createJvmField(EObject context, JvmVisibility jvmVisibility, boolean isStatic, String name, JvmTypeReference jvmTypeReference)
{
JvmField jvmField = createJvmField(context, jvmVisibility, isStatic, jvmTypeReference);
jvmField.setSimpleName(name);
return jvmField;
}
protected JvmField createJvmField(EObject context, JvmVisibility jvmVisibility, boolean isStatic, boolean isFinal, String name, JvmTypeReference jvmTypeReference)
{
JvmField jvmField = createJvmField(context, jvmVisibility, isStatic, name, jvmTypeReference);
jvmField.setFinal(isFinal);
return jvmField;
}
protected JvmOperation createJvmOperation(EObject context, JvmVisibility jvmVisibility, boolean isStatic, JvmTypeReference jvmTypeReference)
{
JvmOperation jvmOperation = TypesFactory.eINSTANCE.createJvmOperation();
jvmOperation.setVisibility(JvmVisibility.PUBLIC);
jvmOperation.setStatic(isStatic);
jvmOperation.setReturnType(jvmTypeReference);
return jvmOperation;
}
protected JvmOperation createJvmOperation(EObject context, JvmVisibility jvmVisibility, boolean isStatic, String name, JvmTypeReference jvmTypeReference)
{
JvmOperation jvmOperation = createJvmOperation(context, jvmVisibility, isStatic, jvmTypeReference);
jvmOperation.setSimpleName(name);
return jvmOperation;
}
protected void populateTypeParameters(String typeParameters, EList<GenTypeParameter> genTypeParameters, EList<JvmTypeParameter> jvmTypeParameters)
{
if (!genTypeParameters.isEmpty())
{
if (typeParameters != null && !"".equals(typeParameters))
{
// For operations, we need to ensure that we use the type-substituted result.
//
Diagnostic diagnostic = EcoreValidator.EGenericTypeBuilder.INSTANCE.parseTypeParameterList(typeParameters);
@SuppressWarnings("unchecked")
List<ETypeParameter> typeParameterList = (List<ETypeParameter>)diagnostic.getData().get(0);
if (typeParameterList.size() == genTypeParameters.size())
{
int i = 0;
for (GenTypeParameter genTypeParameter : genTypeParameters)
{
jvmTypeParameters.add(getJvmTypeParameter(typeParameterList.get(i), genTypeParameter));
++i;
}
}
}
else
{
for (GenTypeParameter genTypeParameter : genTypeParameters)
{
jvmTypeParameters.add(getJvmTypeParameter(genTypeParameter.getEcoreTypeParameter(), genTypeParameter));
}
}
}
}
protected JvmTypeParameter getJvmTypeParameter(final ETypeParameter eTypeParameter, final GenTypeParameter genTypeParameter)
{
JvmElementInferrer<JvmTypeParameter> typeParameterInferrer =
new JvmElementInferrer<JvmTypeParameter>(X_HIGH)
{
@Override
protected JvmTypeParameter inferStructure()
{
JvmTypeParameter jvmTypeParameter = TypesFactory.eINSTANCE.createJvmTypeParameter();
EList<JvmTypeConstraint> constraints = jvmTypeParameter.getConstraints();
ETypeParameter eTypeParameter = genTypeParameter.getEcoreTypeParameter();
for (EGenericType eBound : eTypeParameter.getEBounds())
{
JvmTypeReference jvmTypeReference = getJvmTypeReference(eBound, genTypeParameter);
if (!(jvmTypeReference instanceof JvmWildcardTypeReference))
{
JvmUpperBound jvmUpperBound = TypesFactory.eINSTANCE.createJvmUpperBound();
jvmUpperBound.setTypeReference(jvmTypeReference);
constraints.add(jvmUpperBound);
}
}
return jvmTypeParameter;
}
@Override
public void inferName()
{
inferredElement.setName(genTypeParameter.getName());
}
};
associate(genTypeParameter, typeParameterInferrer);
return typeParameterInferrer.getInferredElement();
}
protected void associate(GenBase genBase, JvmElementInferrer<? extends JvmIdentifiableElement> jvmElementInferrer)
{
InferenceAdapter inferenceAdapter = (InferenceAdapter)EcoreUtil.getAdapter(genBase.eAdapters(), InferenceAdapter.class);
if (inferenceAdapter == null)
{
inferenceAdapter = new InferenceAdapter();
genBase.eAdapters().add(inferenceAdapter);
}
JvmIdentifiableElement inferredElement = jvmElementInferrer.getInferredElement();
ToXcoreMapping toXcoreMapping = mapper.getToXcoreMapping(inferredElement);
XNamedElement xNamedElement = toXcoreMapping.getXcoreElement();
if (xNamedElement == null)
{
xNamedElement = (XNamedElement)mapper.getXcoreElement(genBase);
toXcoreMapping.setXcoreElement(xNamedElement);
}
int priority = jvmElementInferrer.priority;
for (int i = 0, size = inferenceAdapter.jvmElementInferrers.size(); i < size; ++i)
{
if (inferenceAdapter.jvmElementInferrers.get(i).priority > priority)
{
inferenceAdapter.jvmElementInferrers.add(i, jvmElementInferrer);
return;
}
}
inferenceAdapter.jvmElementInferrers.add(jvmElementInferrer);
}
}