blob: 41f0a27cacb15d22db79c4c4374ef7faa4e845c7 [file] [log] [blame]
Ed Willink17785c52014-05-20 12:29:51 +01001/*******************************************************************************
Ed Willink52e3d062015-05-19 10:14:44 +01002 * Copyright (c) 2013 Willink Transformations and others.
Ed.Willinka820ebe2013-10-02 13:55:59 -04003 * All rights reserved. This program and the accompanying materials
Ed Willink2b4d8be2018-06-13 11:53:02 +01004 * are made available under the terms of the Eclipse Public License v2.0
Ed.Willinka820ebe2013-10-02 13:55:59 -04005 * which accompanies this distribution, and is available at
Ed Willink2b4d8be2018-06-13 11:53:02 +01006 * http://www.eclipse.org/legal/epl-v20.html
Ed.Willinka820ebe2013-10-02 13:55:59 -04007 *
8 * Contributors:
9 * E.D.Willink - initial API and implementation
Ed Willink17785c52014-05-20 12:29:51 +010010 *******************************************************************************/
Ed.Willinka820ebe2013-10-02 13:55:59 -040011package org.eclipse.ocl.examples.build.xtend
12
Ed Willink41636df2015-05-03 11:22:31 +010013import java.util.ArrayList
Ed Willinke96c7cd2022-08-24 08:25:49 +010014import java.util.Collection
Ed Willink41636df2015-05-03 11:22:31 +010015import java.util.Collections
Ed.Willinka820ebe2013-10-02 13:55:59 -040016import org.eclipse.emf.ecore.EObject
Ed Willink26704252014-12-05 17:14:01 +000017import org.eclipse.ocl.pivot.AnyType
18import org.eclipse.ocl.pivot.Class
19import org.eclipse.ocl.pivot.CollectionType
20import org.eclipse.ocl.pivot.Comment
21import org.eclipse.ocl.pivot.EnumerationLiteral
Ed Willink26704252014-12-05 17:14:01 +000022import org.eclipse.ocl.pivot.LambdaType
Ed Willink3935bde2015-04-24 19:36:13 +010023import org.eclipse.ocl.pivot.MapType
Ed Willink31c9fc72014-12-08 20:03:58 +000024import org.eclipse.ocl.pivot.Model
Ed Willink26704252014-12-05 17:14:01 +000025import org.eclipse.ocl.pivot.Operation
26import org.eclipse.ocl.pivot.Package
27import org.eclipse.ocl.pivot.Parameter
28import org.eclipse.ocl.pivot.Precedence
Ed Willink31c9fc72014-12-08 20:03:58 +000029import org.eclipse.ocl.pivot.PrimitiveType
Ed Willink26704252014-12-05 17:14:01 +000030import org.eclipse.ocl.pivot.Property
31import org.eclipse.ocl.pivot.TemplateBinding
32import org.eclipse.ocl.pivot.TemplateParameter
33import org.eclipse.ocl.pivot.TemplateParameterSubstitution
34import org.eclipse.ocl.pivot.TemplateSignature
Ed Willinkf57d9712015-05-01 12:09:16 +010035import org.eclipse.ocl.pivot.utilities.ClassUtil
Ed Willinka28e82f2017-08-11 10:33:34 +010036import org.eclipse.ocl.pivot.values.Unlimited
Ed Willinke96c7cd2022-08-24 08:25:49 +010037import org.eclipse.ocl.pivot.utilities.PivotConstants
38import org.eclipse.ocl.pivot.ids.TypeId
39import org.eclipse.ocl.pivot.utilities.NameUtil
Ed.Willinka820ebe2013-10-02 13:55:59 -040040
Ed Willink30631142018-06-17 08:55:17 +010041abstract class GenerateOCLCommonXtend extends GenerateOCLCommon
Ed.Willinka820ebe2013-10-02 13:55:59 -040042{
Ed Willink832631f2017-01-22 14:29:42 +000043 protected def String declareClassTypes(/*@NonNull*/ Model root, /*@NonNull*/ Collection</*@NonNull*/ String> excludedEClassifierNames) {
Ed Willink03e4d682015-04-25 17:57:56 +010044 var pkge2classTypes = root.getSortedClassTypes();
45 if (pkge2classTypes.isEmpty()) return "";
46 var sortedPackages = root.getSortedPackages(pkge2classTypes.keySet());
Ed.Willinka820ebe2013-10-02 13:55:59 -040047 '''
Ed Willink03e4d682015-04-25 17:57:56 +010048 «FOR pkge : sortedPackages»
49
Ed Willink4607e9a2016-01-13 13:01:29 +000050 «FOR type : ClassUtil.nullFree(pkge2classTypes.get(pkge))»
Ed Willink30631142018-06-17 08:55:17 +010051 private final @NonNull «type.eClass.name» «type.getPrefixedSymbolNameWithoutNormalization("_" + type.partialName())» = create«type.
Ed Willink03e4d682015-04-25 17:57:56 +010052 eClass.name»("«type.name»");
53 «ENDFOR»
54 «ENDFOR»
55 '''
56 }
57
58 protected def String declareCollectionTypes(Model root) {
59 var pkge2collectionTypes = root.getSortedCollectionTypes();
60 if (pkge2collectionTypes.isEmpty()) return "";
61 var sortedPackages = root.getSortedPackages(pkge2collectionTypes.keySet());
62 '''
63 «FOR pkge : sortedPackages»
64
Ed Willink4607e9a2016-01-13 13:01:29 +000065 «FOR type : ClassUtil.nullFree(pkge2collectionTypes.get(pkge))»«var typeName = type.getPrefixedSymbolName("_" + type.getName() + "_" + type.getElementType().partialName() + (if (type.isIsNullFree()) "_NullFree" else "") )»
Ed Willink01526762018-01-13 16:50:52 +000066 «IF type.getOwnedSignature() !== null»
Ed Willinke96c7cd2022-08-24 08:25:49 +010067 private final @NonNull «type.eClass.name» «typeName» = create«type.eClass.name»(«getEcoreLiteral(type)»«IF type.getOwnedSignature() !== null»«FOR templateParameter : type.getOwnedSignature().getOwnedParameters()», «templateParameter.getSymbolName()»«ENDFOR»«ENDIF»);
Ed Willinkc7c09162015-05-15 15:56:36 +010068 «ENDIF»
Ed Willinkcdac4962014-08-11 10:10:17 +010069 «ENDFOR»
Ed Willink4607e9a2016-01-13 13:01:29 +000070 «FOR type : ClassUtil.nullFree(pkge2collectionTypes.get(pkge))»«var typeName = type.getPrefixedSymbolName("_" + type.getName() + "_" + type.getElementType().partialName() + (if (type.isIsNullFree()) "_NullFree" else "") )»
Ed Willink01526762018-01-13 16:50:52 +000071 «IF type.getOwnedSignature() === null»
Ed Willink8687e312017-07-19 13:38:32 +020072 private final @NonNull «type.eClass.name» «typeName» = create«type.eClass.name»(«type.getUnspecializedElement().getSymbolName()»);
Ed Willinkc7c09162015-05-15 15:56:36 +010073 «ENDIF»
Ed.Willinka820ebe2013-10-02 13:55:59 -040074 «ENDFOR»
Ed Willink03e4d682015-04-25 17:57:56 +010075 «ENDFOR»
Ed.Willinka820ebe2013-10-02 13:55:59 -040076 '''
77 }
78
Ed Willink70051092015-12-23 19:11:07 +000079 protected def String declareEnumerations(/*@NonNull*/ Model root) {
Ed Willink03e4d682015-04-25 17:57:56 +010080 var pkge2enumerations = root.getSortedEnumerations();
81 if (pkge2enumerations.isEmpty()) return "";
82 var sortedPackages = root.getSortedPackages(pkge2enumerations.keySet());
Ed.Willinka820ebe2013-10-02 13:55:59 -040083 '''
Ed Willink03e4d682015-04-25 17:57:56 +010084
85 «FOR pkge : sortedPackages»
Ed Willink4607e9a2016-01-13 13:01:29 +000086 «FOR enumeration : ClassUtil.nullFree(pkge2enumerations.get(pkge))»
Ed.Willinka820ebe2013-10-02 13:55:59 -040087 «var enumerationName = enumeration.getPrefixedSymbolName("_" + enumeration.partialName())»
Ed Willinkcdac4962014-08-11 10:10:17 +010088 private final @NonNull Enumeration «enumerationName» = createEnumeration("«enumeration.name»");
Ed Willink3b596462014-12-21 09:15:39 +000089 «FOR enumerationLiteral : enumeration.ownedLiterals»
Ed Willinkcdac4962014-08-11 10:10:17 +010090 private final @NonNull EnumerationLiteral «enumerationLiteral.getPrefixedSymbolName(
Ed.Willinka820ebe2013-10-02 13:55:59 -040091 "el_" + enumerationName + "_" + enumerationLiteral.name)» = createEnumerationLiteral("«enumerationLiteral.name»");
92 «ENDFOR»
93 «ENDFOR»
Ed Willink03e4d682015-04-25 17:57:56 +010094 «ENDFOR»
Ed.Willinka820ebe2013-10-02 13:55:59 -040095 '''
96 }
97
Ed Willink70051092015-12-23 19:11:07 +000098 protected def String declareMapTypes(/*@NonNull*/ Model root) {
Ed Willink03e4d682015-04-25 17:57:56 +010099 var pkge2mapTypes = root.getSortedMapTypes();
100 if (pkge2mapTypes.isEmpty()) return "";
101 var sortedPackages = root.getSortedPackages(pkge2mapTypes.keySet());
Ed Willink6489b072015-03-22 12:45:19 +0000102 '''
Ed Willinka32c4042015-04-27 15:34:47 +0100103
Ed Willink03e4d682015-04-25 17:57:56 +0100104 «FOR pkge : sortedPackages»
Ed Willink4607e9a2016-01-13 13:01:29 +0000105 «FOR type : ClassUtil.nullFree(pkge2mapTypes.get(pkge))»
Ed Willink01526762018-01-13 16:50:52 +0000106 «IF type.getOwnedSignature() !== null»
Ed Willink6489b072015-03-22 12:45:19 +0000107 private final @NonNull «type.eClass.name» «type.getPrefixedSymbolName("_" + type.getName() + "_" + type.getKeyType().partialName() + "_" + type.getValueType().partialName())» = create«type.
Ed Willinke96c7cd2022-08-24 08:25:49 +0100108 eClass.name»(«getEcoreLiteral(type)»«IF type.getOwnedSignature() !== null»«FOR templateParameter : type.getOwnedSignature().getOwnedParameters()», «templateParameter.getSymbolName()»«ENDFOR»«ENDIF»);
Ed Willink6489b072015-03-22 12:45:19 +0000109 «ENDIF»
110 «ENDFOR»
Ed Willink4607e9a2016-01-13 13:01:29 +0000111 «FOR type : ClassUtil.nullFree(pkge2mapTypes.get(pkge))»
Ed Willink01526762018-01-13 16:50:52 +0000112 «IF type.getOwnedSignature() === null»
Ed Willink6489b072015-03-22 12:45:19 +0000113 private final @NonNull «type.eClass.name» «type.getPrefixedSymbolName("_" + type.getName() + "_" + type.getKeyType().partialName() + "_" + type.getValueType().partialName())» = create«type.
Ed Willink8687e312017-07-19 13:38:32 +0200114 eClass.name»(«type.getUnspecializedElement().getSymbolName()»);
Ed Willink6489b072015-03-22 12:45:19 +0000115 «ENDIF»
116 «ENDFOR»
Ed.Willinka820ebe2013-10-02 13:55:59 -0400117 «ENDFOR»
Ed.Willinka820ebe2013-10-02 13:55:59 -0400118 '''
Ed Willink03e4d682015-04-25 17:57:56 +0100119 }
120
Ed Willink70051092015-12-23 19:11:07 +0000121 protected def String declarePrimitiveTypes(/*@NonNull*/ Model root) {
Ed Willink03e4d682015-04-25 17:57:56 +0100122 var pkge2primitiveTypes = root.getSortedPrimitiveTypes();
123 if (pkge2primitiveTypes.isEmpty()) return "";
124 var sortedPackages = root.getSortedPackages(pkge2primitiveTypes.keySet());
125 '''
126 «FOR pkge : sortedPackages»
127
Ed Willink4607e9a2016-01-13 13:01:29 +0000128 «FOR type : ClassUtil.nullFree(pkge2primitiveTypes.get(pkge))»
Ed Willink758e2652022-03-02 07:49:56 +0000129 private final @NonNull Class «type.getPrefixedSymbolNameWithoutNormalization("_" + type.partialName())» = createPrimitiveType("«type.name»");
Ed Willink03e4d682015-04-25 17:57:56 +0100130 «ENDFOR»
Ed.Willinka820ebe2013-10-02 13:55:59 -0400131 «ENDFOR»
132 '''
133 }
134
Ed Willink70051092015-12-23 19:11:07 +0000135 protected def String declareTupleTypes(/*@NonNull*/ Model root) {
Ed Willinka32c4042015-04-27 15:34:47 +0100136 var tupleTypes = root.getSortedTupleTypes();
137 if (tupleTypes.isEmpty()) return "";
Ed Willink03e4d682015-04-25 17:57:56 +0100138 '''
139
Ed Willinka32c4042015-04-27 15:34:47 +0100140 «FOR type : tupleTypes»
Ed Willinkcdac4962014-08-11 10:10:17 +0100141 private final @NonNull TupleType «type.getPrefixedSymbolName("_" + type.partialName())» = createTupleType("«type.name»",
Ed.Willinka820ebe2013-10-02 13:55:59 -0400142 «FOR property : type.getSortedTupleParts() BEFORE ("\t") SEPARATOR (",\n\t")»
143 createProperty("«property.name»", «property.type.getSymbolName()»)«ENDFOR»);
144 «ENDFOR»
145 '''
146 }
147
Ed Willink70051092015-12-23 19:11:07 +0000148 protected def String defineCoercions(/*@NonNull*/ Model root) {
Ed Willink03e4d682015-04-25 17:57:56 +0100149 var allCoercions = root.getSortedCoercions();
150 if (allCoercions.isEmpty()) return "";
Ed Willink31c9fc72014-12-08 20:03:58 +0000151 '''
Ed Willink03e4d682015-04-25 17:57:56 +0100152
Ed Willink31c9fc72014-12-08 20:03:58 +0000153 private void installCoercions() {
154 List<Operation> ownedCoercions;
155 Operation coercion;
156 «FOR type : allCoercions.getSortedOwningTypes()»
157 ownedCoercions = «type.getSymbolName()».getCoercions();
158 «FOR coercion : (type as PrimitiveType).getSortedCoercions(allCoercions)»
159 ownedCoercions.add(coercion = «coercion.getSymbolName()»);
Ed Willink01526762018-01-13 16:50:52 +0000160 «IF coercion.bodyExpression !== null»
Ed Willinkd73f3ad2021-08-28 11:40:58 +0100161 createBodyExpression(operation, «coercion.type.getSymbolName()», "«coercion.bodyExpression.javaString()»");
Ed Willink31c9fc72014-12-08 20:03:58 +0000162 «ENDIF»
163 «ENDFOR»
164 «ENDFOR»
165 }
166 '''
167 }
168
Ed Willink70051092015-12-23 19:11:07 +0000169 protected def String defineClassTypes(/*@NonNull*/ Model root) {
Ed Willink03e4d682015-04-25 17:57:56 +0100170 var pkge2classTypes = root.getSortedClassTypes();
171 if (pkge2classTypes.isEmpty()) return "";
172 var sortedPackages = root.getSortedPackages(pkge2classTypes.keySet());
Ed.Willinka820ebe2013-10-02 13:55:59 -0400173 '''
Ed Willink03e4d682015-04-25 17:57:56 +0100174
175 private void installClassTypes() {
176 List<Class> ownedClasses;
Ed Willink0ef69f02014-08-05 18:04:57 +0100177 List<Class> superClasses;
Ed Willink03e4d682015-04-25 17:57:56 +0100178 Class type;
179 «FOR pkge : sortedPackages»
180
Ed Willinke96c7cd2022-08-24 08:25:49 +0100181 ownedClasses = «pkge.getSymbolName()».getOwnedClasses();
182 «FOR type : ClassUtil.nullFree(pkge2classTypes.get(pkge))»«var templateSignature = type.getOwnedSignature()»
183 type = «type.getSymbolName()»;
184 «IF type.isAbstract»
185 type.setIsAbstract(true);
186 «ENDIF»
187 «IF !(type instanceof AnyType)»
188 «type.emitSuperClasses("type")»
189 «ENDIF»
190 «IF templateSignature !== null»«IF templateSignature.getOwnedParameters().size() > 0»
191 createTemplateSignature(type, «FOR templateParameter : templateSignature.getOwnedParameters() SEPARATOR(", ")»«templateParameter.getSymbolName()»«ENDFOR»);
192 «ENDIF»
193 «ENDIF»
194 ownedClasses.add(type);
195 «ENDFOR»
Ed Willink03e4d682015-04-25 17:57:56 +0100196 «ENDFOR»
Ed.Willinka820ebe2013-10-02 13:55:59 -0400197 }
198 '''
199 }
200
Ed Willink70051092015-12-23 19:11:07 +0000201 protected def String defineCollectionTypes(/*@NonNull*/ Model root) {
Ed Willink8687e312017-07-19 13:38:32 +0200202 // FIXME Probably need to interleave all specialized types in reverse dependency order
Ed Willink03e4d682015-04-25 17:57:56 +0100203 var pkge2collectionTypes = root.getSortedCollectionTypes();
204 if (pkge2collectionTypes.isEmpty()) return "";
205 var sortedPackages = root.getSortedPackages(pkge2collectionTypes.keySet());
Ed.Willinka820ebe2013-10-02 13:55:59 -0400206 '''
Ed Willink03e4d682015-04-25 17:57:56 +0100207
208 private void installCollectionTypes() {
209 List<Class> ownedClasses;
210 List<Class> superClasses;
211 CollectionType type;
212 «FOR pkge : sortedPackages»
213
214 ownedClasses = «pkge.getSymbolName()».getOwnedClasses();
Ed Willink4607e9a2016-01-13 13:01:29 +0000215 «FOR type : ClassUtil.nullFree(pkge2collectionTypes.get(pkge))»
Ed Willink5e349ab2022-07-14 18:04:50 +0100216 type = «type.getSymbolName()»;
Ed Willinka28e82f2017-08-11 10:33:34 +0100217 «IF type.isAbstract»
218 type.setIsAbstract(true);
219 «ENDIF»
220 «IF type.lower.intValue() != 0»
221 type.setLower(«type.lower.intValue()»);
222 «ENDIF»
223 «IF !(type.upper instanceof Unlimited)»
224 type.setUpper(«type.upper.intValue()»);
Ed Willink4f1f4a82016-02-24 10:52:50 +0000225 «ENDIF»
Ed Willinkc7c09162015-05-15 15:56:36 +0100226 «IF type.isNullFree»
227 type.setIsNullFree(true);
228 «ENDIF»
Ed Willink03e4d682015-04-25 17:57:56 +0100229 «type.emitSuperClasses("type")»
Ed Willink5e349ab2022-07-14 18:04:50 +0100230 ownedClasses.add(type);
Ed Willink03e4d682015-04-25 17:57:56 +0100231 «ENDFOR»
232 «ENDFOR»
233 }
234 '''
235 }
236
Ed Willink70051092015-12-23 19:11:07 +0000237 protected def String defineComments(/*@NonNull*/ Model root) {
Ed Willink03e4d682015-04-25 17:57:56 +0100238 '''
239
Ed Willinkcdac4962014-08-11 10:10:17 +0100240 private void installComments() {
Ed Willink03e4d682015-04-25 17:57:56 +0100241 «FOR pElement : root.getSortedCommentedElements()»
Ed.Willinka820ebe2013-10-02 13:55:59 -0400242 «FOR pComment : pElement.getSortedComments()»
243 installComment(«pElement.getSymbolName()», "«pComment.javaString()»");
244 «ENDFOR»
245 «ENDFOR»
246 }
247 '''
248 }
249
Ed Willink70051092015-12-23 19:11:07 +0000250 protected def String defineEnumerations(/*@NonNull*/ Model root) {
Ed Willink03e4d682015-04-25 17:57:56 +0100251 var pkge2enumerations = root.getSortedEnumerations();
252 if (pkge2enumerations.isEmpty()) return "";
253 var sortedPackages = root.getSortedPackages(pkge2enumerations.keySet());
Ed.Willinka820ebe2013-10-02 13:55:59 -0400254 '''
Ed Willink03e4d682015-04-25 17:57:56 +0100255
Ed Willinkcdac4962014-08-11 10:10:17 +0100256 private void installEnumerations() {
Ed Willink03e4d682015-04-25 17:57:56 +0100257 List<Class> ownedClasses;
Ed.Willinka820ebe2013-10-02 13:55:59 -0400258 Enumeration type;
259 List<EnumerationLiteral> enumerationLiterals;
Ed Willink03e4d682015-04-25 17:57:56 +0100260 «FOR pkge : sortedPackages»
261
262 ownedClasses = «pkge.getSymbolName()».getOwnedClasses();
Ed Willink4607e9a2016-01-13 13:01:29 +0000263 «FOR enumeration : ClassUtil.nullFree(pkge2enumerations.get(pkge))»
Ed Willink5e349ab2022-07-14 18:04:50 +0100264 type = «enumeration.getSymbolName()»;
Ed Willink03e4d682015-04-25 17:57:56 +0100265 enumerationLiterals = type.getOwnedLiterals();
266 «FOR enumerationLiteral : enumeration.ownedLiterals»
267 enumerationLiterals.add(«enumerationLiteral.getSymbolName()»);
268 «ENDFOR»
Ed Willinkb626c232019-10-24 10:17:54 +0100269 type.getSuperClasses().add(_OclEnumeration);
Ed Willink5e349ab2022-07-14 18:04:50 +0100270 ownedClasses.add(type);
Ed.Willinka820ebe2013-10-02 13:55:59 -0400271 «ENDFOR»
Ed.Willinka820ebe2013-10-02 13:55:59 -0400272 «ENDFOR»
273 }
274 '''
275 }
276
Ed Willink70051092015-12-23 19:11:07 +0000277 protected def String defineExternals(/*@NonNull*/ Model root) {
Ed Willink03e4d682015-04-25 17:57:56 +0100278 var externals = root.getSortedExternals();
279 if (externals.isEmpty()) return "";
Ed Willink3935bde2015-04-24 19:36:13 +0100280 '''
Ed Willinka32c4042015-04-27 15:34:47 +0100281
Ed Willink4607e9a2016-01-13 13:01:29 +0000282 «FOR name : externals»«var element = ClassUtil.nonNullState(name2external.get(name))»
Ed Willinka32c4042015-04-27 15:34:47 +0100283 «IF element instanceof Package»
284 private final @NonNull Package «getPrefixedSymbolName(element, name)» = «element.getExternalReference()»;
Ed Willink758e2652022-03-02 07:49:56 +0000285 «ELSEIF element instanceof PrimitiveType»
286 private final @NonNull Class «getPrefixedSymbolName(element, name)» = «element.getExternalReference()»;
Ed Willinka32c4042015-04-27 15:34:47 +0100287 «ELSE»
288 private final @NonNull «element.eClass().getName()» «getPrefixedSymbolName(element, name)» = «element.getExternalReference()»;
289 «ENDIF»
Ed Willink3935bde2015-04-24 19:36:13 +0100290 «ENDFOR»
291 '''
292 }
293
Ed Willink70051092015-12-23 19:11:07 +0000294 protected def String defineIterations(/*@NonNull*/ Model root) {
Ed Willink03e4d682015-04-25 17:57:56 +0100295 var pkge2iterations = root.getSortedIterations();
296 if (pkge2iterations.isEmpty()) return "";
297 var sortedPackages = root.getSortedPackages(pkge2iterations.keySet());
298 var Class oldType = null;
Ed.Willinka820ebe2013-10-02 13:55:59 -0400299 '''
Ed.Willinka820ebe2013-10-02 13:55:59 -0400300
Ed Willink03e4d682015-04-25 17:57:56 +0100301 «FOR pkge : sortedPackages»
Ed Willink4607e9a2016-01-13 13:01:29 +0000302 «FOR iteration : ClassUtil.nullFree(pkge2iterations.get(pkge))»
Ed Willink03e4d682015-04-25 17:57:56 +0100303 private final @NonNull Iteration «iteration.getPrefixedSymbolName("it_" + iteration.partialName())» = createIteration("«iteration.
Ed Willink01526762018-01-13 16:50:52 +0000304 name»", «iteration.type.getSymbolName()», «IF iteration.implementationClass !== null»"«iteration.
305 implementationClass»", «iteration.implementationClass».INSTANCE«ELSE»null, null«ENDIF»«IF iteration.getOwnedSignature() !== null»«FOR templateParameter : iteration.getOwnedSignature().getOwnedParameters()», «templateParameter.getSymbolName()»«ENDFOR»«ENDIF»);
Ed Willink03e4d682015-04-25 17:57:56 +0100306 «ENDFOR»
307 «ENDFOR»
308
Ed Willinkcdac4962014-08-11 10:10:17 +0100309 private void installIterations() {
Ed.Willinka820ebe2013-10-02 13:55:59 -0400310 List<Operation> ownedIterations;
311 List<Parameter> ownedParameters;
312 Iteration iteration;
313 Parameter parameter;
Ed Willink03e4d682015-04-25 17:57:56 +0100314 «FOR pkge : sortedPackages»
Ed Willink4607e9a2016-01-13 13:01:29 +0000315 «FOR iteration : ClassUtil.nullFree(pkge2iterations.get(pkge))»«var newType = iteration.getOwningClass()»
Ed Willink03e4d682015-04-25 17:57:56 +0100316 «IF newType != oldType»
317
318 ownedIterations = «(oldType = newType).getSymbolName()».getOwnedOperations();
319 «ENDIF»
320 ownedIterations.add(iteration = «iteration.getSymbolName()»);
321 «IF iteration.isInvalidating»
322 iteration.setIsInvalidating(true);
323 «ENDIF»
324 «IF !iteration.isRequired»
325 iteration.setIsRequired(false);
326 «ENDIF»
327 «IF iteration.isStatic»
328 iteration.setIsStatic(true);
329 «ENDIF»
330 «IF iteration.isTypeof»
331 iteration.setIsTypeof(true);
332 «ENDIF»
333 «IF iteration.isValidating»
334 iteration.setIsValidating(true);
335 «ENDIF»
336 «IF iteration.ownedIterators.size() > 0»
337 ownedParameters = iteration.getOwnedIterators();
338 «FOR parameter : iteration.ownedIterators»
339 ownedParameters.add(parameter = createParameter("«parameter.name»", «parameter.type.getSymbolName()», «parameter.isRequired»));
340 «IF parameter.isTypeof»
341 parameter.setIsTypeof(true);
342 «ENDIF»
343 «ENDFOR»
344 «ENDIF»
345 «IF iteration.ownedAccumulators.size() > 0»
346 ownedParameters = iteration.getOwnedAccumulators();
347 «FOR parameter : iteration.ownedAccumulators»
348 ownedParameters.add(parameter = createParameter("«parameter.name»", «parameter.type.getSymbolName()», «parameter.isRequired»));
349 «IF parameter.isTypeof»
350 parameter.setIsTypeof(true);
351 «ENDIF»
352 «ENDFOR»
353 «ENDIF»
354 «IF iteration.ownedParameters.size() > 0»
355 ownedParameters = iteration.getOwnedParameters();
356 «FOR parameter : iteration.ownedParameters»
357 ownedParameters.add(parameter = createParameter("«parameter.name»", «parameter.type.getSymbolName()», «parameter.isRequired»));
358 «IF parameter.isTypeof»
359 parameter.setIsTypeof(true);
360 «ENDIF»
361 «ENDFOR»
362 «ENDIF»
Ed.Willinka820ebe2013-10-02 13:55:59 -0400363 «ENDFOR»
364 «ENDFOR»
365 }
366 '''
367 }
368
Ed Willink70051092015-12-23 19:11:07 +0000369 protected def String defineLambdaTypes(/*@NonNull*/ Model root) {
Ed Willink03e4d682015-04-25 17:57:56 +0100370 var allLambdaTypes = root.getSortedLambdaTypes();
371 if (allLambdaTypes.isEmpty()) return "";
372 var orphanPackage = root.getOrphanPackage();
Ed Willink01526762018-01-13 16:50:52 +0000373 if (orphanPackage === null) return "";
Ed.Willinka820ebe2013-10-02 13:55:59 -0400374 '''
Ed Willink03e4d682015-04-25 17:57:56 +0100375
Ed.Willinka820ebe2013-10-02 13:55:59 -0400376 «FOR type : allLambdaTypes»
Ed Willinkcdac4962014-08-11 10:10:17 +0100377 private final @NonNull LambdaType «type.getPrefixedSymbolName("_" + type.partialName())» = createLambdaType("«type.
Ed.Willinka820ebe2013-10-02 13:55:59 -0400378 name»");
379 «ENDFOR»
380
Ed Willinkcdac4962014-08-11 10:10:17 +0100381 private void installLambdaTypes() {
Ed Willinkf57d9712015-05-01 12:09:16 +0100382 final List<Class> orphanTypes = «ClassUtil.nonNullState(orphanPackage).getSymbolName()».getOwnedClasses();
Ed.Willinka820ebe2013-10-02 13:55:59 -0400383 LambdaType type;
Ed Willink0ef69f02014-08-05 18:04:57 +0100384 List<Class> superClasses;
Ed.Willinka820ebe2013-10-02 13:55:59 -0400385 «FOR type : allLambdaTypes»
386 orphanTypes.add(type = «type.getSymbolName()»);
387 type.setContextType(«type.contextType.getSymbolName()»);
388 «FOR parameterType : type.parameterType»
389 type.getParameterType().add(«parameterType.getSymbolName()»);
390 «ENDFOR»
391 type.setResultType(«type.resultType.getSymbolName()»);
Ed Willink826c1c42014-08-10 19:46:07 +0100392 «type.emitSuperClasses("type")»
Ed.Willinka820ebe2013-10-02 13:55:59 -0400393 «ENDFOR»
394 }
395 '''
396 }
397
Ed Willink70051092015-12-23 19:11:07 +0000398 protected def String defineMapTypes(/*@NonNull*/ Model root) {
Ed Willink03e4d682015-04-25 17:57:56 +0100399 var pkge2mapTypes = root.getSortedMapTypes();
400 if (pkge2mapTypes.isEmpty()) return "";
401 var sortedPackages = root.getSortedPackages(pkge2mapTypes.keySet());
Ed Willink6489b072015-03-22 12:45:19 +0000402 '''
Ed Willink03e4d682015-04-25 17:57:56 +0100403
Ed Willink6489b072015-03-22 12:45:19 +0000404 private void installMapTypes() {
Ed Willink03e4d682015-04-25 17:57:56 +0100405 List<Class> ownedClasses;
406 List<Class> superClasses;
Ed Willink6489b072015-03-22 12:45:19 +0000407 MapType type;
Ed Willink03e4d682015-04-25 17:57:56 +0100408 «FOR pkge : sortedPackages»
Ed Willink6489b072015-03-22 12:45:19 +0000409
Ed Willink03e4d682015-04-25 17:57:56 +0100410 ownedClasses = «pkge.getSymbolName()».getOwnedClasses();
Ed Willink4607e9a2016-01-13 13:01:29 +0000411 «FOR type : ClassUtil.nullFree(pkge2mapTypes.get(pkge))»
Ed Willink5e349ab2022-07-14 18:04:50 +0100412 type = «type.getSymbolName()»;
Ed Willink2de16e42022-08-24 16:49:55 +0100413 «IF !type.keysAreNullFree»
414 type.setKeysAreNullFree(false);
415 «ENDIF»
416 «IF !type.valuesAreNullFree»
417 type.setValuesAreNullFree(false);
418 «ENDIF»
Ed Willink826c1c42014-08-10 19:46:07 +0100419 «type.emitSuperClasses("type")»
Ed Willink5e349ab2022-07-14 18:04:50 +0100420 ownedClasses.add(type);
Ed.Willinka820ebe2013-10-02 13:55:59 -0400421 «ENDFOR»
422 «ENDFOR»
423 }
424 '''
425 }
426
Ed Willink70051092015-12-23 19:11:07 +0000427 protected def String defineOperations(/*@NonNull*/ Model root) {
Ed Willink03e4d682015-04-25 17:57:56 +0100428 var pkge2operations = root.getSortedOperations();
429 if (pkge2operations.isEmpty()) return "";
430 var sortedPackages = root.getSortedPackages(pkge2operations.keySet());
431 var Class oldType = null;
Ed.Willinka820ebe2013-10-02 13:55:59 -0400432 '''
Ed.Willinka820ebe2013-10-02 13:55:59 -0400433
Ed Willink03e4d682015-04-25 17:57:56 +0100434 «FOR pkge : sortedPackages»
Ed Willink4607e9a2016-01-13 13:01:29 +0000435 «FOR operation : ClassUtil.nullFree(pkge2operations.get(pkge))»
Ed Willinkd73f3ad2021-08-28 11:40:58 +0100436 private final @NonNull Operation «operation.getPrefixedSymbolName("op_" + operation.partialName())» = createOperation(«operation.
437 getNameLiteral()», «operation.type.getSymbolName()», «IF operation.implementationClass !== null»"«operation.
Ed Willink01526762018-01-13 16:50:52 +0000438 implementationClass»", «operation.implementationClass».INSTANCE«ELSE»null, null«ENDIF»«IF operation.getOwnedSignature() !== null»«FOR templateParameter : operation.getOwnedSignature().getOwnedParameters()», «templateParameter.getSymbolName()»«ENDFOR»«ENDIF»);
Ed Willink03e4d682015-04-25 17:57:56 +0100439 «ENDFOR»
440 «ENDFOR»
441
442 private void installOperations() {
443 List<Operation> ownedOperations;
444 List<Parameter> ownedParameters;
445 Operation operation;
446 Parameter parameter;
447 «FOR pkge : sortedPackages»
Ed Willink4607e9a2016-01-13 13:01:29 +0000448 «FOR operation : ClassUtil.nullFree(pkge2operations.get(pkge))»«var newType = operation.getOwningClass()»
Ed Willink03e4d682015-04-25 17:57:56 +0100449 «IF newType != oldType»
450
451 ownedOperations = «(oldType = newType).getSymbolName()».getOwnedOperations();
452 «ENDIF»
453 ownedOperations.add(operation = «operation.getSymbolName()»);
454 «IF operation.isInvalidating»
455 operation.setIsInvalidating(true);
456 «ENDIF»
457 «IF !operation.isRequired»
458 operation.setIsRequired(false);
459 «ENDIF»
460 «IF operation.isStatic»
461 operation.setIsStatic(true);
462 «ENDIF»
463 «IF operation.isTypeof»
464 operation.setIsTypeof(true);
465 «ENDIF»
466 «IF operation.isValidating»
467 operation.setIsValidating(true);
468 «ENDIF»
Ed Willink01526762018-01-13 16:50:52 +0000469 «IF operation.bodyExpression !== null»
Ed Willinkd73f3ad2021-08-28 11:40:58 +0100470 createBodyExpression(operation, «operation.owningClass.getSymbolName()», "«operation.bodyExpression.javaString()»", «operation.type.getSymbolName()»);
Ed Willink03e4d682015-04-25 17:57:56 +0100471 «ENDIF»
472 «IF operation.ownedParameters.size() > 0»
473 ownedParameters = operation.getOwnedParameters();
474 «FOR parameter : operation.ownedParameters»
475 ownedParameters.add(parameter = createParameter("«parameter.name»", «parameter.type.getSymbolName()», «parameter.isRequired»));
476 «IF parameter.isTypeof»
477 parameter.setIsTypeof(true);
478 «ENDIF»
479 «ENDFOR»
480 «ENDIF»
481 «ENDFOR»
482 «ENDFOR»
483 }
484 '''
485 }
486
Ed Willink70051092015-12-23 19:11:07 +0000487 protected def String definePackages(/*@NonNull*/ Model root) {
Ed Willink03e4d682015-04-25 17:57:56 +0100488 var allPackages = root.getSortedPackages();
Ed Willink41636df2015-05-03 11:22:31 +0100489 var import2alias = root.getSortedImports();
490 var importKeys = new ArrayList<Package>(import2alias.keySet());
Ed Willinke96c7cd2022-08-24 08:25:49 +0100491 Collections.sort(importKeys, NameUtil.NAMEABLE_COMPARATOR);
Ed Willink03e4d682015-04-25 17:57:56 +0100492 if (allPackages.isEmpty()) return "";
493 '''
494
Ed Willinkcdac4962014-08-11 10:10:17 +0100495 private void installPackages() {
Ed Willink03e4d682015-04-25 17:57:56 +0100496 «emitRoot(root)»
Ed.Willinka820ebe2013-10-02 13:55:59 -0400497 «IF allPackages.size() > 0»
498 «FOR pkg2 : allPackages»
499 «emitPackage(pkg2)»
500 «ENDFOR»
501 «ENDIF»
Ed Willink41636df2015-05-03 11:22:31 +0100502 «FOR importKey : importKeys»«val importName = import2alias.get(importKey)»
Ed Willink01526762018-01-13 16:50:52 +0000503 «root.getSymbolName()».getOwnedImports().add(createImport(«IF importName !== null»"«importName»"«ELSE»null«ENDIF», «importKey.getSymbolName()»));
Ed Willink41636df2015-05-03 11:22:31 +0100504 «ENDFOR»
Ed.Willinka820ebe2013-10-02 13:55:59 -0400505 }
506 '''
507 }
508
Ed Willink03e4d682015-04-25 17:57:56 +0100509 protected def String definePrecedences(Model root) {
510 var allLibraries = root.getSortedLibrariesWithPrecedence();
511 var allOperations = root.getSortedOperationsWithPrecedence();
Ed.Willinka820ebe2013-10-02 13:55:59 -0400512 '''
Ed Willink03e4d682015-04-25 17:57:56 +0100513 «IF (allLibraries.size() > 0) || (allOperations.size() > 0)»
Ed.Willinka820ebe2013-10-02 13:55:59 -0400514
Ed Willinkcdac4962014-08-11 10:10:17 +0100515 private void installPrecedences() {
Ed Willink03e4d682015-04-25 17:57:56 +0100516 «IF allLibraries.size() > 0»
517 List<Precedence> ownedPrecedences;
518
519 «FOR lib : allLibraries»
Ed.Willinka820ebe2013-10-02 13:55:59 -0400520 «var allPrecedences = lib.getSortedPrecedences()»
Ed Willink01526762018-01-13 16:50:52 +0000521 «IF (allPrecedences !== null) && (allPrecedences.size() > 0)»
Ed Willink3935bde2015-04-24 19:36:13 +0100522 «FOR precedence : allPrecedences»
523 final Precedence «precedence.getPrefixedSymbolName("prec_" + precedence.partialName())» = createPrecedence("«precedence.name»", AssociativityKind.«precedence.associativity.toString().toUpperCase()»);
524 «ENDFOR»
Ed.Willinka820ebe2013-10-02 13:55:59 -0400525
Ed Willink03e4d682015-04-25 17:57:56 +0100526 ownedPrecedences = «lib.getSymbolName()».getOwnedPrecedences();
Ed Willink3935bde2015-04-24 19:36:13 +0100527 «FOR precedence : lib.ownedPrecedences»
528 ownedPrecedences.add(«precedence.getSymbolName()»);
529 «ENDFOR»
530 «ENDIF»
Ed Willink03e4d682015-04-25 17:57:56 +0100531 «ENDFOR»
532 «ENDIF»
Ed.Willinka820ebe2013-10-02 13:55:59 -0400533
534 «FOR operation : allOperations»
535 «operation.getSymbolName()».setPrecedence(«operation.precedence.getSymbolName()»);
536 «ENDFOR»
537 }
538 «ENDIF»
539 '''
540 }
541
Ed Willink70051092015-12-23 19:11:07 +0000542 protected def String definePrimitiveTypes(/*@NonNull*/ Model root) {
Ed Willink03e4d682015-04-25 17:57:56 +0100543 var pkge2primitiveTypes = root.getSortedPrimitiveTypes();
544 if (pkge2primitiveTypes.isEmpty()) return "";
545 var sortedPackages = root.getSortedPackages(pkge2primitiveTypes.keySet());
Ed.Willinka820ebe2013-10-02 13:55:59 -0400546 '''
Ed Willink03e4d682015-04-25 17:57:56 +0100547
Ed Willinkcdac4962014-08-11 10:10:17 +0100548 private void installPrimitiveTypes() {
Ed Willink03e4d682015-04-25 17:57:56 +0100549 List<Class> ownedClasses;
Ed.Willinka820ebe2013-10-02 13:55:59 -0400550 PrimitiveType type;
Ed Willink03e4d682015-04-25 17:57:56 +0100551 «FOR pkge : sortedPackages»
552
553 ownedClasses = «pkge.getSymbolName()».getOwnedClasses();
Ed Willink4607e9a2016-01-13 13:01:29 +0000554 «FOR type : ClassUtil.nullFree(pkge2primitiveTypes.get(pkge))»
Ed Willink03e4d682015-04-25 17:57:56 +0100555 «var superClasses = type.getSuperclassesInPackage()»
Ed Willink5e349ab2022-07-14 18:04:50 +0100556 type = «type.getSymbolNameWithoutNormalization()»;
Ed Willink03e4d682015-04-25 17:57:56 +0100557 «FOR superClass : superClasses»
558 type.getSuperClasses().add(«superClass.getSymbolName()»);
559 «ENDFOR»
Ed Willink5e349ab2022-07-14 18:04:50 +0100560 ownedClasses.add(type);
Ed.Willinka820ebe2013-10-02 13:55:59 -0400561 «ENDFOR»
562 «ENDFOR»
563 }
564 '''
565 }
566
Ed Willink70051092015-12-23 19:11:07 +0000567 protected def String defineProperties(/*@NonNull*/ Model root) {
Ed Willink03e4d682015-04-25 17:57:56 +0100568 var pkge2properties = root.getSortedProperties();
569 if (pkge2properties.isEmpty()) return "";
570 var sortedPackages = root.getSortedPackages(pkge2properties.keySet());
571 var Class oldType = null;
Ed.Willinka820ebe2013-10-02 13:55:59 -0400572 '''
Ed Willink03e4d682015-04-25 17:57:56 +0100573
Ed Willinkd73f3ad2021-08-28 11:40:58 +0100574 «FOR pkge : sortedPackages»
575
576 «FOR property : ClassUtil.nullFree(pkge2properties.get(pkge))»
577 private final @NonNull Property «property.getPrefixedSymbolName("pr_" + property.partialName())» = createProperty(«property.getNameLiteral()», «property.type.getSymbolName()»);
578 «ENDFOR»
579 «ENDFOR»
580
Ed Willinkcdac4962014-08-11 10:10:17 +0100581 private void installProperties() {
Ed.Willinka820ebe2013-10-02 13:55:59 -0400582 List<Property> ownedProperties;
583 Property property;
Ed Willink03e4d682015-04-25 17:57:56 +0100584 «FOR pkge : sortedPackages»
Ed Willink4607e9a2016-01-13 13:01:29 +0000585 «FOR property : ClassUtil.nullFree(pkge2properties.get(pkge))»«var newType = property.getOwningClass()»
Ed Willink03e4d682015-04-25 17:57:56 +0100586 «IF newType != oldType»
587
588 ownedProperties = «(oldType = newType).getSymbolName()».getOwnedProperties();
589 «ENDIF»
590 ownedProperties.add(property = «property.getSymbolName()»);
591 «IF property.isComposite»
592 property.setIsComposite(true);
593 «ENDIF»
594 «IF property.isDerived»
595 property.setIsDerived(true);
596 «ENDIF»
597 «IF property.isID»
598 property.setIsID(true);
599 «ENDIF»
600 «IF property.isImplicit»
601 property.setIsImplicit(true);
602 «ENDIF»
603 «IF property.isReadOnly»
604 property.setIsReadOnly(true);
605 «ENDIF»
606 «IF !property.isRequired»
607 property.setIsRequired(false);
608 «ENDIF»
609 «IF property.isResolveProxies»
610 property.setIsResolveProxies(true);
611 «ENDIF»
612 «IF property.isStatic»
613 property.setIsStatic(true);
614 «ENDIF»
615 «IF property.isTransient»
616 property.setIsTransient(true);
617 «ENDIF»
618 «IF false /*property.isTypeof*/»
619 property.setIsTypeof(true);
620 «ENDIF»
621 «IF property.isUnsettable»
622 property.setIsUnsettable(true);
623 «ENDIF»
624 «IF property.isVolatile»
625 property.setIsVolatile(true);
626 «ENDIF»
Ed Willink51430002019-06-02 14:25:13 +0100627 «IF property.defaultValueString !== null»
628 property.setDefaultValueString("«property.defaultValueString»");
629 «ENDIF»
Ed Willink01526762018-01-13 16:50:52 +0000630 «IF property.opposite !== null»
Ed Willink0eb01012015-04-29 11:05:28 +0100631 property.setOpposite(«property.opposite.getSymbolName()»);
Ed Willink03e4d682015-04-25 17:57:56 +0100632 «ENDIF»
Ed Willink01526762018-01-13 16:50:52 +0000633 «IF property.implementationClass !== null»
Ed Willink03e4d682015-04-25 17:57:56 +0100634 property.setImplementationClass("«property.implementationClass»");
635 property.setImplementation(«property.implementationClass».INSTANCE);
636 «ENDIF»
Ed.Willinka820ebe2013-10-02 13:55:59 -0400637 «ENDFOR»
638 «ENDFOR»
639 }
640 '''
641 }
642
Ed Willink70051092015-12-23 19:11:07 +0000643 protected def String defineTemplateBindings(/*@NonNull*/ Model root) {
Ed Willink88131042016-01-14 11:42:58 +0000644 var allTemplateableElements = root.getSortedTemplateableElements(symbolNameComparator);
Ed Willink03e4d682015-04-25 17:57:56 +0100645 if (allTemplateableElements.isEmpty()) return "";
Ed.Willinka820ebe2013-10-02 13:55:59 -0400646 '''
Ed Willink03e4d682015-04-25 17:57:56 +0100647
Ed Willinkcdac4962014-08-11 10:10:17 +0100648 private void installTemplateBindings() {
Ed.Willinka820ebe2013-10-02 13:55:59 -0400649 «FOR templateableElement : allTemplateableElements»
Ed Willink3b596462014-12-21 09:15:39 +0000650 «FOR templateBinding : templateableElement.ownedBindings»
Ed Willinka2b9f0c2017-07-20 09:46:14 +0200651 «FOR templateParameterSubstitution : templateBinding.ownedSubstitutions»
652 addBinding(«templateableElement.getSymbolName()», «templateParameterSubstitution.actual.getSymbolName()»);
653 «ENDFOR»
Ed.Willinka820ebe2013-10-02 13:55:59 -0400654 «ENDFOR»
655 «ENDFOR»
656 }
657 '''
658 }
659
Ed Willink70051092015-12-23 19:11:07 +0000660 protected def String defineTemplateParameters(/*@NonNull*/ Model root) {
Ed Willink03e4d682015-04-25 17:57:56 +0100661 var allTemplateParameters = root.getSortedTemplateParameters();
662 if (allTemplateParameters.isEmpty()) return "";
Ed.Willinka820ebe2013-10-02 13:55:59 -0400663 '''
Ed Willink03e4d682015-04-25 17:57:56 +0100664
Ed.Willinka820ebe2013-10-02 13:55:59 -0400665 «FOR templateParameter : allTemplateParameters»
Ed Willinkcdac4962014-08-11 10:10:17 +0100666 private final @NonNull TemplateParameter «templateParameter.getPrefixedSymbolName(
Ed Willinkf549df72015-04-08 13:49:38 +0100667 "tp_" + templateParameter.partialName())» = createTemplateParameter("«templateParameter.getName()»");
Ed.Willinka820ebe2013-10-02 13:55:59 -0400668 «ENDFOR»
Ed Willink826c1c42014-08-10 19:46:07 +0100669 '''
670 }
671
Ed Willink70051092015-12-23 19:11:07 +0000672 protected def String defineTupleTypes(/*@NonNull*/ Model root) {
Ed Willink03e4d682015-04-25 17:57:56 +0100673 var allTupleTypes = root.getSortedTupleTypes();
674 if (allTupleTypes.isEmpty()) return "";
675 var orphanPackage = root.getOrphanPackage();
Ed Willink01526762018-01-13 16:50:52 +0000676 if (orphanPackage === null) return "";
Ed.Willinka820ebe2013-10-02 13:55:59 -0400677 '''
Ed Willink03e4d682015-04-25 17:57:56 +0100678
Ed Willinkcdac4962014-08-11 10:10:17 +0100679 private void installTupleTypes() {
Ed Willinkf57d9712015-05-01 12:09:16 +0100680 final List<Class> orphanTypes = «ClassUtil.nonNullState(orphanPackage).getSymbolName()».getOwnedClasses();
Ed.Willinka820ebe2013-10-02 13:55:59 -0400681 TupleType type;
Ed Willink0ef69f02014-08-05 18:04:57 +0100682 List<Class> superClasses;
Ed.Willinka820ebe2013-10-02 13:55:59 -0400683 «FOR type : allTupleTypes»
684 orphanTypes.add(type = «type.getSymbolName()»);
685 «FOR property : type.getSortedProperties()»
Ed Willink01526762018-01-13 16:50:52 +0000686 «IF property.implementationClass !== null»
Ed.Willinka820ebe2013-10-02 13:55:59 -0400687 «property.getSymbolName()».setImplementationClass("«property.implementationClass»");
688 «property.getSymbolName()».setImplementation(«property.implementationClass».INSTANCE);
689 «ENDIF»
690 «ENDFOR»
Ed Willink826c1c42014-08-10 19:46:07 +0100691 «type.emitSuperClasses("type")»
Ed.Willinka820ebe2013-10-02 13:55:59 -0400692 «ENDFOR»
693 }
694 '''
695 }
696
697 protected def String emitCreateProperty(Property property) {
698 return "createProperty(" + property.name + ", " + property.type.getSymbolName() + ")";
699 }
700
Ed Willink1b14e452014-08-05 18:07:10 +0100701 protected def String emitPackage(Package pkg) {
Ed.Willinka820ebe2013-10-02 13:55:59 -0400702 '''
703 «FOR nestedPackage : pkg.getSortedPackages()»
Ed Willink54d7d8a2014-08-08 09:27:40 +0100704 «IF nestedPackage.getOwnedPackages().size() > 0»
Ed.Willinka820ebe2013-10-02 13:55:59 -0400705 «emitPackage(nestedPackage)»
706 «ENDIF»
Ed Willink54d7d8a2014-08-08 09:27:40 +0100707 «pkg.getSymbolName()».getOwnedPackages().add(«nestedPackage.getSymbolName()»);
Ed.Willinka820ebe2013-10-02 13:55:59 -0400708 «ENDFOR»
709 '''
710 }
711
Ed Willink0e60b0a2014-09-23 07:02:53 +0100712 protected def String emitRoot(Model pkg) {
Ed.Willinka820ebe2013-10-02 13:55:59 -0400713 '''
714 «FOR nestedPackage : pkg.getSortedPackages()»
Ed Willink54d7d8a2014-08-08 09:27:40 +0100715 «IF nestedPackage.getOwnedPackages().size() > 0»
Ed.Willinka820ebe2013-10-02 13:55:59 -0400716 «emitPackage(nestedPackage)»
717 «ENDIF»
Ed Willink54d7d8a2014-08-08 09:27:40 +0100718 «pkg.getSymbolName()».getOwnedPackages().add(«nestedPackage.getSymbolName()»);
Ed.Willinka820ebe2013-10-02 13:55:59 -0400719 «ENDFOR»
720 '''
721 }
722
Ed Willink826c1c42014-08-10 19:46:07 +0100723 protected def String emitSuperClasses(Class type, String typeName) {
Ed.Willinka820ebe2013-10-02 13:55:59 -0400724 var superClasses = type.getSuperclassesInPackage();
725 '''
726 «IF superClasses.size() > 0»
Ed Willink826c1c42014-08-10 19:46:07 +0100727 superClasses = «typeName».getSuperClasses();
Ed.Willinka820ebe2013-10-02 13:55:59 -0400728 «FOR superClass : superClasses»
729 superClasses.add(«superClass.getSymbolName()»);
730 «ENDFOR»
Ed Willink6489b072015-03-22 12:45:19 +0000731 «ELSEIF (type instanceof MapType)»
Ed Willink826c1c42014-08-10 19:46:07 +0100732 superClasses = «typeName».getSuperClasses();
Ed.Willink61f76212013-10-12 22:01:03 +0100733 superClasses.add(_OclAny);
Ed Willinkbd9d4b62019-05-30 11:00:48 +0100734 «ELSEIF (type instanceof AnyType)»
Ed Willinke96c7cd2022-08-24 08:25:49 +0100735 «ELSEIF TypeId.OCL_ELEMENT_NAME.equals(type.getName())»
736 «ELSEIF PivotConstants.ORPHANAGE_NAME.equals(type.getName())»
Ed Willinkbd9d4b62019-05-30 11:00:48 +0100737 «ELSE»
Ed Willink826c1c42014-08-10 19:46:07 +0100738 superClasses = «typeName».getSuperClasses();
Ed.Willinka820ebe2013-10-02 13:55:59 -0400739 superClasses.add(_OclElement);
740 «ENDIF»
741 '''
742 }
743
Ed Willink70051092015-12-23 19:11:07 +0000744 protected def String installClassTypes(/*@NonNull*/ Model root) {
Ed Willink03e4d682015-04-25 17:57:56 +0100745 var pkge2classTypes = root.getSortedClassTypes();
746 if (pkge2classTypes.isEmpty()) return "";
747 '''installClassTypes();'''
748 }
749
Ed Willinke96c7cd2022-08-24 08:25:49 +0100750 protected def String installCoercions(/*@NonNull*/ Model root) {
751 var allCoercions = root.getSortedCoercions();
752 if (allCoercions.isEmpty()) return "";
753 '''installCoercions();'''
754 }
755
Ed Willink70051092015-12-23 19:11:07 +0000756 protected def String installCollectionTypes(/*@NonNull*/ Model root) {
Ed Willink03e4d682015-04-25 17:57:56 +0100757 var pkge2collectionTypes = root.getSortedCollectionTypes();
758 if (pkge2collectionTypes.isEmpty()) return "";
759 '''installCollectionTypes();'''
760 }
761
Ed Willink70051092015-12-23 19:11:07 +0000762 protected def String installComments(/*@NonNull*/ Model root) {
Ed Willink03e4d682015-04-25 17:57:56 +0100763 '''installComments();'''
764 }
765
Ed Willink70051092015-12-23 19:11:07 +0000766 protected def String installEnumerations(/*@NonNull*/ Model root) {
Ed Willink03e4d682015-04-25 17:57:56 +0100767 var pkge2enumerations = root.getSortedEnumerations();
768 if (pkge2enumerations.isEmpty()) return "";
769 '''installEnumerations();'''
770 }
771
Ed Willink70051092015-12-23 19:11:07 +0000772 protected def String installIterations(/*@NonNull*/ Model root) {
Ed Willink03e4d682015-04-25 17:57:56 +0100773 var pkge2iterations = root.getSortedIterations();
774 if (pkge2iterations.isEmpty()) return "";
775 '''installIterations();'''
776 }
777
Ed Willink70051092015-12-23 19:11:07 +0000778 protected def String installLambdaTypes(/*@NonNull*/ Model root) {
Ed Willink03e4d682015-04-25 17:57:56 +0100779 var allLambdaTypes = root.getSortedLambdaTypes();
780 if (allLambdaTypes.isEmpty()) return "";
781 '''installLambdaTypes();'''
782 }
783
Ed Willink70051092015-12-23 19:11:07 +0000784 protected def String installMapTypes(/*@NonNull*/ Model root) {
Ed Willink03e4d682015-04-25 17:57:56 +0100785 var pkge2mapTypes = root.getSortedMapTypes();
786 if (pkge2mapTypes.isEmpty()) return "";
787 '''installMapTypes();'''
788 }
789
Ed Willink70051092015-12-23 19:11:07 +0000790 protected def String installOperations(/*@NonNull*/ Model root) {
Ed Willink03e4d682015-04-25 17:57:56 +0100791 var pkge2operations = root.getSortedOperations();
792 if (pkge2operations.isEmpty()) return "";
793 '''installOperations();'''
794 }
795
Ed Willink70051092015-12-23 19:11:07 +0000796 protected def String installPackages(/*@NonNull*/ Model root) {
Ed Willink03e4d682015-04-25 17:57:56 +0100797 var allPackages = root.getSortedPackages();
798 if (allPackages.isEmpty()) return "";
799 '''installPackages();'''
800 }
801
Ed Willink70051092015-12-23 19:11:07 +0000802 protected def String installPrecedences(/*@NonNull*/ Model root) {
Ed Willink03e4d682015-04-25 17:57:56 +0100803 var allLibraries = root.getSortedLibrariesWithPrecedence();
804 var allOperations = root.getSortedOperationsWithPrecedence();
805 if (allLibraries.isEmpty() && allOperations.isEmpty()) return "";
806 '''installPrecedences();'''
807 }
808
Ed Willink70051092015-12-23 19:11:07 +0000809 protected def String installPrimitiveTypes(/*@NonNull*/ Model root) {
Ed Willink03e4d682015-04-25 17:57:56 +0100810 var pkge2primitiveTypes = root.getSortedPrimitiveTypes();
811 if (pkge2primitiveTypes.isEmpty()) return "";
812 '''installPrimitiveTypes();'''
813 }
814
Ed Willink70051092015-12-23 19:11:07 +0000815 protected def String installProperties(/*@NonNull*/ Model root) {
Ed Willink03e4d682015-04-25 17:57:56 +0100816 var pkge2properties = root.getSortedProperties();
817 if (pkge2properties.isEmpty()) return "";
818 '''installProperties();'''
819 }
820
Ed Willink70051092015-12-23 19:11:07 +0000821 protected def String installTemplateBindings(/*@NonNull*/ Model root) {
Ed Willinke96c7cd2022-08-24 08:25:49 +0100822 var allTemplateableElements = root.getSortedTemplateableElements();
Ed Willink03e4d682015-04-25 17:57:56 +0100823 if (allTemplateableElements.isEmpty()) return "";
824 '''installTemplateBindings();'''
825 }
826
Ed Willink70051092015-12-23 19:11:07 +0000827 protected def String installTupleTypes(/*@NonNull*/ Model root) {
Ed Willink03e4d682015-04-25 17:57:56 +0100828 var allTupleTypes = root.getSortedTupleTypes();
829 if (allTupleTypes.size() <= 0) return "";
830 '''installTupleTypes();'''
831 }
832
Ed Willinkcdac4962014-08-11 10:10:17 +0100833 /**
834 * Generate a name for element suitable for embedding in a surrounding punctuation context.
835 */
Ed Willinkf0dc8582014-01-03 18:26:51 +0000836 protected override String partialName(EObject element) {
Ed.Willinka820ebe2013-10-02 13:55:59 -0400837 switch element {
Ed Willink01526762018-01-13 16:50:52 +0000838 CollectionType case element.elementType === null: return element.javaName()
Ed Willinkcdac4962014-08-11 10:10:17 +0100839 CollectionType: return element.javaName()
Ed Willink01526762018-01-13 16:50:52 +0000840 LambdaType case element.contextType === null: return "null"
Ed.Willinka820ebe2013-10-02 13:55:59 -0400841 LambdaType: return element.javaName() + "_" + element.contextType.partialName()
Ed Willink01526762018-01-13 16:50:52 +0000842 MapType case element.keyType === null: return element.javaName()
843 MapType case element.valueType === null: return element.javaName()
Ed Willink6489b072015-03-22 12:45:19 +0000844 MapType: return element.javaName()
Ed Willink3b596462014-12-21 09:15:39 +0000845 Class case element.ownedBindings.size() > 0: return '''«element.javaName()»«FOR TemplateParameterSubstitution tps : element.getTemplateParameterSubstitutions()»_«tps.actual.simpleName()»«ENDFOR»'''
Ed Willink826c1c42014-08-10 19:46:07 +0100846 Class: return element.javaName()
Ed Willink01526762018-01-13 16:50:52 +0000847 Comment case element.body === null: return "null"
Ed.Willinka820ebe2013-10-02 13:55:59 -0400848 Comment: return element.javaName(element.body.substring(0, Math.min(11, element.body.length() - 1)))
Ed Willink01526762018-01-13 16:50:52 +0000849 EnumerationLiteral case element.owningEnumeration === null: return "null"
Ed Willink3b596462014-12-21 09:15:39 +0000850 EnumerationLiteral: return element.owningEnumeration.partialName() + "_" + element.javaName()
Ed Willink01526762018-01-13 16:50:52 +0000851 Operation case element.owningClass === null: return "null_" + element.javaName()
Ed Willinkcea7d6a2014-08-08 14:57:50 +0100852 Operation: return element.owningClass.partialName() + "_" + element.javaName()
Ed Willink1b14e452014-08-05 18:07:10 +0100853 Package: return element.javaName()
Ed Willink01526762018-01-13 16:50:52 +0000854 Parameter case element.eContainer() === null: return "null_" + element.javaName()
Ed.Willinka820ebe2013-10-02 13:55:59 -0400855 Parameter: return element.eContainer().partialName() + "_" + element.javaName()
856 Precedence: return element.javaName()
Ed Willinkf0dc8582014-01-03 18:26:51 +0000857 Property: return getPartialName(element)
Ed Willink01526762018-01-13 16:50:52 +0000858 TemplateBinding case element.getTemplateSignature().owningElement === null: return "null"
Ed Willink3b596462014-12-21 09:15:39 +0000859 TemplateBinding: return element.owningElement.partialName()
Ed Willink01526762018-01-13 16:50:52 +0000860 TemplateParameter case element.getOwningSignature.owningElement === null: return "[" + element.getOwningSignature.partialName() + "]"
Ed Willinkcdac4962014-08-11 10:10:17 +0100861// TemplateParameter case element.getOwningTemplateSignature.owningTemplateableElement.getUnspecializedElement() == null: return element.javaName()
Ed Willink3b596462014-12-21 09:15:39 +0000862 TemplateParameter: return element.getOwningSignature.owningElement.partialName() + "_" + element.javaName()
Ed Willink01526762018-01-13 16:50:52 +0000863 TemplateParameterSubstitution case element.owningBinding === null: return "null"
864 TemplateParameterSubstitution case element.owningBinding.owningElement === null: return "null"
Ed Willink3b596462014-12-21 09:15:39 +0000865 TemplateParameterSubstitution: return element.owningBinding.owningElement.partialName()
Ed Willink01526762018-01-13 16:50:52 +0000866 TemplateSignature case element.owningElement === null: return "null"
Ed Willink3b596462014-12-21 09:15:39 +0000867 TemplateSignature: return element.owningElement.partialName()
Ed.Willinka820ebe2013-10-02 13:55:59 -0400868 default: return "xyzzy" + element.eClass().name
869 }
870 }
871
872 protected def String simpleName(EObject element) {
873 switch element {
Ed Willink01526762018-01-13 16:50:52 +0000874 TemplateParameter case element.getOwningSignature.owningElement === null: return "null"
Ed Willink3b596462014-12-21 09:15:39 +0000875 TemplateParameter: return element.getOwningSignature.owningElement.simpleName() + "_" + element.javaName()
Ed Willink01526762018-01-13 16:50:52 +0000876 TemplateParameterSubstitution case element.owningBinding === null: return "null"
877 TemplateParameterSubstitution case element.owningBinding.owningElement === null: return "null"
Ed Willink3b596462014-12-21 09:15:39 +0000878 TemplateParameterSubstitution: return element.owningBinding.owningElement.simpleName()
Ed Willink826c1c42014-08-10 19:46:07 +0100879 Class: return element.javaName()
Ed Willink01526762018-01-13 16:50:52 +0000880 Operation case element.owningClass === null: return "null_" + element.javaName()
Ed Willinkcea7d6a2014-08-08 14:57:50 +0100881 Operation: return element.owningClass.simpleName() + "_" + element.javaName()
Ed.Willinka820ebe2013-10-02 13:55:59 -0400882 default: return "xyzzy" + element.eClass().name
883 }
884 }
885}