blob: 78df9b06593b0b518e5407c0982be4eaa76fd53e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013 E.D.Willink 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
*
* Contributors:
* E.D.Willink - initial API and implementation
*******************************************************************************/
package org.eclipse.ocl.examples.build.xtend
import java.util.List
import org.eclipse.emf.ecore.EObject
import org.eclipse.jdt.annotation.NonNull
import org.eclipse.ocl.pivot.AnyType
import org.eclipse.ocl.pivot.Class
import org.eclipse.ocl.pivot.CollectionType
import org.eclipse.ocl.pivot.Comment
import org.eclipse.ocl.pivot.EnumerationLiteral
import org.eclipse.ocl.pivot.LambdaType
import org.eclipse.ocl.pivot.MapType
import org.eclipse.ocl.pivot.Model
import org.eclipse.ocl.pivot.Operation
import org.eclipse.ocl.pivot.Package
import org.eclipse.ocl.pivot.Parameter
import org.eclipse.ocl.pivot.Precedence
import org.eclipse.ocl.pivot.PrimitiveType
import org.eclipse.ocl.pivot.Property
import org.eclipse.ocl.pivot.TemplateBinding
import org.eclipse.ocl.pivot.TemplateParameter
import org.eclipse.ocl.pivot.TemplateParameterSubstitution
import org.eclipse.ocl.pivot.TemplateSignature
public abstract class GenerateOCLCommonXtend extends GenerateOCLCommon
{
protected def String declareClassTypes(@NonNull Model root) {
var pkge2classTypes = root.getSortedClassTypes();
if (pkge2classTypes.isEmpty()) return "";
var sortedPackages = root.getSortedPackages(pkge2classTypes.keySet());
'''
«FOR pkge : sortedPackages»
«FOR type : pkge2classTypes.get(pkge)»
private final @NonNull «type.eClass.name» «type.getPrefixedSymbolName("_" + type.partialName())» = create«type.
eClass.name»("«type.name»");
«ENDFOR»
«ENDFOR»
'''
}
protected def String declareCollectionTypes(Model root) {
var pkge2collectionTypes = root.getSortedCollectionTypes();
if (pkge2collectionTypes.isEmpty()) return "";
var sortedPackages = root.getSortedPackages(pkge2collectionTypes.keySet());
'''
«FOR pkge : sortedPackages»
«FOR type : pkge2collectionTypes.get(pkge)»
«IF type.getOwnedSignature() != null»
private final @NonNull «type.eClass.name» «type.getPrefixedSymbolName("_" + type.getName() + "_" + type.getElementType().partialName())» = create«type.
eClass.name»("«type.name»"/*«type.elementType.name»*/, "«type.lower.toString()»", "«type.upper.toString()»"«IF type.getOwnedSignature() != null»«FOR templateParameter : type.getOwnedSignature().getOwnedParameters()», «templateParameter.getSymbolName()»«ENDFOR»«ENDIF»);
«ENDIF»
«ENDFOR»
«FOR type : pkge2collectionTypes.get(pkge)»
«IF type.getOwnedSignature() == null»
private final @NonNull «type.eClass.name» «type.getPrefixedSymbolName("_" + type.getName() + "_" + type.getElementType().partialName())» = create«type.
eClass.name»(«type.getUnspecializedElement().getSymbolName()», «type.elementType.getSymbolName()»);
«ENDIF»
«ENDFOR»
«ENDFOR»
'''
}
protected def String declareEnumerations(@NonNull Model root) {
var pkge2enumerations = root.getSortedEnumerations();
if (pkge2enumerations.isEmpty()) return "";
var sortedPackages = root.getSortedPackages(pkge2enumerations.keySet());
'''
«FOR pkge : sortedPackages»
«FOR enumeration : pkge2enumerations.get(pkge)»
«var enumerationName = enumeration.getPrefixedSymbolName("_" + enumeration.partialName())»
private final @NonNull Enumeration «enumerationName» = createEnumeration("«enumeration.name»");
«FOR enumerationLiteral : enumeration.ownedLiterals»
private final @NonNull EnumerationLiteral «enumerationLiteral.getPrefixedSymbolName(
"el_" + enumerationName + "_" + enumerationLiteral.name)» = createEnumerationLiteral("«enumerationLiteral.name»");
«ENDFOR»
«ENDFOR»
«ENDFOR»
'''
}
protected def String declareMapTypes(@NonNull Model root) {
var pkge2mapTypes = root.getSortedMapTypes();
if (pkge2mapTypes.isEmpty()) return "";
var sortedPackages = root.getSortedPackages(pkge2mapTypes.keySet());
'''
«FOR pkge : sortedPackages»
«FOR type : pkge2mapTypes.get(pkge)»
«IF type.getOwnedSignature() != null»
private final @NonNull «type.eClass.name» «type.getPrefixedSymbolName("_" + type.getName() + "_" + type.getKeyType().partialName() + "_" + type.getValueType().partialName())» = create«type.
eClass.name»("«type.name»"/*«type.keyType.name» «type.valueType.name»*/«IF type.getOwnedSignature() != null»«FOR templateParameter : type.getOwnedSignature().getOwnedParameters()», «templateParameter.getSymbolName()»«ENDFOR»«ENDIF»);
«ENDIF»
«ENDFOR»
«FOR type : pkge2mapTypes.get(pkge)»
«IF type.getOwnedSignature() == null»
private final @NonNull «type.eClass.name» «type.getPrefixedSymbolName("_" + type.getName() + "_" + type.getKeyType().partialName() + "_" + type.getValueType().partialName())» = create«type.
eClass.name»(«type.getUnspecializedElement().getSymbolName()», «type.keyType.getSymbolName()», «type.valueType.getSymbolName()»);
«ENDIF»
«ENDFOR»
«ENDFOR»
'''
}
protected def String declarePrimitiveTypes(@NonNull Model root) {
var pkge2primitiveTypes = root.getSortedPrimitiveTypes();
if (pkge2primitiveTypes.isEmpty()) return "";
var sortedPackages = root.getSortedPackages(pkge2primitiveTypes.keySet());
'''
«FOR pkge : sortedPackages»
«FOR type : pkge2primitiveTypes.get(pkge)»
private final @NonNull PrimitiveType «type.getPrefixedSymbolName("_" + type.partialName())» = createPrimitiveType("«type.name»");
«ENDFOR»
«ENDFOR»
'''
}
protected def String declareProperties(@NonNull Model root) {
var pkge2properties = root.getSortedProperties();
if (pkge2properties.isEmpty()) return "";
var sortedPackages = root.getSortedPackages(pkge2properties.keySet());
'''
«FOR pkge : sortedPackages»
«FOR property : pkge2properties.get(pkge)»
private final @NonNull Property «property.getPrefixedSymbolName("pr_" + property.partialName())» = createProperty("«property.name»", «property.type.getSymbolName()»);
«ENDFOR»
«ENDFOR»
'''
}
protected def String declareTupleTypes(@NonNull Model root) {
'''
«FOR type : root.getSortedTupleTypes()»
private final @NonNull TupleType «type.getPrefixedSymbolName("_" + type.partialName())» = createTupleType("«type.name»",
«FOR property : type.getSortedTupleParts() BEFORE ("\t") SEPARATOR (",\n\t")»
createProperty("«property.name»", «property.type.getSymbolName()»)«ENDFOR»);
«ENDFOR»
'''
}
protected def String defineCoercions(@NonNull Model root) {
var allCoercions = root.getSortedCoercions();
if (allCoercions.isEmpty()) return "";
'''
private void installCoercions() {
List<Operation> ownedCoercions;
Operation coercion;
«FOR type : allCoercions.getSortedOwningTypes()»
ownedCoercions = «type.getSymbolName()».getCoercions();
«FOR coercion : (type as PrimitiveType).getSortedCoercions(allCoercions)»
ownedCoercions.add(coercion = «coercion.getSymbolName()»);
«IF coercion.bodyExpression != null»
operation.setBodyExpression(createExpressionInOCL(«coercion.type.getSymbolName()», "«coercion.bodyExpression.javaString()»"));
«ENDIF»
«ENDFOR»
«ENDFOR»
}
'''
}
protected def String defineClassTypes(@NonNull Model root) {
var pkge2classTypes = root.getSortedClassTypes();
if (pkge2classTypes.isEmpty()) return "";
var sortedPackages = root.getSortedPackages(pkge2classTypes.keySet());
'''
private void installClassTypes() {
List<Class> ownedClasses;
List<Class> superClasses;
Class type;
«FOR pkge : sortedPackages»
ownedClasses = «pkge.getSymbolName()».getOwnedClasses();
«FOR type : pkge2classTypes.get(pkge)»
ownedClasses.add(type = «type.getSymbolName()»);
«IF !(type instanceof AnyType)»
«type.emitSuperClasses("type")»
«ENDIF»
«ENDFOR»
«ENDFOR»
}
'''
}
protected def String defineCollectionTypes(@NonNull Model root) {
var pkge2collectionTypes = root.getSortedCollectionTypes();
if (pkge2collectionTypes.isEmpty()) return "";
var sortedPackages = root.getSortedPackages(pkge2collectionTypes.keySet());
'''
private void installCollectionTypes() {
List<Class> ownedClasses;
List<Class> superClasses;
CollectionType type;
«FOR pkge : sortedPackages»
ownedClasses = «pkge.getSymbolName()».getOwnedClasses();
«FOR type : pkge2collectionTypes.get(pkge)»
ownedClasses.add(type = «type.getSymbolName()»);
«type.emitSuperClasses("type")»
«ENDFOR»
«ENDFOR»
}
'''
}
protected def String defineComments(@NonNull Model root) {
'''
private void installComments() {
«FOR pElement : root.getSortedCommentedElements()»
«FOR pComment : pElement.getSortedComments()»
installComment(«pElement.getSymbolName()», "«pComment.javaString()»");
«ENDFOR»
«ENDFOR»
}
'''
}
protected def String defineEnumerations(@NonNull Model root) {
var pkge2enumerations = root.getSortedEnumerations();
if (pkge2enumerations.isEmpty()) return "";
var sortedPackages = root.getSortedPackages(pkge2enumerations.keySet());
'''
private void installEnumerations() {
List<Class> ownedClasses;
Enumeration type;
List<EnumerationLiteral> enumerationLiterals;
«FOR pkge : sortedPackages»
ownedClasses = «pkge.getSymbolName()».getOwnedClasses();
«FOR enumeration : pkge2enumerations.get(pkge)»
ownedClasses.add(type = «enumeration.getSymbolName()»);
enumerationLiterals = type.getOwnedLiterals();
«FOR enumerationLiteral : enumeration.ownedLiterals»
enumerationLiterals.add(«enumerationLiteral.getSymbolName()»);
«ENDFOR»
type.getSuperClasses().add(_Enumeration);
«ENDFOR»
«ENDFOR»
}
'''
}
protected def String defineExternals(@NonNull Model root) {
var externals = root.getSortedExternals();
if (externals.isEmpty()) return "";
'''
«FOR name : externals»«var element = name2external.get(name)»
private final @NonNull «element.eClass().getName()» «name» = «element.getExternalReference()»;
«ENDFOR»
'''
}
protected def String defineIterations(@NonNull Model root) {
var pkge2iterations = root.getSortedIterations();
if (pkge2iterations.isEmpty()) return "";
var sortedPackages = root.getSortedPackages(pkge2iterations.keySet());
var Class oldType = null;
'''
«FOR pkge : sortedPackages»
«FOR iteration : pkge2iterations.get(pkge)»
private final @NonNull Iteration «iteration.getPrefixedSymbolName("it_" + iteration.partialName())» = createIteration("«iteration.
name»", «iteration.type.getSymbolName()», «IF iteration.implementationClass != null»"«iteration.
implementationClass»", «iteration.implementationClass».INSTANCE«ELSE»null, null«ENDIF»«IF iteration.getOwnedSignature() != null»«FOR templateParameter : iteration.getOwnedSignature().getOwnedParameters()», «templateParameter.getSymbolName()»«ENDFOR»«ENDIF»);
«ENDFOR»
«ENDFOR»
private void installIterations() {
List<Operation> ownedIterations;
List<Parameter> ownedParameters;
Iteration iteration;
Parameter parameter;
«FOR pkge : sortedPackages»
«FOR iteration : pkge2iterations.get(pkge)»«var newType = iteration.getOwningClass()»
«IF newType != oldType»
ownedIterations = «(oldType = newType).getSymbolName()».getOwnedOperations();
«ENDIF»
ownedIterations.add(iteration = «iteration.getSymbolName()»);
«IF iteration.isInvalidating»
iteration.setIsInvalidating(true);
«ENDIF»
«IF !iteration.isRequired»
iteration.setIsRequired(false);
«ENDIF»
«IF iteration.isStatic»
iteration.setIsStatic(true);
«ENDIF»
«IF iteration.isTypeof»
iteration.setIsTypeof(true);
«ENDIF»
«IF iteration.isValidating»
iteration.setIsValidating(true);
«ENDIF»
«IF iteration.ownedIterators.size() > 0»
ownedParameters = iteration.getOwnedIterators();
«FOR parameter : iteration.ownedIterators»
ownedParameters.add(parameter = createParameter("«parameter.name»", «parameter.type.getSymbolName()», «parameter.isRequired»));
«IF parameter.isTypeof»
parameter.setIsTypeof(true);
«ENDIF»
«ENDFOR»
«ENDIF»
«IF iteration.ownedAccumulators.size() > 0»
ownedParameters = iteration.getOwnedAccumulators();
«FOR parameter : iteration.ownedAccumulators»
ownedParameters.add(parameter = createParameter("«parameter.name»", «parameter.type.getSymbolName()», «parameter.isRequired»));
«IF parameter.isTypeof»
parameter.setIsTypeof(true);
«ENDIF»
«ENDFOR»
«ENDIF»
«IF iteration.ownedParameters.size() > 0»
ownedParameters = iteration.getOwnedParameters();
«FOR parameter : iteration.ownedParameters»
ownedParameters.add(parameter = createParameter("«parameter.name»", «parameter.type.getSymbolName()», «parameter.isRequired»));
«IF parameter.isTypeof»
parameter.setIsTypeof(true);
«ENDIF»
«ENDFOR»
«ENDIF»
«ENDFOR»
«ENDFOR»
}
'''
}
protected def String defineLambdaTypes(@NonNull Model root) {
var allLambdaTypes = root.getSortedLambdaTypes();
if (allLambdaTypes.isEmpty()) return "";
var orphanPackage = root.getOrphanPackage();
if (orphanPackage == null) return "";
'''
«FOR type : allLambdaTypes»
private final @NonNull LambdaType «type.getPrefixedSymbolName("_" + type.partialName())» = createLambdaType("«type.
name»");
«ENDFOR»
private void installLambdaTypes() {
final List<Class> orphanTypes = «orphanPackage.getSymbolName()».getOwnedClasses();
LambdaType type;
List<Class> superClasses;
«FOR type : allLambdaTypes»
orphanTypes.add(type = «type.getSymbolName()»);
type.setContextType(«type.contextType.getSymbolName()»);
«FOR parameterType : type.parameterType»
type.getParameterType().add(«parameterType.getSymbolName()»);
«ENDFOR»
type.setResultType(«type.resultType.getSymbolName()»);
«type.emitSuperClasses("type")»
«ENDFOR»
}
'''
}
protected def String defineMapTypes(@NonNull Model root) {
var pkge2mapTypes = root.getSortedMapTypes();
if (pkge2mapTypes.isEmpty()) return "";
var sortedPackages = root.getSortedPackages(pkge2mapTypes.keySet());
'''
private void installMapTypes() {
List<Class> ownedClasses;
List<Class> superClasses;
MapType type;
«FOR pkge : sortedPackages»
ownedClasses = «pkge.getSymbolName()».getOwnedClasses();
«FOR type : pkge2mapTypes.get(pkge)»
ownedClasses.add(type = «type.getSymbolName()»);
«type.emitSuperClasses("type")»
«ENDFOR»
«ENDFOR»
}
'''
}
protected def String defineOperations(@NonNull Model root) {
var pkge2operations = root.getSortedOperations();
if (pkge2operations.isEmpty()) return "";
var sortedPackages = root.getSortedPackages(pkge2operations.keySet());
var Class oldType = null;
'''
«FOR pkge : sortedPackages»
«FOR operation : pkge2operations.get(pkge)»
private final @NonNull Operation «operation.getPrefixedSymbolName("op_" + operation.partialName())» = createOperation("«operation.
name»", «operation.type.getSymbolName()», «IF operation.implementationClass != null»"«operation.
implementationClass»", «operation.implementationClass».INSTANCE«ELSE»null, null«ENDIF»«IF operation.getOwnedSignature() != null»«FOR templateParameter : operation.getOwnedSignature().getOwnedParameters()», «templateParameter.getSymbolName()»«ENDFOR»«ENDIF»);
«ENDFOR»
«ENDFOR»
private void installOperations() {
List<Operation> ownedOperations;
List<Parameter> ownedParameters;
Operation operation;
Parameter parameter;
«FOR pkge : sortedPackages»
«FOR operation : pkge2operations.get(pkge)»«var newType = operation.getOwningClass()»
«IF newType != oldType»
ownedOperations = «(oldType = newType).getSymbolName()».getOwnedOperations();
«ENDIF»
ownedOperations.add(operation = «operation.getSymbolName()»);
«IF operation.isInvalidating»
operation.setIsInvalidating(true);
«ENDIF»
«IF !operation.isRequired»
operation.setIsRequired(false);
«ENDIF»
«IF operation.isStatic»
operation.setIsStatic(true);
«ENDIF»
«IF operation.isTypeof»
operation.setIsTypeof(true);
«ENDIF»
«IF operation.isValidating»
operation.setIsValidating(true);
«ENDIF»
«IF operation.bodyExpression != null»
operation.setBodyExpression(createExpressionInOCL(«operation.type.getSymbolName()», "«operation.bodyExpression.javaString()»"));
«ENDIF»
«IF operation.ownedParameters.size() > 0»
ownedParameters = operation.getOwnedParameters();
«FOR parameter : operation.ownedParameters»
ownedParameters.add(parameter = createParameter("«parameter.name»", «parameter.type.getSymbolName()», «parameter.isRequired»));
«IF parameter.isTypeof»
parameter.setIsTypeof(true);
«ENDIF»
«ENDFOR»
«ENDIF»
«ENDFOR»
«ENDFOR»
}
'''
}
protected def String definePackages(@NonNull Model root, List<String> allImports) {
var allPackages = root.getSortedPackages();
if (allPackages.isEmpty()) return "";
'''
private void installPackages() {
«emitRoot(root)»
«IF allPackages.size() > 0»
«FOR pkg2 : allPackages»
«emitPackage(pkg2)»
«ENDFOR»
«ENDIF»
«IF (allImports != null) && (allImports.size() > 0)»
«FOR asImport : allImports»
«root.getSymbolName()».getOwnedImports().add(createImport(«asImport»));
«ENDFOR»
«ENDIF»
}
'''
}
protected def String definePrecedences(Model root) {
var allLibraries = root.getSortedLibrariesWithPrecedence();
var allOperations = root.getSortedOperationsWithPrecedence();
'''
«IF (allLibraries.size() > 0) || (allOperations.size() > 0)»
private void installPrecedences() {
«IF allLibraries.size() > 0»
List<Precedence> ownedPrecedences;
«FOR lib : allLibraries»
«var allPrecedences = lib.getSortedPrecedences()»
«IF (allPrecedences != null) && (allPrecedences.size() > 0)»
«FOR precedence : allPrecedences»
final Precedence «precedence.getPrefixedSymbolName("prec_" + precedence.partialName())» = createPrecedence("«precedence.name»", AssociativityKind.«precedence.associativity.toString().toUpperCase()»);
«ENDFOR»
ownedPrecedences = «lib.getSymbolName()».getOwnedPrecedences();
«FOR precedence : lib.ownedPrecedences»
ownedPrecedences.add(«precedence.getSymbolName()»);
«ENDFOR»
«ENDIF»
«ENDFOR»
«ENDIF»
«FOR operation : allOperations»
«operation.getSymbolName()».setPrecedence(«operation.precedence.getSymbolName()»);
«ENDFOR»
}
«ENDIF»
'''
}
protected def String definePrimitiveTypes(@NonNull Model root) {
var pkge2primitiveTypes = root.getSortedPrimitiveTypes();
if (pkge2primitiveTypes.isEmpty()) return "";
var sortedPackages = root.getSortedPackages(pkge2primitiveTypes.keySet());
'''
private void installPrimitiveTypes() {
List<Class> ownedClasses;
PrimitiveType type;
«FOR pkge : sortedPackages»
ownedClasses = «pkge.getSymbolName()».getOwnedClasses();
«FOR type : pkge2primitiveTypes.get(pkge)»
«var superClasses = type.getSuperclassesInPackage()»
ownedClasses.add(type = «type.getSymbolName()»);
«FOR superClass : superClasses»
type.getSuperClasses().add(«superClass.getSymbolName()»);
«ENDFOR»
«ENDFOR»
«ENDFOR»
}
'''
}
protected def String defineProperties(@NonNull Model root) {
var pkge2properties = root.getSortedProperties();
if (pkge2properties.isEmpty()) return "";
var sortedPackages = root.getSortedPackages(pkge2properties.keySet());
var Class oldType = null;
'''
private void installProperties() {
List<Property> ownedProperties;
Property property;
«FOR pkge : sortedPackages»
«FOR property : pkge2properties.get(pkge)»«var newType = property.getOwningClass()»
«IF newType != oldType»
ownedProperties = «(oldType = newType).getSymbolName()».getOwnedProperties();
«ENDIF»
ownedProperties.add(property = «property.getSymbolName()»);
«IF property.isComposite»
property.setIsComposite(true);
«ENDIF»
«IF property.isDerived»
property.setIsDerived(true);
«ENDIF»
«IF property.isID»
property.setIsID(true);
«ENDIF»
«IF property.isImplicit»
property.setIsImplicit(true);
«ENDIF»
«IF property.isReadOnly»
property.setIsReadOnly(true);
«ENDIF»
«IF !property.isRequired»
property.setIsRequired(false);
«ENDIF»
«IF property.isResolveProxies»
property.setIsResolveProxies(true);
«ENDIF»
«IF property.isStatic»
property.setIsStatic(true);
«ENDIF»
«IF property.isTransient»
property.setIsTransient(true);
«ENDIF»
«IF false /*property.isTypeof*/»
property.setIsTypeof(true);
«ENDIF»
«IF property.isUnsettable»
property.setIsUnsettable(true);
«ENDIF»
«IF property.isVolatile»
property.setIsVolatile(true);
«ENDIF»
«IF property.opposite != null»
property.setOpposite(«property.opposite.getSymbolName()»);
«ENDIF»
«IF property.implementationClass != null»
property.setImplementationClass("«property.implementationClass»");
property.setImplementation(«property.implementationClass».INSTANCE);
«ENDIF»
«ENDFOR»
«ENDFOR»
}
'''
}
protected def String defineTemplateBindings(@NonNull Model root) {
var allTemplateableElements = root.getSortedTemplateableElements();
if (allTemplateableElements.isEmpty()) return "";
'''
private void installTemplateBindings() {
«FOR templateableElement : allTemplateableElements»
«FOR templateBinding : templateableElement.ownedBindings»
«templateableElement.getSymbolName()».getOwnedBindings().add(createTemplateBinding(
«FOR templateParameterSubstitution : templateBinding.ownedSubstitutions SEPARATOR (",\n")»
createTemplateParameterSubstitution(«templateParameterSubstitution.formal.getSymbolName()», «templateParameterSubstitution.actual.getSymbolName()»)«ENDFOR»));
«ENDFOR»
«ENDFOR»
}
'''
}
protected def String defineTemplateParameters(@NonNull Model root) {
var allTemplateParameters = root.getSortedTemplateParameters();
if (allTemplateParameters.isEmpty()) return "";
'''
«FOR templateParameter : allTemplateParameters»
private final @NonNull TemplateParameter «templateParameter.getPrefixedSymbolName(
"tp_" + templateParameter.partialName())» = createTemplateParameter("«templateParameter.getName()»");
«ENDFOR»
'''
}
protected def String defineTupleTypes(@NonNull Model root) {
var allTupleTypes = root.getSortedTupleTypes();
if (allTupleTypes.isEmpty()) return "";
var orphanPackage = root.getOrphanPackage();
if (orphanPackage == null) return "";
'''
private void installTupleTypes() {
final List<Class> orphanTypes = «orphanPackage.getSymbolName()».getOwnedClasses();
TupleType type;
List<Class> superClasses;
«FOR type : allTupleTypes»
orphanTypes.add(type = «type.getSymbolName()»);
«FOR property : type.getSortedProperties()»
«IF property.implementationClass != null»
«property.getSymbolName()».setImplementationClass("«property.implementationClass»");
«property.getSymbolName()».setImplementation(«property.implementationClass».INSTANCE);
«ENDIF»
«ENDFOR»
«type.emitSuperClasses("type")»
«ENDFOR»
}
'''
}
protected def String emitCreateProperty(Property property) {
return "createProperty(" + property.name + ", " + property.type.getSymbolName() + ")";
}
protected def String emitPackage(Package pkg) {
'''
«FOR nestedPackage : pkg.getSortedPackages()»
«IF nestedPackage.getOwnedPackages().size() > 0»
«emitPackage(nestedPackage)»
«ENDIF»
«pkg.getSymbolName()».getOwnedPackages().add(«nestedPackage.getSymbolName()»);
«ENDFOR»
'''
}
protected def String emitRoot(Model pkg) {
'''
«FOR nestedPackage : pkg.getSortedPackages()»
«IF nestedPackage.getOwnedPackages().size() > 0»
«emitPackage(nestedPackage)»
«ENDIF»
«pkg.getSymbolName()».getOwnedPackages().add(«nestedPackage.getSymbolName()»);
«ENDFOR»
'''
}
protected def String emitSuperClasses(Class type, String typeName) {
var superClasses = type.getSuperclassesInPackage();
'''
«IF superClasses.size() > 0»
superClasses = «typeName».getSuperClasses();
«FOR superClass : superClasses»
superClasses.add(«superClass.getSymbolName()»);
«ENDFOR»
«ELSEIF (type instanceof MapType)»
superClasses = «typeName».getSuperClasses();
superClasses.add(_OclAny);
«ELSEIF !(type instanceof AnyType)»
superClasses = «typeName».getSuperClasses();
superClasses.add(_OclElement);
«ENDIF»
'''
}
protected def String installCoercions(@NonNull Model root) {
var allCoercions = root.getSortedCoercions();
if (allCoercions.isEmpty()) return "";
'''installCoercions();'''
}
protected def String installClassTypes(@NonNull Model root) {
var pkge2classTypes = root.getSortedClassTypes();
if (pkge2classTypes.isEmpty()) return "";
'''installClassTypes();'''
}
protected def String installCollectionTypes(@NonNull Model root) {
var pkge2collectionTypes = root.getSortedCollectionTypes();
if (pkge2collectionTypes.isEmpty()) return "";
'''installCollectionTypes();'''
}
protected def String installComments(@NonNull Model root) {
'''installComments();'''
}
protected def String installEnumerations(@NonNull Model root) {
var pkge2enumerations = root.getSortedEnumerations();
if (pkge2enumerations.isEmpty()) return "";
'''installEnumerations();'''
}
protected def String installIterations(@NonNull Model root) {
var pkge2iterations = root.getSortedIterations();
if (pkge2iterations.isEmpty()) return "";
'''installIterations();'''
}
protected def String installLambdaTypes(@NonNull Model root) {
var allLambdaTypes = root.getSortedLambdaTypes();
if (allLambdaTypes.isEmpty()) return "";
'''installLambdaTypes();'''
}
protected def String installMapTypes(@NonNull Model root) {
var pkge2mapTypes = root.getSortedMapTypes();
if (pkge2mapTypes.isEmpty()) return "";
'''installMapTypes();'''
}
protected def String installOperations(@NonNull Model root) {
var pkge2operations = root.getSortedOperations();
if (pkge2operations.isEmpty()) return "";
'''installOperations();'''
}
protected def String installPackages(@NonNull Model root) {
var allPackages = root.getSortedPackages();
if (allPackages.isEmpty()) return "";
'''installPackages();'''
}
protected def String installPrecedences(@NonNull Model root) {
var allLibraries = root.getSortedLibrariesWithPrecedence();
var allOperations = root.getSortedOperationsWithPrecedence();
if (allLibraries.isEmpty() && allOperations.isEmpty()) return "";
'''installPrecedences();'''
}
protected def String installPrimitiveTypes(@NonNull Model root) {
var pkge2primitiveTypes = root.getSortedPrimitiveTypes();
if (pkge2primitiveTypes.isEmpty()) return "";
'''installPrimitiveTypes();'''
}
protected def String installProperties(@NonNull Model root) {
var pkge2properties = root.getSortedProperties();
if (pkge2properties.isEmpty()) return "";
'''installProperties();'''
}
protected def String installTemplateBindings(@NonNull Model root) {
var allTemplateableElements = root.getSortedTemplateableElements();
if (allTemplateableElements.isEmpty()) return "";
'''installTemplateBindings();'''
}
protected def String installTupleTypes(@NonNull Model root) {
var allTupleTypes = root.getSortedTupleTypes();
if (allTupleTypes.size() <= 0) return "";
'''installTupleTypes();'''
}
/**
* Generate a name for element suitable for embedding in a surrounding punctuation context.
*/
protected override String partialName(EObject element) {
switch element {
CollectionType case element.elementType == null: return element.javaName()
CollectionType: return element.javaName()
LambdaType case element.contextType == null: return "null"
LambdaType: return element.javaName() + "_" + element.contextType.partialName()
MapType case element.keyType == null: return element.javaName()
MapType case element.valueType == null: return element.javaName()
MapType: return element.javaName()
Class case element.ownedBindings.size() > 0: return '''«element.javaName()»«FOR TemplateParameterSubstitution tps : element.getTemplateParameterSubstitutions()»_«tps.actual.simpleName()»«ENDFOR»'''
Class: return element.javaName()
Comment case element.body == null: return "null"
Comment: return element.javaName(element.body.substring(0, Math.min(11, element.body.length() - 1)))
EnumerationLiteral case element.owningEnumeration == null: return "null"
EnumerationLiteral: return element.owningEnumeration.partialName() + "_" + element.javaName()
Operation case element.owningClass == null: return "null_" + element.javaName()
Operation: return element.owningClass.partialName() + "_" + element.javaName()
Package: return element.javaName()
Parameter case element.eContainer() == null: return "null_" + element.javaName()
Parameter: return element.eContainer().partialName() + "_" + element.javaName()
Precedence: return element.javaName()
Property: return getPartialName(element)
TemplateBinding case element.getTemplateSignature().owningElement == null: return "null"
TemplateBinding: return element.owningElement.partialName()
TemplateParameter case element.getOwningSignature.owningElement == null: return "[" + element.getOwningSignature.partialName() + "]"
// TemplateParameter case element.getOwningTemplateSignature.owningTemplateableElement.getUnspecializedElement() == null: return element.javaName()
TemplateParameter: return element.getOwningSignature.owningElement.partialName() + "_" + element.javaName()
TemplateParameterSubstitution case element.owningBinding == null: return "null"
TemplateParameterSubstitution case element.owningBinding.owningElement == null: return "null"
TemplateParameterSubstitution: return element.owningBinding.owningElement.partialName()
TemplateSignature case element.owningElement == null: return "null"
TemplateSignature: return element.owningElement.partialName()
default: return "xyzzy" + element.eClass().name
}
}
protected def String simpleName(EObject element) {
switch element {
TemplateParameter case element.getOwningSignature.owningElement == null: return "null"
TemplateParameter: return element.getOwningSignature.owningElement.simpleName() + "_" + element.javaName()
TemplateParameterSubstitution case element.owningBinding == null: return "null"
TemplateParameterSubstitution case element.owningBinding.owningElement == null: return "null"
TemplateParameterSubstitution: return element.owningBinding.owningElement.simpleName()
Class: return element.javaName()
Operation case element.owningClass == null: return "null_" + element.javaName()
Operation: return element.owningClass.simpleName() + "_" + element.javaName()
default: return "xyzzy" + element.eClass().name
}
}
}