forked from masagroup/soft.gen
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgenerateCommon.mtl
220 lines (184 loc) · 10.6 KB
/
generateCommon.mtl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
[**
* This file is part of soft.generator.ts, a project for typescript
* code generation of an ecore model
*
* Copyright(c) 2021 MASA Group
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
**/]
[comment encoding = UTF-8 /]
[module generateCommon('http://www.eclipse.org/emf/2002/Ecore')/]
[import soft::generator::common::generateCommon/]
[import soft::generator::common::generateUtils/]
[**
* package property
*/]
[query public hasPackageProperty(anPackage : EPackage, aProperty : String ) : Boolean =
let property : OclAny = getProperty(aProperty) in
if property.oclIsUndefined() or property = '' then
anPackage.hasKey(aProperty)
else
true
endif
/]
[query public getPackageProperty(anPackage : EPackage, aProperty : String ) : String =
let property : OclAny = getProperty(aProperty) in
if property.oclIsUndefined() or property = '' then
anPackage.valueKey(aProperty)
else
property
endif
/]
[query public getPackageDirectory( anPackage : EPackage ) : String =
let replacement : String = if anPackage.hasPackageProperty('packageDir')
then anPackage.getPackageProperty('packageDir')
else '$1' endif in
anPackage.name.replaceFirst('(.*)', replacement)
/]
[query public getModuleResolution(anPackage : EPackage) : String =
if anPackage.hasPackageProperty('moduleResolution')
then anPackage.getPackageProperty('moduleResolution').toLower()
else 'nodenext'
endif
/]
[query public getTestFramework(anPackage : EPackage) : String =
if anPackage.hasPackageProperty('testFramework')
then anPackage.getPackageProperty('testFramework').toLower()
else 'jest'
endif
/]
[query public isVitest(anPackage : EPackage) : Boolean =
anPackage.getTestFramework() = 'vitest'
/]
[query public isExplicitFileExtension(anPackage : EPackage) : Boolean =
let moduleResolution : String = anPackage.getModuleResolution() in
moduleResolution = 'nodenext' or moduleResolution = 'node16'
/]
[query public isSyntheticDefaultImports (anPackage : EPackage) : Boolean =
if anPackage.hasPackageProperty('allowSyntheticDefaultImports')
then anPackage.getPackageProperty('allowSyntheticDefaultImports') = 'true'
else false
endif
/]
[**
* File Comments
*/]
[template public fileComment(aAny : OclAny)]
// Code generated by soft.generator.ts. DO NOT EDIT.
[getFileNotes()/]
[/template]
[query public hasExtension( aModelElement : EModelElement ) : Boolean = hasKey('extension') and valueKey('extension' )='true'/]
[query public isExported( aNamedElement : ENamedElement ) : Boolean = if ( hasKey('exported') ) then valueKey('exported') = 'true' else false endif/]
[**
* Factory / Package / Classes Interfaces and Implementations Names
*/]
[** search for an annotation in an element and in its ancestors if not present. **/]
[query private getAncestor( aElement : EModelElement ) : EModelElement =
if aElement.oclIsKindOf(EOperation) then aElement.oclAsType(EOperation).eContainingClass
else if aElement.oclIsKindOf(EStructuralFeature) then aElement.oclAsType(EStructuralFeature).eContainingClass
else if aElement.oclIsKindOf(EClass) then aElement.oclAsType(EClass).ePackage
else null
endif endif endif
/]
[query private getAncestors( aElement : EModelElement ) : Sequence(EModelElement) =
let ancestor : EModelElement = aElement.getAncestor() in
if ( ancestor.oclIsUndefined() ) then
Sequence(EModelElement){}
else
ancestor.getAncestors()->prepend( ancestor )
endif
/]
[query private getAnnotationValue(aElement : EModelElement, aKey:String ) : String =
if aElement.hasKey(aKey) then
aElement.valueKey( aKey )
else
let ancestor : EModelElement = aElement.getAncestor() in
if ancestor.oclIsUndefined() then
null
else
ancestor.getAnnotationValue(aKey)
endif
endif
/]
[** Retrieve a key in an element and its ancestors and then regexp replace the value with the default rule**/]
[query private getElementName( aElement : ENamedElement, aKey:String ) : String = aElement.getElementName(aElement.name, aKey, null)/]
[query private getElementName( aElement : ENamedElement, aName : String , aKey:String ) : String = aElement.getElementName(aName, aKey, null)/]
[query private getElementName( aElement : ENamedElement, aName : String , aKey:String , defaultRule : String ) : String =
let value : String = aElement.getAnnotationValue( aKey ) in
let rule : String = if value.oclIsUndefined() then defaultRule else value endif in
if rule.oclIsUndefined() then
aName
else
let index : Integer = rule.index( ':' ) in
let pattern : String = if index = -1 then '(.*)' else rule.substring(1, index - 1) endif in
let replacement : String = if index = -1 then rule else rule.substring(index + 1) endif in
aName.replaceFirst( pattern , replacement )
endif
/]
[** Factory Names **/]
[query public getFactoryName( aPackage : EPackage ) : String = aPackage.getElementName(aPackage.name, 'factoryName','$1Factory').toUpperFirst()/]
[query public getFactoryImplementationName( aPackage : EPackage ) : String = aPackage.getImplementationName( getFactoryName() )/]
[query public getFactoryExtensionName( aPackage : EPackage ) : String = aPackage.getExtensionName( aPackage.getFactoryName() )/]
[** Package Names **/]
[query public getPackageName( aPackage : EPackage ) : String = aPackage.getElementName(aPackage.name, 'packageName','$1Package').toUpperFirst()/]
[** Interface Names **/]
[query public getInterfaceName( aClass : EClass ) : String = aClass.getInterfaceName(aClass.name)/]
[query public getInterfaceName( aPackage : EPackage ) : String = aPackage.getInterfaceName( getPackageName() )/]
[query private getInterfaceName( aNamedElement : ENamedElement , aName : String ) : String = aNamedElement.getElementName( aName, 'interfaceName').toUpperFirst() /]
[** Implementation Names **/]
[query public getImplementationName( aClass : EClass ) : String = aClass.getImplementationName( aClass.name )/]
[query public getImplementationName( aPackage : EPackage ) : String = aPackage.getImplementationName( getPackageName() ) /]
[query private getImplementationName( aNamedElement : ENamedElement , aName : String ) : String = aNamedElement.getElementName( aName, 'implementationName', '$1Impl')/]
[** Constants Names **/]
[query public getConstantsName( aPackage : EPackage ) : String = aPackage.getConstantsName( aPackage.name.toUpperFirst() ) /]
[query private getConstantsName( aNamedElement : ENamedElement , aName : String ) : String = aNamedElement.getElementName( aName, 'constantsName', '$1Constants')/]
[** Extension Names **/]
[query public getExtensionName( aClass : EClass ) : String = aClass.getExtensionName(aClass.name )/]
[query public getExtensionName( aPackage : EPackage ) : String = aPackage.getExtensionName( getPackageName() )/]
[query private getExtensionName( aNamedElement : ENamedElement , aName : String ) : String = aNamedElement.getElementName( aName, 'extensionName', '$1Ext')/]
[** FileNames **/]
[query public getInterfaceFileName( aNamedElement : ENamedElement , aName : String ) : String = aNamedElement.getElementName( aName, 'interfaceFileName', '$1.ts')/]
[query public getImplementationFileName( aNamedElement : ENamedElement , aName : String ) : String = aNamedElement.getElementName( aName, 'implementationFileName', '$1Impl.ts')/]
[query public getImplementationTestFileName( aNamedElement : ENamedElement , aName : String ) : String = aNamedElement.getElementName( aName, 'implementationTestsFileName', '$1Impl.test.ts')/]
[query public getFactoryTestFileName( aNamedElement : ENamedElement, packageName : String ) : String = aNamedElement.getElementName( packageName.toUpperFirst() + 'Factory', 'factoryTestFileName', '$1Impl.test.ts')/]
[query public getExtensionFileName( aNamedElement : ENamedElement , aName : String ) : String = aNamedElement.getElementName( aName, 'extensionFileName', '$1Ext.ts')/]
[query public getConstantsFileName( aNamedElement : ENamedElement , aName : String ) : String = aNamedElement.getElementName( aName, 'constantsFileName', '$1.ts')/]
[query public getInternalFileName( aPackage : EPackage ) : String = aPackage.getElementName( aPackage.getPackageName(), 'internalFileName', 'internal.ts')/]
[query public getIndexFileName( aPackage : EPackage ) : String = aPackage.getElementName( aPackage.getPackageName(), 'indexFileName', 'index.ts')/]
[query private getElementTypeName(anENamedElement : ENamedElement) : String =
if anENamedElement.oclIsTypeOf(EClass) then 'Class'
else if anENamedElement.oclIsTypeOf(EAttribute) then 'Attribute'
else if ( anENamedElement.oclIsTypeOf(EOperation) ) then 'Operation'
else if ( anENamedElement.oclIsTypeOf(EReference) ) then 'Reference'
else ''
endif endif endif endif
/]
[** Accessors Names **/]
[query public getterPrefix(feature : EStructuralFeature) : String = if feature.eType.name = 'EBoolean' then 'Is' else 'Get' endif/]
[query public getUnSetterName(feature : EStructuralFeature) : String = feature.getElementName( name.toUpperFirst() , 'unSetterName', 'unSet$1')/]
[query public getIsSetName(feature : EStructuralFeature) : String = feature.getElementName( name.toUpperFirst() , 'isSetName', 'isSet$1')/]
[query public getOperationName(aOperation : EOperation ) : String = aOperation.getElementName( aOperation.name , 'operationName' )/]
[query public getParameterName(aParameter : EParameter) : String =
let n : String = aParameter.name in
if n = 'arguments' then 'args'
else n
endif
/]
[query public getReflectiveGetterName(anENamedElement : ENamedElement) : String =
let getterName : String = 'get' + anENamedElement.getElementAccessorName() in
let ecorePackageClass : EClass = anENamedElement.eClass().ePackage.eClass() in
let methodName : String = if ecorePackageClass.eAllOperations->exists( name = getterName ) then getterName + anENamedElement.getElementTypeName() else getterName endif in
methodName
/]
[query public getConstantsName(eLiteral : EEnumLiteral) : String =
if eLiteral.name = '_' then '_' else splitAndCombineWords( eLiteral.name, '_').toUpperCase() endif
/]
[query public getReservedKeywords(oclAny : OclAny) : Sequence(String) =
Sequence{ 'break','case','catch','class','const','continue','debugger','default','delete','do','else','enum','export','extends',
'false','finally','for','function','if','import','in','instanceof','new','null,','return','super','switch','this',
'throw','true','try','typeof','var','void','while','with','as','implements','interface','let','package','private',
'protected','public','static','yield','any','boolean','constructor','declare','get','module','require','number',
'set','string','symbol','type','from','of'}
/]