Skip to content

Commit 527d73e

Browse files
authored
Use fully qualified names in generic types (#544)
* Also fixes infinite parser loops * Also implements command line option forwarding to node.js
1 parent 74ce9bf commit 527d73e

24 files changed

+1153
-1090
lines changed

bin/asc

+19-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,22 @@
11
#!/usr/bin/env node
2+
3+
/* tslint:disable */
4+
5+
const tailArgs = process.argv.indexOf("--");
6+
if (~tailArgs) {
7+
require("child_process").spawnSync(
8+
process.argv[0],
9+
process.argv.slice(tailArgs + 1).concat(
10+
process.argv.slice(1, tailArgs)
11+
),
12+
{ stdio: "inherit" }
13+
);
14+
return;
15+
}
16+
217
require("source-map-support").install();
18+
319
const asc = module.exports = require("../cli/asc.js");
4-
if (/\basc$/.test(process.argv[1])) process.exitCode = asc.main(process.argv.slice(2));
20+
if (/\basc$/.test(process.argv[1])) {
21+
process.exitCode = asc.main(process.argv.slice(2));
22+
}

bin/asinit

+3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
#!/usr/bin/env node
2+
3+
/* tslint:disable */
4+
25
const fs = require("fs");
36
const path = require("path");
47
const colors = require("../cli/util/colors");

cli/asc.json

+3
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,9 @@
182182
"type": "b",
183183
"default": false
184184
},
185+
" ...": {
186+
"description": "Specifies node.js options (CLI only). See: node --help"
187+
},
185188
"-Os": { "value": { "optimize": true, "shrinkLevel": 1 } },
186189
"-Oz": { "value": { "optimize": true, "shrinkLevel": 2 } },
187190
"-O0": { "value": { "optimizeLevel": 0, "shrinkLevel": 0 } },

