ts2famix 1.3.1 → 1.4.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/analyze.js +38 -27
- package/dist/analyze_functions/process_functions.js +723 -0
- package/dist/famix_functions/EntityDictionary.js +798 -0
- package/dist/famix_functions/helpers_creation.js +97 -0
- package/dist/fqn.js +106 -95
- package/dist/lib/famix/src/famix_base_element.js +8 -4
- package/dist/lib/famix/src/famix_repository.js +32 -15
- package/dist/lib/ts-complex/cyclomatic-service.js +2 -3
- package/doc-uml/metamodel-full.svg +1 -0
- package/doc-uml/metamodel.svg +1 -0
- package/package.json +1 -1
- package/plantuml.jar +0 -0
- package/src/analyze.ts +48 -29
- package/src/analyze_functions/process_functions.ts +838 -0
- package/src/famix_functions/EntityDictionary.ts +915 -0
- package/src/famix_functions/helpers_creation.ts +77 -0
- package/src/fqn.ts +101 -92
- package/src/lib/famix/src/famix_base_element.ts +9 -5
- package/src/lib/famix/src/famix_repository.ts +45 -23
- package/src/lib/ts-complex/cyclomatic-service.ts +2 -4
- package/src/ts2famix-cli.ts +1 -0
- package/dist/analyze_functions/processAccesses.js +0 -56
- package/dist/analyze_functions/processFiles.js +0 -554
- package/dist/analyze_functions/processImportClauses.js +0 -88
- package/dist/analyze_functions/processInheritances.js +0 -74
- package/dist/analyze_functions/processInvocations.js +0 -50
- package/dist/famix_functions/famix_functions.js +0 -523
- package/dist/famix_functions/famix_functions_associations.js +0 -238
- package/dist/famix_functions/famix_functions_index.js +0 -135
- package/dist/famix_functions/famix_functions_types.js +0 -115
- package/docs/.gitkeep +0 -0
- package/src/analyze_functions/processAccesses.ts +0 -58
- package/src/analyze_functions/processFiles.ts +0 -667
- package/src/analyze_functions/processImportClauses.ts +0 -95
- package/src/analyze_functions/processInheritances.ts +0 -85
- package/src/analyze_functions/processInvocations.ts +0 -52
- package/src/famix_functions/famix_functions.ts +0 -562
- package/src/famix_functions/famix_functions_associations.ts +0 -242
- package/src/famix_functions/famix_functions_index.ts +0 -120
- package/src/famix_functions/famix_functions_types.ts +0 -106
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.findTypeAncestor = exports.findAncestor = exports.computeSignature = exports.getSubTypeName = exports.indexOfSplitArray = void 0;
|
|
27
|
+
const Famix = __importStar(require("../lib/famix/src/model/famix"));
|
|
28
|
+
const analyze_1 = require("../analyze");
|
|
29
|
+
const ts_morph_1 = require("ts-morph");
|
|
30
|
+
/**
|
|
31
|
+
* This function works like indexOf, but it works with arrays of grapheme clusters.
|
|
32
|
+
* @param targetArray
|
|
33
|
+
*/
|
|
34
|
+
function indexOfSplitArray(params) {
|
|
35
|
+
const { searchArray, targetArray, start = 0 } = params;
|
|
36
|
+
for (let i = start; i <= searchArray.length - targetArray.length; i++) {
|
|
37
|
+
let found = true;
|
|
38
|
+
for (let j = 0; j < targetArray.length; j++) {
|
|
39
|
+
if (searchArray[i + j] !== targetArray[j]) {
|
|
40
|
+
found = false;
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (found) {
|
|
45
|
+
return i; // Return the index where the target array was found
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return -1; // Return -1 if the target array was not found in the search array
|
|
49
|
+
}
|
|
50
|
+
exports.indexOfSplitArray = indexOfSplitArray;
|
|
51
|
+
function getSubTypeName(fmxNamedEntity) {
|
|
52
|
+
const name = fmxNamedEntity instanceof Famix.Class ? 'Class' :
|
|
53
|
+
fmxNamedEntity instanceof Famix.Interface ? 'Interface' :
|
|
54
|
+
fmxNamedEntity instanceof Famix.Function ? 'Function' :
|
|
55
|
+
fmxNamedEntity instanceof Famix.Enum ? 'Enum' :
|
|
56
|
+
fmxNamedEntity instanceof Famix.EnumValue ? 'EnumValue' :
|
|
57
|
+
fmxNamedEntity instanceof Famix.Alias ? 'Alias' :
|
|
58
|
+
fmxNamedEntity instanceof Famix.Variable ? 'Variable' :
|
|
59
|
+
fmxNamedEntity instanceof Famix.Type ? 'Type' :
|
|
60
|
+
fmxNamedEntity instanceof Famix.Method ? 'Method' :
|
|
61
|
+
fmxNamedEntity instanceof Famix.Decorator ? 'Decorator' :
|
|
62
|
+
fmxNamedEntity instanceof Famix.Accessor ? 'Accessor' :
|
|
63
|
+
fmxNamedEntity instanceof Famix.Parameter ? 'Parameter' :
|
|
64
|
+
fmxNamedEntity instanceof Famix.Property ? 'Property' :
|
|
65
|
+
'NamedEntity';
|
|
66
|
+
analyze_1.logger.debug(`${fmxNamedEntity.getName()} is of type ${name}`);
|
|
67
|
+
return name;
|
|
68
|
+
}
|
|
69
|
+
exports.getSubTypeName = getSubTypeName;
|
|
70
|
+
/**
|
|
71
|
+
* Gets the signature of a method or a function
|
|
72
|
+
* @param text A method or a function source code
|
|
73
|
+
* @returns The signature of the method or the function
|
|
74
|
+
*/
|
|
75
|
+
function computeSignature(text) {
|
|
76
|
+
const endSignatureText = text.indexOf("{");
|
|
77
|
+
return text.substring(0, endSignatureText).trim();
|
|
78
|
+
}
|
|
79
|
+
exports.computeSignature = computeSignature;
|
|
80
|
+
/**
|
|
81
|
+
* Finds the ancestor of a node
|
|
82
|
+
* @param node A node
|
|
83
|
+
* @returns The ancestor of the node
|
|
84
|
+
*/
|
|
85
|
+
function findAncestor(node) {
|
|
86
|
+
return node.getAncestors().find(a => a.getKind() === ts_morph_1.SyntaxKind.MethodDeclaration || a.getKind() === ts_morph_1.SyntaxKind.Constructor || a.getKind() === ts_morph_1.SyntaxKind.FunctionDeclaration || a.getKind() === ts_morph_1.SyntaxKind.FunctionExpression || a.getKind() === ts_morph_1.SyntaxKind.ModuleDeclaration || a.getKind() === ts_morph_1.SyntaxKind.SourceFile || a.getKindName() === "GetAccessor" || a.getKindName() === "SetAccessor" || a.getKind() === ts_morph_1.SyntaxKind.ClassDeclaration);
|
|
87
|
+
}
|
|
88
|
+
exports.findAncestor = findAncestor;
|
|
89
|
+
/**
|
|
90
|
+
* Finds the ancestor of a ts-morph element
|
|
91
|
+
* @param element A ts-morph element
|
|
92
|
+
* @returns The ancestor of the ts-morph element
|
|
93
|
+
*/
|
|
94
|
+
function findTypeAncestor(element) {
|
|
95
|
+
return element.getAncestors().find(a => a.getKind() === ts_morph_1.SyntaxKind.MethodDeclaration || a.getKind() === ts_morph_1.SyntaxKind.Constructor || a.getKind() === ts_morph_1.SyntaxKind.MethodSignature || a.getKind() === ts_morph_1.SyntaxKind.FunctionDeclaration || a.getKind() === ts_morph_1.SyntaxKind.FunctionExpression || a.getKind() === ts_morph_1.SyntaxKind.ModuleDeclaration || a.getKind() === ts_morph_1.SyntaxKind.SourceFile || a.getKindName() === "GetAccessor" || a.getKindName() === "SetAccessor" || a.getKind() === ts_morph_1.SyntaxKind.ClassDeclaration || a.getKind() === ts_morph_1.SyntaxKind.InterfaceDeclaration);
|
|
96
|
+
}
|
|
97
|
+
exports.findTypeAncestor = findTypeAncestor;
|
package/dist/fqn.js
CHANGED
|
@@ -22,105 +22,116 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
22
22
|
__setModuleDefault(result, mod);
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
25
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.
|
|
29
|
+
exports.getNameOfNode = exports.getFQN = void 0;
|
|
27
30
|
const ts = __importStar(require("ts-morph"));
|
|
31
|
+
const analyze_1 = require("./analyze");
|
|
32
|
+
const path_1 = __importDefault(require("path"));
|
|
28
33
|
/**
|
|
29
|
-
*
|
|
34
|
+
* Gets the fully qualified name of a node, if it has one
|
|
35
|
+
* @param node A node
|
|
36
|
+
* @returns The fully qualified name of the node, or undefined if it doesn't have one
|
|
30
37
|
*/
|
|
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
|
-
if (nodeName)
|
|
58
|
-
qualifiedNameParts.push(nodeName);
|
|
59
|
-
const ancestors = node.getAncestors();
|
|
60
|
-
ancestors.forEach(a => {
|
|
61
|
-
const partName = this.getNameOfNode(a);
|
|
62
|
-
if (partName)
|
|
63
|
-
qualifiedNameParts.push(partName);
|
|
64
|
-
});
|
|
65
|
-
if (qualifiedNameParts.length > 0) {
|
|
66
|
-
return `"${sourceFileDirectory}/${qualifiedNameParts.pop()}".${qualifiedNameParts.reverse().join(".")}`;
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
return undefined;
|
|
70
|
-
}
|
|
38
|
+
function getFQN(node) {
|
|
39
|
+
const absolutePathProject = analyze_1.entityDictionary.famixRep.getAbsolutePath();
|
|
40
|
+
if (node instanceof ts.SourceFile) {
|
|
41
|
+
return analyze_1.entityDictionary.convertToRelativePath(path_1.default.normalize(node.getFilePath()), absolutePathProject).replace(/\\/sg, "/");
|
|
42
|
+
}
|
|
43
|
+
const symbol = node.getSymbol();
|
|
44
|
+
if (!symbol) {
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
const declarations = symbol.getDeclarations();
|
|
48
|
+
if (!declarations) {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
const sourceFile = declarations[0].getSourceFile();
|
|
52
|
+
if (!sourceFile) {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
const absolutePath = path_1.default.normalize(sourceFile.getFilePath());
|
|
56
|
+
const positionNodeModules = absolutePath.indexOf('node_modules');
|
|
57
|
+
let pathInProject = "";
|
|
58
|
+
if (positionNodeModules !== -1) {
|
|
59
|
+
const pathFromNodeModules = absolutePath.substring(positionNodeModules);
|
|
60
|
+
pathInProject = pathFromNodeModules;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
pathInProject = analyze_1.entityDictionary.convertToRelativePath(absolutePath, absolutePathProject).replace(/\\/g, "/");
|
|
71
64
|
}
|
|
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
|
-
|
|
65
|
+
const qualifiedNameParts = [];
|
|
66
|
+
const nodeName = this.getNameOfNode(node);
|
|
67
|
+
if (nodeName)
|
|
68
|
+
qualifiedNameParts.push(nodeName);
|
|
69
|
+
const ancestors = node.getAncestors();
|
|
70
|
+
ancestors.forEach(a => {
|
|
71
|
+
const partName = this.getNameOfNode(a);
|
|
72
|
+
if (partName)
|
|
73
|
+
qualifiedNameParts.push(partName);
|
|
74
|
+
});
|
|
75
|
+
qualifiedNameParts.pop();
|
|
76
|
+
if (qualifiedNameParts.length > 0) {
|
|
77
|
+
return `{${pathInProject}}.${qualifiedNameParts.reverse().join(".")}`;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
exports.getFQN = getFQN;
|
|
84
|
+
/**
|
|
85
|
+
* Gets the name of a node, if it has one
|
|
86
|
+
* @param a A node
|
|
87
|
+
* @returns The name of the node, or an empty string if it doesn't have one
|
|
88
|
+
*/
|
|
89
|
+
function getNameOfNode(a) {
|
|
90
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v;
|
|
91
|
+
switch (a.getKind()) {
|
|
92
|
+
case ts.SyntaxKind.SourceFile:
|
|
93
|
+
return (_a = a.asKind(ts.SyntaxKind.SourceFile)) === null || _a === void 0 ? void 0 : _a.getBaseName();
|
|
94
|
+
case ts.SyntaxKind.ModuleDeclaration:
|
|
95
|
+
return (_b = a.asKind(ts.SyntaxKind.ModuleDeclaration)) === null || _b === void 0 ? void 0 : _b.getName();
|
|
96
|
+
case ts.SyntaxKind.ClassDeclaration:
|
|
97
|
+
return (_c = a.asKind(ts.SyntaxKind.ClassDeclaration)) === null || _c === void 0 ? void 0 : _c.getName();
|
|
98
|
+
case ts.SyntaxKind.InterfaceDeclaration:
|
|
99
|
+
return (_d = a.asKind(ts.SyntaxKind.InterfaceDeclaration)) === null || _d === void 0 ? void 0 : _d.getName();
|
|
100
|
+
case ts.SyntaxKind.PropertyDeclaration:
|
|
101
|
+
return (_e = a.asKind(ts.SyntaxKind.PropertyDeclaration)) === null || _e === void 0 ? void 0 : _e.getName();
|
|
102
|
+
case ts.SyntaxKind.PropertySignature:
|
|
103
|
+
return (_f = a.asKind(ts.SyntaxKind.PropertySignature)) === null || _f === void 0 ? void 0 : _f.getName();
|
|
104
|
+
case ts.SyntaxKind.MethodDeclaration:
|
|
105
|
+
return (_g = a.asKind(ts.SyntaxKind.MethodDeclaration)) === null || _g === void 0 ? void 0 : _g.getName();
|
|
106
|
+
case ts.SyntaxKind.MethodSignature:
|
|
107
|
+
return (_h = a.asKind(ts.SyntaxKind.MethodSignature)) === null || _h === void 0 ? void 0 : _h.getName();
|
|
108
|
+
case ts.SyntaxKind.GetAccessor:
|
|
109
|
+
return (_j = a.asKind(ts.SyntaxKind.GetAccessor)) === null || _j === void 0 ? void 0 : _j.getName();
|
|
110
|
+
case ts.SyntaxKind.SetAccessor:
|
|
111
|
+
return (_k = a.asKind(ts.SyntaxKind.SetAccessor)) === null || _k === void 0 ? void 0 : _k.getName();
|
|
112
|
+
case ts.SyntaxKind.FunctionDeclaration:
|
|
113
|
+
return (_l = a.asKind(ts.SyntaxKind.FunctionDeclaration)) === null || _l === void 0 ? void 0 : _l.getName();
|
|
114
|
+
case ts.SyntaxKind.FunctionExpression:
|
|
115
|
+
return ((_m = a.asKind(ts.SyntaxKind.FunctionExpression)) === null || _m === void 0 ? void 0 : _m.getName()) ? (_o = a.asKind(ts.SyntaxKind.FunctionExpression)) === null || _o === void 0 ? void 0 : _o.getName() : "anonymous";
|
|
116
|
+
case ts.SyntaxKind.Parameter:
|
|
117
|
+
return (_p = a.asKind(ts.SyntaxKind.Parameter)) === null || _p === void 0 ? void 0 : _p.getName();
|
|
118
|
+
case ts.SyntaxKind.VariableDeclaration:
|
|
119
|
+
return (_q = a.asKind(ts.SyntaxKind.VariableDeclaration)) === null || _q === void 0 ? void 0 : _q.getName();
|
|
120
|
+
case ts.SyntaxKind.Decorator:
|
|
121
|
+
return "@" + ((_r = a.asKind(ts.SyntaxKind.Decorator)) === null || _r === void 0 ? void 0 : _r.getName());
|
|
122
|
+
case ts.SyntaxKind.TypeParameter:
|
|
123
|
+
return (_s = a.asKind(ts.SyntaxKind.TypeParameter)) === null || _s === void 0 ? void 0 : _s.getName();
|
|
124
|
+
case ts.SyntaxKind.EnumDeclaration:
|
|
125
|
+
return (_t = a.asKind(ts.SyntaxKind.EnumDeclaration)) === null || _t === void 0 ? void 0 : _t.getName();
|
|
126
|
+
case ts.SyntaxKind.EnumMember:
|
|
127
|
+
return (_u = a.asKind(ts.SyntaxKind.EnumMember)) === null || _u === void 0 ? void 0 : _u.getName();
|
|
128
|
+
case ts.SyntaxKind.TypeAliasDeclaration:
|
|
129
|
+
return (_v = a.asKind(ts.SyntaxKind.TypeAliasDeclaration)) === null || _v === void 0 ? void 0 : _v.getName();
|
|
130
|
+
case ts.SyntaxKind.Constructor:
|
|
131
|
+
return "constructor";
|
|
132
|
+
default:
|
|
133
|
+
// ancestor hasn't got a useful name
|
|
134
|
+
return "";
|
|
124
135
|
}
|
|
125
136
|
}
|
|
126
|
-
exports.
|
|
137
|
+
exports.getNameOfNode = getNameOfNode;
|
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.FamixBaseElement = void 0;
|
|
4
|
+
const analyze_1 = require("../../../analyze");
|
|
5
|
+
// import { FamixRepository } from "./famix_repository";
|
|
4
6
|
class FamixBaseElement {
|
|
5
|
-
constructor(repo) {
|
|
6
|
-
|
|
7
|
+
// constructor(repo: FamixRepository) {
|
|
8
|
+
// repo.addElement(this);
|
|
9
|
+
// }
|
|
10
|
+
constructor() {
|
|
7
11
|
}
|
|
8
|
-
// @
|
|
9
|
-
// tslint:disable-next-line:no-empty
|
|
12
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
10
13
|
addPropertiesToExporter(exporter) {
|
|
14
|
+
analyze_1.logger.debug("addPropertiesToExporter not implemented for " + this.constructor.name + `(${exporter})`);
|
|
11
15
|
}
|
|
12
16
|
}
|
|
13
17
|
exports.FamixBaseElement = FamixBaseElement;
|
|
@@ -16,7 +16,21 @@ class FamixRepository {
|
|
|
16
16
|
this.famixFunctions = new Set(); // All Famix functions
|
|
17
17
|
this.famixFiles = new Set(); // All Famix files
|
|
18
18
|
this.idCounter = 1; // Id counter
|
|
19
|
-
this.
|
|
19
|
+
this.absolutePath = "";
|
|
20
|
+
this.fmxElementObjectMap = new Map();
|
|
21
|
+
this.addElement(new famix_1.SourceLanguage()); // add the source language entity (TypeScript)
|
|
22
|
+
}
|
|
23
|
+
setFmxElementObjectMap(fmxElementObjectMap) {
|
|
24
|
+
this.fmxElementObjectMap = fmxElementObjectMap;
|
|
25
|
+
}
|
|
26
|
+
getFmxElementObjectMap() {
|
|
27
|
+
return this.fmxElementObjectMap;
|
|
28
|
+
}
|
|
29
|
+
getAbsolutePath() {
|
|
30
|
+
return this.absolutePath;
|
|
31
|
+
}
|
|
32
|
+
setAbsolutePath(path) {
|
|
33
|
+
this.absolutePath = path;
|
|
20
34
|
}
|
|
21
35
|
/**
|
|
22
36
|
* Gets a Famix entity by id
|
|
@@ -41,6 +55,9 @@ class FamixRepository {
|
|
|
41
55
|
if (arg0.format === "json") {
|
|
42
56
|
return this.getJSON();
|
|
43
57
|
}
|
|
58
|
+
else {
|
|
59
|
+
throw new Error("Unsupported format");
|
|
60
|
+
}
|
|
44
61
|
}
|
|
45
62
|
// Only for tests
|
|
46
63
|
/**
|
|
@@ -63,48 +80,48 @@ class FamixRepository {
|
|
|
63
80
|
* @param name A class name
|
|
64
81
|
* @returns The Famix class corresponding to the name or undefined if it doesn't exist
|
|
65
82
|
*/
|
|
66
|
-
_getFamixClass(
|
|
67
|
-
return Array.from(this.famixClasses.values()).find(ns => ns.
|
|
83
|
+
_getFamixClass(fullyQualifiedName) {
|
|
84
|
+
return Array.from(this.famixClasses.values()).find(ns => ns.getFullyQualifiedName() === fullyQualifiedName);
|
|
68
85
|
}
|
|
69
86
|
/**
|
|
70
87
|
* Gets a Famix interface by name
|
|
71
88
|
* @param name An interface name
|
|
72
89
|
* @returns The Famix interface corresponding to the name or undefined if it doesn't exist
|
|
73
90
|
*/
|
|
74
|
-
_getFamixInterface(
|
|
75
|
-
return Array.from(this.famixInterfaces.values()).find(ns => ns.
|
|
91
|
+
_getFamixInterface(fullyQualifiedName) {
|
|
92
|
+
return Array.from(this.famixInterfaces.values()).find(ns => ns.getFullyQualifiedName() === fullyQualifiedName);
|
|
76
93
|
}
|
|
77
94
|
/**
|
|
78
95
|
* Gets a Famix method by name
|
|
79
96
|
* @param name A method name
|
|
80
97
|
* @returns The Famix method corresponding to the name or undefined if it doesn't exist
|
|
81
98
|
*/
|
|
82
|
-
_getFamixMethod(
|
|
83
|
-
return Array.from(this.famixMethods.values()).find(ns => ns.
|
|
99
|
+
_getFamixMethod(fullyQualifiedName) {
|
|
100
|
+
return Array.from(this.famixMethods.values()).find(ns => ns.getFullyQualifiedName() === fullyQualifiedName);
|
|
84
101
|
}
|
|
85
102
|
/**
|
|
86
103
|
* Gets a Famix function by name
|
|
87
104
|
* @param name A function name
|
|
88
105
|
* @returns The Famix function corresponding to the name or undefined if it doesn't exist
|
|
89
106
|
*/
|
|
90
|
-
_getFamixFunction(
|
|
91
|
-
return Array.from(this.famixFunctions.values()).find(ns => ns.
|
|
107
|
+
_getFamixFunction(fullyQualifiedName) {
|
|
108
|
+
return Array.from(this.famixFunctions.values()).find(ns => ns.getFullyQualifiedName() === fullyQualifiedName);
|
|
92
109
|
}
|
|
93
110
|
/**
|
|
94
111
|
* Gets a Famix variable by name
|
|
95
112
|
* @param name A variable name
|
|
96
113
|
* @returns The Famix variable corresponding to the name or undefined if it doesn't exist
|
|
97
114
|
*/
|
|
98
|
-
_getFamixVariable(
|
|
99
|
-
return Array.from(this.famixVariables.values()).find(v => v.
|
|
115
|
+
_getFamixVariable(fullyQualifiedName) {
|
|
116
|
+
return Array.from(this.famixVariables.values()).find(v => v.getFullyQualifiedName() === fullyQualifiedName);
|
|
100
117
|
}
|
|
101
118
|
/**
|
|
102
119
|
* Gets a Famix namespace by name
|
|
103
120
|
* @param name A namespace name
|
|
104
121
|
* @returns The Famix namespace corresponding to the name or undefined if it doesn't exist
|
|
105
122
|
*/
|
|
106
|
-
_getFamixNamespace(
|
|
107
|
-
return Array.from(this.famixNamespaces.values()).find(ns => ns.
|
|
123
|
+
_getFamixNamespace(fullyQualifiedName) {
|
|
124
|
+
return Array.from(this.famixNamespaces.values()).find(ns => ns.getFullyQualifiedName() === fullyQualifiedName);
|
|
108
125
|
}
|
|
109
126
|
/**
|
|
110
127
|
* Gets all Famix namespaces
|
|
@@ -118,8 +135,8 @@ class FamixRepository {
|
|
|
118
135
|
* @param name A file name
|
|
119
136
|
* @returns The Famix file corresponding to the name or undefined if it doesn't exist
|
|
120
137
|
*/
|
|
121
|
-
_getFamixFile(
|
|
122
|
-
return Array.from(this.famixFiles.values()).find(ns => ns.getName() ===
|
|
138
|
+
_getFamixFile(fullyQualifiedName) {
|
|
139
|
+
return Array.from(this.famixFiles.values()).find(ns => ns.getName() === fullyQualifiedName);
|
|
123
140
|
}
|
|
124
141
|
/**
|
|
125
142
|
* Gets all Famix files
|
|
@@ -17,10 +17,9 @@ exports.calculate = void 0;
|
|
|
17
17
|
const typescript_1 = require("typescript");
|
|
18
18
|
const tsutils_1 = require("tsutils");
|
|
19
19
|
const fs_1 = require("fs");
|
|
20
|
-
const { isIdentifier } = require('typescript');
|
|
21
20
|
const getNodeName = (node) => {
|
|
22
21
|
const { name, pos, end } = node;
|
|
23
|
-
const key = name !== undefined && isIdentifier(name) ? name.text : JSON.stringify({ pos, end });
|
|
22
|
+
const key = name !== undefined && (0, typescript_1.isIdentifier)(name) ? name.text : JSON.stringify({ pos, end });
|
|
24
23
|
return key;
|
|
25
24
|
};
|
|
26
25
|
const increasesComplexity = (node) => {
|
|
@@ -77,7 +76,7 @@ const calculate = (filePath) => {
|
|
|
77
76
|
throw new Error(`File "${filePath}" does not exists`);
|
|
78
77
|
}
|
|
79
78
|
const sourceText = (0, fs_1.readFileSync)(filePath).toString();
|
|
80
|
-
const source = (0, typescript_1.createSourceFile)(filePath, sourceText,
|
|
79
|
+
const source = (0, typescript_1.createSourceFile)(filePath, sourceText, typescript_1.ScriptTarget.ES2015);
|
|
81
80
|
return calculateFromSource(source);
|
|
82
81
|
};
|
|
83
82
|
exports.calculate = calculate;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="us-ascii" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="206px" preserveAspectRatio="none" style="width:303px;height:206px;background:#FFFFFF;" version="1.1" viewBox="0 0 303 206" width="303px" zoomAndPan="magnify"><defs/><g><text fill="#33FF02" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="261" x="5" y="19">Dot Executable: /opt/local/bin/dot</text><text fill="#33FF02" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="237" x="5" y="35.2969">Dot executable does not exist</text><text fill="#33FF02" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="291" x="5" y="51.5938">Cannot find Graphviz. You should try</text><text fill="#33FF02" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="5" x="5" y="67.8906"> </text><text fill="#33FF02" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="79" x="5" y="84.1875">@startuml</text><text fill="#33FF02" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="57" x="5" y="100.4844">testdot</text><text fill="#33FF02" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="72" x="5" y="116.7813">@enduml</text><text fill="#33FF02" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="5" x="5" y="133.0781"> </text><text fill="#33FF02" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="17" x="10" y="149.375">or</text><text fill="#33FF02" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="5" x="5" y="165.6719"> </text><text fill="#33FF02" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="227" x="5" y="181.9688">java -jar plantuml.jar -testdot</text><text fill="#33FF02" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="5" x="5" y="198.2656"> </text><!--SRC=[xHpBSjmsykwlu96koAuzRZ5RIicIx9eaihGUnJviRRau78p4DOUS9KYj5Dl_ldWsq423CtOYUX_nGHwYdsW0_G10Lat9UNRU3lNmaB7xWRLhdhqij_NzYvApyuPjMJja7vzaujztDspuSNdvEdzQP7pew_P6DvVhzLNVxLW_r8nVT-VtkwuVM9ypywFG32MfXGaETrszVlBvIQKKM7PZNx6Vo_PcB6yOA6BqqkAVSOMqLer2Kf4jsV2NfTVuSAmLQiijmoeApPUOMdOYHIywX9fpN_93aI6WxSeZM-YqswgXiAP1EbWBrVp7vLbN5TcgwnfMjg3KGWEaNWZ47IYazVlrhEhQeQnRgIaI309EBOAoQup2VPGKjqYaw70qZgUwFJGnTv20SgO1qZqvQQlRhazCOAQNKyg6PhMbBMWHQ3wpzdCTk8nm7Yw7SKLDGzbEpq852GZHXE2UWGjaxc2DwqPdHX-91qXffi5aLAlF-1op5e-zEQd1rgbW165qqv0RFeLTpaZ8cWaBzsoDdM4HE4SGUaQYksvZ0fuaE4piJBFhXFEkgikXxjffLzSAQE6ZWsQl1KHg5i6uWKMaQ1HsFRkhkv7JpAyCD2K0u2IRcOpuMiG_lYih5qYNLRSJ4h09TsBKsq62v6Zx6Awx3aLDh1Y9OwGqpxdS4-gfxJ_47co1whPkra9XC9XPuF3ibhX3iOiyH1BAGrEkECDZuOPaDZFqzMu8h43EWdRShbX_kVbPc8TVRgxLuj2DhlCnZjJPn-8qrWHtjEeitkbjsPULw11FAk5G9dJmaDAiPngBYsuzDlvQz8R6348t3ZUTaBdOIXPc5kg7qwOSkJSHBp6gdOq4ib0T8-UrXrHaFibCfl15Wa5ydsyJ28K7SxKmDdI918PBJNqC7cDeZb99ZOXcdm52WYzNQvYTBH2Eb1XXyGXhWZ5IOAjqMkvOLMzggMIGz5vWE97yXXW9ZdE5yQOkEGomrsiSUwRiVULXfAoDS98iaQLBgPaRaEk7dPjL9pvCodHG7a89FZFPLgHnNLyENfL1s7TjaGINdd4krbOqgSvY769YKLWJtCECLk9DBwmpZ9GQwn1jYlUCULPO2979wcPiceU_ZcBEYBMeqe9eC5v6ACHO44XfrcWaUbQn-ewj5-rTLobNQuCCDBWGyoP6XZ0JeWipnkXvB4w46_YDVMyhYgB3Gjy2eqw7FeoSbwt-aGvxpyXjeyH8gEOsPMtj74nVbDyu3fmCAEz3XTRgKJkNGdjHQa5rlU4DY_CuNjKW8aGIOg39BUN2EPQPbe_mtiA00k0Mpz2FrJ3sPJCLBLwmsrBKLe2L31aqudJS26dcieMcVzXhYfgVIe9blMRK_We0wKqM1wRuu3eOcKKXPv_48XRARqGTapHw0dFQwX5Hc1sf9CPCUctwOpyvqc0xuH6261oBa5j6CsT3Y_QMzVLGjjLaqij78KLHJDbx2LZJrlRm9XdZFRPnTO02guF4hwpmrI6Y7zNyHXuONsPhu5k0kvuyTYKUUti-5iDEi037wIZcjVbHm9B6KvaDjztQYBfG3zv4ra0h1O7bD5RFkMOXwXZrVp1yGg8tso36GyindaS-hWln8ROy3mcmyr1KuS_oS4uThDBg2nHQONLMXoZpc5M-6WwOOc4SeKFPDtMh7-fs7UKxFub68jzHpJu1pk7uoKeqbzL0nIGBeqCIG0acWP2P8b_Dh_hwJfGMb1W3eeLOOCmX532kcfeyfzEG17iDYyWZxRk1LQ8oelKtm5GFB9ZYCzTPf_fBEUjP9jeV4U6FYF2xrZVrh-MgONXMwoSN53IcdEjsrlbjntvSy51X-X78iWT-Suwa51a2VXkJn9cPQ_b_CytBiQtGiMSYWtZCNTjAh37kRIoQdERZRDD2-NeoIrTvpIlMYgbJMKydCXjoZNrApxDFhfEVj5xMxa7cPKIfauN74iP3OO_VovacSpHtznp4rXmw7OTrRoZYg6w1CGSSSkgRjXp6dhWNPY54rkjW4NsuLw878dHGX7EA7HFXb9n3yfmHUM1wvObE79XYqOa3KmyfpPhUk3raItaH8qzjASVeUImkkQLiRxHePuwEUCuyK7J2Wu0n4oHZ40rNgM7_tU8Ial9jufApyTJULLMswtejAXvZYj01U7Ub0DDQ8e4hhqrPt1puJ-_GsdEEdZvgCYSLVUgC2U0a6-nGX2KaF71epgqekAhSAGmE60b6ytclHvmxRzY6YOYsPzjJdPXDM5B19osfCHACyB8jUy4oS0hNgZ5o1wRP9vd9Rc_BlfOH_S23aQ33QLDUKUXJbgK93fCwsyLed57ilNJmdsyjk9U6SM138Y3rV6kApbrCfIYbfvMKeUOLqRX7yOUgwRPYULUdtNRNi7j54UGbfmGIaPcGQ5C2oFneEOYWOUxk9l8ZXpAH7tb8QTP80tkd2voW6JruZkzqELGxO26oTwSBG7aagN2UbpIAkOrtsiajqEcxVX9d_rq_XJN1dJJCGOdZPOmybJZ6w7aiBfaubgfgWeDxzUITt1ie7DtxS7bshvvppQGm9HYvhhsz39mgeWmH9uOg7rGC4XcfPMvBFIC0bN-Xmm1SApEDBLImxLeD-rHa117IxCw4CwEHZMvE3Ti2QWGeGhPjoIsp0gBaJ846xKsaBXIxDrjIKGMzAPEA9EIxCfDvZL3kPEBMoRM39swU04OElAWRADna8eo_guVRCrGagVUfWap5syjDKiAxM3IjtDkrj14fJq6AA6b2_LZXAg9EzITToBpOos5_WHD28WwhFGXxoY5RD1yGWnOHwaGCYf3pI58Y1ZtcdVSmIPv81Qsw9vCUVn5WfJm_niinSp8IpB15yUWRnLD5NMds7zD-qEvGJhb1m4co8-DClFIZIAD6aaJY7bAQON3a-gwlwUDY1Q1tBZKef9rf1Cz5NaPkjD-LpMYNWqHwAv_zI2t1TXs422fEYyTSSIaoWC_OAoNl2syKIhhapGi7dBvi8V7cUusYgQjwYFO9eE7ZusyBhjazMx-ic_2TL_GYhDtZ6Sf-kEhY6cnf04I90Q2G6Aqz8PBYUwwQ2Qu6WCb2ZhA2eLZATfgdWkWDg7DC7sHFeYiazwM5f2pXILY6N92CZHWI-egv0L0Nooqe99x_N5Y7Cz8thKJwIWJC5wOv2fO0m8IuvEjlHk_LNboEdLWWNP9PS6wPp1g4h_fwAzBEEvQorsFMGaBS_zYo_-zQDZMSzIvPsLUtxYZA3ZvNxITzNpvOkN_xkmRf7MqIf8p-0vZF1LOPuyvgLU6NFTn5s4WDtx2TqLNywdWzTFs3iUdsNbMG5wN047_CpUmZZVtSgq0bgZhMJg3Q8s_zH9s7Epvm3fxWvP-Ja_m0mV64ztSJF8ENWIM9d1m9RFD6g1Nlln7gwELAJj2hHGxA8pz0T4bxLCFubzS_lRvyz_hzsvEVVpd74rB8D5-Ok5pzWrK32DSSjNv7sVNoekjtjnh7SuZRyWDJc2erS8c13OlsenKH_L6cfX4W6ACalsrHzQmSs6N_IYn0jVCaHEKR-y42-NIKrLpRsC-hzzgUPkzUwjxQbqTr5MRt3uCPu7DH8FDEZmuEwe6YLm1Q0pM_ywgnT-WfylqBXEODSprNBgLmDx0eAOSldSWA4_SXFKdoLejfXUDBa6uX4M_o7YJcAkf6lLNKzHYWaK6OQ7db2a-CkYG1Hrarzkg8vxJ8nlP3s_tBcsts2eyPP4CUzG2sLZVYHm6NmR1ys6A5joudPUFBHlvGu6icthq2Qim1cEQZxohiz0m_Z9bBr3o64vky53CBY_Z8Kap4-d7hrsOK1rVR1TIwZ9KiBfYCX9g5_ese5IAzjAPViZlAeZTOmyKDipDO88I1lNM3MxzmCaFVGC_8FAblsRmfsnlfoxVtvlCVpY-kRUmWFZ9bt9VcGHiIhiBuATPH1fz1-ethdLvipvy_p_wSRJk18dz-clRUNnEHuq2XjmzRTN2sM8k-gRVLXDdMv2ShF5Bll2icttwXYGxrFb_ZAm_fYhl4JSOy_uKMpBkzFVLUDTjF8ffTR-JMkXfZM_Gb5VHU84QVr5Yqcwx8FcQwpPFpWtthE519jPt_SomRNzdlC_Un2fVJV9y5dtIGZLVbS6iNX2M3F4gp1tmf42Q5GEQBLjSL79QZR3rZct9i1Wto89-nERhsJZYRw-uDQqevrQKcURdYNJCEIAsZp6yLJagcVLwTP39Gk0QDwuZWqsd-cQRtWKARD4Eo13Sb_Ce0fJjmv1oa-YZZepy7f94kKkzjQF3RgJDFZNBeGQt1he4PfB14uL2lJxjHPt9U2VoC6XceD7vBrY-hu9X3_jLSmygPOlxqInIKbQxNUQAAH-2TPw185vqTI7al7XRh7FcoS4xIL5_w1GUQgzuYaDjEVvB-PjFrst9mVk1pqCVtwhC3JNWPY5v58RPrY_bmQ_RGGBazJBpQPRAFNdK2PAuicIGDoWqWDmN19At62GYzF7pVgE2b6l21J7QI3qvWWTXLd9FKGSKPaoS_LUQwM-zJaVGr11VtZbhQENttNbTeIfqJBh1VzjtMLhVYRo0xUfVVqEj3c4CvUBxWVTtMqeD88g4dQ-GN0LZZTrVu5RsaZsmzvVPxe-zlXfD_pxOV_WeMwxrNq7LGDD4Hxwr9PQLhuietSRTZzpInwoROoSGBbZkmBrkyaU9BC7TevKPcYx9iUwiMJ_v09bPMoyl3RX6qdv-KvbNCp0l_nAU7dQlLpnyjtUVi4L_92X6Y3xcIxldPQjniM6_sLuNHTQlP1M6R-ZwbwKEERI-tIlowVd9o_Hi0]--></g></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="us-ascii" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="206px" preserveAspectRatio="none" style="width:303px;height:206px;background:#FFFFFF;" version="1.1" viewBox="0 0 303 206" width="303px" zoomAndPan="magnify"><defs/><g><text fill="#33FF02" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="261" x="5" y="19">Dot Executable: /opt/local/bin/dot</text><text fill="#33FF02" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="237" x="5" y="35.2969">Dot executable does not exist</text><text fill="#33FF02" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="291" x="5" y="51.5938">Cannot find Graphviz. You should try</text><text fill="#33FF02" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="5" x="5" y="67.8906"> </text><text fill="#33FF02" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="79" x="5" y="84.1875">@startuml</text><text fill="#33FF02" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="57" x="5" y="100.4844">testdot</text><text fill="#33FF02" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="72" x="5" y="116.7813">@enduml</text><text fill="#33FF02" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="5" x="5" y="133.0781"> </text><text fill="#33FF02" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="17" x="10" y="149.375">or</text><text fill="#33FF02" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="5" x="5" y="165.6719"> </text><text fill="#33FF02" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="227" x="5" y="181.9688">java -jar plantuml.jar -testdot</text><text fill="#33FF02" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="5" x="5" y="198.2656"> </text><!--SRC=[xHpBSjouyUwlO6vqhUpACSLDQKkMPDVihYp5exKFgPIBmy58Z3daX20LARR_FNWsq423C_Qkw3pM1tc8Vg81z0C0-OUwhPfnpJB-eMxvS_FqV3TkcoTLKtAUdRT3FJnax7vWxPfdByjjVV-YvEoyOLlM3jd79vduzzqD6tvSNhxEdnOP7_gwlT7DvNfzrNSxrWyruzVT-VskwmVMvypyA3H3IMfXWiDTLw-VV3OABBknhzZFPNipbZSC535wQV7Fk49QgqOXgSYMRFZpqcjyEDOAjUMMOHM5vajCBJkHeXSTGisvB_cXo13GTkMHBNJQRTLGMDCW7Qo5QlxZygohYcpLTGqhMr1geG5IBmJY3XJI-lrwLdNjKDQjr1G91W6d5a7PDKRXFagAMoHIT3WQnrFT7fgOEqX0ETC0wPwSjDLjroScCDFBAML3izhI5hG8D9zP-xaEN4Ou3vV3kAAceModPw6218HeGd3Fm0KoTx36TQCpeu_40wGqqs0ogjLdV8vPYyVUdDHWwrGmWZ2wQSWDdy8kPoHapOI5UxR6ph08d2C8FIFHNRSn0KyI72PsfjbrmdbNrULGT-sqgsi5jF3HGRFN0Y8rYs3Sm29ID0gxdjtLtSXfvbS6cX80S9BDJ4PyBU8VtvML2wJBgji92TY4Ep7gxI11ShHz3DTTXw8cLep4CLAQvrpk2VNKzXzY3xP0TLitQw4m6CmiS7XsIzoXs4KU8WdbeIbNdE6nS4CocndwUZS4LY1dGJjkLwo_tFmipCClDzTgSUX6r_aOH-hiOt4QQu8xMdKMx_IsxCjAT8WdbN0e4pfuI6dMCut5HRSU6tyjUaDZ1g4RXvjEo5ni9Gip2_N3QLEEt9k8bnZLpaO2MQYEaVFQGoeodsGcK_WYmI2-pxS9XCA3kLeO6xf40iEbfZu6Zp4qHwcaHaIppm0XmPUhDSpE5WX7IeomU8GrmHWfi5KwBNUigZUrL398UYymd4X-Gum4nxd2U5EN70ROwpMEFLFsll8mKjP6E4cMoDAbrCmDoFN3pisg4nycPJee3w44dvbiAzAuhYy7hyeWxBksI89BppWNQokQL6Sn3Z6nAAm9xc56A_6c5zOPHagDTOWsnNl6F2iiXCXaTJCspSDVHZ5dn5fKQK4q62yZ568i2AGqQpGIFQjOVSVMY_QkgvIhjK466bo8UHCZGvW9qOKPO_Gy5YV23Vp6lhSLHT5XeM-1KQT37qREorR_I8UzP-IsKM8aL7ERihPs3gOlocyS1qu6bFUXGclrg9rBeRqejQ2wtl26nNaShseG4I89CT3abdBX7CjCoqTuRs500N2BP-Z7QXZxifcA5Y_ORIbgAy1AXWmQSJfkX3HpsKBJF-mrHSrF9S6oNZDgVmM0z2QB0rDyS1sCpAAGiqzY4GlbDwAEIHezWJbjzOWep8vK4cCclJRziPySQR2Ty0X138v5o2sZcREXHNlB-deesseowUMZaA8efkoz1AnfQtjuaupn7jkuEa21rK7YLrRuwX3HZsf-8m-CBxCry2t0NKyUknAFlJqVYs4dM83ZT1JpslmeO4dZgSo6ssvjH5se1syYQw2LWi1o6gldNBCGTOpwFnW-8T6RRH3ZeUKOpoCVruNu45kUXmJOUIYgy6TvEASELcdr1Ggji3ghGvHvp2fV3GTCiJ2EqA7icxhL3tMxZlATdqGZaU-ePfy0vt3yP2MQosgWOfA5qI49e0IJGCXCaQ_cLtrz9qeBIem1qK8iCEOG2XXNJKsUqsb8Whs6HUIHzjt0Ab4PqVeROAe75apncUkiK_sbdFKi4-ttYF1xHFXDwvlwN-MgONXMwoSN53IcdEjsrlbjntvSy51X-X78iWT-Suwa51a2VXkJn9cPQ_b_CytBiQtGiMSYWtZCNTjAh37kRIoQdERZRDD2-NeoIrTvpIlMYgbJMKydCXjoZNrApxDFhfEVj5xMxa7cPKIfauN74iP3OO_VovacSpHtznp4rXmw7OTrRoZYg6w1CGSSSkgRjXp6dhWNPY54rkjW4NsuLw878dHGX7EA7HFXb9n3yfmHUM1wvObE79XYqOa3KmyfpPhUk3raItaH8qzjASVeUImkkQLiRxHePuwEUCuyK7J2Wu0n4oHZ40rNgM7_pU8Ial9jufApyTJULLMswtejAXvZYj01U7Ub0DDQ8e4hhqrPt1puJ-_GsdEEdZvgCYSLVUgC2U0a6-nGX2KaF71epgqekAhSAGmE60b6ytclHvmxRzY6YOYsPzjJdPXDM5B19osfCHACyB8jUy4oS0hNgZ5o1wRP9vd9Rc_BlfOH_S23aQ33QLDUKUXJbgK93fCwsyLed57ilNJmdsyjk9U6SM138Y3rV6kApbrCfIYbfvMKeUOLqRX7yOUgwRPYULUdtNRNi7j54UGbfmGIaPcGQ5C2oFneEOYWOUxk9l8ZXpAH7tb8QTP80tkd2voW6JruZkzqELGxO26oTwSBG7aagN2UbpIAkOrtsiajqEcxVX9d_rq_XJN1dJJCGOdZPOmybJZ6w7aiBfaubgfgWeDxzUITt1ie7DtxS7bshvvppQGm9HYvhhsz39mgeWmH9uOg7rGC4XcfPMvBFIC0bN-Xmm1SApEDBLImxLeD-rHa117IxCw4CwEHZMvE3Ti2QWGeGhPjoIsp0gBaJ846xKsaBXIxDrjIKGMzAPEA9EIxCfDvZL3kPEBMoRM39swU04OElAWRADna8eo_guVRCrGagVUfWap5syjDKiAxM3IjtDkrj14fJq6AA6b2_LZXAg9EzITToBpOos5_WHD28WwhFGXxoY5RD1yGWnOHwaGCYf3pI58Y1ZtcdVSmIPv81Qsw9vCUVn5WfJm_niinSp8IpB15yUWRnLD5NMds7zD-qEvGJhb1m4co8-DClFIZIAD6aaJY7bAQON3a-gwlwUDY1Q1tBZKef9rf1Cz5NaPkjD-LpMYNWqHwAv_zI2t1TXs422fEYyTSSIaoWC_OAoNl2syKIhhapGi7dBvi8V7cUusYgQjwYFO9eE7ZusyBhjazMx-ic_2TL_GYhDtZ6Sf-kEhY6cnf04I90Q2G6Aqz8PBYUwwQ2Qu6WCb2ZhA2eLZATfgdWkWDg7DC7sHFeYiazwM5f2pXILY6N92CZHWI-egv0L0Nooqe99x_N5Y7Cz8thKJwIWJC5wOv2fO0m8IuvEjlHk_LNboEdLWWNP9PS6wPp1g4h_fwAzBEEvQorsFMGaBS_zYo_-zQDZMSzIvPsLUtxYZA3ZvNxITzNpvOkN_zcmRf7MqIf8p-0vZlC_f0o5cjAlooXxi86wdX6xOpkefV7Q-7hdymDjtUgmhoeXGOue-vcNsaiPzx5QX4LSVQ2LHxvAsVgFDmnmVEmHEy_7DoaXyWE9xm_cw2P_0oi2IHaoE1RTu8jUBzDq8TlLp92Ngro45vv0U8BccFQXZ_ylgdrvVlNhz_U_BpB-TuGWgPvWiJbwk_ise0uPgZrkyekrvUTFtkLkDu3d5RVc0AKwK6BZ6mOT5-j2AYFyhKD084OvJajosgdfK3k-nVYGMeTfw4g7nZFrWWduwocciR-tdrNjlJxDrBtLlxygYkmkp-OJ03V2uAPDxfqS51FL3q2a1heEPtNZNs3Zr5ld-1qBnXhkVAfHJk1XObvV2b4rbXuZwa9qdUQZ6jS7m9qYqauatUWyHSHTsejugw7WCqCWWJBQzSuObHboJWAAl6NXtnd1RPs7vektzwiyrUuJ63RCYZ7i3MwaRyAE0o69OFMwpmrkMaR7pPo1yAVCt4krT0ZJa0qtpqNOMTdk67CNE9ciTmOfENOcPX4HzPYebOFsxzsepYu6gxW5gNiPB51PEHKBFGln6rGgINrlHBTaTPz0PhkBXXTWOBX32mjsvmwnTEPkWRw1cP9_KjcpTbUoDz-VRUVFx3-SMrZHt4HwQC-z8yQ4F2LHW_nJhAu3D8ltAzqulj-VFdsP-oRITGvCzFqzxxQo9o72Zqzc6h3iuMQz4tzRQQCDkQ_6I5H-gTTyNasoyqqQ7UvsjyvI5TSPUuoPZdlz22URUtfzwhPlj9HBFhZTnQLsDiYxwaWjuBnEYJ6ejsqnNPnqotUN9-i6yT1ogfjlD_Z6NZA_jzvZvMuNAQxxFWamwoyQeSRks2i6IGHsdsW2y5mgGGo7pHwhg2mtAKhMTiKuxDe44Uv3CsHzVU2MTptRrXJIcdkjGaBrUyQyO1gNMK-Qt2IScqpwkJJ0OArw1n7H5yEiq_q_G-K6YJPaYMuAQ4NncWT0UEd8DK7sLyzEU0DD95whqD3NuxTUQfKGuzg3NODJ2359Oe7EhrQJVgJCuhWPzH8mELng_9-cKL77F8lvfhM3bJp9z-YOAoqlKwJrJn2Bpp31JfehC3AU_5msAT8ryMpacQwak_u41prLi4SjlfZzBVRBf-MmxE3tmE-lXUVNQW2Iy3qQienBPkCHzkpHuQABU7YLUxJFRHgqw0p9KbawH1kG7afY2OfDKu0Q6NX-yR5RnK0pwGoKxomGai4BkASv8wg3XZykIdobntwtqgahw6uEBUKKixf-_UwmfDgNF21VRBljlQwbRy3MH7x_8RUdq8SoW7pnUyhzjQUX199FHaZVmY06lyxWg_efVqaQsdt7vlzFtDSFBlsVR3Ny5YlVSAkWwA9ZhYlJMfh7HDNFacxdRidYPstGGxcNZ1SWVsPOitKdm9vWwjtCXiKPPjRzNYoH_8nCfgUNdOBOBsyvFIl8gPUU6V-FImSxNw-QEb-vmzuYjP8KBq8LVIFJzRZPiDwyt-gZ2wRZMx86nJtwSqVSYnxULMYL_NJqwkVmC0]--></g></svg>
|
package/package.json
CHANGED
package/plantuml.jar
ADDED
|
Binary file
|
package/src/analyze.ts
CHANGED
|
@@ -1,31 +1,28 @@
|
|
|
1
1
|
import { Project } from "ts-morph";
|
|
2
2
|
import * as fs from 'fs';
|
|
3
3
|
import { FamixRepository } from "./lib/famix/src/famix_repository";
|
|
4
|
-
import { FamixFunctions } from "./famix_functions/famix_functions";
|
|
5
|
-
import { ProcessFiles } from "./analyze_functions/processFiles";
|
|
6
|
-
import { ProcessAccesses } from "./analyze_functions/processAccesses";
|
|
7
|
-
import { ProcessInvocations } from "./analyze_functions/processInvocations";
|
|
8
|
-
import { ProcessInheritances } from "./analyze_functions/processInheritances";
|
|
9
|
-
import { ProcessImportClauses } from "./analyze_functions/processImportClauses";
|
|
10
|
-
|
|
11
4
|
import { Logger } from "tslog";
|
|
5
|
+
import * as processFunctions from "./analyze_functions/process_functions";
|
|
6
|
+
import { EntityDictionary } from "./famix_functions/EntityDictionary";
|
|
7
|
+
import path from "path";
|
|
12
8
|
|
|
13
9
|
export const logger = new Logger({ name: "ts2famix", minLevel: 3});
|
|
14
10
|
export const config = { "expectGraphemes": false };
|
|
11
|
+
export const entityDictionary = new EntityDictionary();
|
|
15
12
|
|
|
16
13
|
/**
|
|
17
14
|
* This class is used to build a Famix model from a TypeScript source code
|
|
18
15
|
*/
|
|
19
16
|
export class Importer {
|
|
20
17
|
|
|
21
|
-
private project = new Project(
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
18
|
+
private project = new Project(
|
|
19
|
+
{
|
|
20
|
+
compilerOptions: {
|
|
21
|
+
baseUrl: "./test_src"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
); // The project containing the source files to analyze
|
|
25
|
+
|
|
29
26
|
/**
|
|
30
27
|
* Main method
|
|
31
28
|
* @param paths An array of paths to the source files to analyze
|
|
@@ -35,10 +32,14 @@ export class Importer {
|
|
|
35
32
|
|
|
36
33
|
// try {
|
|
37
34
|
logger.debug(`famixRepFromPaths: paths: ${paths}`);
|
|
35
|
+
|
|
38
36
|
this.project.addSourceFilesAtPaths(paths);
|
|
37
|
+
|
|
38
|
+
initFamixRep(this.project);
|
|
39
|
+
|
|
39
40
|
this.processEntities(this.project);
|
|
40
41
|
|
|
41
|
-
const famixRep =
|
|
42
|
+
const famixRep = entityDictionary.famixRep;
|
|
42
43
|
// }
|
|
43
44
|
// catch (error) {
|
|
44
45
|
// logger.error(`> ERROR: got exception ${error}. Exiting...`);
|
|
@@ -51,18 +52,20 @@ export class Importer {
|
|
|
51
52
|
}
|
|
52
53
|
|
|
53
54
|
private processEntities(project) {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
const
|
|
57
|
-
const
|
|
58
|
-
const
|
|
59
|
-
const
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
55
|
+
const onlyTypeScriptFiles = project.getSourceFiles().filter(f => f.getFilePath().endsWith('.ts'));
|
|
56
|
+
processFunctions.processFiles(onlyTypeScriptFiles);
|
|
57
|
+
const accesses = processFunctions.accessMap;
|
|
58
|
+
const methodsAndFunctionsWithId = processFunctions.methodsAndFunctionsWithId;
|
|
59
|
+
const classes = processFunctions.classes;
|
|
60
|
+
const interfaces = processFunctions.interfaces;
|
|
61
|
+
const modules = processFunctions.modules;
|
|
62
|
+
const exports = processFunctions.exportedMap;
|
|
63
|
+
|
|
64
|
+
processFunctions.processImportClausesForImportEqualsDeclarations(project.getSourceFiles(), exports);
|
|
65
|
+
processFunctions.processImportClausesForModules(modules, exports);
|
|
66
|
+
processFunctions.processAccesses(accesses);
|
|
67
|
+
processFunctions.processInvocations(methodsAndFunctionsWithId);
|
|
68
|
+
processFunctions.processInheritances(classes, interfaces);
|
|
66
69
|
}
|
|
67
70
|
|
|
68
71
|
/**
|
|
@@ -92,9 +95,25 @@ export class Importer {
|
|
|
92
95
|
//const sourceFileNames = project.getSourceFiles().map(f => f.getFilePath()) as Array<string>;
|
|
93
96
|
|
|
94
97
|
//const famixRep = this.famixRepFromPaths(sourceFileNames);
|
|
98
|
+
|
|
99
|
+
initFamixRep(project);
|
|
100
|
+
|
|
95
101
|
this.processEntities(project);
|
|
96
102
|
|
|
97
|
-
return
|
|
103
|
+
return entityDictionary.famixRep;
|
|
98
104
|
}
|
|
99
105
|
|
|
100
106
|
}
|
|
107
|
+
|
|
108
|
+
function initFamixRep(project :Project ): void {
|
|
109
|
+
|
|
110
|
+
// get compiler options
|
|
111
|
+
const compilerOptions = project.getCompilerOptions();
|
|
112
|
+
|
|
113
|
+
// get baseUrl
|
|
114
|
+
const baseUrl = compilerOptions.baseUrl;
|
|
115
|
+
|
|
116
|
+
const absoluteBaseUrl = path.resolve(baseUrl);
|
|
117
|
+
|
|
118
|
+
entityDictionary.famixRep.setAbsolutePath(path.normalize(absoluteBaseUrl));
|
|
119
|
+
}
|