ts2famix 2.1.0-beta.2 → 3.0.0

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.
Files changed (192) hide show
  1. package/.eslintrc.json +24 -24
  2. package/LICENSE +24 -24
  3. package/README.md +78 -78
  4. package/dist/analyze.js +3 -3
  5. package/dist/analyze_functions/process_functions.js +92 -62
  6. package/dist/famix_functions/EntityDictionary.js +672 -597
  7. package/dist/famix_functions/helpers_creation.js +18 -12
  8. package/dist/fqn.js +351 -18
  9. package/dist/lib/famix/famix_JSON_exporter.js +1 -1
  10. package/dist/lib/famix/famix_base_element.js +1 -1
  11. package/dist/lib/famix/famix_repository.js +14 -5
  12. package/dist/lib/famix/index.js +1 -1
  13. package/dist/lib/famix/model/famix/access.js +1 -1
  14. package/dist/lib/famix/model/famix/accessor.js +1 -1
  15. package/dist/lib/famix/model/famix/alias.js +1 -1
  16. package/dist/lib/famix/model/famix/arrow_function.js +1 -1
  17. package/dist/lib/famix/model/famix/behavioral_entity.js +1 -1
  18. package/dist/lib/famix/model/famix/class.js +1 -1
  19. package/dist/lib/famix/model/famix/comment.js +1 -1
  20. package/dist/lib/famix/model/famix/concretisation.js +1 -1
  21. package/dist/lib/famix/model/famix/container_entity.js +1 -1
  22. package/dist/lib/famix/model/famix/decorator.js +1 -1
  23. package/dist/lib/famix/model/famix/entity.js +1 -1
  24. package/dist/lib/famix/model/famix/enum.js +1 -1
  25. package/dist/lib/famix/model/famix/enum_value.js +1 -1
  26. package/dist/lib/famix/model/famix/function.js +1 -1
  27. package/dist/lib/famix/model/famix/import_clause.js +1 -1
  28. package/dist/lib/famix/model/famix/index.js +1 -1
  29. package/dist/lib/famix/model/famix/indexed_file_anchor.js +1 -1
  30. package/dist/lib/famix/model/famix/inheritance.js +1 -1
  31. package/dist/lib/famix/model/famix/interface.js +1 -1
  32. package/dist/lib/famix/model/famix/invocation.js +1 -1
  33. package/dist/lib/famix/model/famix/method.js +1 -1
  34. package/dist/lib/famix/model/famix/module.js +2 -2
  35. package/dist/lib/famix/model/famix/named_entity.js +1 -1
  36. package/dist/lib/famix/model/famix/parameter.js +1 -1
  37. package/dist/lib/famix/model/famix/parameter_concretisation.js +1 -1
  38. package/dist/lib/famix/model/famix/parameter_type.js +1 -1
  39. package/dist/lib/famix/model/famix/parametric_arrow_function.js +1 -1
  40. package/dist/lib/famix/model/famix/parametric_class.js +1 -1
  41. package/dist/lib/famix/model/famix/parametric_function.js +1 -1
  42. package/dist/lib/famix/model/famix/parametric_interface.js +1 -1
  43. package/dist/lib/famix/model/famix/parametric_method.js +1 -1
  44. package/dist/lib/famix/model/famix/primitive_type.js +1 -1
  45. package/dist/lib/famix/model/famix/property.js +1 -1
  46. package/dist/lib/famix/model/famix/reference.js +1 -1
  47. package/dist/lib/famix/model/famix/scoping_entity.js +1 -1
  48. package/dist/lib/famix/model/famix/script_entity.js +1 -1
  49. package/dist/lib/famix/model/famix/source_anchor.js +1 -1
  50. package/dist/lib/famix/model/famix/source_language.js +1 -1
  51. package/dist/lib/famix/model/famix/sourced_entity.js +1 -1
  52. package/dist/lib/famix/model/famix/structural_entity.js +1 -1
  53. package/dist/lib/famix/model/famix/type.js +1 -1
  54. package/dist/lib/famix/model/famix/variable.js +1 -1
  55. package/dist/lib/ts-complex/cyclomatic-service.js +1 -1
  56. package/dist/refactorer/refactor-getter-setter.js +1 -1
  57. package/dist/ts2famix-cli-wrapper.js +1 -1
  58. package/dist/ts2famix-cli.js +1 -1
  59. package/doc-uml/famix-typescript-model.puml +619 -607
  60. package/doc-uml/famix-typescript-model.svg +1 -1
  61. package/eslint.config.mjs +28 -28
  62. package/jest.config.json +1 -1
  63. package/package.json +70 -70
  64. package/src/analyze.ts +120 -120
  65. package/src/analyze_functions/process_functions.ts +1069 -1040
  66. package/src/famix_functions/EntityDictionary.ts +2061 -2016
  67. package/src/famix_functions/helpers_creation.ts +143 -135
  68. package/src/fqn.ts +416 -50
  69. package/src/generate_uml.sh +20 -20
  70. package/src/lib/famix/License.md +22 -22
  71. package/src/lib/famix/famix_JSON_exporter.ts +56 -56
  72. package/src/lib/famix/famix_base_element.ts +22 -22
  73. package/src/lib/famix/famix_repository.ts +288 -278
  74. package/src/lib/famix/index.ts +8 -8
  75. package/src/lib/famix/model/famix/access.ts +50 -50
  76. package/src/lib/famix/model/famix/accessor.ts +15 -15
  77. package/src/lib/famix/model/famix/alias.ts +39 -39
  78. package/src/lib/famix/model/famix/arrow_function.ts +15 -15
  79. package/src/lib/famix/model/famix/behavioral_entity.ts +97 -97
  80. package/src/lib/famix/model/famix/class.ts +85 -85
  81. package/src/lib/famix/model/famix/comment.ts +47 -47
  82. package/src/lib/famix/model/famix/concretisation.ts +40 -40
  83. package/src/lib/famix/model/famix/container_entity.ts +160 -160
  84. package/src/lib/famix/model/famix/decorator.ts +37 -37
  85. package/src/lib/famix/model/famix/entity.ts +15 -15
  86. package/src/lib/famix/model/famix/enum.ts +30 -30
  87. package/src/lib/famix/model/famix/enum_value.ts +28 -28
  88. package/src/lib/famix/model/famix/function.ts +15 -15
  89. package/src/lib/famix/model/famix/import_clause.ts +51 -51
  90. package/src/lib/famix/model/famix/index.ts +41 -41
  91. package/src/lib/famix/model/famix/indexed_file_anchor.ts +46 -46
  92. package/src/lib/famix/model/famix/inheritance.ts +40 -40
  93. package/src/lib/famix/model/famix/interface.ts +75 -75
  94. package/src/lib/famix/model/famix/invocation.ts +65 -65
  95. package/src/lib/famix/model/famix/method.ts +89 -89
  96. package/src/lib/famix/model/famix/module.ts +71 -71
  97. package/src/lib/famix/model/famix/named_entity.ts +95 -95
  98. package/src/lib/famix/model/famix/parameter.ts +28 -28
  99. package/src/lib/famix/model/famix/parameter_concretisation.ts +51 -51
  100. package/src/lib/famix/model/famix/parameter_type.ts +58 -58
  101. package/src/lib/famix/model/famix/parametric_arrow_function.ts +32 -32
  102. package/src/lib/famix/model/famix/parametric_class.ts +49 -49
  103. package/src/lib/famix/model/famix/parametric_function.ts +32 -32
  104. package/src/lib/famix/model/famix/parametric_interface.ts +49 -49
  105. package/src/lib/famix/model/famix/parametric_method.ts +32 -32
  106. package/src/lib/famix/model/famix/primitive_type.ts +15 -15
  107. package/src/lib/famix/model/famix/property.ts +94 -94
  108. package/src/lib/famix/model/famix/reference.ts +40 -40
  109. package/src/lib/famix/model/famix/scoping_entity.ts +35 -35
  110. package/src/lib/famix/model/famix/script_entity.ts +34 -34
  111. package/src/lib/famix/model/famix/source_anchor.ts +30 -30
  112. package/src/lib/famix/model/famix/source_language.ts +35 -35
  113. package/src/lib/famix/model/famix/sourced_entity.ts +70 -70
  114. package/src/lib/famix/model/famix/structural_entity.ts +43 -43
  115. package/src/lib/famix/model/famix/type.ts +87 -87
  116. package/src/lib/famix/model/famix/variable.ts +27 -27
  117. package/src/lib/famix/package.json +28 -28
  118. package/src/lib/ts-complex/cyclomatic-service.ts +83 -83
  119. package/src/refactorer/refactor-getter-setter.ts +140 -140
  120. package/src/ts2famix-cli-wrapper.ts +21 -21
  121. package/src/ts2famix-cli.ts +60 -60
  122. package/tsconfig.check-tests.json +14 -14
  123. package/tsconfig.json +73 -72
  124. package/.vscode/settings.json +0 -4
  125. package/TODO +0 -1
  126. package/arwea-fix.json +0 -1
  127. package/bogus.ts +0 -3
  128. package/class-diagram.puml +0 -792
  129. package/debug.txt +0 -13332
  130. package/debuglog.txt +0 -12073
  131. package/dist/famix2puml.js +0 -126
  132. package/dist/getClasses-arrow-body.js +0 -43
  133. package/dist/lib/famix/src/famix_JSON_exporter.js +0 -55
  134. package/dist/lib/famix/src/famix_base_element.js +0 -18
  135. package/dist/lib/famix/src/famix_repository.js +0 -224
  136. package/dist/lib/famix/src/index.js +0 -31
  137. package/dist/lib/famix/src/model/famix/access.js +0 -40
  138. package/dist/lib/famix/src/model/famix/accessor.js +0 -17
  139. package/dist/lib/famix/src/model/famix/alias.js +0 -33
  140. package/dist/lib/famix/src/model/famix/arrowFunction.js +0 -17
  141. package/dist/lib/famix/src/model/famix/arrow_function.js +0 -17
  142. package/dist/lib/famix/src/model/famix/behavioral_entity.js +0 -79
  143. package/dist/lib/famix/src/model/famix/class.js +0 -71
  144. package/dist/lib/famix/src/model/famix/comment.js +0 -39
  145. package/dist/lib/famix/src/model/famix/concretisation.js +0 -31
  146. package/dist/lib/famix/src/model/famix/container_entity.js +0 -126
  147. package/dist/lib/famix/src/model/famix/decorator.js +0 -32
  148. package/dist/lib/famix/src/model/famix/entity.js +0 -17
  149. package/dist/lib/famix/src/model/famix/enum.js +0 -31
  150. package/dist/lib/famix/src/model/famix/enum_value.js +0 -25
  151. package/dist/lib/famix/src/model/famix/function.js +0 -17
  152. package/dist/lib/famix/src/model/famix/implicit_variable.js +0 -17
  153. package/dist/lib/famix/src/model/famix/import_clause.js +0 -41
  154. package/dist/lib/famix/src/model/famix/index.js +0 -86
  155. package/dist/lib/famix/src/model/famix/indexed_file_anchor.js +0 -38
  156. package/dist/lib/famix/src/model/famix/inheritance.js +0 -33
  157. package/dist/lib/famix/src/model/famix/interface.js +0 -64
  158. package/dist/lib/famix/src/model/famix/invocation.js +0 -54
  159. package/dist/lib/famix/src/model/famix/method.js +0 -67
  160. package/dist/lib/famix/src/model/famix/module.js +0 -60
  161. package/dist/lib/famix/src/model/famix/named_entity.js +0 -78
  162. package/dist/lib/famix/src/model/famix/parameter.js +0 -25
  163. package/dist/lib/famix/src/model/famix/parameterConcretisation.js +0 -44
  164. package/dist/lib/famix/src/model/famix/parameter_concretisation.js +0 -44
  165. package/dist/lib/famix/src/model/famix/parameter_type.js +0 -45
  166. package/dist/lib/famix/src/model/famix/parametricArrowFunction.js +0 -29
  167. package/dist/lib/famix/src/model/famix/parametric_arrow_function.js +0 -31
  168. package/dist/lib/famix/src/model/famix/parametric_class.js +0 -44
  169. package/dist/lib/famix/src/model/famix/parametric_function.js +0 -31
  170. package/dist/lib/famix/src/model/famix/parametric_interface.js +0 -44
  171. package/dist/lib/famix/src/model/famix/parametric_method.js +0 -31
  172. package/dist/lib/famix/src/model/famix/primitive_type.js +0 -17
  173. package/dist/lib/famix/src/model/famix/property.js +0 -73
  174. package/dist/lib/famix/src/model/famix/reference.js +0 -33
  175. package/dist/lib/famix/src/model/famix/scoping_entity.js +0 -36
  176. package/dist/lib/famix/src/model/famix/script_entity.js +0 -29
  177. package/dist/lib/famix/src/model/famix/source_anchor.js +0 -27
  178. package/dist/lib/famix/src/model/famix/source_language.js +0 -35
  179. package/dist/lib/famix/src/model/famix/sourced_entity.js +0 -60
  180. package/dist/lib/famix/src/model/famix/structural_entity.js +0 -39
  181. package/dist/lib/famix/src/model/famix/text_anchor.js +0 -38
  182. package/dist/lib/famix/src/model/famix/type.js +0 -73
  183. package/dist/lib/famix/src/model/famix/variable.js +0 -24
  184. package/fqn-model.json +0 -1
  185. package/iterateGenericTypes.ts +0 -69
  186. package/out/class-diagram/class-diagram.svg +0 -1
  187. package/sample.json +0 -1
  188. package/sample.ts +0 -1
  189. package/stats.txt +0 -3091
  190. package/tabby-debug-output.txt +0 -19433
  191. package/ts2famix.log +0 -22656
  192. package/validate-references.js +0 -103