cli/util/options.js

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ function parse(argv, config) {
1818
// make an alias map and initialize defaults
1919
var aliases = {};
2020
Object.keys(config).forEach(key => {
21+
if (key.startsWith(" ")) return;
2122
var option = config[key];
2223
if (option.alias != null) {
2324
if (typeof option.alias === "string") aliases[option.alias] = key;

src/parser.ts

+37-3
Original file line numberDiff line numberDiff line change
@@ -1576,6 +1576,16 @@ export class Parser extends DiagnosticEmitter {
15761576
do {
15771577
let member = this.parseClassMember(tn, declaration);
15781578
if (member) members.push(<DeclarationStatement>member);
1579+
else {
1580+
this.skipStatement(tn);
1581+
if (tn.skip(Token.ENDOFFILE)) {
1582+
this.error(
1583+
DiagnosticCode._0_expected,
1584+
tn.range(), "}"
1585+
);
1586+
return null;
1587+
}
1588+
}
15791589
} while (!tn.skip(Token.CLOSEBRACE));
15801590
}
15811591
return declaration;
@@ -1617,6 +1627,16 @@ export class Parser extends DiagnosticEmitter {
16171627
do {
16181628
let member = this.parseClassMember(tn, declaration);
16191629
if (member) members.push(<DeclarationStatement>member);
1630+
else {
1631+
this.skipStatement(tn);
1632+
if (tn.skip(Token.ENDOFFILE)) {
1633+
this.error(
1634+
DiagnosticCode._0_expected,
1635+
tn.range(), "}"
1636+
);
1637+
return null;
1638+
}
1639+
}
16201640
} while (!tn.skip(Token.CLOSEBRACE));
16211641
}
16221642
return Node.createClassExpression(declaration);
@@ -2152,6 +2172,16 @@ export class Parser extends DiagnosticEmitter {
21522172
while (!tn.skip(Token.CLOSEBRACE)) {
21532173
let member = this.parseTopLevelStatement(tn, ns);
21542174
if (member) members.push(member);
2175+
else {
2176+
this.skipStatement(tn);
2177+
if (tn.skip(Token.ENDOFFILE)) {
2178+
this.error(
2179+
DiagnosticCode._0_expected,
2180+
tn.range(), "}"
2181+
);
2182+
return null;
2183+
}
2184+
}
21552185
}
21562186
tn.skip(Token.SEMICOLON);
21572187
return ns;
@@ -2182,9 +2212,9 @@ export class Parser extends DiagnosticEmitter {
21822212
if (tn.skip(Token.OPENBRACE)) {
21832213
let members = new Array<ExportMember>();
21842214
while (!tn.skip(Token.CLOSEBRACE)) {
2185-
let member = this.parseExportMember(tn);
2186-
if (!member) return null;
2187-
members.push(member);
2215+
let member = this.parseExportMember(tn);
2216+
if (!member) return null;
2217+
members.push(member);
21882218
if (!tn.skip(Token.COMMA)) {
21892219
if (tn.skip(Token.CLOSEBRACE)) {
21902220
break;
@@ -3720,6 +3750,10 @@ export class Parser extends DiagnosticEmitter {
37203750
tn.readFloat();
37213751
break;
37223752
}
3753+
case Token.OPENBRACE: {
3754+
this.skipBlock(tn);
3755+
break;
3756+
}
37233757
}
37243758
} while (true);
37253759
}

src/types.ts

+12-13
Original file line numberDiff line numberDiff line change
@@ -266,20 +266,20 @@ export class Type {
266266
return null;
267267
}
268268

269-
/** Converts this type to its TypeScript representation. */
270-
toString(kindOnly: bool = false): string {
271-
if (!kindOnly && this.is(TypeFlags.REFERENCE)) {
269+
/** Converts this type to a string. */
270+
toString(): string {
271+
if (this.is(TypeFlags.REFERENCE)) {
272272
let classReference = this.classReference;
273273
if (classReference) {
274274
return this.is(TypeFlags.NULLABLE)
275-
? classReference.name + " | null"
276-
: classReference.name;
275+
? classReference.internalName + " | null"
276+
: classReference.internalName;
277277
}
278278
let signatureReference = this.signatureReference;
279279
if (signatureReference) {
280280
return this.is(TypeFlags.NULLABLE)
281-
? "(" + signatureReference.toString(true) + ") | null"
282-
: signatureReference.toString(true);
281+
? "(" + signatureReference.toString() + ") | null"
282+
: signatureReference.toString();
283283
}
284284
assert(false);
285285
}
@@ -637,17 +637,16 @@ export class Signature {
637637
}
638638

639639
/** Converts this signature to a string. */
640-
toString(includeThis: bool = false): string {
640+
toString(): string {
641641
var sb = new Array<string>();
642642
sb.push("(");
643643
var index = 0;
644644
var thisType = this.thisType;
645645
if (thisType) {
646-
if (includeThis) {
647-
sb.push("this: ");
648-
sb.push(thisType.toString());
649-
index = 1;
650-
}
646+
sb.push("this: ");
647+
assert(!thisType.signatureReference);
648+
sb.push(thisType.toString());
649+
index = 1;
651650
}
652651
var parameters = this.parameterTypes;
653652
var numParameters = parameters.length;

tests/compiler.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -223,8 +223,12 @@ tests.forEach(filename => {
223223
stderr: stderr
224224
}, err => {
225225
console.log();
226-
if (err)
226+
if (err) {
227227
stderr.write(err.stack + os.EOL);
228+
failedMessages.set(basename, err.message);
229+
failedTests.push(basename);
230+
return 1;
231+
}
228232

229233
// Instantiate
230234
try {
@@ -308,6 +312,7 @@ tests.forEach(filename => {
308312
if (failed) failedTests.push(basename);
309313
console.log();
310314
});
315+
if (failed) return 1;
311316
});
312317
if (v8_no_flags) v8.setFlagsFromString(v8_no_flags);
313318
});

tests/compiler/nonNullAssertion.untouched.wat

+6-6
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
local.get $0
5252
i32.load
5353
)
54-
(func $~lib/array/Array<Foo>#__get (; 5 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32)
54+
(func $~lib/array/Array<nonNullAssertion/Foo>#__get (; 5 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32)
5555
(local $2 i32)
5656
(local $3 i32)
5757
(local $4 i32)
@@ -87,9 +87,9 @@
8787
(func $nonNullAssertion/testArr (; 6 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32)
8888
local.get $0
8989
i32.const 0
90-
call $~lib/array/Array<Foo>#__get
90+
call $~lib/array/Array<nonNullAssertion/Foo>#__get
9191
)
92-
(func $~lib/array/Array<Foo | null>#__get (; 7 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32)
92+
(func $~lib/array/Array<nonNullAssertion/Foo | null>#__get (; 7 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32)
9393
(local $2 i32)
9494
(local $3 i32)
9595
(local $4 i32)
@@ -125,18 +125,18 @@
125125
(func $nonNullAssertion/testElem (; 8 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32)
126126
local.get $0
127127
i32.const 0
128-
call $~lib/array/Array<Foo | null>#__get
128+
call $~lib/array/Array<nonNullAssertion/Foo | null>#__get
129129
)
130130
(func $nonNullAssertion/testAll (; 9 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32)
131131
local.get $0
132132
i32.const 0
133-
call $~lib/array/Array<Foo | null>#__get
133+
call $~lib/array/Array<nonNullAssertion/Foo | null>#__get
134134
i32.load
135135
)
136136
(func $nonNullAssertion/testAll2 (; 10 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32)
137137
local.get $0
138138
i32.const 0
139-
call $~lib/array/Array<Foo | null>#__get
139+
call $~lib/array/Array<nonNullAssertion/Foo | null>#__get
140140
i32.load
141141
)
142142
(func $nonNullAssertion/testFn (; 11 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32)

tests/compiler/std/array-access.untouched.wat

+10-10
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
(export "stringArrayMethodCall" (func $std/array-access/stringArrayMethodCall))
2121
(export "stringArrayArrayPropertyAccess" (func $std/array-access/stringArrayArrayPropertyAccess))
2222
(export "stringArrayArrayMethodCall" (func $std/array-access/stringArrayArrayMethodCall))
23-
(func $~lib/array/Array<Array<i32>>#__get (; 1 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32)
23+
(func $~lib/array/Array<~lib/array/Array<i32>>#__get (; 1 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32)
2424
(local $2 i32)
2525
(local $3 i32)
2626
(local $4 i32)
@@ -89,11 +89,11 @@
8989
(func $std/array-access/i32ArrayArrayElementAccess (; 3 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32)
9090
local.get $0
9191
i32.const 0
92-
call $~lib/array/Array<Array<i32>>#__get
92+
call $~lib/array/Array<~lib/array/Array<i32>>#__get
9393
i32.const 1
9494
call $~lib/array/Array<i32>#__get
9595
)
96-
(func $~lib/array/Array<String>#__get (; 4 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32)
96+
(func $~lib/array/Array<~lib/string/String>#__get (; 4 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32)
9797
(local $2 i32)
9898
(local $3 i32)
9999
(local $4 i32)
@@ -129,7 +129,7 @@
129129
(func $std/array-access/stringArrayPropertyAccess (; 5 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32)
130130
local.get $0
131131
i32.const 0
132-
call $~lib/array/Array<String>#__get
132+
call $~lib/array/Array<~lib/string/String>#__get
133133
i32.load
134134
)
135135
(func $~lib/internal/string/compareUnsafe (; 6 ;) (type $FUNCSIG$iiiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) (result i32)
@@ -255,12 +255,12 @@
255255
(func $std/array-access/stringArrayMethodCall (; 8 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32)
256256
local.get $0
257257
i32.const 0
258-
call $~lib/array/Array<String>#__get
258+
call $~lib/array/Array<~lib/string/String>#__get
259259
i32.const 8
260260
i32.const 0
261261
call $~lib/string/String#startsWith
262262
)
263-
(func $~lib/array/Array<Array<String>>#__get (; 9 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32)
263+
(func $~lib/array/Array<~lib/array/Array<~lib/string/String>>#__get (; 9 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32)
264264
(local $2 i32)
265265
(local $3 i32)
266266
(local $4 i32)
@@ -296,17 +296,17 @@
296296
(func $std/array-access/stringArrayArrayPropertyAccess (; 10 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32)
297297
local.get $0
298298
i32.const 0
299-
call $~lib/array/Array<Array<String>>#__get
299+
call $~lib/array/Array<~lib/array/Array<~lib/string/String>>#__get
300300
i32.const 1
301-
call $~lib/array/Array<String>#__get
301+
call $~lib/array/Array<~lib/string/String>#__get
302302
i32.load
303303
)
304304
(func $std/array-access/stringArrayArrayMethodCall (; 11 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32)
305305
local.get $0
306306
i32.const 0
307-
call $~lib/array/Array<Array<String>>#__get
307+
call $~lib/array/Array<~lib/array/Array<~lib/string/String>>#__get
308308
i32.const 1
309-
call $~lib/array/Array<String>#__get
309+
call $~lib/array/Array<~lib/string/String>#__get
310310
i32.const 8
311311
i32.const 0
312312
call $~lib/string/String#startsWith

0 commit comments

Comments
 (0)