@emfts/codegen 0.0.1-next.8 → 0.0.2-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +12 -12
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/init.d.ts +6 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +69 -16
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/import-mappings.d.ts +5 -0
- package/dist/cli/import-mappings.d.ts.map +1 -0
- package/dist/cli/import-mappings.js +16 -0
- package/dist/cli/import-mappings.js.map +1 -0
- package/dist/genconfig/GenConfig.d.ts +14 -0
- package/dist/genconfig/GenConfig.d.ts.map +1 -1
- package/dist/genconfig/GenConfig.js.map +1 -1
- package/dist/genconfig/GenConfigConverter.d.ts.map +1 -1
- package/dist/genconfig/GenConfigConverter.js +4 -1
- package/dist/genconfig/GenConfigConverter.js.map +1 -1
- package/dist/genconfig/GenConfigLoader.d.ts +4 -4
- package/dist/genconfig/GenConfigLoader.d.ts.map +1 -1
- package/dist/genconfig/GenConfigLoader.js +38 -27
- package/dist/genconfig/GenConfigLoader.js.map +1 -1
- package/dist/genconfig/model/ClassDefaults.d.ts +12 -0
- package/dist/genconfig/model/ClassDefaults.d.ts.map +1 -0
- package/dist/genconfig/model/ClassDefaults.js +8 -0
- package/dist/genconfig/model/ClassDefaults.js.map +1 -0
- package/dist/genconfig/model/ClassDefaultsImpl.d.ts +46 -0
- package/dist/genconfig/model/ClassDefaultsImpl.d.ts.map +1 -0
- package/dist/genconfig/model/ClassDefaultsImpl.js +205 -0
- package/dist/genconfig/model/ClassDefaultsImpl.js.map +1 -0
- package/dist/genconfig/model/ClassOverride.d.ts +15 -0
- package/dist/genconfig/model/ClassOverride.d.ts.map +1 -0
- package/dist/genconfig/model/ClassOverride.js +8 -0
- package/dist/genconfig/model/ClassOverride.js.map +1 -0
- package/dist/genconfig/model/ClassOverrideImpl.d.ts +53 -0
- package/dist/genconfig/model/ClassOverrideImpl.d.ts.map +1 -0
- package/dist/genconfig/model/ClassOverrideImpl.js +248 -0
- package/dist/genconfig/model/ClassOverrideImpl.js.map +1 -0
- package/dist/genconfig/model/FeatureDefaults.d.ts +11 -0
- package/dist/genconfig/model/FeatureDefaults.d.ts.map +1 -0
- package/dist/genconfig/model/FeatureDefaults.js +8 -0
- package/dist/genconfig/model/FeatureDefaults.js.map +1 -0
- package/dist/genconfig/model/FeatureDefaultsImpl.d.ts +39 -0
- package/dist/genconfig/model/FeatureDefaultsImpl.d.ts.map +1 -0
- package/dist/genconfig/model/FeatureDefaultsImpl.js +136 -0
- package/dist/genconfig/model/FeatureDefaultsImpl.js.map +1 -0
- package/dist/genconfig/model/FeatureOverride.d.ts +14 -0
- package/dist/genconfig/model/FeatureOverride.d.ts.map +1 -0
- package/dist/genconfig/model/FeatureOverride.js +8 -0
- package/dist/genconfig/model/FeatureOverride.js.map +1 -0
- package/dist/genconfig/model/FeatureOverrideImpl.d.ts +51 -0
- package/dist/genconfig/model/FeatureOverrideImpl.d.ts.map +1 -0
- package/dist/genconfig/model/FeatureOverrideImpl.js +241 -0
- package/dist/genconfig/model/FeatureOverrideImpl.js.map +1 -0
- package/dist/genconfig/model/GenConfig.d.ts +21 -0
- package/dist/genconfig/model/GenConfig.d.ts.map +1 -0
- package/dist/genconfig/model/GenConfig.js +8 -0
- package/dist/genconfig/model/GenConfig.js.map +1 -0
- package/dist/genconfig/model/GenConfigFactory.d.ts +56 -0
- package/dist/genconfig/model/GenConfigFactory.d.ts.map +1 -0
- package/dist/genconfig/model/GenConfigFactory.js +108 -0
- package/dist/genconfig/model/GenConfigFactory.js.map +1 -0
- package/dist/genconfig/model/GenConfigImpl.d.ts +62 -0
- package/dist/genconfig/model/GenConfigImpl.d.ts.map +1 -0
- package/dist/genconfig/model/GenConfigImpl.js +283 -0
- package/dist/genconfig/model/GenConfigImpl.js.map +1 -0
- package/dist/genconfig/model/GenConfigPackage.d.ts +68 -0
- package/dist/genconfig/model/GenConfigPackage.d.ts.map +1 -0
- package/dist/genconfig/model/GenConfigPackage.js +436 -0
- package/dist/genconfig/model/GenConfigPackage.js.map +1 -0
- package/dist/genconfig/model/GenerationMode.d.ts +19 -0
- package/dist/genconfig/model/GenerationMode.d.ts.map +1 -0
- package/dist/genconfig/model/GenerationMode.js +34 -0
- package/dist/genconfig/model/GenerationMode.js.map +1 -0
- package/dist/genconfig/model/GenerationSettings.d.ts +14 -0
- package/dist/genconfig/model/GenerationSettings.d.ts.map +1 -0
- package/dist/genconfig/model/GenerationSettings.js +8 -0
- package/dist/genconfig/model/GenerationSettings.js.map +1 -0
- package/dist/genconfig/model/GenerationSettingsImpl.d.ts +51 -0
- package/dist/genconfig/model/GenerationSettingsImpl.d.ts.map +1 -0
- package/dist/genconfig/model/GenerationSettingsImpl.js +241 -0
- package/dist/genconfig/model/GenerationSettingsImpl.js.map +1 -0
- package/dist/genconfig/model/PackageSettings.d.ts +13 -0
- package/dist/genconfig/model/PackageSettings.d.ts.map +1 -0
- package/dist/genconfig/model/PackageSettings.js +8 -0
- package/dist/genconfig/model/PackageSettings.js.map +1 -0
- package/dist/genconfig/model/PackageSettingsImpl.d.ts +50 -0
- package/dist/genconfig/model/PackageSettingsImpl.d.ts.map +1 -0
- package/dist/genconfig/model/PackageSettingsImpl.js +240 -0
- package/dist/genconfig/model/PackageSettingsImpl.js.map +1 -0
- package/dist/genconfig/model/PropertyMode.d.ts +19 -0
- package/dist/genconfig/model/PropertyMode.d.ts.map +1 -0
- package/dist/genconfig/model/PropertyMode.js +34 -0
- package/dist/genconfig/model/PropertyMode.js.map +1 -0
- package/dist/genconfig/model/ReferencedPackage.d.ts +10 -0
- package/dist/genconfig/model/ReferencedPackage.d.ts.map +1 -0
- package/dist/genconfig/model/ReferencedPackage.js +8 -0
- package/dist/genconfig/model/ReferencedPackage.js.map +1 -0
- package/dist/genconfig/model/ReferencedPackageImpl.d.ts +38 -0
- package/dist/genconfig/model/ReferencedPackageImpl.d.ts.map +1 -0
- package/dist/genconfig/model/ReferencedPackageImpl.js +135 -0
- package/dist/genconfig/model/ReferencedPackageImpl.js.map +1 -0
- package/dist/genconfig/model/index.d.ts +21 -0
- package/dist/genconfig/model/index.d.ts.map +1 -0
- package/dist/genconfig/model/index.js +22 -0
- package/dist/genconfig/model/index.js.map +1 -0
- package/dist/generator/CodeGenerator.d.ts.map +1 -1
- package/dist/generator/CodeGenerator.js +2 -1
- package/dist/generator/CodeGenerator.js.map +1 -1
- package/dist/generator/ImportResolver.d.ts.map +1 -1
- package/dist/generator/ImportResolver.js +28 -5
- package/dist/generator/ImportResolver.js.map +1 -1
- package/dist/generator/TypeMapper.d.ts +2 -0
- package/dist/generator/TypeMapper.d.ts.map +1 -1
- package/dist/generator/TypeMapper.js +48 -3
- package/dist/generator/TypeMapper.js.map +1 -1
- package/dist/generator/modes/BaseGenerator.d.ts +6 -0
- package/dist/generator/modes/BaseGenerator.d.ts.map +1 -1
- package/dist/generator/modes/BaseGenerator.js +21 -1
- package/dist/generator/modes/BaseGenerator.js.map +1 -1
- package/dist/generator/modes/DecoratorGenerator.d.ts +5 -0
- package/dist/generator/modes/DecoratorGenerator.d.ts.map +1 -1
- package/dist/generator/modes/DecoratorGenerator.js +11 -2
- package/dist/generator/modes/DecoratorGenerator.js.map +1 -1
- package/dist/generator/modes/EmfGenerator.d.ts +1 -0
- package/dist/generator/modes/EmfGenerator.d.ts.map +1 -1
- package/dist/generator/modes/EmfGenerator.js +6 -2
- package/dist/generator/modes/EmfGenerator.js.map +1 -1
- package/dist/genmodel/GenModel.d.ts +2 -0
- package/dist/genmodel/GenModel.d.ts.map +1 -1
- package/dist/genmodel/GenModel.js.map +1 -1
- package/dist/index.js +15 -2
- package/dist/index.js.map +1 -1
- package/dist/loader/EcoreLoader.d.ts +4 -0
- package/dist/loader/EcoreLoader.d.ts.map +1 -1
- package/dist/loader/EcoreLoader.js +20 -0
- package/dist/loader/EcoreLoader.js.map +1 -1
- package/dist/templates/partials/decorator/class-file.ejs +99 -27
- package/dist/templates/partials/decorator/enum-file.ejs +1 -1
- package/dist/templates/partials/decorator/interface-file.ejs +1 -7
- package/dist/templates/partials/decorator/model-annotations.ejs +7 -6
- package/dist/templates/partials/decorator/package-file.ejs +4 -2
- package/dist/templates/partials/emf/class-file.ejs +75 -10
- package/dist/templates/partials/emf/factory-file.ejs +3 -3
- package/dist/templates/partials/emf/index-file.ejs +5 -5
- package/dist/templates/partials/emf/interface-file.ejs +5 -0
- package/dist/templates/partials/emf/package-file.ejs +6 -0
- package/dist/templates/partials/plain/class-file.ejs +1 -7
- package/dist/templates/partials/plain/interface-file.ejs +1 -7
- package/dist/templates/partials/plain/package-file.ejs +1 -1
- package/model/genconfig.ecore +21 -0
- package/model/genconfig.genconfig.xmi +11 -0
- package/package.json +3 -2
|
@@ -4,9 +4,27 @@
|
|
|
4
4
|
const imports = importResolver.resolveImportsForClass(eClass, genPackage, 'emf');
|
|
5
5
|
const hardcodedCoreTypes = ['BasicEObject', 'EClass', 'EStructuralFeature'];
|
|
6
6
|
const coreTypeImports = ['EClass', 'EStructuralFeature'];
|
|
7
|
+
const coreValueImports = [];
|
|
7
8
|
const typeOnlyImports = [];
|
|
8
9
|
const valueImports = [];
|
|
9
10
|
const importedNames = new Set();
|
|
11
|
+
// Check if any feature is many-valued (needs EList imports)
|
|
12
|
+
const useEList = typeMapper.useEList;
|
|
13
|
+
const hasManyFeature = features.some(gf => isMany(gf.ecoreFeature));
|
|
14
|
+
const hasManyMixin = (mixinFeatures || []).some(mf => isMany(mf.feature));
|
|
15
|
+
if (useEList && (hasManyFeature || hasManyMixin)) {
|
|
16
|
+
coreTypeImports.push('EList', 'EReference');
|
|
17
|
+
// Determine which factory functions are needed
|
|
18
|
+
const needsContainment = features.some(gf => isMany(gf.ecoreFeature) && isContainment(gf.ecoreFeature))
|
|
19
|
+
|| (mixinFeatures || []).some(mf => isMany(mf.feature) && isContainment(mf.feature));
|
|
20
|
+
const needsEObjectList = features.some(gf => isMany(gf.ecoreFeature) && !isContainment(gf.ecoreFeature) && typeMapper.isReference(gf.ecoreFeature))
|
|
21
|
+
|| (mixinFeatures || []).some(mf => isMany(mf.feature) && !isContainment(mf.feature) && typeMapper.isReference(mf.feature));
|
|
22
|
+
const needsBasicList = features.some(gf => isMany(gf.ecoreFeature) && typeMapper.isAttribute(gf.ecoreFeature))
|
|
23
|
+
|| (mixinFeatures || []).some(mf => isMany(mf.feature) && typeMapper.isAttribute(mf.feature));
|
|
24
|
+
if (needsContainment) coreValueImports.push('createContainmentEList');
|
|
25
|
+
if (needsEObjectList) coreValueImports.push('createEObjectEList');
|
|
26
|
+
if (needsBasicList) coreValueImports.push('createBasicEList');
|
|
27
|
+
}
|
|
10
28
|
for (const imp of imports) {
|
|
11
29
|
if (imp.typeName === className || imp.typeName === interfaceName || imp.typeName === extendsClass) continue;
|
|
12
30
|
if (hardcodedCoreTypes.includes(imp.typeName)) continue;
|
|
@@ -46,6 +64,9 @@ for (const imp of (mixinImports || [])) {
|
|
|
46
64
|
<% if (!extendsImport) { -%>
|
|
47
65
|
import { BasicEObject } from '@emfts/core';
|
|
48
66
|
<% } -%>
|
|
67
|
+
<% if (coreValueImports.length > 0) { -%>
|
|
68
|
+
import { <%- coreValueImports.join(', ') %> } from '@emfts/core';
|
|
69
|
+
<% } -%>
|
|
49
70
|
import type { <%- coreTypeImports.join(', ') %> } from '@emfts/core';
|
|
50
71
|
<% for (const imp of typeOnlyImports) { -%>
|
|
51
72
|
import type { <%- imp.typeName %> } from '<%- imp.importPath %>';
|
|
@@ -56,8 +77,8 @@ import { <%- imp.typeName %> } from '<%- imp.importPath %>';
|
|
|
56
77
|
<% if (extendsImport) { -%>
|
|
57
78
|
import { <%- extendsClass %> } from '<%- extendsImport %>';
|
|
58
79
|
<% } -%>
|
|
59
|
-
import type { <%- interfaceName %> } from './<%- interfaceName
|
|
60
|
-
import { <%- packagePrefix %>Package } from './<%- packagePrefix %>Package';
|
|
80
|
+
import type { <%- interfaceName %> } from './<%- interfaceName %>.js';
|
|
81
|
+
import { <%- packagePrefix %>Package } from './<%- packagePrefix %>Package.js';
|
|
61
82
|
|
|
62
83
|
/**
|
|
63
84
|
* Implementation of <%- interfaceName %>
|
|
@@ -80,14 +101,14 @@ export <% if (isAbstract) { %>abstract <% } %>class <%- className %> extends <%-
|
|
|
80
101
|
const defaultValue = typeMapper.getDefaultValue(feature);
|
|
81
102
|
const featureIsMany = isMany(feature);
|
|
82
103
|
-%>
|
|
83
|
-
private _<%- featureName %><% if (!featureIsMany && defaultValue === null) { %>?<% } %>: <%- featureType %><% if (defaultValue !== null) { %> = <%- defaultValue %><% } %>;
|
|
104
|
+
private _<%- featureName %><% if (useEList && featureIsMany) { %>!<% } else if (!featureIsMany && defaultValue === null) { %>?<% } %>: <%- featureType %><% if (defaultValue !== null) { %> = <%- defaultValue %><% } %>;
|
|
84
105
|
<% } -%>
|
|
85
106
|
<% for (const mf of (mixinFeatures || [])) {
|
|
86
107
|
const featureType = typeMapper.mapFeature(mf.feature);
|
|
87
108
|
const defaultValue = typeMapper.getDefaultValue(mf.feature);
|
|
88
109
|
const featureIsMany = isMany(mf.feature);
|
|
89
110
|
-%>
|
|
90
|
-
private _<%- mf.name %><% if (!featureIsMany && defaultValue === null) { %>?<% } %>: <%- featureType %><% if (defaultValue !== null) { %> = <%- defaultValue %><% } %>;
|
|
111
|
+
private _<%- mf.name %><% if (useEList && featureIsMany) { %>!<% } else if (!featureIsMany && defaultValue === null) { %>?<% } %>: <%- featureType %><% if (defaultValue !== null) { %> = <%- defaultValue %><% } %>;
|
|
91
112
|
<% } -%>
|
|
92
113
|
|
|
93
114
|
/**
|
|
@@ -105,6 +126,27 @@ export <% if (isAbstract) { %>abstract <% } %>class <%- className %> extends <%-
|
|
|
105
126
|
const featureIsMany = isMany(feature);
|
|
106
127
|
const upperName = toUpperSnake(featureName);
|
|
107
128
|
-%>
|
|
129
|
+
<% if (useEList && featureIsMany) {
|
|
130
|
+
// EList lazy-init getter: creates the right EList on first access
|
|
131
|
+
const isRef = typeMapper.isReference(feature);
|
|
132
|
+
const isCont = isRef && isContainment(feature);
|
|
133
|
+
let factoryCall;
|
|
134
|
+
if (isCont) {
|
|
135
|
+
factoryCall = `createContainmentEList<any>(this, this.eClass().getEStructuralFeature('${featureName}') as EReference)`;
|
|
136
|
+
} else if (isRef) {
|
|
137
|
+
factoryCall = `createEObjectEList(this, this.eClass().getEStructuralFeature('${featureName}') as EReference) as unknown as ${featureType}`;
|
|
138
|
+
} else {
|
|
139
|
+
factoryCall = `createBasicEList<any>(this, this.eClass().getEStructuralFeature('${featureName}')!)`;
|
|
140
|
+
}
|
|
141
|
+
-%>
|
|
142
|
+
get <%- featureName %>(): <%- featureType %> {
|
|
143
|
+
if (!this._<%- featureName %>) {
|
|
144
|
+
this._<%- featureName %> = <%- factoryCall %>;
|
|
145
|
+
}
|
|
146
|
+
return this._<%- featureName %>;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
<% } else { -%>
|
|
108
150
|
get <%- featureName %>(): <%- featureType %> {
|
|
109
151
|
return this._<%- featureName %><% if (!featureIsMany) { %>!<% } %>;
|
|
110
152
|
}
|
|
@@ -134,6 +176,7 @@ export <% if (isAbstract) { %>abstract <% } %>class <%- className %> extends <%-
|
|
|
134
176
|
<% } -%>
|
|
135
177
|
}
|
|
136
178
|
|
|
179
|
+
<% } -%>
|
|
137
180
|
<% } -%>
|
|
138
181
|
<% } -%>
|
|
139
182
|
<% for (const mf of (mixinFeatures || [])) {
|
|
@@ -177,18 +220,32 @@ export <% if (isAbstract) { %>abstract <% } %>class <%- className %> extends <%-
|
|
|
177
220
|
const featureID = this.eClass().getFeatureID(feature);
|
|
178
221
|
switch (featureID) {
|
|
179
222
|
<% for (const fid of featureIds) {
|
|
180
|
-
const
|
|
223
|
+
const feat = fid.feature.ecoreFeature;
|
|
224
|
+
const featureType = typeMapper.mapFeature(feat);
|
|
225
|
+
const featureName = getName(feat);
|
|
226
|
+
const featureIsMany = isMany(feat);
|
|
181
227
|
-%>
|
|
182
228
|
case <%- className %>.<%- fid.name %>:
|
|
183
|
-
|
|
229
|
+
<% if (useEList && featureIsMany) { -%>
|
|
230
|
+
this.<%- featureName %>.clear();
|
|
231
|
+
this.<%- featureName %>.addAll(newValue as any[]);
|
|
232
|
+
<% } else { -%>
|
|
233
|
+
this.<%- featureName %> = newValue as <%- featureType %>;
|
|
234
|
+
<% } -%>
|
|
184
235
|
super.eSet(feature, newValue);
|
|
185
236
|
break;
|
|
186
237
|
<% } -%>
|
|
187
238
|
<% for (const mf of (mixinFeatures || [])) {
|
|
188
239
|
const featureType = typeMapper.mapFeature(mf.feature);
|
|
240
|
+
const featureIsMany = isMany(mf.feature);
|
|
189
241
|
-%>
|
|
190
242
|
case <%- className %>.<%- mf.upperName %>:
|
|
243
|
+
<% if (useEList && featureIsMany) { -%>
|
|
244
|
+
this.<%- mf.name %>.clear();
|
|
245
|
+
this.<%- mf.name %>.addAll(newValue as any[]);
|
|
246
|
+
<% } else { -%>
|
|
191
247
|
this.<%- mf.name %> = newValue as <%- featureType %>;
|
|
248
|
+
<% } -%>
|
|
192
249
|
super.eSet(feature, newValue);
|
|
193
250
|
break;
|
|
194
251
|
<% } -%>
|
|
@@ -210,7 +267,9 @@ export <% if (isAbstract) { %>abstract <% } %>class <%- className %> extends <%-
|
|
|
210
267
|
const featureName = getName(feature);
|
|
211
268
|
-%>
|
|
212
269
|
case <%- className %>.<%- fid.name %>:
|
|
213
|
-
<% if (featureIsMany) { -%>
|
|
270
|
+
<% if (useEList && featureIsMany) { -%>
|
|
271
|
+
return this._<%- featureName %> !== undefined && !this._<%- featureName %>.isEmpty();
|
|
272
|
+
<% } else if (featureIsMany) { -%>
|
|
214
273
|
return this._<%- featureName %> !== undefined && this._<%- featureName %>.length > 0;
|
|
215
274
|
<% } else if (defaultValue !== null) { -%>
|
|
216
275
|
return this._<%- featureName %> !== <%- defaultValue %>;
|
|
@@ -223,7 +282,9 @@ export <% if (isAbstract) { %>abstract <% } %>class <%- className %> extends <%-
|
|
|
223
282
|
const defaultValue = typeMapper.getDefaultValue(mf.feature);
|
|
224
283
|
-%>
|
|
225
284
|
case <%- className %>.<%- mf.upperName %>:
|
|
226
|
-
<% if (featureIsMany) { -%>
|
|
285
|
+
<% if (useEList && featureIsMany) { -%>
|
|
286
|
+
return this._<%- mf.name %> !== undefined && !this._<%- mf.name %>.isEmpty();
|
|
287
|
+
<% } else if (featureIsMany) { -%>
|
|
227
288
|
return this._<%- mf.name %> !== undefined && this._<%- mf.name %>.length > 0;
|
|
228
289
|
<% } else if (defaultValue !== null) { -%>
|
|
229
290
|
return this._<%- mf.name %> !== <%- defaultValue %>;
|
|
@@ -249,7 +310,9 @@ export <% if (isAbstract) { %>abstract <% } %>class <%- className %> extends <%-
|
|
|
249
310
|
const featureName = getName(feature);
|
|
250
311
|
-%>
|
|
251
312
|
case <%- className %>.<%- fid.name %>:
|
|
252
|
-
<% if (featureIsMany) { -%>
|
|
313
|
+
<% if (useEList && featureIsMany) { -%>
|
|
314
|
+
if (this._<%- featureName %>) this._<%- featureName %>.clear();
|
|
315
|
+
<% } else if (featureIsMany) { -%>
|
|
253
316
|
this._<%- featureName %> = [];
|
|
254
317
|
<% } else if (defaultValue !== null) { -%>
|
|
255
318
|
this._<%- featureName %> = <%- defaultValue %>;
|
|
@@ -263,7 +326,9 @@ export <% if (isAbstract) { %>abstract <% } %>class <%- className %> extends <%-
|
|
|
263
326
|
const defaultValue = typeMapper.getDefaultValue(mf.feature);
|
|
264
327
|
-%>
|
|
265
328
|
case <%- className %>.<%- mf.upperName %>:
|
|
266
|
-
<% if (featureIsMany) { -%>
|
|
329
|
+
<% if (useEList && featureIsMany) { -%>
|
|
330
|
+
if (this._<%- mf.name %>) this._<%- mf.name %>.clear();
|
|
331
|
+
<% } else if (featureIsMany) { -%>
|
|
267
332
|
this._<%- mf.name %> = [];
|
|
268
333
|
<% } else if (defaultValue !== null) { -%>
|
|
269
334
|
this._<%- mf.name %> = <%- defaultValue %>;
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
import { BasicEFactory } from '@emfts/core';
|
|
4
4
|
import type { EClass, EObject } from '@emfts/core';
|
|
5
|
-
import { <%- packageName %>Package } from './<%- packageName %>Package';
|
|
5
|
+
import { <%- packageName %>Package } from './<%- packageName %>Package.js';
|
|
6
6
|
<% for (const genClass of concreteClasses) {
|
|
7
7
|
const className = genClass.ecoreClass.getName();
|
|
8
8
|
const implName = genClass.implClassName || (className + 'Impl');
|
|
9
9
|
-%>
|
|
10
|
-
import type { <%- className %> } from './<%- className
|
|
11
|
-
import { <%- implName %> } from './<%- implName
|
|
10
|
+
import type { <%- className %> } from './<%- className %>.js';
|
|
11
|
+
import { <%- implName %> } from './<%- implName %>.js';
|
|
12
12
|
<% } -%>
|
|
13
13
|
|
|
14
14
|
/**
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
<%- header %>
|
|
2
2
|
|
|
3
3
|
// Package and Factory
|
|
4
|
-
export { <%- packageName %>Package } from './<%- packageName %>Package';
|
|
5
|
-
export { <%- packageName %>Factory } from './<%- packageName %>Factory';
|
|
4
|
+
export { <%- packageName %>Package } from './<%- packageName %>Package.js';
|
|
5
|
+
export { <%- packageName %>Factory } from './<%- packageName %>Factory.js';
|
|
6
6
|
|
|
7
7
|
// Interfaces
|
|
8
8
|
<% for (const genClass of genClasses) {
|
|
9
9
|
const name = getName(genClass.ecoreClass);
|
|
10
10
|
-%>
|
|
11
|
-
export type { <%- name %> } from './<%- name
|
|
11
|
+
export type { <%- name %> } from './<%- name %>.js';
|
|
12
12
|
<% } -%>
|
|
13
13
|
|
|
14
14
|
// Implementations (including abstract classes, as they're extended by subclasses)
|
|
@@ -16,7 +16,7 @@ export type { <%- name %> } from './<%- name %>';
|
|
|
16
16
|
if (!checkIsInterface(genClass.ecoreClass)) {
|
|
17
17
|
const implName = genClass.implClassName || (getName(genClass.ecoreClass) + 'Impl');
|
|
18
18
|
-%>
|
|
19
|
-
export { <%- implName %> } from './<%- implName
|
|
19
|
+
export { <%- implName %> } from './<%- implName %>.js';
|
|
20
20
|
<%
|
|
21
21
|
}
|
|
22
22
|
} -%>
|
|
@@ -25,5 +25,5 @@ export { <%- implName %> } from './<%- implName %>';
|
|
|
25
25
|
<% for (const genEnum of genEnums) {
|
|
26
26
|
const name = getName(genEnum.ecoreEnum);
|
|
27
27
|
-%>
|
|
28
|
-
export { <%- name %>, get<%- name %>, get<%- name %>ByLiteral } from './<%- name
|
|
28
|
+
export { <%- name %>, get<%- name %>, get<%- name %>ByLiteral } from './<%- name %>.js';
|
|
29
29
|
<% } -%>
|
|
@@ -4,6 +4,11 @@
|
|
|
4
4
|
const imports = importResolver.resolveImportsForClass(eClass, genPackage, 'emf');
|
|
5
5
|
const coreTypeImports = ['EObject'];
|
|
6
6
|
const otherTypeImports = [];
|
|
7
|
+
// Add EList import if any feature is many-valued and useEList is on
|
|
8
|
+
const useEList = typeMapper.useEList;
|
|
9
|
+
if (useEList && features.some(gf => isMany(gf.ecoreFeature))) {
|
|
10
|
+
coreTypeImports.push('EList');
|
|
11
|
+
}
|
|
7
12
|
for (const imp of imports) {
|
|
8
13
|
if (imp.typeName === interfaceName) continue;
|
|
9
14
|
if (imp.importPath === '@emfts/core') {
|
|
@@ -94,6 +94,7 @@ if (needsRegistryImport) coreImports.push('EPackageRegistry');
|
|
|
94
94
|
-%>
|
|
95
95
|
import { <%- coreImports.join(', ') %> } from '@emfts/core';
|
|
96
96
|
import type { EClass, EAttribute, EReference, EEnum } from '@emfts/core';
|
|
97
|
+
import { <%- packageName %>Factory } from './<%- packageName %>Factory.js';
|
|
97
98
|
|
|
98
99
|
/**
|
|
99
100
|
* <%- packageName %> Package
|
|
@@ -138,6 +139,11 @@ export class <%- packageName %>Package extends BasicEPackage {
|
|
|
138
139
|
* Initialize package contents
|
|
139
140
|
*/
|
|
140
141
|
private init(): void {
|
|
142
|
+
// Wire the generated factory so loaded/created instances are typed Impls.
|
|
143
|
+
// eINSTANCE is already assigned at this point, so the factory's back
|
|
144
|
+
// reference to the package resolves without re-entering init()
|
|
145
|
+
this.setEFactoryInstance(<%- packageName %>Factory.eINSTANCE);
|
|
146
|
+
|
|
141
147
|
<% for (const genClass of genClasses) {
|
|
142
148
|
const eClass = genClass.ecoreClass;
|
|
143
149
|
const className = getName(eClass);
|
|
@@ -60,14 +60,8 @@ if (superTypes && superTypes.length > 0) {
|
|
|
60
60
|
const op = genOp.ecoreOperation;
|
|
61
61
|
const opName = op.getName();
|
|
62
62
|
const returnType = op.getEType() ? typeMapper.mapClassifier(op.getEType()) : 'void';
|
|
63
|
-
const params = [];
|
|
64
|
-
for (const param of op.getEParameters()) {
|
|
65
|
-
const paramName = param.getName();
|
|
66
|
-
const paramType = typeMapper.mapClassifier(param.getEType());
|
|
67
|
-
params.push(`${paramName}: ${paramType}`);
|
|
68
|
-
}
|
|
69
63
|
-%>
|
|
70
|
-
<%- opName %>(<%-
|
|
64
|
+
<%- opName %>(<%- mapParams(op) %>): <%- returnType %> {
|
|
71
65
|
throw new Error('<%- opName %> not implemented');
|
|
72
66
|
}
|
|
73
67
|
|
|
@@ -49,13 +49,7 @@ if (superTypes && superTypes.length > 0) {
|
|
|
49
49
|
const op = genOp.ecoreOperation;
|
|
50
50
|
const opName = op.getName();
|
|
51
51
|
const returnType = op.getEType() ? typeMapper.mapClassifier(op.getEType()) : 'void';
|
|
52
|
-
const params = [];
|
|
53
|
-
for (const param of op.getEParameters()) {
|
|
54
|
-
const paramName = param.getName();
|
|
55
|
-
const paramType = typeMapper.mapClassifier(param.getEType());
|
|
56
|
-
params.push(`${paramName}: ${paramType}`);
|
|
57
|
-
}
|
|
58
52
|
-%>
|
|
59
|
-
<%- opName %>(<%-
|
|
53
|
+
<%- opName %>(<%- mapParams(op) %>): <%- returnType %>;
|
|
60
54
|
<% } -%>
|
|
61
55
|
}
|
package/model/genconfig.ecore
CHANGED
|
@@ -19,6 +19,22 @@
|
|
|
19
19
|
<eStructuralFeatures xsi:type="ecore:EReference" name="classDefaults" eType="#//ClassDefaults" containment="true"/>
|
|
20
20
|
<eStructuralFeatures xsi:type="ecore:EReference" name="featureDefaults" eType="#//FeatureDefaults" containment="true"/>
|
|
21
21
|
<eStructuralFeatures xsi:type="ecore:EReference" name="classOverrides" upperBound="-1" eType="#//ClassOverride" containment="true"/>
|
|
22
|
+
<eStructuralFeatures xsi:type="ecore:EReference" name="referencedPackages" upperBound="-1" eType="#//ReferencedPackage" containment="true">
|
|
23
|
+
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
|
|
24
|
+
<details key="documentation" value="Import path mappings for cross-package references (equivalent of usedGenPackages in EMF Java genmodels)"/>
|
|
25
|
+
</eAnnotations>
|
|
26
|
+
</eStructuralFeatures>
|
|
27
|
+
</eClassifiers>
|
|
28
|
+
|
|
29
|
+
<!-- ============================================ -->
|
|
30
|
+
<!-- REFERENCED PACKAGE -->
|
|
31
|
+
<!-- ============================================ -->
|
|
32
|
+
<eClassifiers xsi:type="ecore:EClass" name="ReferencedPackage">
|
|
33
|
+
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
|
|
34
|
+
<details key="documentation" value="Maps the nsURI of an external EPackage to the TypeScript import path of its generated code"/>
|
|
35
|
+
</eAnnotations>
|
|
36
|
+
<eStructuralFeatures xsi:type="ecore:EAttribute" name="nsURI" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
|
|
37
|
+
<eStructuralFeatures xsi:type="ecore:EAttribute" name="importPath" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
|
|
22
38
|
</eClassifiers>
|
|
23
39
|
|
|
24
40
|
<!-- ============================================ -->
|
|
@@ -32,6 +48,11 @@
|
|
|
32
48
|
<eStructuralFeatures xsi:type="ecore:EAttribute" name="outputDir" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" defaultValueLiteral="./generated"/>
|
|
33
49
|
<eStructuralFeatures xsi:type="ecore:EAttribute" name="fileExtension" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" defaultValueLiteral=".ts"/>
|
|
34
50
|
<eStructuralFeatures xsi:type="ecore:EAttribute" name="headerComment" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
|
|
51
|
+
<eStructuralFeatures xsi:type="ecore:EAttribute" name="annotationsPackage" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
|
|
52
|
+
<eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
|
|
53
|
+
<details key="documentation" value="Decorator mode: import ModelClass/Attribute/... decorators from this package instead of generating ModelAnnotations per model"/>
|
|
54
|
+
</eAnnotations>
|
|
55
|
+
</eStructuralFeatures>
|
|
35
56
|
</eClassifiers>
|
|
36
57
|
|
|
37
58
|
<eClassifiers xsi:type="ecore:EEnum" name="GenerationMode">
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<genconfig:GenConfig
|
|
3
|
+
xmi:version="2.0"
|
|
4
|
+
xmlns:xmi="http://www.omg.org/XMI"
|
|
5
|
+
xmlns:genconfig="http://www.emfts.org/genconfig/1.0"
|
|
6
|
+
ecorePackage="http://www.emfts.org/genconfig/1.0#/">
|
|
7
|
+
<generation mode="emf" outputDir="./src/genconfig"/>
|
|
8
|
+
<package prefix="GenConfig" basePackage="model" generateFactory="true" generatePackage="true" generateIndex="true"/>
|
|
9
|
+
<classDefaults generateInterface="true" generateImpl="true" rootExtendsClass="BasicEObject" rootExtendsInterface="EObject"/>
|
|
10
|
+
<featureDefaults notify="true" property="editable"/>
|
|
11
|
+
</genconfig:GenConfig>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@emfts/codegen",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.2-next.1",
|
|
4
4
|
"description": "TypeScript code generator for Ecore models using emfts",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
},
|
|
17
17
|
"scripts": {
|
|
18
18
|
"build": "tsc && rm -rf dist/templates && cp -r src/templates dist/templates",
|
|
19
|
+
"generate:genconfig": "npm run build && node dist/cli/index.js generate -m model/genconfig.ecore -c model/genconfig.genconfig.xmi && npm run build",
|
|
19
20
|
"watch": "tsc --watch",
|
|
20
21
|
"test": "vitest",
|
|
21
22
|
"test:run": "vitest run",
|
|
@@ -45,7 +46,7 @@
|
|
|
45
46
|
"dependencies": {
|
|
46
47
|
"commander": "^12.0.0",
|
|
47
48
|
"ejs": "^3.1.10",
|
|
48
|
-
"@emfts/core": "^0.
|
|
49
|
+
"@emfts/core": "^0.2.0-next.1",
|
|
49
50
|
"sax": "^1.4.4"
|
|
50
51
|
},
|
|
51
52
|
"devDependencies": {
|