Skip to content
This repository was archived by the owner on Jan 19, 2019. It is now read-only.

Commit b6302c4

Browse files
committed
Breaking: Change how interface node gets converted (fixes #201)
This commit create an TSInterfaceDeclration and TSInterfaceBody node when converting typescript interface
1 parent 65c2e0a commit b6302c4

14 files changed

+2401
-1076
lines changed

lib/ast-converter.js

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,25 @@ module.exports = function(ast, extra) {
669669
return classImplementsNode;
670670
}
671671

672+
/**
673+
* Converts a child into a interface heritage node.
674+
* @param {TSNode} child The TypeScript AST node to convert.
675+
* @returns {ESTreeNode} The type annotation node.
676+
*/
677+
function convertInterfaceHeritageClauses(child) {
678+
var id = convertChild(child.expression);
679+
var classImplementsNode = {
680+
type: "TSInterfaceHeritage",
681+
loc: id.loc,
682+
range: id.range,
683+
id: id
684+
};
685+
if (child.typeArguments && child.typeArguments.length) {
686+
classImplementsNode.typeParameters = convertTypeArgumentsToTypeParameters(child.typeArguments);
687+
}
688+
return classImplementsNode;
689+
}
690+
672691
/**
673692
* For nodes that are copied directly from the TypeScript AST into
674693
* ESTree mostly as-is. The only difference is the addition of a type
@@ -2067,6 +2086,38 @@ module.exports = function(ast, extra) {
20672086

20682087
break;
20692088

2089+
case SyntaxKind.InterfaceDeclaration:
2090+
var interfaceHeritageClauses = node.heritageClauses || [];
2091+
var interfaceLastClassToken = interfaceHeritageClauses.length ? interfaceHeritageClauses[interfaceHeritageClauses.length - 1] : node.name;
2092+
2093+
if (node.typeParameters && node.typeParameters.length) {
2094+
var interfaceLastTypeParameter = node.typeParameters[node.typeParameters.length - 1];
2095+
if (!interfaceLastClassToken || interfaceLastTypeParameter.pos > interfaceLastClassToken.pos) {
2096+
interfaceLastClassToken = ts.findNextToken(interfaceLastTypeParameter, ast);
2097+
}
2098+
result.typeParameters = convertTSTypeParametersToTypeParametersDeclaration(node.typeParameters);
2099+
}
2100+
2101+
var hasImplementsClause = interfaceHeritageClauses.length > 0;
2102+
var interfaceOpenBrace = ts.findNextToken(interfaceLastClassToken, ast);
2103+
2104+
var interfaceBody = {
2105+
type: "TSInterfaceBody",
2106+
body: node.members.map(function(member) {
2107+
return convertChild(member);
2108+
}),
2109+
range: [ interfaceOpenBrace.getStart(), result.range[1] ],
2110+
loc: getLocFor(interfaceOpenBrace.getStart(), node.end, ast)
2111+
};
2112+
2113+
assign(result, {
2114+
type: "TSInterfaceDeclaration",
2115+
body: interfaceBody,
2116+
id: convertChild(node.name),
2117+
heritage: hasImplementsClause ? interfaceHeritageClauses[0].types.map(convertInterfaceHeritageClauses) : []
2118+
});
2119+
break;
2120+
20702121
default:
20712122
deeplyCopy();
20722123
}
Lines changed: 291 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,291 @@
1+
module.exports = {
2+
"type": "Program",
3+
"range": [
4+
0,
5+
34
6+
],
7+
"loc": {
8+
"start": {
9+
"line": 1,
10+
"column": 0
11+
},
12+
"end": {
13+
"line": 3,
14+
"column": 1
15+
}
16+
},
17+
"body": [
18+
{
19+
"type": "TSInterfaceDeclaration",
20+
"range": [
21+
0,
22+
34
23+
],
24+
"loc": {
25+
"start": {
26+
"line": 1,
27+
"column": 0
28+
},
29+
"end": {
30+
"line": 3,
31+
"column": 1
32+
}
33+
},
34+
"body": {
35+
"type": "TSInterfaceBody",
36+
"body": [],
37+
"range": [
38+
30,
39+
34
40+
],
41+
"loc": {
42+
"start": {
43+
"line": 1,
44+
"column": 30
45+
},
46+
"end": {
47+
"line": 3,
48+
"column": 1
49+
}
50+
}
51+
},
52+
"id": {
53+
"type": "Identifier",
54+
"range": [
55+
10,
56+
13
57+
],
58+
"loc": {
59+
"start": {
60+
"line": 1,
61+
"column": 10
62+
},
63+
"end": {
64+
"line": 1,
65+
"column": 13
66+
}
67+
},
68+
"name": "Foo"
69+
},
70+
"heritage": [
71+
{
72+
"type": "TSInterfaceHeritage",
73+
"loc": {
74+
"start": {
75+
"line": 1,
76+
"column": 22
77+
},
78+
"end": {
79+
"line": 1,
80+
"column": 25
81+
}
82+
},
83+
"range": [
84+
22,
85+
25
86+
],
87+
"id": {
88+
"type": "Identifier",
89+
"range": [
90+
22,
91+
25
92+
],
93+
"loc": {
94+
"start": {
95+
"line": 1,
96+
"column": 22
97+
},
98+
"end": {
99+
"line": 1,
100+
"column": 25
101+
}
102+
},
103+
"name": "Bar"
104+
}
105+
},
106+
{
107+
"type": "TSInterfaceHeritage",
108+
"loc": {
109+
"start": {
110+
"line": 1,
111+
"column": 26
112+
},
113+
"end": {
114+
"line": 1,
115+
"column": 29
116+
}
117+
},
118+
"range": [
119+
26,
120+
29
121+
],
122+
"id": {
123+
"type": "Identifier",
124+
"range": [
125+
26,
126+
29
127+
],
128+
"loc": {
129+
"start": {
130+
"line": 1,
131+
"column": 26
132+
},
133+
"end": {
134+
"line": 1,
135+
"column": 29
136+
}
137+
},
138+
"name": "Baz"
139+
}
140+
}
141+
]
142+
}
143+
],
144+
"sourceType": "script",
145+
"tokens": [
146+
{
147+
"type": "Keyword",
148+
"value": "interface",
149+
"range": [
150+
0,
151+
9
152+
],
153+
"loc": {
154+
"start": {
155+
"line": 1,
156+
"column": 0
157+
},
158+
"end": {
159+
"line": 1,
160+
"column": 9
161+
}
162+
}
163+
},
164+
{
165+
"type": "Identifier",
166+
"value": "Foo",
167+
"range": [
168+
10,
169+
13
170+
],
171+
"loc": {
172+
"start": {
173+
"line": 1,
174+
"column": 10
175+
},
176+
"end": {
177+
"line": 1,
178+
"column": 13
179+
}
180+
}
181+
},
182+
{
183+
"type": "Keyword",
184+
"value": "extends",
185+
"range": [
186+
14,
187+
21
188+
],
189+
"loc": {
190+
"start": {
191+
"line": 1,
192+
"column": 14
193+
},
194+
"end": {
195+
"line": 1,
196+
"column": 21
197+
}
198+
}
199+
},
200+
{
201+
"type": "Identifier",
202+
"value": "Bar",
203+
"range": [
204+
22,
205+
25
206+
],
207+
"loc": {
208+
"start": {
209+
"line": 1,
210+
"column": 22
211+
},
212+
"end": {
213+
"line": 1,
214+
"column": 25
215+
}
216+
}
217+
},
218+
{
219+
"type": "Punctuator",
220+
"value": ",",
221+
"range": [
222+
25,
223+
26
224+
],
225+
"loc": {
226+
"start": {
227+
"line": 1,
228+
"column": 25
229+
},
230+
"end": {
231+
"line": 1,
232+
"column": 26
233+
}
234+
}
235+
},
236+
{
237+
"type": "Identifier",
238+
"value": "Baz",
239+
"range": [
240+
26,
241+
29
242+
],
243+
"loc": {
244+
"start": {
245+
"line": 1,
246+
"column": 26
247+
},
248+
"end": {
249+
"line": 1,
250+
"column": 29
251+
}
252+
}
253+
},
254+
{
255+
"type": "Punctuator",
256+
"value": "{",
257+
"range": [
258+
30,
259+
31
260+
],
261+
"loc": {
262+
"start": {
263+
"line": 1,
264+
"column": 30
265+
},
266+
"end": {
267+
"line": 1,
268+
"column": 31
269+
}
270+
}
271+
},
272+
{
273+
"type": "Punctuator",
274+
"value": "}",
275+
"range": [
276+
33,
277+
34
278+
],
279+
"loc": {
280+
"start": {
281+
"line": 3,
282+
"column": 0
283+
},
284+
"end": {
285+
"line": 3,
286+
"column": 1
287+
}
288+
}
289+
}
290+
]
291+
};
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
interface Foo extends Bar,Baz {
2+
3+
}

0 commit comments

Comments
 (0)