/** * @return a {@link JvmOperation} with common denominator argument types of all given operations */ protected JvmOperation deriveGenericDispatchOperationSignature( List<JvmOperation> sortedOperations, JvmGenericType target) { if (sortedOperations.isEmpty()) return null; final Iterator<JvmOperation> iterator = sortedOperations.iterator(); JvmOperation first = iterator.next(); JvmOperation result = typesFactory.createJvmOperation(); target.getMembers().add(result); for (int i = 0; i < first.getParameters().size(); i++) { JvmFormalParameter parameter = typesFactory.createJvmFormalParameter(); result.getParameters().add(parameter); parameter.setParameterType(getTypeProxy(parameter)); JvmFormalParameter parameter2 = first.getParameters().get(i); parameter.setName(parameter2.getName()); } jvmTypesBuilder.setBody(result, compileStrategies.forDispatcher(result, sortedOperations)); JvmVisibility commonVisibility = null; boolean isFirst = true; boolean allStatic = true; for (JvmOperation jvmOperation : sortedOperations) { Iterable<XtendFunction> xtendFunctions = filter(associations.getSourceElements(jvmOperation), XtendFunction.class); for (XtendFunction func : xtendFunctions) { JvmVisibility xtendVisibility = func.eIsSet(Xtend2Package.Literals.XTEND_FUNCTION__VISIBILITY) ? func.getVisibility() : null; if (isFirst) { commonVisibility = xtendVisibility; isFirst = false; } else if (commonVisibility != xtendVisibility) { commonVisibility = null; } associator.associate(func, result); if (!func.isStatic()) allStatic = false; } for (JvmTypeReference declaredException : jvmOperation.getExceptions()) result.getExceptions().add(cloneWithProxies(declaredException)); } if (commonVisibility == null) result.setVisibility(JvmVisibility.PUBLIC); else result.setVisibility(commonVisibility); result.setStatic(allStatic); return result; }
protected SignatureHashBuilder appendSignature(JvmOperation operation) { appendVisibility(operation.getVisibility()).append(" "); if (operation.isAbstract()) append("abstract "); if (operation.isStatic()) append("static "); if (operation.isFinal()) append("final "); appendType(operation.getReturnType()) .appendTypeParameters(operation) .append(" ") .append(operation.getSimpleName()) .append("("); for (JvmFormalParameter p : operation.getParameters()) { appendType(p.getParameterType()); append(" "); } append(") "); for (JvmTypeReference ex : operation.getExceptions()) { appendType(ex).append(" "); } return this; }
public void generateBodyAnnotations(final XPackage pack) { final HashSet<ETypedElement> processed = CollectionLiterals.<ETypedElement>newHashSet(); EList<XClassifier> _classifiers = pack.getClassifiers(); for (final XClassifier xClassifier : _classifiers) { if ((xClassifier instanceof XDataType)) { final XDataType xDataType = ((XDataType) xClassifier); XDataTypeMapping _mapping = this.mappings.getMapping(xDataType); final EDataType eDataType = _mapping.getEDataType(); final XBlockExpression createBody = xDataType.getCreateBody(); XDataTypeMapping _mapping_1 = this.mappings.getMapping(xDataType); final JvmOperation creator = _mapping_1.getCreator(); boolean _and = false; boolean _notEquals = (!Objects.equal(createBody, null)); if (!_notEquals) { _and = false; } else { boolean _notEquals_1 = (!Objects.equal(creator, null)); _and = (_notEquals && _notEquals_1); } if (_and) { final XcoreAppendable appendable = this.createAppendable(); EList<JvmFormalParameter> _parameters = creator.getParameters(); JvmFormalParameter _get = _parameters.get(0); appendable.declareVariable(_get, "it"); JvmTypeReference _returnType = creator.getReturnType(); Set<JvmTypeReference> _emptySet = Collections.<JvmTypeReference>emptySet(); this.compiler.compile(createBody, appendable, _returnType, _emptySet); String _string = appendable.toString(); String _extractBody = this.extractBody(_string); EcoreUtil.setAnnotation(eDataType, GenModelPackage.eNS_URI, "create", _extractBody); } final XBlockExpression convertBody = xDataType.getConvertBody(); XDataTypeMapping _mapping_2 = this.mappings.getMapping(xDataType); final JvmOperation converter = _mapping_2.getConverter(); boolean _and_1 = false; boolean _notEquals_2 = (!Objects.equal(convertBody, null)); if (!_notEquals_2) { _and_1 = false; } else { boolean _notEquals_3 = (!Objects.equal(converter, null)); _and_1 = (_notEquals_2 && _notEquals_3); } if (_and_1) { final XcoreAppendable appendable_1 = this.createAppendable(); EList<JvmFormalParameter> _parameters_1 = converter.getParameters(); JvmFormalParameter _get_1 = _parameters_1.get(0); appendable_1.declareVariable(_get_1, "it"); JvmTypeReference _returnType_1 = converter.getReturnType(); Set<JvmTypeReference> _emptySet_1 = Collections.<JvmTypeReference>emptySet(); this.compiler.compile(convertBody, appendable_1, _returnType_1, _emptySet_1); String _string_1 = appendable_1.toString(); String _extractBody_1 = this.extractBody(_string_1); EcoreUtil.setAnnotation(eDataType, GenModelPackage.eNS_URI, "convert", _extractBody_1); } } else { final XClass xClass = ((XClass) xClassifier); XClassMapping _mapping_3 = this.mappings.getMapping(xClass); final EClass eClass = _mapping_3.getEClass(); EList<EStructuralFeature> _eAllStructuralFeatures = eClass.getEAllStructuralFeatures(); for (final EStructuralFeature eStructuralFeature : _eAllStructuralFeatures) { boolean _add = processed.add(eStructuralFeature); if (_add) { final XStructuralFeature xFeature = this.mappings.getXFeature(eStructuralFeature); boolean _notEquals_4 = (!Objects.equal(xFeature, null)); if (_notEquals_4) { final XBlockExpression getBody = xFeature.getGetBody(); boolean _notEquals_5 = (!Objects.equal(getBody, null)); if (_notEquals_5) { XFeatureMapping _mapping_4 = this.mappings.getMapping(xFeature); final JvmOperation getter = _mapping_4.getGetter(); final XcoreAppendable appendable_2 = this.createAppendable(); JvmTypeReference _returnType_2 = getter.getReturnType(); Set<JvmTypeReference> _emptySet_2 = Collections.<JvmTypeReference>emptySet(); this.compiler.compile(getBody, appendable_2, _returnType_2, _emptySet_2); String _string_2 = appendable_2.toString(); String _extractBody_2 = this.extractBody(_string_2); EcoreUtil.setAnnotation( eStructuralFeature, GenModelPackage.eNS_URI, "get", _extractBody_2); } } } } EList<EOperation> _eAllOperations = eClass.getEAllOperations(); for (final EOperation eOperation : _eAllOperations) { boolean _add_1 = processed.add(eOperation); if (_add_1) { final XOperation xOperation = this.mappings.getXOperation(eOperation); boolean _notEquals_6 = (!Objects.equal(xOperation, null)); if (_notEquals_6) { final XBlockExpression body = xOperation.getBody(); boolean _notEquals_7 = (!Objects.equal(body, null)); if (_notEquals_7) { XOperationMapping _mapping_5 = this.mappings.getMapping(xOperation); final JvmOperation jvmOperation = _mapping_5.getJvmOperation(); boolean _notEquals_8 = (!Objects.equal(jvmOperation, null)); if (_notEquals_8) { final XcoreAppendable appendable_3 = this.createAppendable(); JvmDeclaredType _declaringType = jvmOperation.getDeclaringType(); appendable_3.declareVariable(_declaringType, "this"); JvmDeclaredType _declaringType_1 = jvmOperation.getDeclaringType(); EList<JvmTypeReference> _superTypes = _declaringType_1.getSuperTypes(); final JvmTypeReference superType = IterableExtensions.<JvmTypeReference>head(_superTypes); boolean _notEquals_9 = (!Objects.equal(superType, null)); if (_notEquals_9) { JvmType _type = superType.getType(); appendable_3.declareVariable(_type, "super"); } EList<JvmFormalParameter> _parameters_2 = jvmOperation.getParameters(); for (final JvmFormalParameter parameter : _parameters_2) { String _name = parameter.getName(); appendable_3.declareVariable(parameter, _name); } JvmTypeReference _returnType_3 = jvmOperation.getReturnType(); EList<JvmTypeReference> _exceptions = jvmOperation.getExceptions(); HashSet<JvmTypeReference> _hashSet = new HashSet<JvmTypeReference>(_exceptions); this.compiler.compile(body, appendable_3, _returnType_3, _hashSet); String _string_3 = appendable_3.toString(); String _extractBody_3 = this.extractBody(_string_3); EcoreUtil.setAnnotation( eOperation, GenModelPackage.eNS_URI, "body", _extractBody_3); } } } } } } } }
protected void transform(XtendFunction source, JvmGenericType container) { JvmOperation operation = typesFactory.createJvmOperation(); container.getMembers().add(operation); associator.associatePrimary(source, operation); String sourceName = source.getName(); JvmVisibility visibility = source.getVisibility(); if (source.isDispatch()) { if (!source.eIsSet(Xtend2Package.Literals.XTEND_FUNCTION__VISIBILITY)) visibility = JvmVisibility.PROTECTED; sourceName = "_" + sourceName; } operation.setSimpleName(sourceName); operation.setVisibility(visibility); operation.setStatic(source.isStatic()); for (XtendParameter parameter : source.getParameters()) { JvmFormalParameter jvmParam = typesFactory.createJvmFormalParameter(); jvmParam.setName(parameter.getName()); jvmParam.setParameterType(cloneWithProxies(parameter.getParameterType())); operation.getParameters().add(jvmParam); associator.associate(parameter, jvmParam); jvmTypesBuilder.translateAnnotationsTo(parameter.getAnnotations(), jvmParam); } JvmTypeReference returnType = null; if (source.getReturnType() != null) { returnType = cloneWithProxies(source.getReturnType()); } else { returnType = getTypeProxy(operation); } operation.setReturnType(returnType); copyAndFixTypeParameters(source.getTypeParameters(), operation); for (JvmTypeReference exception : source.getExceptions()) { operation.getExceptions().add(cloneWithProxies(exception)); } jvmTypesBuilder.translateAnnotationsTo(source.getAnnotationInfo().getAnnotations(), operation); CreateExtensionInfo createExtensionInfo = source.getCreateExtensionInfo(); if (createExtensionInfo != null) { JvmTypeReference arrayList = typeReferences.getTypeForName(ArrayList.class, container, typeReferences.wildCard()); JvmTypeReference hashMap = typeReferences.getTypeForName( HashMap.class, container, arrayList, cloneWithProxies(returnType)); JvmField cacheVar = jvmTypesBuilder.toField( source, CREATE_CHACHE_VARIABLE_PREFIX + source.getName(), hashMap); cacheVar.setFinal(true); jvmTypesBuilder.setInitializer(cacheVar, compileStrategies.forCacheVariable(container)); container.getMembers().add(cacheVar); JvmOperation initializer = typesFactory.createJvmOperation(); container.getMembers().add(initializer); initializer.setSimpleName(CREATE_INITIALIZER_PREFIX + source.getName()); initializer.setVisibility(JvmVisibility.PRIVATE); initializer.setReturnType(typeReferences.getTypeForName(Void.TYPE, source)); for (JvmTypeReference exception : source.getExceptions()) { initializer.getExceptions().add(cloneWithProxies(exception)); } jvmTypesBuilder.setBody( operation, compileStrategies.forCacheMethod(createExtensionInfo, cacheVar, initializer)); // the first parameter is the created object JvmFormalParameter jvmParam = typesFactory.createJvmFormalParameter(); jvmParam.setName(createExtensionInfo.getName()); jvmParam.setParameterType(getTypeProxy(createExtensionInfo.getCreateExpression())); initializer.getParameters().add(jvmParam); associator.associate(createExtensionInfo, jvmParam); // add all others for (XtendParameter parameter : source.getParameters()) { jvmParam = typesFactory.createJvmFormalParameter(); jvmParam.setName(parameter.getName()); jvmParam.setParameterType(cloneWithProxies(parameter.getParameterType())); initializer.getParameters().add(jvmParam); associator.associate(parameter, jvmParam); } associator.associate(source, initializer); associator.associateLogicalContainer(createExtensionInfo.getCreateExpression(), operation); associator.associateLogicalContainer(source.getExpression(), initializer); } else { associator.associateLogicalContainer(source.getExpression(), operation); } jvmTypesBuilder.setDocumentation(operation, jvmTypesBuilder.getDocumentation(source)); }