Merge pull request #57 from michaelficarra/GH-56

fixes #56: indent cases inside switch statements
master
James Long 2017-01-10 17:49:46 -05:00 committed by GitHub
commit e3b41dd6ca
11 changed files with 333 additions and 331 deletions

View File

@ -1001,8 +1001,10 @@ function genericPrintNoParens(path, options, print) {
"switch (", "switch (",
path.call(print, "discriminant"), path.call(print, "discriminant"),
") {", ") {",
hardline, indent(
join(hardline, path.map(print, "cases")), options.tabWidth,
concat([ hardline, join(hardline, path.map(print, "cases"))])
),
hardline, hardline,
"}" "}"
]); ]);

View File

@ -575,16 +575,16 @@ function switch_scope(x: string) {
let a: number = 0; let a: number = 0;
var b: number = 0; var b: number = 0;
switch (x) { switch (x) {
case \"foo\": case \"foo\":
let a = \"\"; let a = \"\";
// ok: local to switch // ok: local to switch
var b = \"\"; var b = \"\";
// error: string ~> number // error: string ~> number
break; break;
case \"bar\": case \"bar\":
let a = \"\"; let a = \"\";
// error: a already bound in switch // error: a already bound in switch
break; break;
} }
} }
@ -593,25 +593,25 @@ function switch_scope(x: string) {
// yet perfect. // yet perfect.
function switch_scope2(x: number) { function switch_scope2(x: number) {
switch (x) { switch (x) {
case 0: case 0:
a = \"\"; a = \"\";
// error: assign before declaration // error: assign before declaration
break; break;
case 1: case 1:
var b = a; var b = a;
// error: use before declaration // error: use before declaration
break; break;
case 2: case 2:
let a = \"\"; let a = \"\";
break; break;
case 3: case 3:
a = \"\"; a = \"\";
// error: skipped initializer // error: skipped initializer
break; break;
case 4: case 4:
var c: string = a; var c: string = a;
// error: skipped initializer // error: skipped initializer
break; break;
} }
a = \"\"; // error: a no longer in scope a = \"\"; // error: a no longer in scope
} }

View File

@ -86,15 +86,15 @@ function bar(b) {
if (x == null) if (x == null)
return; return;
switch (\"\") { switch (\"\") {
case 0: case 0:
var y: number = x; var y: number = x;
// error: boolean !~> number // error: boolean !~> number
x = \"\"; x = \"\";
case 1: case 1:
var z: number = x; var z: number = x;
// 2 errors: (boolean | string) !~> number // 2 errors: (boolean | string) !~> number
break; break;
case 2: case 2:
} }
var w: number = x; // 2 errors: (boolean | string) !~> number var w: number = x; // 2 errors: (boolean | string) !~> number
} }
@ -104,17 +104,17 @@ function bar2(b) {
if (x == null) if (x == null)
return; return;
switch (\"\") { switch (\"\") {
case 0: { case 0: {
let y: number = x; let y: number = x;
// error: boolean !~> number // error: boolean !~> number
x = \"\"; x = \"\";
} }
case 1: { case 1: {
let z: number = x; let z: number = x;
// 2 errors: (boolean | string) !~> number // 2 errors: (boolean | string) !~> number
break; break;
} }
case 2: case 2:
} }
var w: number = x; // 2 errors: (boolean | string) !~> number var w: number = x; // 2 errors: (boolean | string) !~> number
} }

View File

