2 Object.defineProperty(exports, "__esModule", { value: true });
3 var ts = require("typescript");
4 var node_1 = require("../typeguard/node");
5 function endsControlFlow(statement) {
6 return getControlFlowEnd(statement).end;
8 exports.endsControlFlow = endsControlFlow;
9 var defaultControlFlowEnd = { statements: [], end: false };
10 function getControlFlowEnd(statement) {
11 return node_1.isBlockLike(statement) ? handleBlock(statement) : getControlFlowEndWorker(statement);
13 exports.getControlFlowEnd = getControlFlowEnd;
14 function getControlFlowEndWorker(statement) {
15 switch (statement.kind) {
16 case ts.SyntaxKind.ReturnStatement:
17 case ts.SyntaxKind.ThrowStatement:
18 case ts.SyntaxKind.ContinueStatement:
19 case ts.SyntaxKind.BreakStatement:
20 return { statements: [statement], end: true };
21 case ts.SyntaxKind.Block:
22 return handleBlock(statement);
23 case ts.SyntaxKind.ForStatement:
24 case ts.SyntaxKind.WhileStatement:
25 return handleForAndWhileStatement(statement);
26 case ts.SyntaxKind.ForOfStatement:
27 case ts.SyntaxKind.ForInStatement:
28 return handleForInOrOfStatement(statement);
29 case ts.SyntaxKind.DoStatement:
30 return matchBreakOrContinue(getControlFlowEndWorker(statement.statement), node_1.isBreakOrContinueStatement);
31 case ts.SyntaxKind.IfStatement:
32 return handleIfStatement(statement);
33 case ts.SyntaxKind.SwitchStatement:
34 return matchBreakOrContinue(handleSwitchStatement(statement), node_1.isBreakStatement);
35 case ts.SyntaxKind.TryStatement:
36 return handleTryStatement(statement);
37 case ts.SyntaxKind.LabeledStatement:
38 return matchLabel(getControlFlowEndWorker(statement.statement), statement.label);
39 case ts.SyntaxKind.WithStatement:
40 return getControlFlowEndWorker(statement.statement);
42 return defaultControlFlowEnd;
45 function handleBlock(statement) {
47 var result = { statements: [], end: false };
48 for (var _i = 0, _b = statement.statements; _i < _b.length; _i++) {
50 var current = getControlFlowEndWorker(s);
51 (_a = result.statements).push.apply(_a, current.statements);
59 function handleForInOrOfStatement(statement) {
60 var end = matchBreakOrContinue(getControlFlowEndWorker(statement.statement), node_1.isBreakOrContinueStatement);
64 function handleForAndWhileStatement(statement) {
65 var constantCondition = statement.kind === ts.SyntaxKind.WhileStatement
66 ? getConstantCondition(statement.expression)
67 : statement.condition === undefined || getConstantCondition(statement.condition);
68 if (constantCondition === false)
69 return defaultControlFlowEnd;
70 var end = matchBreakOrContinue(getControlFlowEndWorker(statement.statement), node_1.isBreakOrContinueStatement);
71 if (constantCondition === undefined)
75 function getConstantCondition(node) {
77 case ts.SyntaxKind.TrueKeyword:
79 case ts.SyntaxKind.FalseKeyword:
85 function handleIfStatement(node) {
86 switch (getConstantCondition(node.expression)) {
88 return getControlFlowEndWorker(node.thenStatement);
90 return node.elseStatement === undefined
91 ? defaultControlFlowEnd
92 : getControlFlowEndWorker(node.elseStatement);
94 var then = getControlFlowEndWorker(node.thenStatement);
95 if (node.elseStatement === undefined)
97 statements: then.statements,
100 var elze = getControlFlowEndWorker(node.elseStatement);
102 statements: then.statements.concat(elze.statements),
103 end: then.end && elze.end,
106 function handleSwitchStatement(node) {
108 var hasDefault = false;
113 for (var _i = 0, _b = node.caseBlock.clauses; _i < _b.length; _i++) {
115 if (clause.kind === ts.SyntaxKind.DefaultClause)
117 var current = handleBlock(clause);
118 result.end = current.end;
119 (_a = result.statements).push.apply(_a, current.statements);
125 function handleTryStatement(node) {
127 if (node.finallyBlock !== undefined) {
128 finallyResult = handleBlock(node.finallyBlock);
129 if (finallyResult.end)
130 return finallyResult;
132 var tryResult = handleBlock(node.tryBlock);
133 if (node.catchClause === undefined)
134 return { statements: finallyResult.statements.concat(tryResult.statements), end: tryResult.end };
135 var catchResult = handleBlock(node.catchClause.block);
137 statements: tryResult.statements
138 .filter(function (s) { return s.kind !== ts.SyntaxKind.ThrowStatement; })
139 .concat(catchResult.statements, finallyResult === undefined ? [] : finallyResult.statements),
140 end: tryResult.end && catchResult.end,
143 function matchBreakOrContinue(current, pred) {
148 for (var _i = 0, _a = current.statements; _i < _a.length; _i++) {
149 var statement = _a[_i];
150 if (pred(statement) && statement.label === undefined) {
154 result.statements.push(statement);
158 function matchLabel(current, label) {
163 var labelText = label.text;
164 for (var _i = 0, _a = current.statements; _i < _a.length; _i++) {
165 var statement = _a[_i];
166 switch (statement.kind) {
167 case ts.SyntaxKind.BreakStatement:
168 case ts.SyntaxKind.ContinueStatement:
169 if (statement.label !== undefined && statement.label.text === labelText) {
174 result.statements.push(statement);
178 //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbC1mbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29udHJvbC1mbG93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsK0JBQWlDO0FBQ2pDLDBDQUE4RjtBQUU5RixTQUFnQixlQUFlLENBQUMsU0FBc0M7SUFDbEUsT0FBTyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDNUMsQ0FBQztBQUZELDBDQUVDO0FBaUJELElBQU0scUJBQXFCLEdBQW1CLEVBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFDLENBQUM7QUFLM0UsU0FBZ0IsaUJBQWlCLENBQUMsU0FBc0M7SUFDcEUsT0FBTyxrQkFBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ2hHLENBQUM7QUFGRCw4Q0FFQztBQUVELFNBQVMsdUJBQXVCLENBQUMsU0FBdUI7SUFDcEQsUUFBUSxTQUFTLENBQUMsSUFBSSxFQUFFO1FBQ3BCLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUM7UUFDbkMsS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQztRQUNsQyxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUM7UUFDckMsS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLGNBQWM7WUFDN0IsT0FBTyxFQUFDLFVBQVUsRUFBRSxDQUF1QixTQUFTLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFDLENBQUM7UUFDdEUsS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLEtBQUs7WUFDcEIsT0FBTyxXQUFXLENBQVcsU0FBUyxDQUFDLENBQUM7UUFDNUMsS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQztRQUNoQyxLQUFLLEVBQUUsQ0FBQyxVQUFVLENB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