package org.eclipselabs.spray.xtext.jvmmodel; import com.google.inject.Inject; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; import org.eclipse.xtext.common.types.JvmDeclaredType; import org.eclipse.xtext.common.types.JvmField; import org.eclipse.xtext.common.types.JvmGenericType; import org.eclipse.xtext.common.types.JvmMember; import org.eclipse.xtext.common.types.JvmOperation; import org.eclipse.xtext.common.types.JvmTypeReference; import org.eclipse.xtext.common.types.util.TypeReferences; import org.eclipse.xtext.naming.IQualifiedNameConverter; import org.eclipse.xtext.naming.QualifiedName; import org.eclipse.xtext.util.IAcceptor; import org.eclipse.xtext.xbase.jvmmodel.AbstractModelInferrer; import org.eclipse.xtext.xbase.jvmmodel.JvmTypesBuilder; import org.eclipse.xtext.xbase.lib.BooleanExtensions; import org.eclipse.xtext.xbase.lib.CollectionExtensions; import org.eclipse.xtext.xbase.lib.ObjectExtensions; import org.eclipse.xtext.xbase.lib.Procedures.Procedure1; import org.eclipse.xtext.xbase.lib.StringExtensions; import org.eclipselabs.spray.mm.spray.MetaClass; import org.eclipselabs.spray.xtext.util.GenModelHelper; /** * <p>Infers a JVM model from the source model.</p> * * <p>The JVM model should contain all elements that would appear in the Java code * which is generated from the source model. * Other Xtend models link against the JVM model rather than the source model. The JVM * model elements should be associated with their source element by means of the * {@link IJvmModelAssociator}.</p> */ @SuppressWarnings("all") public class SprayJvmModelInferrer extends AbstractModelInferrer { @Inject private TypeReferences typeReferences; @Inject private GenModelHelper _genModelHelper; @Inject private JvmTypesBuilder _jvmTypesBuilder; @Inject private IQualifiedNameConverter converter; protected void _infer(final MetaClass clazz, final IAcceptor<JvmDeclaredType> acceptor, final boolean prelinkingPhase) { boolean _operator_or = false; EClass _type = clazz.getType(); boolean _operator_equals = ObjectExtensions.operator_equals(_type, null); if (_operator_equals) { _operator_or = true; } else { EClass _type_1 = clazz.getType(); boolean _eIsProxy = _type_1.eIsProxy(); _operator_or = BooleanExtensions.operator_or(_operator_equals, _eIsProxy); } if (_operator_or) { return; } try { EClass _type_2 = clazz.getType(); this._genModelHelper.getJavaInterfaceName(_type_2); } catch (final IllegalStateException e) { return; } EClass _type_3 = clazz.getType(); String _javaInterfaceName = this._genModelHelper.getJavaInterfaceName(_type_3); final String instanceClassName = _javaInterfaceName; JvmTypeReference _typeForName = this.typeReferences.getTypeForName(instanceClassName, clazz, null); final JvmTypeReference eClassJvmType = _typeForName; EClass _type_4 = clazz.getType(); EPackage _ePackage = _type_4.getEPackage(); String _name = _ePackage.getName(); String _operator_plus = StringExtensions.operator_plus(_name, "."); EClass _type_5 = clazz.getType(); String _name_1 = _type_5.getName(); String _operator_plus_1 = StringExtensions.operator_plus(_operator_plus, _name_1); QualifiedName _qualifiedName = this.converter.toQualifiedName(_operator_plus_1); final Procedure1<JvmGenericType> _function = new Procedure1<JvmGenericType>() { public void apply(final JvmGenericType it) { { EList<JvmMember> _members = it.getMembers(); JvmField _field = SprayJvmModelInferrer.this._jvmTypesBuilder.toField(it, "ecoreClass", eClassJvmType); CollectionExtensions.<JvmField>operator_add(_members, _field); EList<JvmMember> _members_1 = it.getMembers(); JvmOperation _getter = SprayJvmModelInferrer.this._jvmTypesBuilder.toGetter(it, "ecoreClass", eClassJvmType); CollectionExtensions.<JvmOperation>operator_add(_members_1, _getter); } } }; JvmGenericType _class = this._jvmTypesBuilder.toClass(clazz, _qualifiedName, _function); acceptor.accept(_class); } public void infer(final EObject clazz, final IAcceptor<JvmDeclaredType> acceptor, final boolean prelinkingPhase) { if (clazz instanceof MetaClass) { _infer((MetaClass)clazz, acceptor, prelinkingPhase); } else { _infer(clazz, acceptor, prelinkingPhase); } } }