prettier/tests/flow/try/init.js

155 lines
2.3 KiB
JavaScript

/***
* test initialization tracking of hoisted stuff
* @flow
*/
// for illustrative purposes only - Flow considers a throw possible
// anywhere within a block
function might_throw() {}
// local use of annotated var within try is ok
function f() {
try {
var x:number = 0;
var y:number = x;
} catch (e) {
}
}
// and within catch
function f() {
try {
} catch (e) {
var x:number = 0;
var y:number = x;
}
}
// but not across try/catch
function f() {
try {
might_throw();
var x:number = 0;
} catch (e) {
var y:number = x; // error
}
}
// or try/finally
function f() {
try {
might_throw();
var x:number = 0;
} finally {
var y:number = x; // error
}
}
// or catch/finally
function f() {
try {
} catch (e) {
var x:number = 0;
} finally {
var y:number = x; // error
}
}
// or try/catch/finally if init doesn't dominate
function f() {
try {
var x:number = 0;
} catch (e) {
might_throw();
var x:number = 0;
} finally {
var y:number = x; // error
}
}
// post-use ok because init dominates here
function f() {
try {
var x:number = 0;
} catch (e) {
might_throw(); // ...but if so, suffix is not reached
var x:number = 0;
}
var y:number = x;
}
// and here
function f() {
try {
} catch (e) {
} finally {
might_throw(); // ...but if so, suffix is not reached
var x:number = 0;
}
var y:number = x;
}
// and here
function f() {
try {
var x:number;
} catch (e) {
} finally {
might_throw(); // ...but if so, suffix is not reached
x = 0;
}
var y:number = x;
}
// and here, thank you JS for the wonder that is hoisting
function f() {
try {
} catch (e) {
var x:number;
} finally {
might_throw(); // ...but if so, suffix is not reached
x = 0;
}
var y:number = x;
}
// error if used prior to init
function f() {
var y:number = x; // error
try {
var x:number = 0;
} catch (e) {
}
}
// another non-dominated post
function f() {
try {
var x:number = 0;
} catch (e) {
}
var y:number = x; // error
}
// ditto
function f() {
try {
} catch (e) {
var x:number = 0;
}
var y:number = x; // error
}
// ditto
function f(b) {
try {
var x:number;
if (b) {
throw new Error();
}
x = 0;
} catch (e) {
}
var y:number = x; // error
}