Skip to content

Commit b4eb81d

Browse files
Turn converters into components
1 parent 0ecc0ad commit b4eb81d

File tree

122 files changed

+1552
-695
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

122 files changed

+1552
-695
lines changed

lib/Application.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@ var Options_1 = require("./Options");
2020
var Logger_1 = require("./Logger");
2121
var fs_1 = require("./utils/fs");
2222
var index_1 = require("./models/index");
23-
var converter_1 = require("./converter/converter");
23+
var index_2 = require("./converter/index");
2424
var Renderer_1 = require("./output/Renderer");
2525
var Application = (function (_super) {
2626
__extends(Application, _super);
2727
function Application(arg) {
2828
_super.call(this);
29-
this.converter = new converter_1.Converter(this);
29+
this.converter = new index_2.Converter(this);
3030
this.renderer = new Renderer_1.Renderer(this);
3131
this.logger = new Logger_1.ConsoleLogger();
3232
this.options = Options_1.OptionsParser.createOptions();

lib/converter/components.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
var __extends = (this && this.__extends) || function (d, b) {
2+
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
3+
function __() { this.constructor = d; }
4+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
5+
};
6+
var component_1 = require("../utils/component");
7+
exports.Component = component_1.Component;
8+
var ConverterComponent = (function (_super) {
9+
__extends(ConverterComponent, _super);
10+
function ConverterComponent() {
11+
_super.apply(this, arguments);
12+
}
13+
return ConverterComponent;
14+
})(component_1.AbstractComponent);
15+
exports.ConverterComponent = ConverterComponent;
16+
var ConverterNodeComponent = (function (_super) {
17+
__extends(ConverterNodeComponent, _super);
18+
function ConverterNodeComponent() {
19+
_super.apply(this, arguments);
20+
}
21+
return ConverterNodeComponent;
22+
})(ConverterComponent);
23+
exports.ConverterNodeComponent = ConverterNodeComponent;
24+
var ConverterTypeComponent = (function (_super) {
25+
__extends(ConverterTypeComponent, _super);
26+
function ConverterTypeComponent() {
27+
_super.apply(this, arguments);
28+
this.priority = 0;
29+
}
30+
return ConverterTypeComponent;
31+
})(ConverterComponent);
32+
exports.ConverterTypeComponent = ConverterTypeComponent;

lib/converter/context.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ var minimatch_1 = require("minimatch");
33
var index_1 = require("../models/index");
44
var type_parameter_1 = require("./factories/type-parameter");
55
var converter_1 = require("./converter");
6-
var convert_node_1 = require("./convert-node");
7-
var convert_type_1 = require("./convert-type");
86
var Context = (function () {
97
function Context(converter, fileNames, checker, program) {
108
this.symbolID = -1024;
@@ -136,12 +134,12 @@ var Context = (function () {
136134
this.inherited = [];
137135
}
138136
if (typeArguments) {
139-
this.typeArguments = typeArguments.map(function (t) { return convert_type_1.convertType(_this, t); });
137+
this.typeArguments = typeArguments.map(function (t) { return _this.converter.convertType(_this, t); });
140138
}
141139
else {
142140
this.typeArguments = null;
143141
}
144-
convert_node_1.convertNode(this, baseNode);
142+
this.converter.convertNode(this, baseNode);
145143
this.isInherit = wasInherit;
146144
this.inherited = oldInherited;
147145
this.inheritParent = oldInheritParent;

lib/converter/converter.js

Lines changed: 127 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,21 @@ var __extends = (this && this.__extends) || function (d, b) {
33
function __() { this.constructor = d; }
44
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
55
};
6+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
7+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") return Reflect.decorate(decorators, target, key, desc);
8+
switch (arguments.length) {
9+
case 2: return decorators.reduceRight(function(o, d) { return (d && d(o)) || o; }, target);
10+
case 3: return decorators.reduceRight(function(o, d) { return (d && d(target, key)), void 0; }, void 0);
11+
case 4: return decorators.reduceRight(function(o, d) { return (d && d(target, key, o)) || o; }, desc);
12+
}
13+
};
14+
var __metadata = (this && this.__metadata) || function (k, v) {
15+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
16+
};
617
var ts = require("typescript");
718
var Options_1 = require("../Options");
819
var context_1 = require("./context");
9-
var convert_node_1 = require("./convert-node");
20+
var components_1 = require("./components");
1021
var compiler_host_1 = require("./utils/compiler-host");
1122
var component_1 = require("../utils/component");
1223
(function (SourceFileMode) {
@@ -21,6 +32,9 @@ var Converter = (function (_super) {
2132
}
2233
Converter.prototype.initialize = function () {
2334
this.compilerHost = new compiler_host_1.CompilerHost(this);
35+
this.nodeConverters = {};
36+
this.typeTypeConverters = [];
37+
this.typeNodeConverters = [];
2438
};
2539
Converter.prototype.getParameters = function () {
2640
return _super.prototype.getParameters.call(this).concat([{
@@ -52,6 +66,68 @@ var Converter = (function (_super) {
5266
type: Options_1.ParameterType.Boolean
5367
}]);
5468
};
69+
Converter.prototype.addComponent = function (name, componentClass) {
70+
var component = _super.prototype.addComponent.call(this, name, componentClass);
71+
if (component instanceof components_1.ConverterNodeComponent) {
72+
this.addNodeConverter(component);
73+
}
74+
else if (component instanceof components_1.ConverterTypeComponent) {
75+
this.addTypeConverter(component);
76+
}
77+
return component;
78+
};
79+
Converter.prototype.addNodeConverter = function (converter) {
80+
for (var _i = 0, _a = converter.supports; _i < _a.length; _i++) {
81+
var supports = _a[_i];
82+
this.nodeConverters[supports] = converter;
83+
}
84+
};
85+
Converter.prototype.addTypeConverter = function (converter) {
86+
if ("supportsNode" in converter && "convertNode" in converter) {
87+
this.typeNodeConverters.push(converter);
88+
this.typeNodeConverters.sort(function (a, b) { return (b.priority || 0) - (a.priority || 0); });
89+
}
90+
if ("supportsType" in converter && "convertType" in converter) {
91+
this.typeTypeConverters.push(converter);
92+
this.typeTypeConverters.sort(function (a, b) { return (b.priority || 0) - (a.priority || 0); });
93+
}
94+
};
95+
Converter.prototype.removeComponent = function (name) {
96+
var component = _super.prototype.removeComponent.call(this, name);
97+
if (component instanceof components_1.ConverterNodeComponent) {
98+
this.removeNodeConverter(component);
99+
}
100+
else if (component instanceof components_1.ConverterTypeComponent) {
101+
this.removeTypeConverter(component);
102+
}
103+
return component;
104+
};
105+
Converter.prototype.removeNodeConverter = function (converter) {
106+
var converters = this.nodeConverters;
107+
var keys = _.keys(this.nodeConverters);
108+
for (var _i = 0; _i < keys.length; _i++) {
109+
var key = keys[_i];
110+
if (converters[key] === converter) {
111+
delete converters[key];
112+
}
113+
}
114+
};
115+
Converter.prototype.removeTypeConverter = function (converter) {
116+
var index = this.typeNodeConverters.indexOf(converter);
117+
if (index != -1) {
118+
this.typeTypeConverters.splice(index, 1);
119+
}
120+
index = this.typeNodeConverters.indexOf(converter);
121+
if (index != -1) {
122+
this.typeNodeConverters.splice(index, 1);
123+
}
124+
};
125+
Converter.prototype.removeAllComponents = function () {
126+
_super.prototype.removeAllComponents.call(this);
127+
this.nodeConverters = {};
128+
this.typeTypeConverters = [];
129+
this.typeNodeConverters = [];
130+
};
55131
Converter.prototype.convert = function (fileNames) {
56132
if (this.application.options.verbose) {
57133
this.application.logger.verbose('\n\x1b[32mStarting conversion\x1b[0m\n\nInput files:');
@@ -78,10 +154,54 @@ var Converter = (function (_super) {
78154
project: project
79155
};
80156
};
157+
Converter.prototype.convertNode = function (context, node) {
158+
if (context.visitStack.indexOf(node) != -1) {
159+
return null;
160+
}
161+
var oldVisitStack = context.visitStack;
162+
context.visitStack = oldVisitStack.slice();
163+
context.visitStack.push(node);
164+
if (context.getOptions().verbose) {
165+
var file = ts.getSourceFileOfNode(node);
166+
var pos = ts.getLineAndCharacterOfPosition(file, node.pos);
167+
if (node.symbol) {
168+
context.getLogger().verbose('Visiting \x1b[34m%s\x1b[0m\n in %s (%s:%s)', context.checker.getFullyQualifiedName(node.symbol), file.fileName, pos.line.toString(), pos.character.toString());
169+
}
170+
else {
171+
context.getLogger().verbose('Visiting node of kind %s in %s (%s:%s)', node.kind.toString(), file.fileName, pos.line.toString(), pos.character.toString());
172+
}
173+
}
174+
var result;
175+
if (node.kind in this.nodeConverters) {
176+
result = this.nodeConverters[node.kind].convert(context, node);
177+
}
178+
context.visitStack = oldVisitStack;
179+
return result;
180+
};
181+
Converter.prototype.convertType = function (context, node, type) {
182+
if (node) {
183+
type = type || context.getTypeAtLocation(node);
184+
for (var _i = 0, _a = this.typeNodeConverters; _i < _a.length; _i++) {
185+
var converter = _a[_i];
186+
if (converter.supportsNode(context, node, type)) {
187+
return converter.convertNode(context, node, type);
188+
}
189+
}
190+
}
191+
if (type) {
192+
for (var _b = 0, _c = this.typeTypeConverters; _b < _c.length; _b++) {
193+
var converter = _c[_b];
194+
if (converter.supportsType(context, type)) {
195+
return converter.convertType(context, type);
196+
}
197+
}
198+
}
199+
};
81200
Converter.prototype.compile = function (context) {
201+
var _this = this;
82202
var program = context.program;
83203
program.getSourceFiles().forEach(function (sourceFile) {
84-
convert_node_1.convertNode(context, sourceFile);
204+
_this.convertNode(context, sourceFile);
85205
});
86206
var diagnostics = program.getSyntacticDiagnostics();
87207
if (diagnostics.length === 0) {
@@ -126,7 +246,10 @@ var Converter = (function (_super) {
126246
Converter.EVENT_RESOLVE_BEGIN = 'resolveBegin';
127247
Converter.EVENT_RESOLVE = 'resolveReflection';
128248
Converter.EVENT_RESOLVE_END = 'resolveEnd';
249+
Converter = __decorate([
250+
component_1.Component({ childClass: components_1.ConverterComponent }),
251+
__metadata('design:paramtypes', [])
252+
], Converter);
129253
return Converter;
130-
})(component_1.ConverterHost);
254+
})(component_1.ChildableComponent);
131255
exports.Converter = Converter;
132-
require("./plugins/index");

lib/converter/factories/parameter.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
var ts = require("typescript");
22
var index_1 = require("../../models/reflections/index");
33
var converter_1 = require("../converter");
4-
var convert_type_1 = require("../convert-type");
54
var convert_expression_1 = require("../convert-expression");
65
function createParameter(context, node) {
76
var signature = context.scope;
@@ -12,11 +11,11 @@ function createParameter(context, node) {
1211
context.registerReflection(parameter, node);
1312
context.withScope(parameter, function () {
1413
if (ts.isBindingPattern(node.name)) {
15-
parameter.type = convert_type_1.convertType(context, node.name);
14+
parameter.type = context.converter.convertType(context, node.name);
1615
parameter.name = '__namedParameters';
1716
}
1817
else {
19-
parameter.type = convert_type_1.convertType(context, node.type, context.getTypeAtLocation(node));
18+
parameter.type = context.converter.convertType(context, node.type, context.getTypeAtLocation(node));
2019
}
2120
parameter.defaultValue = convert_expression_1.convertDefaultValue(node);
2221
parameter.setFlag(index_1.ReflectionFlag.Optional, !!node.questionToken);

lib/converter/factories/signature.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
var ts = require("typescript");
22
var index_1 = require("../../models/index");
33
var converter_1 = require("../converter");
4-
var convert_type_1 = require("../convert-type");
54
var parameter_1 = require("./parameter");
65
var reference_1 = require("./reference");
76
function createSignature(context, node, name, kind) {
@@ -29,14 +28,14 @@ function extractSignatureType(context, node) {
2928
if (node.kind & 145 || node.kind & 166) {
3029
try {
3130
var signature = checker.getSignatureFromDeclaration(node);
32-
return convert_type_1.convertType(context, node.type, checker.getReturnTypeOfSignature(signature));
31+
return context.converter.convertType(context, node.type, checker.getReturnTypeOfSignature(signature));
3332
}
3433
catch (error) { }
3534
}
3635
if (node.type) {
37-
return convert_type_1.convertType(context, node.type);
36+
return context.converter.convertType(context, node.type);
3837
}
3938
else {
40-
return convert_type_1.convertType(context, node);
39+
return context.converter.convertType(context, node);
4140
}
4241
}

lib/converter/factories/type-parameter.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
var index_1 = require("../../models/index");
22
var converter_1 = require("../converter");
3-
var convert_type_1 = require("../convert-type");
43
function createTypeParameter(context, node) {
54
var typeParameter = new index_1.TypeParameterType();
65
typeParameter.name = node.symbol.name;
76
if (node.constraint) {
8-
typeParameter.constraint = convert_type_1.convertType(context, node.constraint);
7+
typeParameter.constraint = context.converter.convertType(context, node.constraint);
98
}
109
var reflection = context.scope;
1110
var typeParameterReflection = new index_1.TypeParameterReflection(reflection, typeParameter);

lib/converter/index.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
var convert_node_1 = require("./convert-node");
2-
exports.convertNode = convert_node_1.convertNode;
3-
var convert_type_1 = require("./convert-type");
4-
exports.convertType = convert_type_1.convertType;
1+
var context_1 = require("./context");
2+
exports.Context = context_1.Context;
3+
var converter_1 = require("./converter");
4+
exports.Converter = converter_1.Converter;
55
var convert_expression_1 = require('./convert-expression');
66
exports.convertDefaultValue = convert_expression_1.convertDefaultValue;
77
exports.convertExpression = convert_expression_1.convertExpression;
8+
require('./nodes/index');
9+
require('./types/index');
10+
require('./plugins/index');

lib/converter/nodes/accessor.js

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,27 @@
1+
var __extends = (this && this.__extends) || function (d, b) {
2+
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
3+
function __() { this.constructor = d; }
4+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
5+
};
6+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
7+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") return Reflect.decorate(decorators, target, key, desc);
8+
switch (arguments.length) {
9+
case 2: return decorators.reduceRight(function(o, d) { return (d && d(o)) || o; }, target);
10+
case 3: return decorators.reduceRight(function(o, d) { return (d && d(target, key)), void 0; }, void 0);
11+
case 4: return decorators.reduceRight(function(o, d) { return (d && d(target, key, o)) || o; }, desc);
12+
}
13+
};
14+
var __metadata = (this && this.__metadata) || function (k, v) {
15+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
16+
};
117
var ts = require("typescript");
218
var index_1 = require("../../models/index");
319
var index_2 = require("../factories/index");
4-
var AccessorConverter = (function () {
20+
var components_1 = require("../components");
21+
var AccessorConverter = (function (_super) {
22+
__extends(AccessorConverter, _super);
523
function AccessorConverter() {
24+
_super.apply(this, arguments);
625
this.supports = [
726
143,
827
144
@@ -20,6 +39,10 @@ var AccessorConverter = (function () {
2039
});
2140
return accessor;
2241
};
42+
AccessorConverter = __decorate([
43+
components_1.Component({ name: 'node:accessor' }),
44+
__metadata('design:paramtypes', [])
45+
], AccessorConverter);
2346
return AccessorConverter;
24-
})();
47+
})(components_1.ConverterNodeComponent);
2548
exports.AccessorConverter = AccessorConverter;

0 commit comments

Comments
 (0)