Revert "fixes #49: omit new parens when it has no arguments"

This reverts commit b5392f9468.
master
James Long 2017-01-10 18:51:46 -05:00
parent e3b41dd6ca
commit d2d6def9be
76 changed files with 325 additions and 325 deletions

View File

@ -769,7 +769,7 @@ function genericPrintNoParens(path, options, print) {
var args = n.arguments; var args = n.arguments;
if (args && args.length > 0) { if (args) {
parts.push(printArgumentsList(path, options, print)); parts.push(printArgumentsList(path, options, print));
} }

View File

@ -158,7 +158,7 @@ function foo() {
let myClassInstance: MyClass = mk(); let myClassInstance: MyClass = mk();
// ok (no confusion across scopes) // ok (no confusion across scopes)
function mk() { function mk() {
return new MyClass; return new MyClass();
} }
class MyClass {} // looked up above class MyClass {} // looked up above

View File

@ -89,7 +89,7 @@ arr[day] = 0;
(arr[day]: string); // error: number ~> string (arr[day]: string); // error: number ~> string
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
var arr = []; var arr = [];
var day = new Date; var day = new Date();
// Date instances are numeric (see Flow_js.numeric) and thus can index into // Date instances are numeric (see Flow_js.numeric) and thus can index into
// arrays. // arrays.

View File

@ -182,7 +182,7 @@ class C {
var e = async function() {}; var e = async function() {};
var et = async function<T>(a: T) {}; var et = async function<T>(a: T) {};
var n = new async function() {}; var n = new async function() {}();
var o = { async m() {} }; var o = { async m() {} };
var ot = { async m<T>(a: T) {} }; var ot = { async m<T>(a: T) {} };
@ -484,7 +484,7 @@ var et = async function<T>(a: T) {
var n = new async function() { var n = new async function() {
await 1; await 1;
}; }();
var o = { var o = {
async m() { async m() {

View File

@ -876,11 +876,11 @@ function f5() {
// //
var x: C; var x: C;
// ok // ok
var y = new C; var y = new C();
// error: let ref before decl from value position // error: let ref before decl from value position
class C {} class C {}
var z: C = new C; var z: C = new C();
// ok // ok
// --- vars --- // --- vars ---
// it\'s possible to annotate a var with a non-maybe type, // it\'s possible to annotate a var with a non-maybe type,

View File

@ -70,7 +70,7 @@ for (let [x, y]: [number, number] of a.entries()) {} // incorrect
/* @flow */ /* @flow */
// constructor // constructor
const a: FormData = new FormData; const a: FormData = new FormData();
// correct // correct
new FormData(\"\"); new FormData(\"\");
// incorrect // incorrect
@ -116,11 +116,11 @@ a.set(\"bar\", new File([], \"q\"), \"x\");
// correct // correct
a.set(\"bar\", new File([], \"q\"), 2); a.set(\"bar\", new File([], \"q\"), 2);
// incorrect // incorrect
a.set(\"bar\", new Blob); a.set(\"bar\", new Blob());
// correct // correct
a.set(\"bar\", new Blob, \"x\"); a.set(\"bar\", new Blob(), \"x\");
// correct // correct
a.set(\"bar\", new Blob, 2); a.set(\"bar\", new Blob(), 2);
// incorrect // incorrect
// append // append
a.append(\"foo\", \"bar\"); a.append(\"foo\", \"bar\");
@ -139,11 +139,11 @@ a.append(\"bar\", new File([], \"q\"), \"x\");
// correct // correct
a.append(\"bar\", new File([], \"q\"), 2); a.append(\"bar\", new File([], \"q\"), 2);
// incorrect // incorrect
a.append(\"bar\", new Blob); a.append(\"bar\", new Blob());
// correct // correct
a.append(\"bar\", new Blob, \"x\"); a.append(\"bar\", new Blob(), \"x\");
// correct // correct
a.append(\"bar\", new Blob, 2); a.append(\"bar\", new Blob(), 2);
// incorrect // incorrect
// delete // delete
a.delete(\"xx\"); a.delete(\"xx\");
@ -218,7 +218,7 @@ new MutationObserver((arr: Array<MutationRecord>) => true);
// correct // correct
new MutationObserver(() => {}); new MutationObserver(() => {});
// correct // correct
new MutationObserver; new MutationObserver();
// incorrect // incorrect
new MutationObserver(42); new MutationObserver(42);
// incorrect // incorrect

View File

@ -67,7 +67,7 @@ function example<T: { x: number }>(o: T): T {
var obj1: { x: number, y: string } = example({ x: 0, y: \"\" }); var obj1: { x: number, y: string } = example({ x: 0, y: \"\" });
var obj2: { x: number } = example({ x: 0 }); var obj2: { x: number } = example({ x: 0 });
var c: C<string> = new C; var c: C<string> = new C();
// error, since T = string is incompatible with number // error, since T = string is incompatible with number
var q: number = c.qux(0); var q: number = c.qux(0);
/* 2 more errors, since argument U = number is incompatible with T = string, and /* 2 more errors, since argument U = number is incompatible with T = string, and

View File

@ -32,7 +32,7 @@ function f() {
} }
var Foo = require(\"./genericfoo\"); var Foo = require(\"./genericfoo\");
var foo = new Foo; var foo = new Foo();
function g() { function g() {
var foo1 = foo.map(function() { var foo1 = foo.map(function() {
return \"...\"; return \"...\";
@ -60,7 +60,7 @@ class Foo<T> {
return this; return this;
} }
map<U>(callbackfn: () => U): Foo<U> { map<U>(callbackfn: () => U): Foo<U> {
return new Foo; return new Foo();
} }
set(x: T): void {} set(x: T): void {}
get(): T { get(): T {

View File

@ -88,11 +88,11 @@ class B extends A {
B.qux(0); // error B.qux(0); // error
} }
static create(): A { static create(): A {
return new this; return new this();
} }
static badCreate(): number { static badCreate(): number {
return new this; // error B ~> number return new this(); // error B ~> number
} }
} }
@ -100,7 +100,7 @@ class C<X> {
static x: X; static x: X;
static bar(x: X) {} static bar(x: X) {}
static create(): C<*> { static create(): C<*> {
return new this; return new this();
} }
} }
@ -113,7 +113,7 @@ class D extends C<string> {
} }
var d: C<*> = D.create(); var d: C<*> = D.create();
(new A: typeof A); (new A(): typeof A);
(B: typeof A); (B: typeof A);
class E { class E {

View File

@ -26,8 +26,8 @@ var I = require(\"./test.js\");
class C extends I.A {} class C extends I.A {}
var x: I.A = new C; var x: I.A = new C();
var y: I.B = new C;" var y: I.B = new C();"
`; `;
exports[`test test3.js 1`] = ` exports[`test test3.js 1`] = `
@ -42,7 +42,7 @@ class A<X, Y, Z> {}
class B extends A<string, number, boolean> {} class B extends A<string, number, boolean> {}
class C<X, Y, Z> extends B {} class C<X, Y, Z> extends B {}
var c: C<number, string, Array<boolean>> = new C; var c: C<number, string, Array<boolean>> = new C();
// none of the type args matter // none of the type args matter
var a: A<string, number, Array<boolean>> = c; // the third type arg is incorrect" var a: A<string, number, Array<boolean>> = c; // the third type arg is incorrect"
`; `;
@ -70,7 +70,7 @@ function foo<X>(c: C<X>, x: X) {}
type O = { f: number }; type O = { f: number };
foo((new C: C<O>), { f_: 0 }); foo((new C(): C<O>), { f_: 0 });
class D extends C<O> { class D extends C<O> {
bar() { bar() {
@ -78,5 +78,5 @@ class D extends C<O> {
} }
} }
foo(new D, { f_: 0 });" foo(new D(), { f_: 0 });"
`; `;

View File

@ -13,14 +13,14 @@ function bar(x: Class<B>): B {
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class A {} class A {}
function foo(x: Class<A>): A { function foo(x: Class<A>): A {
return new x; // OK return new x(); // OK
} }
class B { class B {
constructor(_: any) {} constructor(_: any) {}
} }
function bar(x: Class<B>): B { function bar(x: Class<B>): B {
return new x; // error (too few args) return new x(); // error (too few args)
}" }"
`; `;
@ -49,9 +49,9 @@ class A {}
class B extends A {} class B extends A {}
class C {} class C {}
check(B, new A); check(B, new A());
check(A, new B); check(A, new B());
check(C, new A); check(C, new A());
check(C, new B); check(C, new B());
check(B, new C);" check(B, new C());"
`; `;

View File

@ -26,7 +26,7 @@ var A = require(\"./A\");
class B extends A {} class B extends A {}
let b = new B; let b = new B();
(b.foo: number); (b.foo: number);
// error, number !~> function // error, number !~> function
module.exports = B;" module.exports = B;"
@ -50,7 +50,7 @@ class C extends B {
foo(x: string): void {} foo(x: string): void {}
} }
let c = new C; let c = new C();
(c.foo: number); (c.foo: number);
// error, number !~> function // error, number !~> function
module.exports = C;" module.exports = C;"
@ -63,7 +63,7 @@ new E().x
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class D {} class D {}
class E {} class E {}
new E.x;" new E().x;"
`; `;
exports[`test class_shapes.js 1`] = ` exports[`test class_shapes.js 1`] = `
@ -120,7 +120,7 @@ class TestClass {
c: ?string; c: ?string;
} }
var x = new TestClass; var x = new TestClass();
x.a; x.a;
// ok // ok
@ -144,7 +144,7 @@ class Test2Class extends Test2Superclass {
b: number; // conflicts with cast to Foo b: number; // conflicts with cast to Foo
} }
var z = new Test2Class; var z = new Test2Class();
var w: Foo = z;" var w: Foo = z;"
`; `;
@ -183,33 +183,33 @@ var alias2: Alias = _Alias.factory(); // error: bad pun
var Bar = class Foo { var Bar = class Foo {
static factory(): Foo { static factory(): Foo {
// OK: Foo is a type in this scope // OK: Foo is a type in this scope
return new Foo; // OK: Foo is a runtime binding in this scope return new Foo(); // OK: Foo is a runtime binding in this scope
} }
}; };
var bar1: Bar = new Bar; var bar1: Bar = new Bar();
// OK // OK
var bar2: Bar = Bar.factory(); var bar2: Bar = Bar.factory();
// OK // OK
// NB: Don\'t write expected errors using Foo to avoid error collapse hiding an // NB: Don\'t write expected errors using Foo to avoid error collapse hiding an
// unexpected failure in the above code. // unexpected failure in the above code.
var B = class Baz {}; var B = class Baz {};
var b = new Baz; var b = new Baz();
// error: Baz is not a runtime binding in this scope // error: Baz is not a runtime binding in this scope
var C = class Qux {}; var C = class Qux {};
var c: Qux = new C; var c: Qux = new C();
// error: Qux is not a type in this scope // error: Qux is not a type in this scope
// OK: anon classes create no binding, but can be bound manually // OK: anon classes create no binding, but can be bound manually
var Anon = class {}; var Anon = class {};
var anon: Anon = new Anon; var anon: Anon = new Anon();
class Alias {} class Alias {}
var _Alias = class Alias { var _Alias = class Alias {
static factory(): Alias { static factory(): Alias {
return new Alias; return new Alias();
} }
}; };
var alias1: Alias = new _Alias; var alias1: Alias = new _Alias();
// error: bad pun // error: bad pun
var alias2: Alias = _Alias.factory(); // error: bad pun" var alias2: Alias = _Alias.factory(); // error: bad pun"
`; `;

View File

@ -85,7 +85,7 @@ class C {
_p: string; _p: string;
} }
module.exports = new C;" module.exports = new C();"
`; `;
exports[`test commonjs_import.js 1`] = ` exports[`test commonjs_import.js 1`] = `

View File

@ -60,16 +60,16 @@ var y2: string = Foo2.y; // error, found boolean instead of string
var z2: string = new Foo2().m(); var z2: string = new Foo2().m();
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
var Foo = require(\"./constructors\").Foo; var Foo = require(\"./constructors\").Foo;
var x: string = new Foo.x; var x: string = new Foo().x;
// error, found number instead of string // error, found number instead of string
var y: string = Foo.y; var y: string = Foo.y;
// error, found number instead of string // error, found number instead of string
var z: string = new Foo.m(); var z: string = new Foo().m();
var Foo2 = require(\"./constructors\").Foo2; var Foo2 = require(\"./constructors\").Foo2;
var x2: string = new Foo2.x; var x2: string = new Foo2().x;
// error, found boolean instead of string // error, found boolean instead of string
var y2: string = Foo2.y; var y2: string = Foo2.y;
// error, found boolean instead of string // error, found boolean instead of string
var z2: string = new Foo2.m();" var z2: string = new Foo2().m();"
`; `;

View File

@ -49,7 +49,7 @@ let tests = [
let tests = [ let tests = [
// constructor // constructor
function() { function() {
new Boolean; new Boolean();
new Boolean(0); new Boolean(0);
new Boolean(-0); new Boolean(-0);
new Boolean(null); new Boolean(null);
@ -128,11 +128,11 @@ function* generator(): Iterable<[string, number]> {
let tests = [ let tests = [
// good constructors // good constructors
function() { function() {
let w = new Map; let w = new Map();
let x = new Map(null); let x = new Map(null);
let y = new Map([ [ \"foo\", 123 ] ]); let y = new Map([ [ \"foo\", 123 ] ]);
let z = new Map(generator()); let z = new Map(generator());
let a: Map<string, number> = new Map; let a: Map<string, number> = new Map();
let b: Map<string, number> = new Map([ [ \"foo\", 123 ] ]); let b: Map<string, number> = new Map([ [ \"foo\", 123 ] ]);
let c: Map<string, number> = new Map(generator()); let c: Map<string, number> = new Map(generator());
}, },
@ -254,7 +254,7 @@ let ws5 = new WeakSet(numbers()); // error, must be objects
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// @flow // @flow
let ws = new WeakSet; let ws = new WeakSet();
let obj: Object = {}; let obj: Object = {};
let dict: { foo: string } = { foo: \"bar\" }; let dict: { foo: string } = { foo: \"bar\" };

View File

@ -61,7 +61,7 @@ class NVerbose<E, I: E> {
} }
} }
var nv: NVerbose<number, *> = new NVerbose; var nv: NVerbose<number, *> = new NVerbose();
nv.x = [ 0 ]; nv.x = [ 0 ];
(nv.x[0]: string); (nv.x[0]: string);
// error // error

View File

@ -34,7 +34,7 @@ var x: string = d.getTime();
var y: number = d; var y: number = d;
// valid constructors // valid constructors
new Date; new Date();
new Date(1234567890); new Date(1234567890);
new Date(\"2015/06/18\"); new Date(\"2015/06/18\");
new Date(2015, 6); new Date(2015, 6);

View File

@ -6,7 +6,7 @@ export function foo(): Implementation { return new Implementation; }
/* @providesModule A */ /* @providesModule A */
class Implementation {} class Implementation {}
export function foo(): Implementation { export function foo(): Implementation {
return new Implementation; return new Implementation();
}" }"
`; `;
@ -25,7 +25,7 @@ module.exports.fun = (): Implementation => new Implementation;
*/ */
class Implementation {} class Implementation {}
module.exports.fun = (): Implementation => new Implementation;" module.exports.fun = (): Implementation => new Implementation();"
`; `;
exports[`test ExplicitProvidesModuleSameName.js 1`] = ` exports[`test ExplicitProvidesModuleSameName.js 1`] = `
@ -43,7 +43,7 @@ module.exports.fun = (): Implementation => new Implementation;
*/ */
class Implementation {} class Implementation {}
module.exports.fun = (): Implementation => new Implementation;" module.exports.fun = (): Implementation => new Implementation();"
`; `;
exports[`test ImplicitProvidesModule.js 1`] = ` exports[`test ImplicitProvidesModule.js 1`] = `
@ -61,7 +61,7 @@ module.exports.fun = (): Implementation => new Implementation;
*/ */
class Implementation {} class Implementation {}
module.exports.fun = (): Implementation => new Implementation;" module.exports.fun = (): Implementation => new Implementation();"
`; `;
exports[`test md5.js 1`] = ` exports[`test md5.js 1`] = `

View File

@ -3,5 +3,5 @@ exports[`test min.js 1`] = `
module.exports.fun = (): Implementation => new Implementation; module.exports.fun = (): Implementation => new Implementation;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class Implementation {} class Implementation {}
module.exports.fun = (): Implementation => new Implementation;" module.exports.fun = (): Implementation => new Implementation();"
`; `;

View File

@ -4,7 +4,7 @@ export function foo(): Implementation { return new Implementation; }
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class Implementation {} class Implementation {}
export function foo(): Implementation { export function foo(): Implementation {
return new Implementation; return new Implementation();
}" }"
`; `;

View File

@ -908,22 +908,22 @@ import {doesntExist2} from \"CommonJS_Clobbering_Class\";
import {staticNumber1, baseProp, childProp} from \"CommonJS_Clobbering_Class\"; import {staticNumber1, baseProp, childProp} from \"CommonJS_Clobbering_Class\";
// Error // Error
import CJS_Clobb_Class from \"CommonJS_Clobbering_Class\"; import CJS_Clobb_Class from \"CommonJS_Clobbering_Class\";
new CJS_Clobb_Class; new CJS_Clobb_Class();
new CJS_Clobb_Class.doesntExist; new CJS_Clobb_Class().doesntExist;
// Error: Class has no \`doesntExist\` property // Error: Class has no \`doesntExist\` property
var h1: number = CJS_Clobb_Class.staticNumber2(); var h1: number = CJS_Clobb_Class.staticNumber2();
var h2: string = CJS_Clobb_Class.staticNumber2(); var h2: string = CJS_Clobb_Class.staticNumber2();
// Error: number ~> string // Error: number ~> string
var h3: number = new CJS_Clobb_Class.instNumber1(); var h3: number = new CJS_Clobb_Class().instNumber1();
var h4: string = new CJS_Clobb_Class.instNumber1(); var h4: string = new CJS_Clobb_Class().instNumber1();
// Error: number ~> string // Error: number ~> string
import * as CJS_Clobb_Class_NS from \"CommonJS_Clobbering_Class\"; import * as CJS_Clobb_Class_NS from \"CommonJS_Clobbering_Class\";
new CJS_Clobb_Class_NS; new CJS_Clobb_Class_NS();
// Error: Namespace object isn\'t constructable // Error: Namespace object isn\'t constructable
var i1: number = CJS_Clobb_Class_NS.staticNumber3(); var i1: number = CJS_Clobb_Class_NS.staticNumber3();
// Error: Class statics not copied to Namespace object // Error: Class statics not copied to Namespace object
var i2: number = new CJS_Clobb_Class_NS.default.instNumber2(); var i2: number = new CJS_Clobb_Class_NS.default().instNumber2();
var i3: string = new CJS_Clobb_Class_NS.default.instNumber2(); var i3: string = new CJS_Clobb_Class_NS.default().instNumber2();
// Error: number ~> string // Error: number ~> string
// =================================== // // =================================== //
// == CommonJS Named Exports -> ES6 == // // == CommonJS Named Exports -> ES6 == //
@ -964,8 +964,8 @@ var o1: number = ES6_Def_NamedFunc1();
var o2: string = ES6_Def_NamedFunc1(); var o2: string = ES6_Def_NamedFunc1();
// Error: number ~> string // Error: number ~> string
import ES6_Def_NamedClass1 from \"ES6_Default_NamedClass1\"; import ES6_Def_NamedClass1 from \"ES6_Default_NamedClass1\";
var q1: number = new ES6_Def_NamedClass1.givesANum(); var q1: number = new ES6_Def_NamedClass1().givesANum();
var q2: string = new ES6_Def_NamedClass1.givesANum(); var q2: string = new ES6_Def_NamedClass1().givesANum();
// Error: number ~> string // Error: number ~> string
//////////////////////////// ////////////////////////////
// == ES6 Named -> ES6 == // // == ES6 Named -> ES6 == //
@ -996,8 +996,8 @@ var v1: number = givesANumber();
var v2: string = givesANumber(); var v2: string = givesANumber();
// Error: number ~> string // Error: number ~> string
import {NumberGenerator} from \"ES6_Named1\"; import {NumberGenerator} from \"ES6_Named1\";
var w1: number = new NumberGenerator.givesANumber(); var w1: number = new NumberGenerator().givesANumber();
var w2: string = new NumberGenerator.givesANumber(); var w2: string = new NumberGenerator().givesANumber();
// Error: number ~> string // Error: number ~> string
import {varDeclNumber1, varDeclNumber2} from \"ES6_Named1\"; import {varDeclNumber1, varDeclNumber2} from \"ES6_Named1\";
var x1: number = varDeclNumber1; var x1: number = varDeclNumber1;
@ -1032,8 +1032,8 @@ var ae1: number = ES6_Def_NamedFunc2();
var ae2: string = ES6_Def_NamedFunc2(); var ae2: string = ES6_Def_NamedFunc2();
// Error: number ~> string // Error: number ~> string
var ES6_Def_NamedClass2 = require(\"ES6_Default_NamedClass2\").default; var ES6_Def_NamedClass2 = require(\"ES6_Default_NamedClass2\").default;
var ag1: number = new ES6_Def_NamedClass2.givesANum(); var ag1: number = new ES6_Def_NamedClass2().givesANum();
var ag2: string = new ES6_Def_NamedClass2.givesANum(); var ag2: string = new ES6_Def_NamedClass2().givesANum();
// Error: number ~> string // Error: number ~> string
///////////////////////////////// /////////////////////////////////
// == ES6 Named -> CommonJS == // // == ES6 Named -> CommonJS == //
@ -1059,8 +1059,8 @@ var ak1: number = givesANumber2();
var ak2: string = givesANumber2(); var ak2: string = givesANumber2();
// Error: number ~> string // Error: number ~> string
var NumberGenerator2 = require(\"ES6_Named2\").NumberGenerator2; var NumberGenerator2 = require(\"ES6_Named2\").NumberGenerator2;
var al1: number = new NumberGenerator2.givesANumber(); var al1: number = new NumberGenerator2().givesANumber();
var al2: string = new NumberGenerator2.givesANumber(); var al2: string = new NumberGenerator2().givesANumber();
// Error: number ~> string // Error: number ~> string
var varDeclNumber3 = require(\"ES6_Named2\").varDeclNumber3; var varDeclNumber3 = require(\"ES6_Named2\").varDeclNumber3;
var varDeclNumber4 = require(\"ES6_Named2\").varDeclNumber4; var varDeclNumber4 = require(\"ES6_Named2\").varDeclNumber4;

View File

@ -372,7 +372,7 @@ class Child extends Base {
childprop2: number; childprop2: number;
} }
var { baseprop1, childprop1, ...others } = new Child; var { baseprop1, childprop1, ...others } = new Child();
var bp1: number = baseprop1; var bp1: number = baseprop1;
var bp1_err: string = baseprop1; var bp1_err: string = baseprop1;

View File

@ -411,11 +411,11 @@ function unsound_dict_has_every_key(o: { [k: string]: X }) {
// As with any object type, we can assign subtypes to properties. // As with any object type, we can assign subtypes to properties.
function set_prop_covariant(o: { [k: string]: B }) { function set_prop_covariant(o: { [k: string]: B }) {
o.p = new A; o.p = new A();
// error, A ~> B // error, A ~> B
o.p = new B; o.p = new B();
// ok // ok
o.p = new C; // ok o.p = new C(); // ok
} }
// This isn\'t specific behavior to dictionaries, but for completeness... // This isn\'t specific behavior to dictionaries, but for completeness...
@ -472,7 +472,7 @@ function unsound_string_conversion_alias_declared_prop(
function unification_dict_values_invariant(x: Array<{ [k: string]: B }>) { function unification_dict_values_invariant(x: Array<{ [k: string]: B }>) {
let a: Array<{ [k: string]: A }> = x; let a: Array<{ [k: string]: A }> = x;
// error // error
a[0].p = new A; a[0].p = new A();
// in[0].p no longer B // in[0].p no longer B
let b: Array<{ [k: string]: B }> = x; let b: Array<{ [k: string]: B }> = x;
// ok // ok
@ -484,7 +484,7 @@ function unification_dict_values_invariant(x: Array<{ [k: string]: B }>) {
function subtype_dict_values_invariant(x: { [k: string]: B }) { function subtype_dict_values_invariant(x: { [k: string]: B }) {
let a: { [k: string]: A } = x; let a: { [k: string]: A } = x;
// error // error
a.p = new A; a.p = new A();
// x[0].p no longer B // x[0].p no longer B
let b: { [k: string]: B } = x; let b: { [k: string]: B } = x;
// ok // ok
@ -495,30 +495,30 @@ function subtype_dict_values_invariant(x: { [k: string]: B }) {
function subtype_dict_values_fresh_exception() { function subtype_dict_values_fresh_exception() {
let a: { [k: string]: A } = { let a: { [k: string]: A } = {
a: new A, a: new A(),
// ok, A == A // ok, A == A
b: new B, b: new B(),
// ok, B <: A // ok, B <: A
// ok, C <: A // ok, C <: A
c: new C c: new C()
}; };
let b: { [k: string]: B } = { let b: { [k: string]: B } = {
a: new A, a: new A(),
// error, A not <: B // error, A not <: B
b: new B, b: new B(),
// ok, B == B // ok, B == B
// ok, C <: A // ok, C <: A
c: new C c: new C()
}; };
let c: { [k: string]: C } = { let c: { [k: string]: C } = {
a: new A, a: new A(),
// error, A not <: C // error, A not <: C
b: new B, b: new B(),
// error, A not <: C // error, A not <: C
// ok, C == C // ok, C == C
c: new C c: new C()
}; };
} }
@ -548,7 +548,7 @@ function unification_mix_with_declared_props_invariant_l(
) { ) {
let a: Array<{ [k: string]: B, p: A }> = x; let a: Array<{ [k: string]: B, p: A }> = x;
// error: A ~> B // error: A ~> B
a[0].p = new A; a[0].p = new A();
// x[0].p no longer B // x[0].p no longer B
let b: Array<{ [k: string]: B, p: B }> = x; let b: Array<{ [k: string]: B, p: B }> = x;
// ok // ok
@ -564,7 +564,7 @@ function unification_mix_with_declared_props_invariant_r(
) { ) {
let a: Array<{ [k: string]: A }> = xa; let a: Array<{ [k: string]: A }> = xa;
// error // error
a[0].p = new A; a[0].p = new A();
// xa[0].p no longer B // xa[0].p no longer B
let b: Array<{ [k: string]: B }> = xb; let b: Array<{ [k: string]: B }> = xb;
// ok // ok
@ -576,7 +576,7 @@ function unification_mix_with_declared_props_invariant_r(
function subtype_mix_with_declared_props_invariant_l(x: { [k: string]: B }) { function subtype_mix_with_declared_props_invariant_l(x: { [k: string]: B }) {
let a: { [k: string]: B, p: A } = x; let a: { [k: string]: B, p: A } = x;
// error: A ~> B // error: A ~> B
a.p = new A; a.p = new A();
// x.p no longer B // x.p no longer B
let b: { [k: string]: B, p: B } = x; let b: { [k: string]: B, p: B } = x;
// ok // ok
@ -592,7 +592,7 @@ function subtype_mix_with_declared_props_invariant_r(
) { ) {
let a: { [k: string]: A } = xa; let a: { [k: string]: A } = xa;
// error // error
a.p = new A; a.p = new A();
// xa.p no longer B // xa.p no longer B
let b: { [k: string]: B } = xb; let b: { [k: string]: B } = xb;
// ok // ok
@ -616,7 +616,7 @@ function unification_obj_to_dict(
function subtype_dict_to_obj(x: { [k: string]: B }) { function subtype_dict_to_obj(x: { [k: string]: B }) {
let a: { p: A } = x; let a: { p: A } = x;
// error // error
a.p = new A; a.p = new A();
// x.p no longer B // x.p no longer B
let b: { p: B } = x; let b: { p: B } = x;
// ok // ok
@ -628,7 +628,7 @@ function subtype_dict_to_obj(x: { [k: string]: B }) {
function subtype_obj_to_dict(x: { p: B }) { function subtype_obj_to_dict(x: { p: B }) {
let a: { [k: string]: A } = x; let a: { [k: string]: A } = x;
// error // error
a.p = new A; a.p = new A();
// x.p no longer B // x.p no longer B
let b: { [k: string]: B } = x; let b: { [k: string]: B } = x;

View File

@ -297,14 +297,14 @@ let listener: EventListener = function(event: Event): void {};
let tests = [ let tests = [
// attachEvent // attachEvent
function() { function() {
let target = new EventTarget; let target = new EventTarget();
(target.attachEvent(\"foo\", listener): void); (target.attachEvent(\"foo\", listener): void);
// invalid, may be undefined // invalid, may be undefined
(target.attachEvent && target.attachEvent(\"foo\", listener): void); // valid (target.attachEvent && target.attachEvent(\"foo\", listener): void); // valid
}, },
// detachEvent // detachEvent
function() { function() {
let target = new EventTarget; let target = new EventTarget();
(target.detachEvent(\"foo\", listener): void); (target.detachEvent(\"foo\", listener): void);
// invalid, may be undefined // invalid, may be undefined
(target.detachEvent && target.detachEvent(\"foo\", listener): void); // valid (target.detachEvent && target.detachEvent(\"foo\", listener): void); // valid
@ -335,7 +335,7 @@ let tests = [
let tests = [ let tests = [
// arcTo // arcTo
function() { function() {
let path = new Path2D; let path = new Path2D();
(path.arcTo(0, 0, 0, 0, 10): void); (path.arcTo(0, 0, 0, 0, 10): void);
// valid // valid
(path.arcTo(0, 0, 0, 0, 10, 20, 5): void); (path.arcTo(0, 0, 0, 0, 10, 20, 5): void);

View File

@ -40,7 +40,7 @@ class C1 {
m() {} m() {}
} }
new C1.m(); new C1().m();
class C2 { class C2 {
get m() { get m() {
@ -49,14 +49,14 @@ class C2 {
m() {} m() {}
} }
new C2.m(); new C2().m();
class C3 { class C3 {
set m(x) {} set m(x) {}
m() {} m() {}
} }
new C3.m(); new C3().m();
class C4 { class C4 {
get m() { get m() {
@ -65,7 +65,7 @@ class C4 {
set m(x: number) {} set m(x: number) {}
} }
new C4.m = new C4.m - 42; new C4().m = new C4().m - 42;
class C5 { class C5 {
m() {} m() {}
@ -75,5 +75,5 @@ class C5 {
set m(x: number) {} set m(x: number) {}
} }
new C5.m = new C5.m - 42;" new C5().m = new C5().m - 42;"
`; `;

View File

@ -17,7 +17,7 @@ var s3 = tag2 \`la la la\`;
(s3.foo: number); // error: string ~> number (s3.foo: number); // error: string ~> number
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class A {} class A {}
var a = new A; var a = new A();
var s1 = \`l\${a.x}r\`; var s1 = \`l\${a.x}r\`;
// error: no prop x in A // error: no prop x in A
function tag(strings, ...values) { function tag(strings, ...values) {

View File

@ -245,7 +245,7 @@ export default class Foo {
// Regression test for https://github.com/facebook/flow/issues/511 // Regression test for https://github.com/facebook/flow/issues/511
// //
// Default-exported class should also be available in local scope // Default-exported class should also be available in local scope
new Foo;" new Foo();"
`; `;
exports[`test ES6_Default_NamedClass2.js 1`] = ` exports[`test ES6_Default_NamedClass2.js 1`] = `
@ -1011,22 +1011,22 @@ import {doesntExist2} from \"CommonJS_Clobbering_Class\";
import {staticNumber1, baseProp, childProp} from \"CommonJS_Clobbering_Class\"; import {staticNumber1, baseProp, childProp} from \"CommonJS_Clobbering_Class\";
// Error // Error
import CJS_Clobb_Class from \"CommonJS_Clobbering_Class\"; import CJS_Clobb_Class from \"CommonJS_Clobbering_Class\";
new CJS_Clobb_Class; new CJS_Clobb_Class();
new CJS_Clobb_Class.doesntExist; new CJS_Clobb_Class().doesntExist;
// Error: Class has no \`doesntExist\` property // Error: Class has no \`doesntExist\` property
var h1: number = CJS_Clobb_Class.staticNumber2(); var h1: number = CJS_Clobb_Class.staticNumber2();
var h2: string = CJS_Clobb_Class.staticNumber2(); var h2: string = CJS_Clobb_Class.staticNumber2();
// Error: number ~> string // Error: number ~> string
var h3: number = new CJS_Clobb_Class.instNumber1(); var h3: number = new CJS_Clobb_Class().instNumber1();
var h4: string = new CJS_Clobb_Class.instNumber1(); var h4: string = new CJS_Clobb_Class().instNumber1();
// Error: number ~> string // Error: number ~> string
import * as CJS_Clobb_Class_NS from \"CommonJS_Clobbering_Class\"; import * as CJS_Clobb_Class_NS from \"CommonJS_Clobbering_Class\";
new CJS_Clobb_Class_NS; new CJS_Clobb_Class_NS();
// Error: Namespace object isn\'t constructable // Error: Namespace object isn\'t constructable
var i1: number = CJS_Clobb_Class_NS.staticNumber3(); var i1: number = CJS_Clobb_Class_NS.staticNumber3();
// Error: Class statics not copied to Namespace object // Error: Class statics not copied to Namespace object
var i2: number = new CJS_Clobb_Class_NS.default.instNumber2(); var i2: number = new CJS_Clobb_Class_NS.default().instNumber2();
var i3: string = new CJS_Clobb_Class_NS.default.instNumber2(); var i3: string = new CJS_Clobb_Class_NS.default().instNumber2();
// Error: number ~> string // Error: number ~> string
// =================================== // // =================================== //
// == CommonJS Named Exports -> ES6 == // // == CommonJS Named Exports -> ES6 == //
@ -1067,12 +1067,12 @@ var o1: number = ES6_Def_NamedFunc1();
var o2: string = ES6_Def_NamedFunc1(); var o2: string = ES6_Def_NamedFunc1();
// Error: number ~> string // Error: number ~> string
import ES6_Def_AnonClass1 from \"ES6_Default_AnonClass1\"; import ES6_Def_AnonClass1 from \"ES6_Default_AnonClass1\";
var p1: number = new ES6_Def_AnonClass1.givesANum(); var p1: number = new ES6_Def_AnonClass1().givesANum();
var p2: string = new ES6_Def_AnonClass1.givesANum(); var p2: string = new ES6_Def_AnonClass1().givesANum();
// Error: number ~> string // Error: number ~> string
import ES6_Def_NamedClass1 from \"ES6_Default_NamedClass1\"; import ES6_Def_NamedClass1 from \"ES6_Default_NamedClass1\";
var q1: number = new ES6_Def_NamedClass1.givesANum(); var q1: number = new ES6_Def_NamedClass1().givesANum();
var q2: string = new ES6_Def_NamedClass1.givesANum(); var q2: string = new ES6_Def_NamedClass1().givesANum();
// Error: number ~> string // Error: number ~> string
//////////////////////////// ////////////////////////////
// == ES6 Named -> ES6 == // // == ES6 Named -> ES6 == //
@ -1103,8 +1103,8 @@ var v1: number = givesANumber();
var v2: string = givesANumber(); var v2: string = givesANumber();
// Error: number ~> string // Error: number ~> string
import {NumberGenerator} from \"ES6_Named1\"; import {NumberGenerator} from \"ES6_Named1\";
var w1: number = new NumberGenerator.givesANumber(); var w1: number = new NumberGenerator().givesANumber();
var w2: string = new NumberGenerator.givesANumber(); var w2: string = new NumberGenerator().givesANumber();
// Error: number ~> string // Error: number ~> string
import {varDeclNumber1, varDeclNumber2} from \"ES6_Named1\"; import {varDeclNumber1, varDeclNumber2} from \"ES6_Named1\";
var x1: number = varDeclNumber1; var x1: number = varDeclNumber1;
@ -1147,12 +1147,12 @@ var ae1: number = ES6_Def_NamedFunc2();
var ae2: string = ES6_Def_NamedFunc2(); var ae2: string = ES6_Def_NamedFunc2();
// Error: number ~> string // Error: number ~> string
var ES6_Def_AnonClass2 = require(\"ES6_Default_AnonClass2\").default; var ES6_Def_AnonClass2 = require(\"ES6_Default_AnonClass2\").default;
var af1: number = new ES6_Def_AnonClass2.givesANum(); var af1: number = new ES6_Def_AnonClass2().givesANum();
var af2: string = new ES6_Def_AnonClass2.givesANum(); var af2: string = new ES6_Def_AnonClass2().givesANum();
// Error: number ~> string // Error: number ~> string
var ES6_Def_NamedClass2 = require(\"ES6_Default_NamedClass2\").default; var ES6_Def_NamedClass2 = require(\"ES6_Default_NamedClass2\").default;
var ag1: number = new ES6_Def_NamedClass2.givesANum(); var ag1: number = new ES6_Def_NamedClass2().givesANum();
var ag2: string = new ES6_Def_NamedClass2.givesANum(); var ag2: string = new ES6_Def_NamedClass2().givesANum();
// Error: number ~> string // Error: number ~> string
///////////////////////////////// /////////////////////////////////
// == ES6 Named -> CommonJS == // // == ES6 Named -> CommonJS == //
@ -1178,8 +1178,8 @@ var ak1: number = givesANumber2();
var ak2: string = givesANumber2(); var ak2: string = givesANumber2();
// Error: number ~> string // Error: number ~> string
var NumberGenerator2 = require(\"ES6_Named2\").NumberGenerator2; var NumberGenerator2 = require(\"ES6_Named2\").NumberGenerator2;
var al1: number = new NumberGenerator2.givesANumber(); var al1: number = new NumberGenerator2().givesANumber();
var al2: string = new NumberGenerator2.givesANumber(); var al2: string = new NumberGenerator2().givesANumber();
// Error: number ~> string // Error: number ~> string
var varDeclNumber3 = require(\"ES6_Named2\").varDeclNumber3; var varDeclNumber3 = require(\"ES6_Named2\").varDeclNumber3;
var varDeclNumber4 = require(\"ES6_Named2\").varDeclNumber4; var varDeclNumber4 = require(\"ES6_Named2\").varDeclNumber4;

View File

@ -76,10 +76,10 @@ import {num3} from \"ES\";
// Error: number ~> string // Error: number ~> string
import {C} from \"ES\"; import {C} from \"ES\";
import type {C as CType} from \"ES\"; import type {C as CType} from \"ES\";
(new C: C); (new C(): C);
(42: C); (42: C);
// Error: number ~> C // Error: number ~> C
(new C: CType); (new C(): CType);
(42: CType); (42: CType);
// Error: number ~> CType // Error: number ~> CType
import {T} from \"ES\"; import {T} from \"ES\";

View File

@ -88,7 +88,7 @@ const c = new Headers({ \"Content-Type\", \"image/jpeg\" });
// correct // correct
const d = new Headers(c); const d = new Headers(c);
// correct // correct
const e: Headers = new Headers; const e: Headers = new Headers();
// correct // correct
e.append(\"Content-Type\", \"image/jpeg\"); e.append(\"Content-Type\", \"image/jpeg\");
// correct // correct
@ -173,7 +173,7 @@ h.arrayBuffer().then((ab: ArrayBuffer) => ab); // correct
h.arrayBuffer().then((ab: Buffer) => ab); // incorrect h.arrayBuffer().then((ab: Buffer) => ab); // incorrect
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* @flow */ /* @flow */
const a: Request = new Request; const a: Request = new Request();
// incorrect // incorrect
const b: Request = new Request(\"http://example.org\"); const b: Request = new Request(\"http://example.org\");
// correct // correct
@ -276,13 +276,13 @@ h.arrayBuffer().then((ab: ArrayBuffer) => ab); // correct
h.arrayBuffer().then((ab: Buffer) => ab); // incorrect h.arrayBuffer().then((ab: Buffer) => ab); // incorrect
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* @flow */ /* @flow */
const a: Response = new Response; const a: Response = new Response();
// correct // correct
const b: Response = new Response(new Blob); const b: Response = new Response(new Blob());
// correct // correct
const c: Response = new Response(new FormData); const c: Response = new Response(new FormData());
// correct // correct
const d: Response = new Response(new FormData, { status: 404 }); const d: Response = new Response(new FormData(), { status: 404 });
// correct // correct
const e: Response = new Response(\"responsebody\", { status: \"404\" }); const e: Response = new Response(\"responsebody\", { status: \"404\" });
// incorrect // incorrect
@ -358,7 +358,7 @@ const c = new URLSearchParams({ \"key1\", \"value1\" });
// not correct // not correct
const d = new URLSearchParams(c); const d = new URLSearchParams(c);
// correct // correct
const e: URLSearchParams = new URLSearchParams; const e: URLSearchParams = new URLSearchParams();
// correct // correct
e.append(\"key1\", \"value1\"); e.append(\"key1\", \"value1\");
// correct // correct

View File

@ -226,7 +226,7 @@ class GeneratorExamples {
} }
} }
var examples = new GeneratorExamples; var examples = new GeneratorExamples();
for (var x of examples.infer_stmt()) { for (var x of examples.infer_stmt()) {
(x: string); (x: string);
@ -297,7 +297,7 @@ class GeneratorExamples<X> {
} }
} }
var examples = new GeneratorExamples; var examples = new GeneratorExamples();
for (var x of examples.infer_stmt()) { for (var x of examples.infer_stmt()) {
(x: string); (x: string);

View File

@ -62,7 +62,7 @@ class D<T> {
} }
} }
var d = new D; var d = new D();
var o = {}; var o = {};
var b = d.m(true, 0, o); var b = d.m(true, 0, o);
var s: string = d.x; var s: string = d.x;
@ -78,7 +78,7 @@ class E<X> extends C<X> {
} }
} }
var e = new E; var e = new E();
// error: too few arguments to inherited constructor // error: too few arguments to inherited constructor
var x: string = e.set(0); var x: string = e.set(0);
@ -91,7 +91,7 @@ class H<Z> extends G<Array<Z>> {
} }
} }
var h1 = new H; var h1 = new H();
h1.foo([ \"...\" ]); h1.foo([ \"...\" ]);
var h2: F<Array<Array<Array<number>>>> = h1; var h2: F<Array<Array<Array<number>>>> = h1;

View File

@ -22,7 +22,7 @@ geolocation.clearWatch(id);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* @flow */ /* @flow */
var geolocation = new Geolocation; var geolocation = new Geolocation();
var id = geolocation.watchPosition( var id = geolocation.watchPosition(
position => { position => {
var coords: Coordinates = position.coords; var coords: Coordinates = position.coords;

View File

@ -107,7 +107,7 @@ class Foo {
set propOverriddenWithSetter(x: string) {} set propOverriddenWithSetter(x: string) {}
} }
var foo = new Foo; var foo = new Foo();
// Test getting properties with getters // Test getting properties with getters
var testGetterNoError1: number = foo.goodGetterNoAnnotation; var testGetterNoError1: number = foo.goodGetterNoAnnotation;
@ -234,12 +234,12 @@ var obj = {
return 4; return 4;
}, },
get exampleOfOrderOfGetterAndSetter(): A { get exampleOfOrderOfGetterAndSetter(): A {
return new A; return new A();
}, },
set exampleOfOrderOfGetterAndSetter(x: B) {}, set exampleOfOrderOfGetterAndSetter(x: B) {},
set exampleOfOrderOfGetterAndSetterReordered(x: B) {}, set exampleOfOrderOfGetterAndSetterReordered(x: B) {},
get exampleOfOrderOfGetterAndSetterReordered(): A { get exampleOfOrderOfGetterAndSetterReordered(): A {
return new A; return new A();
} }
}; };
@ -264,7 +264,7 @@ var testSubtypingGetterAndSetter: number = obj.propWithSubtypingGetterAndSetter;
// When building this feature, it was tempting to flow the setter into the // When building this feature, it was tempting to flow the setter into the
// getter and then use either the getter or setter as the type of the property. // getter and then use either the getter or setter as the type of the property.
// This example shows the danger of using the getter\'s type // This example shows the danger of using the getter\'s type
obj.exampleOfOrderOfGetterAndSetter = new C; obj.exampleOfOrderOfGetterAndSetter = new C();
// Error C ~> B // Error C ~> B
// And this example shows the danger of using the setter\'s type. // And this example shows the danger of using the setter\'s type.
var testExampleOrOrderOfGetterAndSetterReordered: number = obj.exampleOfOrderOfGetterAndSetterReordered; // Error A ~> B" var testExampleOrOrderOfGetterAndSetterReordered: number = obj.exampleOfOrderOfGetterAndSetterReordered; // Error A ~> B"

View File

@ -20,8 +20,8 @@ class B extends A {
} }
} }
class C extends A {} class C extends A {}
var a: A = new B; var a: A = new B();
a.foo = function(): C { a.foo = function(): C {
return new C; return new C();
};" };"
`; `;

View File

@ -21,7 +21,7 @@ class ClassFoo3 {
return 42; return 42;
} }
static givesAFoo3(): ClassFoo3 { static givesAFoo3(): ClassFoo3 {
return new ClassFoo3; return new ClassFoo3();
} }
} }
@ -65,17 +65,17 @@ class ClassFoo4 {
class ClassFoo5 {} class ClassFoo5 {}
function givesAFoo4(): ClassFoo4 { function givesAFoo4(): ClassFoo4 {
return new ClassFoo4; return new ClassFoo4();
} }
function givesAFoo5(): ClassFoo5 { function givesAFoo5(): ClassFoo5 {
return new ClassFoo5; return new ClassFoo5();
} }
exports.ClassFoo4 = ClassFoo4; exports.ClassFoo4 = ClassFoo4;
exports.ClassFoo5 = ClassFoo5; exports.ClassFoo5 = ClassFoo5;
exports.foo4Inst = new ClassFoo4; exports.foo4Inst = new ClassFoo4();
exports.foo5Inst = new ClassFoo5;" exports.foo5Inst = new ClassFoo5();"
`; `;
exports[`test ExportDefault_Class.js 1`] = ` exports[`test ExportDefault_Class.js 1`] = `
@ -101,7 +101,7 @@ class ClassFoo1 {
} }
export default ClassFoo1 export default ClassFoo1
export var foo1Inst = new ClassFoo1;" export var foo1Inst = new ClassFoo1();"
`; `;
exports[`test ExportNamed_Alias.js 1`] = ` exports[`test ExportNamed_Alias.js 1`] = `
@ -156,7 +156,7 @@ class ClassFoo2 {
} }
export {ClassFoo2} export {ClassFoo2}
export var foo2Inst = new ClassFoo2;" export var foo2Inst = new ClassFoo2();"
`; `;
exports[`test ExportsANumber.js 1`] = ` exports[`test ExportsANumber.js 1`] = `
@ -267,7 +267,7 @@ import {foo1Inst} from \"./ExportDefault_Class\";
var a1: ClassFoo1 = foo1Inst; var a1: ClassFoo1 = foo1Inst;
var a2: number = foo1Inst; var a2: number = foo1Inst;
// Error: ClassFoo1 ~> number // Error: ClassFoo1 ~> number
new ClassFoo1; new ClassFoo1();
// Error: ClassFoo1 is not a value-identifier // Error: ClassFoo1 is not a value-identifier
/////////////////////////////////////////////// ///////////////////////////////////////////////
// == Importing Class Type (Named Export) == // // == Importing Class Type (Named Export) == //
@ -278,15 +278,15 @@ import {foo2Inst} from \"./ExportNamed_Class\";
var b1: ClassFoo2 = foo2Inst; var b1: ClassFoo2 = foo2Inst;
var b2: number = foo2Inst; var b2: number = foo2Inst;
// Error: ClassFoo2 ~> number // Error: ClassFoo2 ~> number
new ClassFoo2; new ClassFoo2();
// Error: ClassFoo2 is not a value-identifier // Error: ClassFoo2 is not a value-identifier
///////////////////////////////////////////////////// /////////////////////////////////////////////////////
// == Importing Class Type (CJS Default Export) == // // == Importing Class Type (CJS Default Export) == //
///////////////////////////////////////////////////// /////////////////////////////////////////////////////
import type ClassFoo3T from \"./ExportCJSDefault_Class\"; import type ClassFoo3T from \"./ExportCJSDefault_Class\";
import ClassFoo3 from \"./ExportCJSDefault_Class\"; import ClassFoo3 from \"./ExportCJSDefault_Class\";
var c1: ClassFoo3T = new ClassFoo3; var c1: ClassFoo3T = new ClassFoo3();
new ClassFoo3T; new ClassFoo3T();
// Error: ClassFoo3 is not a value-identifier // Error: ClassFoo3 is not a value-identifier
/////////////////////////////////////////////////// ///////////////////////////////////////////////////
// == Importing Class Type (CJS Named Export) == // // == Importing Class Type (CJS Named Export) == //
@ -297,7 +297,7 @@ import {foo4Inst, foo5Inst} from \"./ExportCJSNamed_Class\";
var d1: ClassFoo4 = foo4Inst; var d1: ClassFoo4 = foo4Inst;
var d2: number = foo4Inst; var d2: number = foo4Inst;
// Error: ClassFoo4 ~> number // Error: ClassFoo4 ~> number
new ClassFoo4; new ClassFoo4();
// Error: ClassFoo4 is not a value-identifier // Error: ClassFoo4 is not a value-identifier
// TODO: this errors correctly, but the message is just \'can\'t resolve name\' // TODO: this errors correctly, but the message is just \'can\'t resolve name\'
var d3: typeof ClassFoo5 = foo5Inst; var d3: typeof ClassFoo5 = foo5Inst;

View File

@ -21,7 +21,7 @@ class ClassFoo3 {
return 42; return 42;
} }
static givesAFoo3(): ClassFoo3 { static givesAFoo3(): ClassFoo3 {
return new ClassFoo3; return new ClassFoo3();
} }
} }
@ -292,9 +292,9 @@ import typeof ClassFoo1T from \"./ExportDefault_Class\";
import ClassFoo1 from \"./ExportDefault_Class\"; import ClassFoo1 from \"./ExportDefault_Class\";
var a1: ClassFoo1T = ClassFoo1; var a1: ClassFoo1T = ClassFoo1;
var a2: ClassFoo1T = new ClassFoo1; var a2: ClassFoo1T = new ClassFoo1();
// Error: ClassFoo1 (inst) ~> ClassFoo1 (class) // Error: ClassFoo1 (inst) ~> ClassFoo1 (class)
new ClassFoo1T; new ClassFoo1T();
// Error: ClassFoo1T is not bound to a value // Error: ClassFoo1T is not bound to a value
///////////////////////////////////////////////// /////////////////////////////////////////////////
// == Importing Class Typeof (Named Export) == // // == Importing Class Typeof (Named Export) == //
@ -303,9 +303,9 @@ import typeof {ClassFoo2 as ClassFoo2T} from \"./ExportNamed_Class\";
import {ClassFoo2} from \"./ExportNamed_Class\"; import {ClassFoo2} from \"./ExportNamed_Class\";
var b1: ClassFoo2T = ClassFoo2; var b1: ClassFoo2T = ClassFoo2;
var b2: ClassFoo2T = new ClassFoo2; var b2: ClassFoo2T = new ClassFoo2();
// Error: ClassFoo2 (inst) ~> ClassFoo2 (class) // Error: ClassFoo2 (inst) ~> ClassFoo2 (class)
new ClassFoo2T; new ClassFoo2T();
// Error: ClassFoo2T is not bound to a value // Error: ClassFoo2T is not bound to a value
/////////////////////////////////////////////////////// ///////////////////////////////////////////////////////
// == Importing Class Typeof (CJS Default Export) == // // == Importing Class Typeof (CJS Default Export) == //
@ -314,7 +314,7 @@ import typeof ClassFoo3T from \"./ExportCJSDefault_Class\";
import ClassFoo3 from \"./ExportCJSDefault_Class\"; import ClassFoo3 from \"./ExportCJSDefault_Class\";
var c1: ClassFoo3T = ClassFoo3; var c1: ClassFoo3T = ClassFoo3;
var c2: ClassFoo3T = new ClassFoo3; var c2: ClassFoo3T = new ClassFoo3();
// Error: ClassFoo3 (inst) ~> ClassFoo3 (class) // Error: ClassFoo3 (inst) ~> ClassFoo3 (class)
///////////////////////////////////////////////////// /////////////////////////////////////////////////////
// == Importing Class Typeof (CJS Named Export) == // // == Importing Class Typeof (CJS Named Export) == //
@ -323,7 +323,7 @@ import typeof {ClassFoo4 as ClassFoo4T} from \"./ExportCJSNamed_Class\";
import {ClassFoo4} from \"./ExportCJSNamed_Class\"; import {ClassFoo4} from \"./ExportCJSNamed_Class\";
var d1: ClassFoo4T = ClassFoo4; var d1: ClassFoo4T = ClassFoo4;
var d2: ClassFoo4T = new ClassFoo4; var d2: ClassFoo4T = new ClassFoo4();
// Error: ClassFoo4 (inst) ~> ClassFoo4 (class) // Error: ClassFoo4 (inst) ~> ClassFoo4 (class)
////////////////////////////////////////////// //////////////////////////////////////////////
// == Import Typeof Alias (Named Export) == // // == Import Typeof Alias (Named Export) == //

View File

@ -99,7 +99,7 @@ class X2 {
} }
function x(b) { function x(b) {
return b ? new X1 : new X2; return b ? new X1() : new X2();
} }
function consumer1(b) { function consumer1(b) {
@ -126,7 +126,7 @@ class Y2 {
} }
function y(b) { function y(b) {
return b ? new Y1 : new Y2; return b ? new Y1() : new Y2();
} }
function consumer3(b) { function consumer3(b) {
@ -153,7 +153,7 @@ class Z2 {
} }
function z(b) { function z(b) {
return b ? new Z1 : new Z2; return b ? new Z1() : new Z2();
} }
function consumer5(b) { function consumer5(b) {

View File

@ -44,11 +44,11 @@ function testInterfaceName(o: I) {
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
declare class C { x: number } declare class C { x: number }
var x: string = new C.x; var x: string = new C().x;
interface I { x: number } interface I { x: number }
var i = new I; var i = new I();
// error // error
function testInterfaceName(o: I) { function testInterfaceName(o: I) {
(o.name: string); (o.name: string);
@ -177,5 +177,5 @@ interface I { foo(x: number): void }
// error, property \`foo\` not found function // error, property \`foo\` not found function
declare class C { bar(i: I): void, bar(f: (x: number) => void): void } declare class C { bar(i: I): void, bar(f: (x: number) => void): void }
new C.bar((x: string) => {}); // error, number ~/~> string" new C().bar((x: string) => {}); // error, number ~/~> string"
`; `;

View File

@ -93,7 +93,7 @@ function foo(strs: Iterable<string>): void {
} }
} }
var m: Map<string, number> = new Map; var m: Map<string, number> = new Map();
foo(m.keys());" foo(m.keys());"
`; `;

View File

@ -68,13 +68,13 @@ class C {
} }
// check // check
(new C.foo(): boolean); (new C().foo(): boolean);
// last wins // last wins
(new C.x: boolean); (new C().x: boolean);
// last wins // last wins
(new C.bar: boolean); (new C().bar: boolean);
// last wins // last wins
(new C.qux: boolean); (new C().qux: boolean);
// weird outlier where last doesn\'t win in classes // weird outlier where last doesn\'t win in classes
// Objects // Objects
const o = { const o = {

View File

@ -13,10 +13,10 @@ if (undefined) {
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
var x: string = NaN; var x: string = NaN;
var y: string = Number.MAX_VALUE; var y: string = Number.MAX_VALUE;
var z: number = new TypeError.name; var z: number = new TypeError().name;
var w: string = parseInt(\"...\"); var w: string = parseInt(\"...\");
var a = new Map; var a = new Map();
a.delete(\"foobar\"); a.delete(\"foobar\");
var b = undefined; var b = undefined;

View File

@ -43,11 +43,11 @@ class C {
} }
} }
C.x; C.x;
new C.foo.x; new C().foo.x;
C.bar.x; C.bar.x;
import {Foo} from \"./exports_optional_prop\"; import {Foo} from \"./exports_optional_prop\";
const foo = new Foo; const foo = new Foo();
(foo.bar(): string); (foo.bar(): string);
// error, could be undefined // error, could be undefined
function f(x) { function f(x) {

View File

@ -86,7 +86,7 @@ var B = require(\"B\");
var f = require(\"A\").fn; var f = require(\"A\").fn;
function C() { function C() {
var o = new B; var o = new B();
f(o.b); f(o.b);
f(o.s); f(o.s);
o.fn(); o.fn();

View File

@ -42,9 +42,9 @@ function Foo() {
} }
Foo.prototype.m = function() {}; Foo.prototype.m = function() {};
var o1: { x: number, m(): void } = new Foo; var o1: { x: number, m(): void } = new Foo();
var o2: Foo = new Foo;" var o2: Foo = new Foo();"
`; `;
exports[`test super.js 1`] = ` exports[`test super.js 1`] = `
@ -58,5 +58,5 @@ class C {
} }
class D extends C {} class D extends C {}
var d: { +m: () => void } = new D;" var d: { +m: () => void } = new D();"
`; `;

View File

@ -33,7 +33,7 @@ class Bar {
} }
bar(z: string, u: string): string { bar(z: string, u: string): string {
new Qux.w = \"?\"; new Qux().w = \"?\";
return z; return z;
} }
} }

View File

@ -72,7 +72,7 @@ f(x);
class A {} class A {}
function h() { function h() {
return 42 || new A; return 42 || new A();
} }
var y = h(); var y = h();
@ -90,7 +90,7 @@ class C {
function foo() { function foo() {
var c = \"...\"; var c = \"...\";
c = new C; c = new C();
if (bar()) { if (bar()) {
c.qux(); c.qux();
} }

View File

@ -17,7 +17,7 @@ var test1 = A.bar;
var test2: string = A.name; var test2: string = A.name;
var test3: number = A.name; var test3: number = A.name;
// Error string ~> number // Error string ~> number
var a = new A; var a = new A();
var test4 = a.constructor.bar; var test4 = a.constructor.bar;
// Error bar doesn\'t exist // Error bar doesn\'t exist
var test5: string = a.constructor.name; var test5: string = a.constructor.name;

View File

@ -61,8 +61,8 @@ class MyWriteStream extends stream.Writable {}
class MyDuplex extends stream.Duplex {} class MyDuplex extends stream.Duplex {}
class MyTransform extends stream.Duplex {} class MyTransform extends stream.Duplex {}
new MyReadStream new MyReadStream()
.pipe(new MyDuplex) .pipe(new MyDuplex())
.pipe(new MyTransform) .pipe(new MyTransform())
.pipe(new MyWriteStream);" .pipe(new MyWriteStream());"
`; `;

View File

@ -96,7 +96,7 @@ class C {
(Object.create(C.prototype): C); (Object.create(C.prototype): C);
// OK, \`instanceof C\` would be true // OK, \`instanceof C\` would be true
(Object.create(new C): C); (Object.create(new C()): C);
// error, object literals don\'t structurally match instances // error, object literals don\'t structurally match instances
({ foo: \"foo\" }: C); ({ foo: \"foo\" }: C);
@ -127,7 +127,7 @@ class Bar extends Foo {}
let tests = [ let tests = [
function() { function() {
const x = new Bar; const x = new Bar();
(Object.getPrototypeOf(x): Foo); (Object.getPrototypeOf(x): Foo);
} }
];" ];"
@ -191,14 +191,14 @@ class Foo {
foo() {} foo() {}
} }
// constructor and foo not enumerable // constructor and foo not enumerable
(Object.keys(new Foo): Array<\"error\">); (Object.keys(new Foo()): Array<\"error\">);
// error: prop ~> error // error: prop ~> error
class Bar extends Foo { class Bar extends Foo {
bar_prop: string; bar_prop: string;
bar() {} bar() {}
} }
// only own enumerable props // only own enumerable props
(Object.keys(new Bar): Array<\"error\">); // error: bar_prop ~> error" (Object.keys(new Bar()): Array<\"error\">); // error: bar_prop ~> error"
`; `;
exports[`test object_missing.js 1`] = ` exports[`test object_missing.js 1`] = `
@ -403,8 +403,8 @@ var c = {
} }
}; };
var d: { [key: string]: string } = { foo: \"bar\" }; var d: { [key: string]: string } = { foo: \"bar\" };
var x = new Date; var x = new Date();
var y = new Foo; var y = new Foo();
// //
// toString // toString

View File

@ -273,7 +273,7 @@ var i:I<number> = new I();
var j:I<number> = i.map(id => id); var j:I<number> = i.map(id => id);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
declare class I<V> { map<M>(mapper: (value?: V) => M): I<M> } declare class I<V> { map<M>(mapper: (value?: V) => M): I<M> }
var i: I<number> = new I; var i: I<number> = new I();
var j: I<number> = i.map(id => id);" var j: I<number> = i.map(id => id);"
`; `;

View File

@ -69,7 +69,7 @@ declare class C {
bar(x: { a: string }): string bar(x: { a: string }): string
} }
var a = new C; var a = new C();
a.foo(0); a.foo(0);
// ok // ok
@ -113,8 +113,8 @@ exports[`test test.js 1`] = `
} }
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function foo() { function foo() {
var output = new FakeUint8Array; var output = new FakeUint8Array();
output.set(new FakeUint8Array, 0); // matches one of the overloads of set output.set(new FakeUint8Array(), 0); // matches one of the overloads of set
}" }"
`; `;
@ -128,7 +128,7 @@ var foo = new Foo;
(foo.bar(\'hmmm\'): number); // error (foo.bar(\'hmmm\'): number); // error
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
declare class Foo { bar(x: \"hmm\"): number, bar(x: string): string } declare class Foo { bar(x: \"hmm\"): number, bar(x: string): string }
var foo = new Foo; var foo = new Foo();
(foo.bar(\"hmm\"): number); (foo.bar(\"hmm\"): number);
// OK // OK
(foo.bar(\"hmmm\"): number); // error" (foo.bar(\"hmmm\"): number); // error"

View File

@ -104,7 +104,7 @@ C.prototype.foo = function() {
return this.x; return this.x;
}; };
var c = new C; var c = new C();
var x: string = c.foo(); var x: string = c.foo();
function foo() { function foo() {

View File

@ -12,18 +12,18 @@ function bar(): A<*> { // error, * can\'t be {} and {x: string} at the same time
} }
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class A<X> {} class A<X> {}
new A; new A();
// OK, implicitly inferred type args // OK, implicitly inferred type args
class B extends A {} class B extends A {}
// OK, same as above // OK, same as above
function foo(b): A<any> { function foo(b): A<any> {
// ok but unsafe, caller may assume any type arg // ok but unsafe, caller may assume any type arg
return b ? (new A: A<number>) : (new A: A<string>); return b ? (new A(): A<number>) : (new A(): A<string>);
} }
function bar(): A<*> { function bar(): A<*> {
// error, * can\'t be {} and {x: string} at the same time // error, * can\'t be {} and {x: string} at the same time
return (new A: A<{}>) || (new A: A<{ x: string }>); return (new A(): A<{}>) || (new A(): A<{ x: string }>);
}" }"
`; `;
@ -63,13 +63,13 @@ class C<T: Middle> {
// T is implicitly (bounded by) Middle in constructor call if not provided. // T is implicitly (bounded by) Middle in constructor call if not provided.
// Explicit type arg is required in annotation - here a wildcard captures it. // Explicit type arg is required in annotation - here a wildcard captures it.
var a: C<*> = new C; var a: C<*> = new C();
a.meth(new Middle); a.meth(new Middle());
a.meth(new Child); a.meth(new Child());
a.meth(42); a.meth(42);
// Error: number ~> Middle // Error: number ~> Middle
a.meth(new Base); // Error: Base ~> Middle" a.meth(new Base()); // Error: Base ~> Middle"
`; `;
exports[`test issue-1029.js 1`] = ` exports[`test issue-1029.js 1`] = `

View File

@ -39,7 +39,7 @@ class B extends A<string> {
} }
} }
module.exports = new B;" module.exports = new B();"
`; `;
exports[`test C.js 1`] = ` exports[`test C.js 1`] = `

View File

@ -110,8 +110,8 @@ var b: number = new react.Component(); // Error: ReactComponent ~> number
import react from \"react\"; import react from \"react\";
import {Component} from \"react\"; import {Component} from \"react\";
var a: Component<*, *, *> = new react.Component; var a: Component<*, *, *> = new react.Component();
var b: number = new react.Component; // Error: ReactComponent ~> number" var b: number = new react.Component(); // Error: ReactComponent ~> number"
`; `;
exports[`test jsx_spread.js 1`] = ` exports[`test jsx_spread.js 1`] = `

View File

@ -93,7 +93,7 @@ class P<X> {
// this is like Promise // this is like Promise
type Pstar<X> = X | Pstar<P<X>>; type Pstar<X> = X | Pstar<P<X>>;
// this is like Promise* // this is like Promise*
var p: P<number> = new P; var p: P<number> = new P();
(p.x: string); (p.x: string);
// error // error
var pstar: Pstar<number> = 0; var pstar: Pstar<number> = 0;
@ -105,7 +105,7 @@ pstar = p;
// OK // OK
(pstar.x: string); (pstar.x: string);
// error // error
pstar = (new P: P<P<number>>); pstar = (new P(): P<P<number>>);
// OK // OK
(pstar.x: string); // error" (pstar.x: string); // error"
`; `;
@ -156,7 +156,7 @@ function bar() {
class A<X> { class A<X> {
x: A<A<X>>; x: A<A<X>>;
} }
var a_ = new A; var a_ = new A();
function foo0() { function foo0() {
a_ = a_.x; // terminate despite expanding types a_ = a_.x; // terminate despite expanding types
} }
@ -172,7 +172,7 @@ function foo1(b: S<*>) {
class D<X> {} class D<X> {}
class B<X> extends D<X> {} class B<X> extends D<X> {}
class C<X> extends B<X> {} class C<X> extends B<X> {}
((new C: C<number>): D<string>); // error: number ~/~ string" ((new C(): C<number>): D<string>); // error: number ~/~ string"
`; `;
exports[`test test3.js 1`] = ` exports[`test test3.js 1`] = `

View File

@ -113,7 +113,7 @@ import { C, D } from \"./b2\";
import {C, D} from \"./b2\"; import {C, D} from \"./b2\";
(new D: C);" (new D(): C);"
`; `;
exports[`test c1.js 1`] = ` exports[`test c1.js 1`] = `
@ -169,7 +169,7 @@ export var x = new A;
export class A {} export class A {}
export class B {} export class B {}
export var x = new A;" export var x = new A();"
`; `;
exports[`test d2.js 1`] = ` exports[`test d2.js 1`] = `
@ -304,7 +304,7 @@ import { D } from \'./g2\';
import {C} from \"./g1\"; import {C} from \"./g1\";
import {D} from \"./g2\"; import {D} from \"./g2\";
(new D: C);" (new D(): C);"
`; `;
exports[`test h1.js 1`] = ` exports[`test h1.js 1`] = `

View File

@ -9,5 +9,5 @@ export var x = new B;
export class A {} export class A {}
export class B {} export class B {}
export var x = new B;" export var x = new B();"
`; `;

View File

@ -414,7 +414,7 @@ function foo1(x: ?Foo): string {
} }
function foo2(x: ?Class<Foo>): string { function foo2(x: ?Class<Foo>): string {
return x && new x.foo || \"\"; return x && new x().foo || \"\";
}" }"
`; `;

View File

@ -15,21 +15,21 @@ var a: A = new B(); // OK (returns new A)
function Foo() { function Foo() {
return {}; return {};
} }
var foo: number = new Foo; var foo: number = new Foo();
// error (returns object literal above) // error (returns object literal above)
function Bar() { function Bar() {
return 0; return 0;
} }
var bar: number = new Bar; var bar: number = new Bar();
// error (returns new object) // error (returns new object)
function Qux() {} function Qux() {}
var qux: number = new Qux; var qux: number = new Qux();
// error (returns new object) // error (returns new object)
class A {} class A {}
function B() { function B() {
return new A; return new A();
} }
var a: A = new B; // OK (returns new A)" var a: A = new B(); // OK (returns new A)"
`; `;
exports[`test test2.js 1`] = ` exports[`test test2.js 1`] = `
@ -51,10 +51,10 @@ declare class D {
y: any y: any
} }
var d = new D; var d = new D();
d.x = \"\"; d.x = \"\";
// error, string ~/~ number (but property x is found) // error, string ~/~ number (but property x is found)
(new D: D); (new D(): D);
// error, new D is an object, D not in proto chain // error, new D is an object, D not in proto chain
module.exports = D;" module.exports = D;"
`; `;

View File

@ -41,7 +41,7 @@ var export_o: { x:any; } = o; // awkward type cast
module.exports = export_o; module.exports = export_o;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function Foo() {} function Foo() {}
var o = new Foo; var o = new Foo();
var x: number = o.x; var x: number = o.x;
Foo.prototype.m = function() { Foo.prototype.m = function() {

View File

@ -38,5 +38,5 @@ C.g = function(x) {
return x; return x;
}; };
var x: string = new C.f();" var x: string = new C().f();"
`; `;

View File

@ -64,10 +64,10 @@ interface IHasXNumber { x: number }
interface IHasYString { y: string } interface IHasYString { y: string }
var testInstance1: IHasXString = new ClassWithXString; var testInstance1: IHasXString = new ClassWithXString();
var testInstance2: IHasXNumber = new ClassWithXString; var testInstance2: IHasXNumber = new ClassWithXString();
// Error wrong type // Error wrong type
var testInstance3: IHasYString = new ClassWithXString; // Error missing prop" var testInstance3: IHasYString = new ClassWithXString(); // Error missing prop"
`; `;
exports[`test obj.js 1`] = ` exports[`test obj.js 1`] = `

View File

@ -286,8 +286,8 @@ class L extends L_ {
return x; return x;
} }
} }
(new L_: L_); (new L_(): L_);
(new L: L); (new L(): L);
// similarly, the converse is true: if the parent\'s constructor returns an // similarly, the converse is true: if the parent\'s constructor returns an
// object, then the child does too. // object, then the child does too.
@ -301,8 +301,8 @@ class M extends M_ {
return super(); return super();
} }
} }
(new M_: { foo: string }); (new M_(): { foo: string });
(new M: { foo: string }); (new M(): { foo: string });
// however! super() calls the parent constructor with the subclass as its \`this\` // however! super() calls the parent constructor with the subclass as its \`this\`
// value (essentially \`super.constructor.call(this)\`). // value (essentially \`super.constructor.call(this)\`).
@ -317,8 +317,8 @@ class N extends N_ {
return super(); return super();
} }
} }
(new N_: N_); (new N_(): N_);
(new N: N);" (new N(): N);"
`; `;
exports[`test import.js 1`] = ` exports[`test import.js 1`] = `

View File

@ -71,17 +71,17 @@ F.prototype.m = function() {
function foo(p: string) {} function foo(p: string) {}
var o1 = new F; var o1 = new F();
// sets o1.x to 0 // sets o1.x to 0
o1.x = \"\"; o1.x = \"\";
foo(o1.x); foo(o1.x);
// ok by definite assignment // ok by definite assignment
var o2 = new F; var o2 = new F();
o1.y = 0; o1.y = 0;
o2.y = \"\"; o2.y = \"\";
foo(o2.y); foo(o2.y);
// setting o1.y to 0 has no effect on o2.y // setting o1.y to 0 has no effect on o2.y
var o3 = new F; var o3 = new F();
o3.m(); o3.m();
// sets o3.y to 0 // sets o3.y to 0
o3.y = \"\"; o3.y = \"\";
@ -175,14 +175,14 @@ class C {
return this; return this;
} // return type is C } // return type is C
} }
var c = new C; var c = new C();
var f = c.foo(); var f = c.foo();
var i = f(); var i = f();
// OK // OK
(i: C); (i: C);
// OK // OK
class D extends C {} class D extends C {}
var d = new D; var d = new D();
var g = d.foo(); var g = d.foo();
var j = g(); var j = g();
// OK // OK

View File

@ -83,8 +83,8 @@ class C {
class D extends C {} class D extends C {}
var d = new D; var d = new D();
(d: C).next = new C; (d: C).next = new C();
(d.next: D); (d.next: D);
// sneaky // sneaky
class A { class A {
@ -114,7 +114,7 @@ class Invariant {
class Misc { class Misc {
// Set<X> has invariant X // Set<X> has invariant X
out_set(): Set<this> { out_set(): Set<this> {
return new Set.add(this); return new Set().add(this);
} }
in_set(_: Set<this>) {} in_set(_: Set<this>) {}
inout_set: Set<this>; inout_set: Set<this>;
@ -198,7 +198,7 @@ class ImplicitNumber extends Implicit {
arg: number; arg: number;
} }
(new ImplicitNumber.val: string); // error: number ~> string" (new ImplicitNumber().val: string); // error: number ~> string"
`; `;
exports[`test import.js 1`] = ` exports[`test import.js 1`] = `
@ -233,27 +233,27 @@ import {A3} from \"./export\";
class B1 extends A1 { class B1 extends A1 {
foo(): B1 { foo(): B1 {
return new B1; return new B1();
} // error } // error
} }
(new B1.bar(): B1); (new B1().bar(): B1);
// OK // OK
class B3<X> extends A3<X> { class B3<X> extends A3<X> {
foo(): B3<X> { foo(): B3<X> {
return new B3; return new B3();
} // error } // error
} }
(new B3.bar(): B3<*>); (new B3().bar(): B3<*>);
// OK // OK
(new B3.qux(0): string); (new B3().qux(0): string);
// error // error
(new B3.bar(): A2<*>); (new B3().bar(): A2<*>);
// OK // OK
((new B3.bar(): B3<string>): A2<number>); ((new B3().bar(): B3<string>): A2<number>);
// error // error
((new B3: A2<number>).qux(0): string); // error" ((new B3(): A2<number>).qux(0): string); // error"
`; `;
exports[`test interface.js 1`] = ` exports[`test interface.js 1`] = `
@ -294,8 +294,8 @@ class C {
} }
} }
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(new DoublyLinkedList.prev(): DoublyLinkedList); (new DoublyLinkedList().prev(): DoublyLinkedList);
(new DoublyLinkedList.next(): DoublyLinkedList); (new DoublyLinkedList().next(): DoublyLinkedList);
var MiniImmutable = require(\"mini-immutable\"); var MiniImmutable = require(\"mini-immutable\");
class C { class C {
@ -321,7 +321,7 @@ class A {
// return of foo is not annotated to get around // return of foo is not annotated to get around
// substituting this below // substituting this below
bar(): this { bar(): this {
return new A.foo(); return new A().foo();
} }
// same as returning : A, so error // same as returning : A, so error
qux(): this { qux(): this {
@ -357,7 +357,7 @@ class A {
// describes instances of A or subclasses of A: the // describes instances of A or subclasses of A: the
// meaning of the \`this\` type is not changed simply by // meaning of the \`this\` type is not changed simply by
// switching into a static context // switching into a static context
return new this; // but in a static context, the value \`this\` is bound to return new this(); // but in a static context, the value \`this\` is bound to
// the class, instead of instances of the class // the class, instead of instances of the class
} }
} }
@ -451,7 +451,7 @@ class Base {
return this; return this;
} }
qux() { qux() {
return new Base; return new Base();
} }
bar() { bar() {
@ -474,22 +474,22 @@ class Override extends Base {
} }
// OK, too // OK, too
bar() { bar() {
return new Override; return new Override();
} // OK (cf. error below) } // OK (cf. error below)
} }
class InheritOverride extends Override {} class InheritOverride extends Override {}
(new Inherit.foo(): Base); (new Inherit().foo(): Base);
(new Inherit.foo(): Inherit); (new Inherit().foo(): Inherit);
// error (cf. OK below) // error (cf. OK below)
((new Inherit: Base).foo(): Base); ((new Inherit(): Base).foo(): Base);
(new Override.foo(): Base); (new Override().foo(): Base);
(new Override.foo(): Override); (new Override().foo(): Override);
// OK // OK
((new Override: Base).foo(): Base); ((new Override(): Base).foo(): Base);
(new InheritOverride.bar_caller(): InheritOverride); (new InheritOverride().bar_caller(): InheritOverride);
// error // error
// blame flips below // blame flips below
// Examples with \`this\` types (compare with examples above) // Examples with \`this\` types (compare with examples above)
@ -498,7 +498,7 @@ class Base2 {
return this; return this;
} }
qux(): Base2 { qux(): Base2 {
return new Base2; return new Base2();
} }
bar(): this { bar(): this {
@ -524,7 +524,7 @@ class Override2 extends Base2 {
} }
// OK, too // OK, too
bar(): Override2 { bar(): Override2 {
return new Override2; return new Override2();
} }
// error (cf. OK above) // error (cf. OK above)
// see exploit below // see exploit below
@ -536,16 +536,16 @@ class Override2 extends Base2 {
class InheritOverride2 extends Override2 {} class InheritOverride2 extends Override2 {}
(new Inherit2.foo(): Base2); (new Inherit2().foo(): Base2);
(new Inherit2.foo(): Inherit2); (new Inherit2().foo(): Inherit2);
// OK (cf. error above) // OK (cf. error above)
((new Inherit2: Base2).foo(): Base2); ((new Inherit2(): Base2).foo(): Base2);
(new Override2.foo(): Base2); (new Override2().foo(): Base2);
(new Override2.foo(): Override2); (new Override2().foo(): Override2);
// OK // OK
((new Override2: Base2).foo(): Base2); ((new Override2(): Base2).foo(): Base2);
(new InheritOverride2.bar_caller(): InheritOverride2); (new InheritOverride2().bar_caller(): InheritOverride2);
// exploits error above // exploits error above
(new Override2: Base2).corge(new Base2); // exploits error above" (new Override2(): Base2).corge(new Base2()); // exploits error above"
`; `;

View File

@ -27,12 +27,12 @@ function h(x: number): string {
*/ */
function f(): number { function f(): number {
throw new Error; // OK to not return throw new Error(); // OK to not return
} }
function g(a: ?string) { function g(a: ?string) {
if (a == null) { if (a == null) {
throw new Error; throw new Error();
} }
return a * 1; // a is not null return a * 1; // a is not null
} }
@ -41,7 +41,7 @@ function h(x: number): string {
if (x) { if (x) {
return \"foo\"; return \"foo\";
} else { } else {
throw new Error; throw new Error();
} }
}" }"
`; `;

View File

@ -35,11 +35,11 @@ declare class Baz<T> {
x: T x: T
} }
(new Foo.x: number); (new Foo().x: number);
// error: Qux wins // error: Qux wins
(new Foo.y: string); (new Foo().y: string);
// error: Bar wins // error: Bar wins
(new Foo.z: number); // error: Qux wins" (new Foo().z: number); // error: Qux wins"
`; `;
exports[`test test2.js 1`] = ` exports[`test test2.js 1`] = `

View File

@ -329,7 +329,7 @@ function f(b) {
try { try {
var x: number; var x: number;
if (b) { if (b) {
throw new Error; throw new Error();
} }
x = 0; x = 0;
} catch (e) {} } catch (e) {}

View File

@ -92,22 +92,22 @@ mn;
// @flow // @flow
class C<X> {} class C<X> {}
var cn: C<number> = new C; var cn: C<number> = new C();
cn; cn;
function foo() { function foo() {
return C; return C;
} }
var D = foo(); var D = foo();
var dn: D<number> = new C; var dn: D<number> = new C();
dn; dn;
type E<X> = C<X>; type E<X> = C<X>;
var en: E<number> = new C; var en: E<number> = new C();
en; en;
type F<X> = C<void>; type F<X> = C<void>;
var fn: F<number> = new C; var fn: F<number> = new C();
fn; fn;
type O<X> = { x: X }; type O<X> = { x: X };
@ -115,7 +115,7 @@ var on: O<number> = { x: 0 };
on; on;
type Mono = C<void>; type Mono = C<void>;
var mn: Mono<number> = new C; var mn: Mono<number> = new C();
// error: application of non-poly type // error: application of non-poly type
mn;" mn;"
`; `;

View File

@ -102,9 +102,9 @@ var n = Foo;
var o = Baz; var o = Baz;
// errors from value positions only // errors from value positions only
var a: Foo = new Foo; var a: Foo = new Foo();
var b: Foo = new A.Foo; var b: Foo = new A.Foo();
(new A.Bar: Baz);" (new A.Bar(): Baz);"
`; `;
exports[`test import_type.js 1`] = ` exports[`test import_type.js 1`] = `
@ -141,8 +141,8 @@ var n = Foo;
var o = Baz; var o = Baz;
// But using it in a type should still work // But using it in a type should still work
var a: Foo = new actualA.Foo; var a: Foo = new actualA.Foo();
(new actualA.Bar: Baz);" (new actualA.Bar(): Baz);"
`; `;
exports[`test type_alias.js 1`] = ` exports[`test type_alias.js 1`] = `

View File

@ -78,7 +78,7 @@ class A<T> {
class B<T=string> extends A<T> {} class B<T=string> extends A<T> {}
var b_number: B<number> = new B(123); var b_number: B<number> = new B(123);
var b_void: B<void> = new B; var b_void: B<void> = new B();
var b_default: B<> = new B(\"hello\"); var b_default: B<> = new B(\"hello\");
var b_star: B<*> = new B(123); var b_star: B<*> = new B(123);
@ -95,7 +95,7 @@ class C<T: ?string=string> extends A<T> {}
var c_number: C<number> = new C(123); var c_number: C<number> = new C(123);
// Error number ~> ?string // Error number ~> ?string
var c_void: C<void> = new C; var c_void: C<void> = new C();
var c_default: C<> = new C(\"hello\"); var c_default: C<> = new C(\"hello\");
var c_star: C<*> = new C(\"hello\"); var c_star: C<*> = new C(\"hello\");
@ -107,7 +107,7 @@ var c_star: C<*> = new C(\"hello\");
// Error string ~> boolean // Error string ~> boolean
class D<S, T=string> extends A<T> {} class D<S, T=string> extends A<T> {}
var d_number: D<mixed, number> = new D(123); var d_number: D<mixed, number> = new D(123);
var d_void: D<mixed, void> = new D; var d_void: D<mixed, void> = new D();
var d_default: D<mixed> = new D(\"hello\"); var d_default: D<mixed> = new D(\"hello\");
var d_too_few_args: D<> = new D(\"hello\"); var d_too_few_args: D<> = new D(\"hello\");
// Error too few tparams // Error too few tparams
@ -139,7 +139,7 @@ class I<T: ?string=*> extends A<T> {}
var i_number: I<number> = new I(123); var i_number: I<number> = new I(123);
// Error number ~> ?string // Error number ~> ?string
var i_void: I<void> = new I; var i_void: I<void> = new I();
var i_default: I<> = new I(\"hello\"); var i_default: I<> = new I(\"hello\");
var i_star: I<*> = new I(\"hello\");" var i_star: I<*> = new I(\"hello\");"
`; `;

View File

@ -102,7 +102,7 @@ class MyClass1 {
// an object produced by the MyClass1 constructor // an object produced by the MyClass1 constructor
// function. // function.
// //
var a: MyClass1 = new MyClass1; var a: MyClass1 = new MyClass1();
// Following tests are errors which conflate the type // Following tests are errors which conflate the type
// of the class value itself with the type of its // of the class value itself with the type of its
@ -136,7 +136,7 @@ class MyClass2 {
// to a variable whose annotated type is the type of // to a variable whose annotated type is the type of
// the class value (constructor function) MyClass2 itself. // the class value (constructor function) MyClass2 itself.
// //
var c: typeof MyClass2 = new MyClass2; var c: typeof MyClass2 = new MyClass2();
////////////////////////////////////// //////////////////////////////////////
// == typeof <<non-class value>> == // // == typeof <<non-class value>> == //

View File

@ -116,7 +116,7 @@ var foo = new Foo();
var foostr: Foo | string = foo; var foostr: Foo | string = foo;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
var Foo = require(\"./issue-323-lib\"); var Foo = require(\"./issue-323-lib\");
var foo = new Foo; var foo = new Foo();
var foostr: Foo | string = foo;" var foostr: Foo | string = foo;"
`; `;
@ -145,8 +145,8 @@ class Foo {}
class Bar {} class Bar {}
var foostr: Foo | string = new Foo; var foostr: Foo | string = new Foo();
var barstr: Bar | string = new Bar; var barstr: Bar | string = new Bar();
foostr = barstr;" foostr = barstr;"
`; `;
@ -177,7 +177,7 @@ class Tag {
type Node = Tag_ | string; type Node = Tag_ | string;
class Tag_ { class Tag_ {
constructor() { constructor() {
var a1: Array<Node> = [ new Tag_ ]; var a1: Array<Node> = [ new Tag_() ];
var a2: Array<Node> = a1; var a2: Array<Node> = a1;
} }
}" }"
@ -402,19 +402,19 @@ class C {}
class D {} class D {}
function CD(b) { function CD(b) {
var E = b ? C : D; var E = b ? C : D;
var c: C = new E; var c: C = new E();
// error, since E could be D, and D is not a subtype of C // error, since E could be D, and D is not a subtype of C
function qux(e: E) {} function qux(e: E) {}
// this annotation is an error: is it C, or is it D? // this annotation is an error: is it C, or is it D?
function qux2(e: C | D) {} function qux2(e: C | D) {}
// OK // OK
qux2(new C); qux2(new C());
} }
declare class F { foo(x: number): void, foo(x: string): void } declare class F { foo(x: number): void, foo(x: string): void }
function corge(b) { function corge(b) {
var x = b ? \"\" : 0; var x = b ? \"\" : 0;
new F.foo(x); new F().foo(x);
}" }"
`; `;

View File

@ -484,7 +484,7 @@ function inst(a: A5 | A6) {}
class B5 {} class B5 {}
class B6 {} class B6 {}
inst([ new B6 ]); inst([ new B6() ]);
type A5 = B5[]; type A5 = B5[];
type A6 = B6[];" type A6 = B6[];"
@ -605,7 +605,7 @@ class C<X> {}
function inst(a: C<number> | C<string>) {} function inst(a: C<number> | C<string>) {}
inst((new C: A3)); inst((new C(): A3));
type A3 = C<B3>; type A3 = C<B3>;
@ -1150,10 +1150,10 @@ class D {}
function check_inst(_: C | D) {} function check_inst(_: C | D) {}
// ok // ok
check_inst(new D); check_inst(new D());
// ...even when they \"flow\" in // ...even when they \"flow\" in
check_inst(id(new C)); check_inst(id(new C()));
//////////////////////// ////////////////////////
// function annotations // function annotations
@ -1192,7 +1192,7 @@ class P<X> {}
function check_poly_inst(_: P<number> | P<string>) {} function check_poly_inst(_: P<number> | P<string>) {}
// help! // help!
check_poly_inst(new P);" check_poly_inst(new P());"
`; `;
exports[`test test11.js 1`] = ` exports[`test test11.js 1`] = `
@ -1445,7 +1445,7 @@ function f() {
return 0; return 0;
} }
new C.m(f());" new C().m(f());"
`; `;
exports[`test test19.js 1`] = ` exports[`test test19.js 1`] = `
@ -1467,7 +1467,7 @@ declare class D {
// constructor overloads // constructor overloads
function m<X>() { function m<X>() {
return new D; return new D();
} }
declare class D { constructor(_: void): void, constructor(_: null): void }" declare class D { constructor(_: void): void, constructor(_: null): void }"
@ -1758,7 +1758,7 @@ declare class Record {
set(x: \"bar\", y: string): void set(x: \"bar\", y: string): void
} }
new Record.set(\"foo\", \"42\");" new Record().set(\"foo\", \"42\");"
`; `;
exports[`test test27.js 1`] = ` exports[`test test27.js 1`] = `
@ -1957,7 +1957,7 @@ declare class ImmutableMap<K, V> {}
declare function convert<K, V>(iter: SomeIterable<[K, V]>): ImmutableMap<K, V>; declare function convert<K, V>(iter: SomeIterable<[K, V]>): ImmutableMap<K, V>;
function foo(): ImmutableMap<string, boolean> { function foo(): ImmutableMap<string, boolean> {
const countersGlobalMap = new SomeMap; const countersGlobalMap = new SomeMap();
countersGlobalMap.set(\"\", false); countersGlobalMap.set(\"\", false);
return convert(countersGlobalMap); return convert(countersGlobalMap);
}" }"

View File

@ -57,11 +57,11 @@ while (node) {
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class C { class C {
m() { m() {
return new C; return new C();
} }
} }
function blah() {} function blah() {}
var node: ?C = new C; var node: ?C = new C();
while (node) { while (node) {
var parent = node.m(); var parent = node.m();
var cloneable: C = node; var cloneable: C = node;