@@ -1,278 +1,288 @@
1
- import { FamixBaseElement } from "./famix_base_element";
2
- import { Class, Interface, Variable, Method, ArrowFunction, Function as FamixFunctionEntity, Type, NamedEntity, ScriptEntity, Module, SourceLanguage } from "./model/famix";
3
- import * as Famix from "./model/famix";
4
- import { TSMorphObjectType } from "../../famix_functions/EntityDictionary";
5
- /**
6
- * This class is used to store all Famix elements
7
- */
8
- export class FamixRepository {
9
- private elements = new Set<FamixBaseElement>(); // All Famix elements
10
- private famixClasses = new Set<Class>(); // All Famix classes
11
- private famixInterfaces = new Set<Interface>(); // All Famix interfaces
12
- private famixModules = new Set<Module>(); // All Famix namespaces
13
- private famixMethods = new Set<Method>(); // All Famix methods
14
- private famixVariables = new Set<Variable>(); // All Famix variables
15
- private famixFunctions = new Set<FamixFunctionEntity>(); // All Famix functions
16
- private famixFiles = new Set<ScriptEntity | Module>(); // All Famix files
17
- private idCounter = 1; // Id counter
18
- private absolutePath: string = "";
19
- private fmxElementObjectMap = new Map<Famix.Entity, TSMorphObjectType>();
20
- private tsMorphObjectMap = new Map<TSMorphObjectType, Famix.Entity>(); // TODO: add this map to have two-way mapping between Famix and TS Morph objects
21
-
22
- constructor() {
23
- this.addElement(new SourceLanguage()); // add the source language entity (TypeScript)
24
- }
25
-
26
- public setFmxElementObjectMap(fmxElementObjectMap: Map<Famix.Entity, TSMorphObjectType>) {
27
- this.fmxElementObjectMap = fmxElementObjectMap;
28
- }
29
-
30
- public getFmxElementObjectMap() {
31
- return this.fmxElementObjectMap;
32
- }
33
-
34
- public getAbsolutePath(): string {
35
- return this.absolutePath;
36
- }
37
-
38
- public setAbsolutePath(path: string) {
39
- this.absolutePath = path;
40
- }
41
-
42
- /**
43
- * Gets a Famix entity by id
44
- * @param id An id of a Famix entity
45
- * @returns The Famix entity corresponding to the id or undefined if it doesn't exist
46
- */
47
- public getFamixEntityById(id: number): FamixBaseElement | undefined {
48
- const entity = Array.from(this.elements.values()).find(e => e.id === id);
49
- return entity;
50
- }
51
-
52
- /**
53
- * Gets a Famix entity by fully qualified name
54
- * @param fullyQualifiedName A fully qualified name
55
- * @returns The Famix entity corresponding to the fully qualified name or undefined if it doesn't exist
56
- */
57
- public getFamixEntityByFullyQualifiedName(fullyQualifiedName: string): FamixBaseElement | undefined {
58
- const allEntities = Array.from(this.elements.values()).filter(e => e instanceof NamedEntity) as Array<NamedEntity>;
59
- const entity = allEntities.find(e =>
60
- // {console.log(`namedEntity: ${e.fullyQualifiedName}`);
61
- // return
62
- e.fullyQualifiedName === fullyQualifiedName
63
- // }
64
- );
65
- return entity;
66
- }
67
-
68
- // Method to get Famix access by accessor and variable
69
- public getFamixAccessByAccessorAndVariable(accessor: Famix.ContainerEntity, variable: Famix.StructuralEntity): Famix.Access | undefined {
70
- // Iterate through the list of Famix accesses to find the matching one
71
- for (const access of Array.from(this.elements.values()).filter(e => e instanceof Famix.Access) as Array<Famix.Access>) {
72
- if (access.accessor === accessor && access.variable === variable) {
73
- return access;
74
- }
75
- }
76
- // Return undefined if no matching access is found
77
- return undefined;
78
- }
79
-
80
-
81
- export(arg0: { format: string; }) {
82
- if (arg0.format === "json") {
83
- return this.getJSON();
84
- } else {
85
- throw new Error("Unsupported format");
86
- }
87
- }
88
-
89
-
90
- // Only for tests
91
-
92
- /**
93
- * Gets all Famix entities
94
- * @returns All Famix entities
95
- */
96
- public _getAllEntities(): Set<FamixBaseElement> {
97
- return new Set(Array.from(this.elements.values()));
98
- }
99
-
100
- /**
101
- * Gets all Famix entities of a given type
102
- * @param theType A type of Famix entity
103
- * @returns All Famix entities of the given type
104
- */
105
- public _getAllEntitiesWithType(theType: string): Set<FamixBaseElement> {
106
- return new Set(Array.from(this.elements.values()).filter(e => (e as FamixBaseElement).constructor.name === theType));
107
- }
108
-
109
- /**
110
- * Gets a Famix class by name
111
- * @param name A class name
112
- * @returns The Famix class corresponding to the name or undefined if it doesn't exist
113
- */
114
- public _getFamixClass(fullyQualifiedName: string): Class | undefined {
115
- return Array.from(this.famixClasses.values()).find(ns => ns.fullyQualifiedName === fullyQualifiedName);
116
- }
117
-
118
- /**
119
- * Gets a Famix interface by name
120
- * @param name An interface name
121
- * @returns The Famix interface corresponding to the name or undefined if it doesn't exist
122
- */
123
- public _getFamixInterface(fullyQualifiedName: string): Interface | undefined {
124
- return Array.from(this.famixInterfaces.values()).find(ns => ns.fullyQualifiedName === fullyQualifiedName);
125
- }
126
-
127
- /**
128
- * Gets a Famix method by name
129
- * @param name A method name
130
- * @returns The Famix method corresponding to the name or undefined if it doesn't exist
131
- */
132
- public _getFamixMethod(fullyQualifiedName: string): Method | undefined {
133
- return Array.from(this.famixMethods.values()).find(ns => ns.fullyQualifiedName === fullyQualifiedName);
134
- }
135
-
136
- /**
137
- * Gets a Famix function by name
138
- * @param name A function name
139
- * @returns The Famix function corresponding to the name or undefined if it doesn't exist
140
- */
141
- public _getFamixFunction(fullyQualifiedName: string): FamixFunctionEntity | undefined {
142
- return Array.from(this.famixFunctions.values()).find(ns => ns.fullyQualifiedName === fullyQualifiedName);
143
- }
144
-
145
-
146
- /**
147
- * Gets a Famix variable by name
148
- * @param name A variable name
149
- * @returns The Famix variable corresponding to the name or undefined if it doesn't exist
150
- */
151
- public _getFamixVariable(fullyQualifiedName: string): Variable | undefined {
152
- return Array.from(this.famixVariables.values()).find(v => v.fullyQualifiedName === fullyQualifiedName);
153
- }
154
-
155
- /**
156
- * Gets a Famix namespace by name
157
- * @param name A namespace name
158
- * @returns The Famix namespace corresponding to the name or undefined if it doesn't exist
159
- */
160
- public _getFamixModule(fullyQualifiedName: string): Module | undefined {
161
- return Array.from(this.famixModules.values()).find(ns => ns.fullyQualifiedName === fullyQualifiedName);
162
- }
163
-
164
- /**
165
- * Gets all Famix namespaces
166
- * @returns All Famix namespaces
167
- */
168
- public _getFamixModules(): Set<Module> {
169
- return new Set(Array.from(this.famixModules.values()));
170
- }
171
-
172
- /**
173
- * Gets a Famix file by name
174
- * @param name A file name
175
- * @returns The Famix file corresponding to the name or undefined if it doesn't exist
176
- */
177
- public _getFamixFile(fullyQualifiedName: string): ScriptEntity | Module | undefined {
178
- return Array.from(this.famixFiles.values()).find(ns => ns.name === fullyQualifiedName);
179
- }
180
-
181
- /**
182
- * Gets all Famix files
183
- * @returns All Famix files
184
- */
185
- public _getFamixFiles(): Set<ScriptEntity | Module> {
186
- return new Set(Array.from(this.famixFiles.values()));
187
- }
188
-
189
- /**
190
- * Gets all method names as a set from a class
191
- * @param className A class name
192
- * @returns The set of class "className" method names
193
- */
194
- public _methodNamesAsSetFromClass(className: string): Set<string> {
195
- const theClass = this._getFamixClass(className) as Class;
196
- return new Set(Array.from(theClass.methods).map(m => m.name));
197
- }
198
-
199
- /**
200
- * Gets all method parents as a set from a class
201
- * @param className A class name
202
- * @returns The set of class "className" method parents
203
- */
204
- public _methodParentsAsSetFromClass(className: string): Set<Type> {
205
- const theClass = this._getFamixClass(className) as Class;
206
- return new Set(Array.from(theClass.methods).map(m => m.parentEntity));
207
- }
208
-
209
- /**
210
- * Gets the map of Famix element ids and their Famix element from a JSON model
211
- * @param model A JSON model
212
- * @returns The map of Famix element ids and their Famix element from the JSON model
213
- */
214
- public _initMapFromModel(model: string): Map<number, unknown> {
215
- const parsedModel: Array<FamixBaseElement> = JSON.parse(model);
216
- const idToElementMap: Map<number, unknown> = new Map();
217
- parsedModel.forEach(element => {
218
- idToElementMap.set(element.id, element);
219
- });
220
- return idToElementMap;
221
- }
222
-
223
-
224
- /**
225
- * Adds a Famix element to the repository
226
- * @param element A Famix element
227
- */
228
- public addElement(element: FamixBaseElement): void {
229
- if (element instanceof Class) {
230
- this.famixClasses.add(element);
231
- } else if (element instanceof Interface) {
232
- this.famixInterfaces.add(element);
233
- } else if (element instanceof Module) {
234
- this.famixModules.add(element);
235
- } else if (element instanceof Variable) {
236
- this.famixVariables.add(element);
237
- } else if (element instanceof Method) {
238
- this.famixMethods.add(element);
239
- } else if (element instanceof FamixFunctionEntity || element instanceof ArrowFunction) {
240
- this.famixFunctions.add(element);
241
- } else if (element instanceof ScriptEntity || element instanceof Module) {
242
- this.famixFiles.add(element);
243
- }
244
- this.elements.add(element);
245
- element.id = this.idCounter;
246
- this.idCounter++;
247
- this.validateFQNs();
248
- }
249
-
250
- /**
251
- * Validates the fully qualified names of all Famix elements
252
- */
253
- private validateFQNs(): void {
254
- // make sure all elements have unique fully qualified names
255
- const fqns = new Set<string>();
256
- for (const element of Array.from(this.elements.values())) {
257
- if (element instanceof NamedEntity && element.fullyQualifiedName && fqns.has(element.fullyQualifiedName)) {
258
- const theExistingElement = Array.from(this.elements.values()).find(e => (e as NamedEntity).fullyQualifiedName === element.fullyQualifiedName);
259
- throw new Error(`The fully qualified name ${element.fullyQualifiedName} is not unique.\nIt exists for ${theExistingElement?.getJSON()}`);
260
- }
261
- fqns.add((element as NamedEntity).fullyQualifiedName);
262
- }
263
- }
264
-
265
-
266
- /**
267
- * Gets a JSON representation of the repository
268
- * @returns A JSON representation of the repository
269
- */
270
- public getJSON(): string {
271
- let ret = "[";
272
- for (const element of Array.from(this.elements.values())) {
273
- ret = ret + element.getJSON() + ",";
274
- }
275
- ret = ret.substring(0, ret.length - 1);
276
- return ret + "]";
277
- }
278
- }
1
+ import { FamixBaseElement } from "./famix_base_element";
2
+ import { Class, Interface, Variable, Method, ArrowFunction, Function as FamixFunctionEntity, Type, NamedEntity, ScriptEntity, Module, SourceLanguage } from "./model/famix";
3
+ import * as Famix from "./model/famix";
4
+ import { TSMorphObjectType } from "../../famix_functions/EntityDictionary";
5
+ import { logger } from "../../analyze";
6
+
7
+ /**
8
+ * This class is used to store all Famix elements
9
+ */
10
+ export class FamixRepository {
11
+ private elements = new Set<FamixBaseElement>(); // All Famix elements
12
+ private famixClasses = new Set<Class>(); // All Famix classes
13
+ private famixInterfaces = new Set<Interface>(); // All Famix interfaces
14
+ private famixModules = new Set<Module>(); // All Famix namespaces
15
+ private famixMethods = new Set<Method>(); // All Famix methods
16
+ private famixVariables = new Set<Variable>(); // All Famix variables
17
+ private famixFunctions = new Set<FamixFunctionEntity>(); // All Famix functions
18
+ private famixFiles = new Set<ScriptEntity | Module>(); // All Famix files
19
+ private idCounter = 1; // Id counter
20
+ private absolutePath: string = "";
21
+ private fmxElementObjectMap = new Map<Famix.Entity, TSMorphObjectType>();
22
+ private tsMorphObjectMap = new Map<TSMorphObjectType, Famix.Entity>(); // TODO: add this map to have two-way mapping between Famix and TS Morph objects
23
+
24
+ constructor() {
25
+ this.addElement(new SourceLanguage()); // add the source language entity (TypeScript)
26
+ }
27
+
28
+ public setFmxElementObjectMap(fmxElementObjectMap: Map<Famix.Entity, TSMorphObjectType>) {
29
+ this.fmxElementObjectMap = fmxElementObjectMap;
30
+ }
31
+
32
+ public getFmxElementObjectMap() {
33
+ return this.fmxElementObjectMap;
34
+ }
35
+
36
+ public getAbsolutePath(): string {
37
+ return this.absolutePath;
38
+ }
39
+
40
+ public setAbsolutePath(path: string) {
41
+ this.absolutePath = path;
42
+ }
43
+
44
+ /**
45
+ * Gets a Famix entity by id
46
+ * @param id An id of a Famix entity
47
+ * @returns The Famix entity corresponding to the id or undefined if it doesn't exist
48
+ */
49
+ public getFamixEntityById(id: number): FamixBaseElement | undefined {
50
+ const entity = Array.from(this.elements.values()).find(e => e.id === id);
51
+ return entity;
52
+ }
53
+
54
+ /**
55
+ * Gets a Famix entity by fully qualified name
56
+ * @param fullyQualifiedName A fully qualified name
57
+ * @returns The Famix entity corresponding to the fully qualified name or undefined if it doesn't exist
58
+ */
59
+ public getFamixEntityByFullyQualifiedName(fullyQualifiedName: string): FamixBaseElement | undefined {
60
+ const allEntities = Array.from(this.elements.values()).filter(e => e instanceof NamedEntity) as Array<NamedEntity>;
61
+ const entity = allEntities.find(e =>
62
+ // {console.log(`namedEntity: ${e.fullyQualifiedName}`);
63
+ // return
64
+ e.fullyQualifiedName === fullyQualifiedName
65
+ // }
66
+ );
67
+ return entity;
68
+ }
69
+
70
+ // Method to get Famix access by accessor and variable
71
+ public getFamixAccessByAccessorAndVariable(accessor: Famix.ContainerEntity, variable: Famix.StructuralEntity): Famix.Access | undefined {
72
+ // Iterate through the list of Famix accesses to find the matching one
73
+ for (const access of Array.from(this.elements.values()).filter(e => e instanceof Famix.Access) as Array<Famix.Access>) {
74
+ if (access.accessor === accessor && access.variable === variable) {
75
+ return access;
76
+ }
77
+ }
78
+ // Return undefined if no matching access is found
79
+ return undefined;
80
+ }
81
+
82
+
83
+ export(arg0: { format: string; }) {
84
+ if (arg0.format === "json") {
85
+ return this.getJSON();
86
+ } else {
87
+ throw new Error("Unsupported format");
88
+ }
89
+ }
90
+
91
+
92
+ // Only for tests
93
+
94
+ /**
95
+ * Gets all Famix entities
96
+ * @returns All Famix entities
97
+ */
98
+ public _getAllEntities(): Set<FamixBaseElement> {
99
+ return new Set(Array.from(this.elements.values()));
100
+ }
101
+
102
+ /**
103
+ * Gets all Famix entities of a given type
104
+ * @param theType A type of Famix entity
105
+ * @returns All Famix entities of the given type
106
+ */
107
+ public _getAllEntitiesWithType(theType: string): Set<FamixBaseElement> {
108
+ return new Set(Array.from(this.elements.values()).filter(e => (e as FamixBaseElement).constructor.name === theType));
109
+ }
110
+
111
+ /**
112
+ * Gets a Famix class by name
113
+ * @param name A class name
114
+ * @returns The Famix class corresponding to the name or undefined if it doesn't exist
115
+ */
116
+ public _getFamixClass(fullyQualifiedName: string): Class | undefined {
117
+ return Array.from(this.famixClasses.values()).find(ns => ns.fullyQualifiedName === fullyQualifiedName);
118
+ }
119
+
120
+ /**
121
+ * Gets a Famix interface by name
122
+ * @param name An interface name
123
+ * @returns The Famix interface corresponding to the name or undefined if it doesn't exist
124
+ */
125
+ public _getFamixInterface(fullyQualifiedName: string): Interface | undefined {
126
+ return Array.from(this.famixInterfaces.values()).find(ns => ns.fullyQualifiedName === fullyQualifiedName);
127
+ }
128
+
129
+ /**
130
+ * Gets a Famix method by name
131
+ * @param name A method name
132
+ * @returns The Famix method corresponding to the name or undefined if it doesn't exist
133
+ */
134
+ public _getFamixMethod(fullyQualifiedName: string): Method | undefined {
135
+ return Array.from(this.famixMethods.values()).find(ns => ns.fullyQualifiedName === fullyQualifiedName);
136
+ }
137
+
138
+ /**
139
+ * Gets a Famix function by name
140
+ * @param name A function name
141
+ * @returns The Famix function corresponding to the name or undefined if it doesn't exist
142
+ */
143
+ public _getFamixFunction(fullyQualifiedName: string): FamixFunctionEntity | undefined {
144
+ return Array.from(this.famixFunctions.values()).find(ns => ns.fullyQualifiedName === fullyQualifiedName);
145
+ }
146
+
147
+
148
+ /**
149
+ * Gets a Famix variable by name
150
+ * @param name A variable name
151
+ * @returns The Famix variable corresponding to the name or undefined if it doesn't exist
152
+ */
153
+ public _getFamixVariable(fullyQualifiedName: string): Variable | undefined {
154
+ return Array.from(this.famixVariables.values()).find(v => v.fullyQualifiedName === fullyQualifiedName);
155
+ }
156
+
157
+ /**
158
+ * Gets a Famix namespace by name
159
+ * @param name A namespace name
160
+ * @returns The Famix namespace corresponding to the name or undefined if it doesn't exist
161
+ */
162
+ public _getFamixModule(fullyQualifiedName: string): Module | undefined {
163
+ return Array.from(this.famixModules.values()).find(ns => ns.fullyQualifiedName === fullyQualifiedName);
164
+ }
165
+
166
+ /**
167
+ * Gets all Famix namespaces
168
+ * @returns All Famix namespaces
169
+ */
170
+ public _getFamixModules(): Set<Module> {
171
+ return new Set(Array.from(this.famixModules.values()));
172
+ }
173
+
174
+ /**
175
+ * Gets a Famix file by name
176
+ * @param name A file name
177
+ * @returns The Famix file corresponding to the name or undefined if it doesn't exist
178
+ */
179
+ public _getFamixFile(fullyQualifiedName: string): ScriptEntity | Module | undefined {
180
+ return Array.from(this.famixFiles.values()).find(ns => ns.name === fullyQualifiedName);
181
+ }
182
+
183
+ /**
184
+ * Gets all Famix files
185
+ * @returns All Famix files
186
+ */
187
+ public _getFamixFiles(): Set<ScriptEntity | Module> {
188
+ return new Set(Array.from(this.famixFiles.values()));
189
+ }
190
+
191
+ /**
192
+ * Gets all method names as a set from a class
193
+ * @param className A class name
194
+ * @returns The set of class "className" method names
195
+ */
196
+ public _methodNamesAsSetFromClass(className: string): Set<string> {
197
+ const theClass = this._getFamixClass(className) as Class;
198
+ return new Set(Array.from(theClass.methods).map(m => m.name));
199
+ }
200
+
201
+ /**
202
+ * Gets all method parents as a set from a class
203
+ * @param className A class name
204
+ * @returns The set of class "className" method parents
205
+ */
206
+ public _methodParentsAsSetFromClass(className: string): Set<Type> {
207
+ const theClass = this._getFamixClass(className) as Class;
208
+ return new Set(Array.from(theClass.methods).map(m => m.parentEntity));
209
+ }
210
+
211
+ /**
212
+ * Gets the map of Famix element ids and their Famix element from a JSON model
213
+ * @param model A JSON model
214
+ * @returns The map of Famix element ids and their Famix element from the JSON model
215
+ */
216
+ public _initMapFromModel(model: string): Map<number, unknown> {
217
+ const parsedModel: Array<FamixBaseElement> = JSON.parse(model);
218
+ const idToElementMap: Map<number, unknown> = new Map();
219
+ parsedModel.forEach(element => {
220
+ idToElementMap.set(element.id, element);
221
+ });
222
+ return idToElementMap;
223
+ }
224
+
225
+
226
+ /**
227
+ * Adds a Famix element to the repository
228
+ * @param element A Famix element
229
+ */
230
+ public addElement(element: FamixBaseElement): void {
231
+ logger.debug(`Adding Famix element ${element.constructor.name} with id ${element.id}`);
232
+ if (element instanceof Class) {
233
+ this.famixClasses.add(element);
234
+ } else if (element instanceof Interface) {
235
+ this.famixInterfaces.add(element);
236
+ } else if (element instanceof Module) {
237
+ this.famixModules.add(element);
238
+ } else if (element instanceof Variable) {
239
+ this.famixVariables.add(element);
240
+ } else if (element instanceof Method) {
241
+ this.famixMethods.add(element);
242
+ } else if (element instanceof FamixFunctionEntity || element instanceof ArrowFunction) {
243
+ this.famixFunctions.add(element);
244
+ } else if (element instanceof ScriptEntity || element instanceof Module) {
245
+ this.famixFiles.add(element);
246
+ }
247
+ this.elements.add(element);
248
+ element.id = this.idCounter;
249
+ this.idCounter++;
250
+ this.validateFQNs();
251
+ }
252
+
253
+ /**
254
+ * Validates the fully qualified names of all Famix elements
255
+ */
256
+ private validateFQNs(): void {
257
+ // make sure all elements have unique fully qualified names
258
+ const fqns = new Set<string>();
259
+ for (const element of Array.from(this.elements.values())) {
260
+ // ignore everything that is not a NamedEntity
261
+ if (element instanceof NamedEntity) {
262
+ if (element.fullyQualifiedName && fqns.has(element.fullyQualifiedName)) {
263
+ const theExistingElement = Array.from(this.elements.values()).find(e => (e as NamedEntity).fullyQualifiedName === element.fullyQualifiedName);
264
+ throw new Error(`The fully qualified name ${element.fullyQualifiedName} is not unique.\nIt exists for ${theExistingElement?.getJSON()}`);
265
+ }
266
+ const theName = (element as NamedEntity).fullyQualifiedName;
267
+ if (theName === undefined || theName === "") {
268
+ throw new Error(`The element ${element.constructor.name} with id ${element.id} has no valid fully qualified name`);
269
+ }
270
+ fqns.add(theName);
271
+ }
272
+ }
273
+ }
274
+
275
+
276
+ /**
277
+ * Gets a JSON representation of the repository
278
+ * @returns A JSON representation of the repository
279
+ */
280
+ public getJSON(): string {
281
+ let ret = "[";
282
+ for (const element of Array.from(this.elements.values())) {
283
+ ret = ret + element.getJSON() + ",";
284
+ }
285
+ ret = ret.substring(0, ret.length - 1);
286
+ return ret + "]";
287
+ }
288
+ }
@@ -1,8 +1,8 @@
1
- import * as Famix from "./model/famix";
2
- import { FamixBaseElement } from "./famix_base_element";
3
- import { FamixJSONExporter } from "./famix_JSON_exporter";
4
- import { FamixRepository } from "./famix_repository";
5
-
6
- const model = { Famix };
7
-
8
- export = { FamixBaseElement, FamixJSONExporter, FamixRepository, model };
1
+ import * as Famix from "./model/famix";
2
+ import { FamixBaseElement } from "./famix_base_element";
3
+ import { FamixJSONExporter } from "./famix_JSON_exporter";
4
+ import { FamixRepository } from "./famix_repository";
5
+
6
+ const model = { Famix };
7
+
8
+ export = { FamixBaseElement, FamixJSONExporter, FamixRepository, model };