@ -238,55 +238,55 @@ function getBinaryOp(
op: \"plus\" | \"minus\" | \"divide\" | \"multiply\" op: \"plus\" | \"minus\" | \"divide\" | \"multiply\"
): \"+\" | \"-\" | \"*\" | \"/\" { ): \"+\" | \"-\" | \"*\" | \"/\" {
switch (op) { switch (op) {
case \"plus\": case \"plus\":
return \"+\"; return \"+\";
case \"minus\": case \"minus\":
return \"-\"; return \"-\";
case \"divide\": case \"divide\":
return \"/\"; return \"/\";
case \"multiply\": case \"multiply\":
return \"*\"; return \"*\";
default: default:
throw new Error(\"Invalid binary operator: \" + op); throw new Error(\"Invalid binary operator: \" + op);
} }
} }
export function emitExpression(node: TypedNode): t.Expression { export function emitExpression(node: TypedNode): t.Expression {
switch (node.exprNodeType) { switch (node.exprNodeType) {
case \"string_literal\": case \"string_literal\":
// FALLTHROUGH // FALLTHROUGH
case \"number\": case \"number\":
return b.literal(node.value); return b.literal(node.value);
case \"variable\": case \"variable\":
return b.memberExpression( return b.memberExpression(
b.identifier(\"vars\"), b.identifier(\"vars\"),
b.identifier(node.name),
false
);
case \"binary_op\": {
const lhs = emitExpression(node.lhs);
const rhs = emitExpression(node.rhs);
const op = getBinaryOp(node.binaryOp);
return b.binaryExpression(op, lhs, rhs);
}
case \"unary_minus\": {
const operand = emitExpression(node.op);
return b.unaryExpression(\"-\", operand, true);
}
case \"function_invocation\": {
const callee = b.memberExpression(
b.identifier(\"fns\"),
b.identifier(node.name), b.identifier(node.name),
false false
); );
case \"binary_op\": {
const lhs = emitExpression(node.lhs);
const rhs = emitExpression(node.rhs);
const args = node.parameters.map(n => emitExpression(n)); const op = getBinaryOp(node.binaryOp);
return b.binaryExpression(op, lhs, rhs);
}
case \"unary_minus\": {
const operand = emitExpression(node.op);
return b.unaryExpression(\"-\", operand, true);
}
case \"function_invocation\": {
const callee = b.memberExpression(
b.identifier(\"fns\"),
b.identifier(node.name),
false
);
return b.callExpression(callee, args); const args = node.parameters.map(n => emitExpression(n));
}
default: return b.callExpression(callee, args);
throw new Error(\"Unknown expression type: \" + node.type); }
default:
throw new Error(\"Unknown expression type: \" + node.type);
} }
}" }"
`; `;

View File

@ -31,11 +31,11 @@ var id = geolocation.watchPosition(
e => { e => {
var message: string = e.message; var message: string = e.message;
switch (e.code) { switch (e.code) {
case e.PERMISSION_DENIED: case e.PERMISSION_DENIED:
case e.POSITION_UNAVAILABLE: case e.POSITION_UNAVAILABLE:
case e.TIMEOUT: case e.TIMEOUT:
default: default:
break; break;
} }
} }
); );

View File

@ -451,12 +451,12 @@ function if_post_init(b) {
function switch_partial_post_init(i) { function switch_partial_post_init(i) {
var x: number; var x: number;
switch (i) { switch (i) {
case 0: case 0:
x = 0; x = 0;
break; break;
case 1: case 1:
x = 1; x = 1;
break; break;
} }
var y: number = x; // error, possibly uninitialized var y: number = x; // error, possibly uninitialized
} }
@ -465,14 +465,14 @@ function switch_partial_post_init(i) {
function switch_post_init(i) { function switch_post_init(i) {
var x: number; var x: number;
switch (i) { switch (i) {
case 0: case 0:
x = 0; x = 0;
break; break;
case 1: case 1:
x = 1; x = 1;
break; break;
default: default:
x = 2; x = 2;
} }
var y: number = x; // no error, all cases covered var y: number = x; // no error, all cases covered
} }
@ -480,9 +480,9 @@ function switch_post_init(i) {
// local use of annotated var in switch is ok // local use of annotated var in switch is ok
function switch_scoped_init_1(i) { function switch_scoped_init_1(i) {
switch (i) { switch (i) {
case 0: case 0:
var x: number = 0; var x: number = 0;
var y: number = x; var y: number = x;
} }
} }
@ -491,16 +491,16 @@ function switch_scoped_init_2(i) {
var y: number = x; var y: number = x;
// error // error
switch (i) { switch (i) {
case 0: case 0:
var x: number = 0; var x: number = 0;
} }
} }
// ...and after // ...and after
function switch_scoped_init_3(i) { function switch_scoped_init_3(i) {
switch (i) { switch (i) {
case 0: case 0:
var x: number = 0; var x: number = 0;
} }
var y: number = x; // error var y: number = x; // error
} }
@ -508,11 +508,11 @@ function switch_scoped_init_3(i) {
// ...and in a fallthrough case without initialization // ...and in a fallthrough case without initialization
function switch_scoped_init_4(i) { function switch_scoped_init_4(i) {
switch (i) { switch (i) {
case 0: case 0:
var x: number = 0; var x: number = 0;
// error // error
case 1: case 1:
var y: number = x; var y: number = x;
} }
} }
@ -853,12 +853,12 @@ function if_post_init(b) {
function switch_partial_post_init(i) { function switch_partial_post_init(i) {
let x: number; let x: number;
switch (i) { switch (i) {
case 0: case 0:
x = 0; x = 0;
break; break;
case 1: case 1:
x = 1; x = 1;
break; break;
} }
var y: number = x; // error, possibly uninitialized var y: number = x; // error, possibly uninitialized
} }
@ -867,14 +867,14 @@ function switch_partial_post_init(i) {
function switch_post_init(i) { function switch_post_init(i) {
let x: number; let x: number;
switch (i) { switch (i) {
case 0: case 0:
x = 0; x = 0;
break; break;
case 1: case 1:
x = 1; x = 1;
break; break;
default: default:
x = 2; x = 2;
} }
var y: number = x; // no error, all cases covered var y: number = x; // no error, all cases covered
} }
@ -882,11 +882,11 @@ function switch_post_init(i) {
// use in a switch after a skipped decl is an error // use in a switch after a skipped decl is an error
function switch_scoped_init_2(i) { function switch_scoped_init_2(i) {
switch (i) { switch (i) {
case 0: case 0:
let x: number; let x: number;
// error, skipped declaration // error, skipped declaration
case 1: case 1:
let y: number = x; let y: number = x;
} }
} }
@ -930,11 +930,11 @@ function for_of_post_init() {
function switch_post_init2(i): number { function switch_post_init2(i): number {
let bar; let bar;
switch (i) { switch (i) {
case 1: case 1:
bar = 3; bar = 3;
break; break;
default: default:
throw new Error(\"Invalid state\"); throw new Error(\"Invalid state\");
} }
return bar; // ok, definitely initialized return bar; // ok, definitely initialized
} }
@ -943,11 +943,11 @@ function switch_post_init2(i): number {
function switch_post_init2(i): number { function switch_post_init2(i): number {
let bar; let bar;
switch (i) { switch (i) {
case 1: case 1:
bar = 3; bar = 3;
break; break;
default: default:
throw new Error(\"Invalid state\"); throw new Error(\"Invalid state\");
} }
return bar; // ok, definitely initialized return bar; // ok, definitely initialized
} }

View File

@ -64,11 +64,11 @@ function switch_scope(x: mixed) {
let a = \"\"; let a = \"\";
let b = \"\"; let b = \"\";
switch (x) { switch (x) {
case \"foo\": case \"foo\":
let a; let a;
a = 0; a = 0;
// doesn\'t add lower bound to outer a // doesn\'t add lower bound to outer a
b = 0; b = 0;
} }
(a: string); (a: string);
// OK // OK

View File

@ -250,10 +250,10 @@ var React = React.createClass({
// So this would have been an error in 0.21.0 if we didn\'t make this.props // So this would have been an error in 0.21.0 if we didn\'t make this.props
// Object // Object
switch (this.props.name) { switch (this.props.name) {
case \"a\": case \"a\":
return \"Bob\"; return \"Bob\";
default: default:
return \"Alice\"; return \"Alice\";
} }
}, },
render() { render() {

View File

@ -624,10 +624,10 @@ function block_scope(x: string | number) {
function switch_scope(x: string | number) { function switch_scope(x: string | number) {
switch (x) { switch (x) {
// doesn\'t refine outer x // doesn\'t refine outer x
default: default:
let x; let x;
x = \"\"; x = \"\";
} }
(x: string); // error: number ~> string (x: string); // error: number ~> string
} }
@ -1187,13 +1187,13 @@ function exhaustion3(x): number {
// @flow // @flow
function foo(a, b, c) { function foo(a, b, c) {
switch (c) { switch (c) {
case a.x.y: case a.x.y:
// OK
case b.x.y:
// OK // OK
return; case b.x.y:
default: // OK
return; return;
default:
return;
} }
} }
@ -1201,13 +1201,13 @@ function foo(a, b, c) {
function exhaustion1(x): number { function exhaustion1(x): number {
var foo; var foo;
switch (x) { switch (x) {
case 0: case 0:
// falls through // falls through
case 1: case 1:
foo = 3; foo = 3;
break; break;
default: default:
throw new Error(\"Invalid state\"); throw new Error(\"Invalid state\");
} }
return foo; // no error return foo; // no error
} }
@ -1215,11 +1215,11 @@ function exhaustion1(x): number {
function exhaustion2(x, y): number { function exhaustion2(x, y): number {
var foo; var foo;
switch (x) { switch (x) {
case 0: case 0:
if (y) { if (y) {
break; // leaks uninitialized foo out of switch break; // leaks uninitialized foo out of switch
} }
/** /**
* TODO this shouldn\'t cause an error, because the path that * TODO this shouldn\'t cause an error, because the path that
* runs it will always go on to assign a number to foo. But * runs it will always go on to assign a number to foo. But
* we\'ll need true isolation in env snapshots to model this. * we\'ll need true isolation in env snapshots to model this.
@ -1228,11 +1228,11 @@ function exhaustion2(x, y): number {
* *
foo = \"\"; foo = \"\";
*/ */
case 1: case 1:
foo = 3; foo = 3;
break; break;
default: default:
throw new Error(\"Invalid state\"); throw new Error(\"Invalid state\");
} }
return foo; // error, possibly uninitialized return foo; // error, possibly uninitialized
} }
@ -1240,13 +1240,13 @@ function exhaustion2(x, y): number {
function exhaustion3(x): number { function exhaustion3(x): number {
let foo = null; let foo = null;
switch (x) { switch (x) {
case 0: case 0:
// falls through // falls through
case 1: case 1:
foo = 3; foo = 3;
break; break;
default: default:
throw new Error(\"Invalid state\"); throw new Error(\"Invalid state\");
} }
return foo; // no error return foo; // no error
}" }"

View File

@ -1399,14 +1399,14 @@ let tests = [
}, },
function(mode: Mode) { function(mode: Mode) {
switch (mode) { switch (mode) {
case 0: case 0:
(mode: 0); (mode: 0);
break; break;
case 1: case 1:
case 2: case 2:
(mode: 1 | 2); (mode: 1 | 2);
break; break;
} }
}, },
function(x: number): 0 { function(x: number): 0 {
@ -1972,14 +1972,14 @@ let tests = [
}, },
function(mode: Mode) { function(mode: Mode) {
switch (mode) { switch (mode) {
case \"a\": case \"a\":
(mode: \"a\"); (mode: \"a\");
break; break;
case \"b\": case \"b\":
case \"c\": case \"c\":
(mode: \"b\" | \"c\"); (mode: \"b\" | \"c\");
break; break;
} }
}, },
function(x: string): \"\" { function(x: string): \"\" {
@ -2120,55 +2120,55 @@ function corge(text: string | number | Array<string>): string {
function foo(text: string | number): string { function foo(text: string | number): string {
switch (typeof text) { switch (typeof text) {
case \"string\": case \"string\":
return text; return text;
// error, should return string // error, should return string
case \"number\": case \"number\":
return text; return text;
default: default:
return \"wat\"; return \"wat\";
} }
} }
function bar(text: string | number): string { function bar(text: string | number): string {
switch (typeof text) { switch (typeof text) {
case \"string\": case \"string\":
return text[0]; return text[0];
default: default:
return text++ + \"\"; return text++ + \"\";
} }
} }
function baz1(text: string | number): string { function baz1(text: string | number): string {
switch (typeof text) { switch (typeof text) {
case \"number\": case \"number\":
// error, [0] on number // error, [0] on number
case \"string\": case \"string\":
return text[0]; return text[0];
default: default:
return \"wat\"; return \"wat\";
} }
} }
function baz2(text: string | number): string { function baz2(text: string | number): string {
switch (typeof text) { switch (typeof text) {
case \"string\": case \"string\":
// error, [0] on number // error, [0] on number
case \"number\": case \"number\":
return text[0]; return text[0];
default: default:
return \"wat\"; return \"wat\";
} }
} }
function corge(text: string | number | Array<string>): string { function corge(text: string | number | Array<string>): string {
switch (typeof text) { switch (typeof text) {
case \"object\": case \"object\":
return text[0]; return text[0];
case \"string\": case \"string\":
case // using ++ since it isn\'t valid on arrays or strings. case // using ++ since it isn\'t valid on arrays or strings.
// should only error for string since Array was filtered out. // should only error for string since Array was filtered out.
\"number\": \"number\":
return text++ + \"\"; return text++ + \"\";
default: default:
return \"wat\"; return \"wat\";
} }
}" }"
`; `;
@ -2463,10 +2463,10 @@ function list(n) {
} }
function length(l) { function length(l) {
switch (l.kind) { switch (l.kind) {
case \"cons\": case \"cons\":
return 1 + length(l.next); return 1 + length(l.next);
default: default:
return 0; return 0;
} }
} }
function check(n) { function check(n) {
@ -2482,13 +2482,13 @@ type B = { kind: 2, B: number };
type C = { kind: 3, C: number }; type C = { kind: 3, C: number };
function kind(x: A | B | C): number { function kind(x: A | B | C): number {
switch (x.kind) { switch (x.kind) {
case EnumKind.A: case EnumKind.A:
return x.A; return x.A;
case EnumKind.B: case EnumKind.B:
return x.B; return x.B;
// error, x: C and property A not found in type C // error, x: C and property A not found in type C
default: default:
return x.A; return x.A;
} }
} }
kind({ kind: EnumKind.A, A: 1 }); kind({ kind: EnumKind.A, A: 1 });
@ -2704,11 +2704,11 @@ type Error = { type: typeof ERROR, error: string };
function handleStatus(status: Success | Error) { function handleStatus(status: Success | Error) {
switch (status.type) { switch (status.type) {
case SUCCESS: case SUCCESS:
console.log(\`Successful: \${status.message}\`); console.log(\`Successful: \${status.message}\`);
break; break;
default: default:
console.log(\`Errored: \${status.error}\`); console.log(\`Errored: \${status.error}\`);
} }
}" }"
`; `;

View File

@ -30,32 +30,32 @@ function baz(x): number {
function foo(x): number { function foo(x): number {
switch (x) { switch (x) {
case 0: case 0:
case 1: case 1:
return 1; return 1;
default: default:
throw new Error(\"hi\"); throw new Error(\"hi\");
} }
} }
function bar(x) { function bar(x) {
switch (x) { switch (x) {
case 0: case 0:
break; break;
default: default:
return; return;
} }
1; 1;
} }
function baz(x): number { function baz(x): number {
switch (x) { switch (x) {
case 0: case 0:
break; break;
case 1: case 1:
return 1; return 1;
default: default:
throw new Error(\"hi\"); throw new Error(\"hi\");
} }
return 2; return 2;
}" }"
@ -98,28 +98,28 @@ function qux(b) {
*/ */
function foo(): number { function foo(): number {
switch (\"foo\") { switch (\"foo\") {
case \"foo\": case \"foo\":
return 1; return 1;
} }
return 2; return 2;
} }
function bar() { function bar() {
switch (\"bar\") { switch (\"bar\") {
case \"bar\": case \"bar\":
break; break;
default: default:
break; break;
} }
} }
function qux(b) { function qux(b) {
var x = b ? 0 : \"\"; var x = b ? 0 : \"\";
switch (\"qux\") { switch (\"qux\") {
case \"\": case \"\":
x = 0; x = 0;
case \"qux\": case \"qux\":
x = x * x; x = x * x;
} }
}" }"
`; `;
@ -181,10 +181,10 @@ function foo(x: mixed): string {
var b = \"\"; var b = \"\";
switch (x) { switch (x) {
case \"foo\": case \"foo\":
a = 0; a = 0;
default: default:
b = 0; b = 0;
} }
// a is now string | number // a is now string | number
@ -203,13 +203,13 @@ function baz(x: mixed): number {
var b = \"\"; var b = \"\";
switch (x) { switch (x) {
case \"baz\": case \"baz\":
a = 0; a = 0;
break; break;
case \"bar\": case \"bar\":
a = \"\"; a = \"\";
default: default:
b = 0; b = 0;
} }
// a is now string | number // a is now string | number
@ -316,18 +316,18 @@ function f1(i) {
var x; var x;
switch (i) { switch (i) {
case 0: case 0:
x = 0; x = 0;
break; break;
case 1: case 1:
x = 1; x = 1;
break; break;
default: default:
x = -1; x = -1;
break; break;
case 2: case 2:
x = \"2\"; x = \"2\";
break; break;
} }
var y: number = x; // error, number | string ~/> number var y: number = x; // error, number | string ~/> number
@ -337,13 +337,13 @@ function f2(i) {
var x; var x;
switch (i) { switch (i) {
case 0: case 0:
case 1: case 1:
default: default:
x = 1; x = 1;
break; break;
// does not fall through default // does not fall through default
case 2: case 2:
} }
var y: number = x; // error, number | uninitialized ~/> number var y: number = x; // error, number | uninitialized ~/> number
@ -353,12 +353,12 @@ function f3(i) {
var x; var x;
switch (i) { switch (i) {
case 0: case 0:
case 1: case 1:
default: default:
// falls through to subsequent cases // falls through to subsequent cases
case 2: case 2:
x = 1; x = 1;
} }
var y: number = x; // no error var y: number = x; // no error
@ -366,32 +366,32 @@ function f3(i) {
function foo(x): number { function foo(x): number {
switch (x) { switch (x) {
case 0: case 0:
default: default:
throw new Error(\"hi\"); throw new Error(\"hi\");
case 1: case 1:
return 1; return 1;
} }
} }
function bar(x) { function bar(x) {
switch (x) { switch (x) {
default: default:
return; return;
case 0: case 0:
break; break;
} }
1; 1;
} }
function baz(x): number { function baz(x): number {
switch (x) { switch (x) {
case 0: case 0:
break; break;
default: default:
throw new Error(\"hi\"); throw new Error(\"hi\");
case 1: case 1:
return 1; return 1;
} }
return 2; return 2;
}" }"