I find it weird to put `{}` together. So I figured I would change it to have an empty line and ask for feedback :)

Beware: most of the test cases are not representative of real code, you almost never define blocks with no content in practice.
472 lines
9.3 KiB
Plaintext
472 lines
9.3 KiB
Plaintext
exports[`test function-bind.js 1`] = `
|
|
"// @flow
|
|
|
|
// Sanity checks:
|
|
// - use of bind in a position of a function predicate.
|
|
// (This case should fall through, as method calls
|
|
// are currently not supported.) The original behavior
|
|
// (including \`havoc\`) should be retained.
|
|
|
|
class C {
|
|
m() {
|
|
return true;
|
|
}
|
|
a: 1;
|
|
|
|
n() {
|
|
if(this.m.bind(this)) {
|
|
this.a;
|
|
}
|
|
}
|
|
}
|
|
|
|
declare var m: Function;
|
|
const o = { a: 1 };
|
|
|
|
if (m.bind(o)) {
|
|
o.a;
|
|
}
|
|
|
|
|
|
class D {
|
|
m: Function;
|
|
|
|
n() {
|
|
if(this.m({})) { }
|
|
}
|
|
}
|
|
|
|
declare var m: Function;
|
|
const x = \"\";
|
|
if (m.bind(this)(x)) { }
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// @flow
|
|
|
|
// Sanity checks:
|
|
// - use of bind in a position of a function predicate.
|
|
// (This case should fall through, as method calls
|
|
// are currently not supported.) The original behavior
|
|
// (including \`havoc\`) should be retained.
|
|
|
|
class C {
|
|
m() {
|
|
return true;
|
|
}
|
|
a: 1;
|
|
|
|
n() {
|
|
if (this.m.bind(this)) {
|
|
this.a;
|
|
}
|
|
}
|
|
}
|
|
|
|
declare var m: Function;
|
|
const o = { a: 1 };
|
|
|
|
if (m.bind(o)) {
|
|
o.a;
|
|
}
|
|
|
|
class D {
|
|
m: Function;
|
|
|
|
n() {
|
|
if (this.m({})) {
|
|
}
|
|
}
|
|
}
|
|
|
|
declare var m: Function;
|
|
const x = \"\";
|
|
if (m.bind(this)(x)) {
|
|
}
|
|
"
|
|
`;
|
|
|
|
exports[`test function-union.js 1`] = `
|
|
"// @flow
|
|
|
|
declare function f1(x: mixed): boolean %checks(typeof x === \"string\");
|
|
declare function f2(x: mixed): boolean %checks(Array.isArray(x));
|
|
|
|
declare var cond: boolean;
|
|
|
|
// Feature check:
|
|
function foo(x: number | string | Array<string>): number {
|
|
|
|
var f = (cond) ? f1 : f2;
|
|
|
|
if (f(x)) {
|
|
return x.length;
|
|
} else {
|
|
return 1;
|
|
}
|
|
}
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// @flow
|
|
|
|
declare function f1(x: mixed): boolean %checks(typeof x === \"string\");
|
|
declare function f2(x: mixed): boolean %checks(Array.isArray(x));
|
|
|
|
declare var cond: boolean;
|
|
|
|
// Feature check:
|
|
function foo(x: number | string | Array<string>): number {
|
|
var f = cond ? f1 : f2;
|
|
|
|
if (f(x)) {
|
|
return x.length;
|
|
} else {
|
|
return 1;
|
|
}
|
|
}
|
|
"
|
|
`;
|
|
|
|
exports[`test is-string-decl.js 1`] = `
|
|
"// @flow
|
|
|
|
declare function is_string(x: mixed): boolean %checks(typeof x === \"string\");
|
|
declare function is_number(x: mixed): boolean %checks(typeof x === \"number\");
|
|
|
|
// Feature check:
|
|
function foo(x: string | Array<string>): string {
|
|
if (is_string(x)) {
|
|
// The use of \`is_string\` as a conditional check
|
|
// should guarantee the narrowing of the type of \`x\`
|
|
// to string.
|
|
return x;
|
|
} else {
|
|
// Accordingly the negation of the above check
|
|
// guarantees that \`x\` here is an Array<string>
|
|
return x.join();
|
|
}
|
|
}
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// @flow
|
|
|
|
declare function is_string(x: mixed): boolean %checks(typeof x === \"string\");
|
|
declare function is_number(x: mixed): boolean %checks(typeof x === \"number\");
|
|
|
|
// Feature check:
|
|
function foo(x: string | Array<string>): string {
|
|
if (is_string(x)) {
|
|
// The use of \`is_string\` as a conditional check
|
|
// should guarantee the narrowing of the type of \`x\`
|
|
// to string.
|
|
return x;
|
|
} else {
|
|
// Accordingly the negation of the above check
|
|
// guarantees that \`x\` here is an Array<string>
|
|
return x.join();
|
|
}
|
|
}
|
|
"
|
|
`;
|
|
|
|
exports[`test logical-or.js 1`] = `
|
|
"// @flow
|
|
|
|
// Sanity check:
|
|
// - conditional functions do not affect behavior of conditional
|
|
// expressions (e.g. \`||\`)
|
|
|
|
declare function r(x: string): number;
|
|
var s = \'a\';
|
|
var n = r(s) || 1;
|
|
(n: number);
|
|
|
|
var x = \"\";
|
|
if (x = r(s) || 1) {
|
|
(x: number);
|
|
}
|
|
|
|
declare var dollars: mixed;
|
|
|
|
function foo(x: mixed) { return 1; }
|
|
(foo(dollars) || 0);
|
|
|
|
(Number(dollars) || 0);
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// @flow
|
|
|
|
// Sanity check:
|
|
// - conditional functions do not affect behavior of conditional
|
|
// expressions (e.g. \`||\`)
|
|
|
|
declare function r(x: string): number;
|
|
var s = \"a\";
|
|
var n = r(s) || 1;
|
|
(n: number);
|
|
|
|
var x = \"\";
|
|
if (x = r(s) || 1) {
|
|
(x: number);
|
|
}
|
|
|
|
declare var dollars: mixed;
|
|
|
|
function foo(x: mixed) {
|
|
return 1;
|
|
}
|
|
foo(dollars) || 0;
|
|
|
|
Number(dollars) || 0;
|
|
"
|
|
`;
|
|
|
|
exports[`test object-invariant.js 1`] = `
|
|
"// @flow
|
|
|
|
// Sanity check:
|
|
// - preserving \`havoc\` semantics
|
|
|
|
type Meeting = {
|
|
organizer: ?Invitee,
|
|
es: Array<Invitee>
|
|
}
|
|
|
|
type Invitee = {
|
|
fbid: number
|
|
}
|
|
|
|
function f(_this: { m: ?Meeting }): string {
|
|
if (!_this.m) {
|
|
return \"0\";
|
|
}
|
|
|
|
if (_this.m.es.some((a) => a.fbid === 0)) {
|
|
|
|
}
|
|
return \"3\";
|
|
}
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// @flow
|
|
|
|
// Sanity check:
|
|
// - preserving \`havoc\` semantics
|
|
|
|
type Meeting = { organizer: ?Invitee, es: Array<Invitee> };
|
|
|
|
type Invitee = { fbid: number };
|
|
|
|
function f(_this: { m: ?Meeting }): string {
|
|
if (!_this.m) {
|
|
return \"0\";
|
|
}
|
|
|
|
if (_this.m.es.some(a => a.fbid === 0)) {
|
|
}
|
|
return \"3\";
|
|
}
|
|
"
|
|
`;
|
|
|
|
exports[`test orig-string-tag-check.js 1`] = `
|
|
"// @flow
|
|
|
|
// The original first-order case
|
|
|
|
function foo(x: string | Array<string>): string {
|
|
if (typeof x === \"string\") {
|
|
return x; // [ERROR] x: Array<string> doesn\'t match return type
|
|
}
|
|
else {
|
|
return x.join(); // [ERROR] x: string doesn\'t have .join method
|
|
}
|
|
}
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// @flow
|
|
|
|
// The original first-order case
|
|
|
|
function foo(x: string | Array<string>): string {
|
|
if (typeof x === \"string\") {
|
|
return x; // [ERROR] x: Array<string> doesn\'t match return type
|
|
} else {
|
|
return x.join(); // [ERROR] x: string doesn\'t have .join method
|
|
}
|
|
}
|
|
"
|
|
`;
|
|
|
|
exports[`test sanity-fall-through.js 1`] = `
|
|
"// @flow
|
|
|
|
// Sanity check:
|
|
// - we should still be getting an error at the second return statement
|
|
|
|
declare function pred<T>(x: T): boolean;
|
|
|
|
function foo(s: Array<string>): string {
|
|
if (pred(s)) {
|
|
return \"1\";
|
|
}
|
|
return 1;
|
|
}
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// @flow
|
|
|
|
// Sanity check:
|
|
// - we should still be getting an error at the second return statement
|
|
|
|
declare function pred<T>(x: T): boolean;
|
|
|
|
function foo(s: Array<string>): string {
|
|
if (pred(s)) {
|
|
return \"1\";
|
|
}
|
|
return 1;
|
|
}
|
|
"
|
|
`;
|
|
|
|
exports[`test sanity-invalid-calls.js 1`] = `
|
|
"// @flow
|
|
|
|
// Sanity check:
|
|
// - invalid calls at predicate positions
|
|
|
|
declare function pred<T>(x: T): boolean;
|
|
|
|
function foo(s: Array<string>): string {
|
|
|
|
if ((1)(s)) {
|
|
return \"1\";
|
|
}
|
|
|
|
if ((pred + 1)(\"s\")) {
|
|
return \"1\";
|
|
}
|
|
|
|
return \"1\"
|
|
}
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// @flow
|
|
|
|
// Sanity check:
|
|
// - invalid calls at predicate positions
|
|
|
|
declare function pred<T>(x: T): boolean;
|
|
|
|
function foo(s: Array<string>): string {
|
|
if (1(s)) {
|
|
return \"1\";
|
|
}
|
|
|
|
if ((pred + 1)(\"s\")) {
|
|
return \"1\";
|
|
}
|
|
|
|
return \"1\";
|
|
}
|
|
"
|
|
`;
|
|
|
|
exports[`test sanity-is-string-bug.js 1`] = `
|
|
"// @flow
|
|
|
|
declare function is_string(x: mixed): boolean %checks(typeof x === \"string\");
|
|
declare function is_number(x: mixed): boolean %checks(typeof x === \"number\");
|
|
|
|
// Sanity check:
|
|
// - Erroneous logic
|
|
|
|
function bar(x: string | Array<string>): string {
|
|
if (is_number(x)) {
|
|
return x;
|
|
} else {
|
|
return x.join(); // error: both string and Array<string> can flow to x
|
|
}
|
|
}
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// @flow
|
|
|
|
declare function is_string(x: mixed): boolean %checks(typeof x === \"string\");
|
|
declare function is_number(x: mixed): boolean %checks(typeof x === \"number\");
|
|
|
|
// Sanity check:
|
|
// - Erroneous logic
|
|
function bar(x: string | Array<string>): string {
|
|
if (is_number(x)) {
|
|
return x;
|
|
} else {
|
|
return x.join(); // error: both string and Array<string> can flow to x
|
|
}
|
|
}
|
|
"
|
|
`;
|
|
|
|
exports[`test sanity-parameter-mismatch.js 1`] = `
|
|
"// @flow
|
|
|
|
// Sanity check: make sure the parameters are checked as usual
|
|
|
|
declare function foo(
|
|
input: mixed,
|
|
types: string | Array<string>
|
|
): boolean %checks(typeof input === \"string\" || Array.isArray(input));
|
|
|
|
foo(3, 3);
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// @flow
|
|
|
|
// Sanity check: make sure the parameters are checked as usual
|
|
|
|
declare function foo(
|
|
input: mixed,
|
|
types: string | Array<string>
|
|
): boolean %checks(typeof input === \"string\" || Array.isArray(input));
|
|
|
|
foo(3, 3);
|
|
"
|
|
`;
|
|
|
|
exports[`test sanity-pred-with-body.js 1`] = `
|
|
"// @flow
|
|
|
|
// Sanity check:
|
|
// - predicate functions cannot have bodies (can only be declarations)
|
|
|
|
function pred(x: mixed): boolean %checks(typeof x === \"string\") { // error: cannot use pred type here
|
|
return typeof x === \"string\";
|
|
}
|
|
|
|
function foo(x: string | Array<string>): string {
|
|
if (pred(x)) {
|
|
return x;
|
|
}
|
|
return \"1\"
|
|
}
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// @flow
|
|
|
|
// Sanity check:
|
|
// - predicate functions cannot have bodies (can only be declarations)
|
|
|
|
function pred(x: mixed): boolean %checks(typeof x === \"string\") {
|
|
// error: cannot use pred type here
|
|
return typeof x === \"string\";
|
|
}
|
|
|
|
function foo(x: string | Array<string>): string {
|
|
if (pred(x)) {
|
|
return x;
|
|
}
|
|
return \"1\";
|
|
}
|
|
"
|
|
`;
|
|
|
|
exports[`test sanity-return-type.js 1`] = `
|
|
"// @flow
|
|
|
|
declare function f2(x: mixed): string %checks(Array.isArray(x));
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// @flow
|
|
|
|
declare function f2(x: mixed): string %checks(Array.isArray(x));
|
|
"
|
|
`;
|