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

Commit d2d5935

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 d2d5935

12 files changed

+2107
-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 implements node.
674+
* @param {TSNode} child The TypeScript AST node to convert.
675+
* @returns {ESTreeNode} The type annotation node.
676+
*/
677+
function convertInterfaceImplements(child) {
678+
var id = convertChild(child.expression);
679+
var classImplementsNode = {
680+
type: "TSInterfaceImplements",
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+
implements: hasImplementsClause ? interfaceHeritageClauses[0].types.map(convertInterfaceImplements) : []
2118+
});
2119+
break;
2120+
20702121
default:
20712122
deeplyCopy();
20722123
}
Lines changed: 220 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,220 @@
1+
module.exports = {
2+
"type": "Program",
3+
"range": [
4+
0,
5+
33
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+
33
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+
29,
39+
33
40+
],
41+
"loc": {
42+
"start": {
43+
"line": 1,
44+
"column": 29
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+
"implements": [
71+
{
72+
"type": "TSInterfaceImplements",
73+
"loc": {
74+
"start": {
75+
"line": 1,
76+
"column": 25
77+
},
78+
"end": {
79+
"line": 1,
80+
"column": 28
81+
}
82+
},
83+
"range": [
84+
25,
85+
28
86+
],
87+
"id": {
88+
"type": "Identifier",
89+
"range": [
90+
25,
91+
28
92+
],
93+
"loc": {
94+
"start": {
95+
"line": 1,
96+
"column": 25
97+
},
98+
"end": {
99+
"line": 1,
100+
"column": 28
101+
}
102+
},
103+
"name": "Bar"
104+
}
105+
}
106+
]
107+
}
108+
],
109+
"sourceType": "script",
110+
"tokens": [
111+
{
112+
"type": "Keyword",
113+
"value": "interface",
114+
"range": [
115+
0,
116+
9
117+
],
118+
"loc": {
119+
"start": {
120+
"line": 1,
121+
"column": 0
122+
},
123+
"end": {
124+
"line": 1,
125+
"column": 9
126+
}
127+
}
128+
},
129+
{
130+
"type": "Identifier",
131+
"value": "Foo",
132+
"range": [
133+
10,
134+
13
135+
],
136+
"loc": {
137+
"start": {
138+
"line": 1,
139+
"column": 10
140+
},
141+
"end": {
142+
"line": 1,
143+
"column": 13
144+
}
145+
}
146+
},
147+
{
148+
"type": "Keyword",
149+
"value": "implements",
150+
"range": [
151+
14,
152+
24
153+
],
154+
"loc": {
155+
"start": {
156+
"line": 1,
157+
"column": 14
158+
},
159+
"end": {
160+
"line": 1,
161+
"column": 24
162+
}
163+
}
164+
},
165+
{
166+
"type": "Identifier",
167+
"value": "Bar",
168+
"range": [
169+
25,
170+
28
171+
],
172+
"loc": {
173+
"start": {
174+
"line": 1,
175+
"column": 25
176+
},
177+
"end": {
178+
"line": 1,
179+
"column": 28
180+
}
181+
}
182+
},
183+
{
184+
"type": "Punctuator",
185+
"value": "{",
186+
"range": [
187+
29,
188+
30
189+
],
190+
"loc": {
191+
"start": {
192+
"line": 1,
193+
"column": 29
194+
},
195+
"end": {
196+
"line": 1,
197+
"column": 30
198+
}
199+
}
200+
},
201+
{
202+
"type": "Punctuator",
203+
"value": "}",
204+
"range": [
205+
32,
206+
33
207+
],
208+
"loc": {
209+
"start": {
210+
"line": 3,
211+
"column": 0
212+
},
213+
"end": {
214+
"line": 3,
215+
"column": 1
216+
}
217+
}
218+
}
219+
]
220+
};
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
interface Foo implements Bar {
2+
3+
}

0 commit comments

Comments
 (0)