Skip to content

Commit

Permalink
Handle break-to-labeled-non-loop
Browse files Browse the repository at this point in the history
Closes babel#1
  • Loading branch information
marijnh authored and JacopKane committed Jan 11, 2018
1 parent badb37f commit 805dfd3
Show file tree
Hide file tree
Showing 3 changed files with 120 additions and 4 deletions.
6 changes: 4 additions & 2 deletions packages/babylon/acorn.js
Expand Up @@ -970,8 +970,10 @@
// continue to.
for (var i = 0; i < labels.length; ++i) {
var lab = labels[i];
if ((node.label == null || lab.name === node.label.name) &&
lab.kind != null && (isBreak || lab.kind === "loop")) break;
if (node.label == null || lab.name === node.label.name) {
if (lab.kind != null && (isBreak || lab.kind === "loop")) break;
if (node.label && isBreak) break;
}
}
if (i === labels.length) raise(node.start, "Unsyntactic " + starttype.keyword);
return finishNode(node, isBreak ? "BreakStatement" : "ContinueStatement");
Expand Down
6 changes: 4 additions & 2 deletions packages/babylon/index.html
Expand Up @@ -660,8 +660,10 @@
<span class="p">}</span></pre></div> </td> </tr> <tr id="section-89"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-89">&#182;</a> </div> <p>Verify that there is an actual destination to break or
continue to.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">labels</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="o">++</span><span class="nx">i</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">lab</span> <span class="o">=</span> <span class="nx">labels</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>
<span class="k">if</span> <span class="p">((</span><span class="nx">node</span><span class="p">.</span><span class="nx">label</span> <span class="o">==</span> <span class="kc">null</span> <span class="o">||</span> <span class="nx">lab</span><span class="p">.</span><span class="nx">name</span> <span class="o">===</span> <span class="nx">node</span><span class="p">.</span><span class="nx">label</span><span class="p">.</span><span class="nx">name</span><span class="p">)</span> <span class="o">&amp;&amp;</span>
<span class="nx">lab</span><span class="p">.</span><span class="nx">kind</span> <span class="o">!=</span> <span class="kc">null</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="nx">isBreak</span> <span class="o">||</span> <span class="nx">lab</span><span class="p">.</span><span class="nx">kind</span> <span class="o">===</span> <span class="s2">&quot;loop&quot;</span><span class="p">))</span> <span class="k">break</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">node</span><span class="p">.</span><span class="nx">label</span> <span class="o">==</span> <span class="kc">null</span> <span class="o">||</span> <span class="nx">lab</span><span class="p">.</span><span class="nx">name</span> <span class="o">===</span> <span class="nx">node</span><span class="p">.</span><span class="nx">label</span><span class="p">.</span><span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">lab</span><span class="p">.</span><span class="nx">kind</span> <span class="o">!=</span> <span class="kc">null</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="nx">isBreak</span> <span class="o">||</span> <span class="nx">lab</span><span class="p">.</span><span class="nx">kind</span> <span class="o">===</span> <span class="s2">&quot;loop&quot;</span><span class="p">))</span> <span class="k">break</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">node</span><span class="p">.</span><span class="nx">label</span> <span class="o">&amp;&amp;</span> <span class="nx">isBreak</span><span class="p">)</span> <span class="k">break</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">i</span> <span class="o">===</span> <span class="nx">labels</span><span class="p">.</span><span class="nx">length</span><span class="p">)</span> <span class="nx">raise</span><span class="p">(</span><span class="nx">node</span><span class="p">.</span><span class="nx">start</span><span class="p">,</span> <span class="s2">&quot;Unsyntactic &quot;</span> <span class="o">+</span> <span class="nx">starttype</span><span class="p">.</span><span class="nx">keyword</span><span class="p">);</span>
<span class="k">return</span> <span class="nx">finishNode</span><span class="p">(</span><span class="nx">node</span><span class="p">,</span> <span class="nx">isBreak</span> <span class="o">?</span> <span class="s2">&quot;BreakStatement&quot;</span> <span class="o">:</span> <span class="s2">&quot;ContinueStatement&quot;</span><span class="p">);</span>
Expand Down
112 changes: 112 additions & 0 deletions packages/babylon/test/tests.js
Expand Up @@ -25724,6 +25724,118 @@ test("", {
}
});

test("foo: if (true) break foo;", {
type: "Program",
start: 0,
end: 25,
loc: {
start: {
line: 1,
column: 0
},
end: {
line: 1,
column: 25
}
},
body: [
{
type: "LabeledStatement",
start: 0,
end: 25,
loc: {
start: {
line: 1,
column: 0
},
end: {
line: 1,
column: 25
}
},
body: {
type: "IfStatement",
start: 5,
end: 25,
loc: {
start: {
line: 1,
column: 5
},
end: {
line: 1,
column: 25
}
},
test: {
type: "Literal",
start: 9,
end: 13,
loc: {
start: {
line: 1,
column: 9
},
end: {
line: 1,
column: 13
}
},
value: true
},
consequent: {
type: "BreakStatement",
start: 15,
end: 25,
loc: {
start: {
line: 1,
column: 15
},
end: {
line: 1,
column: 25
}
},
label: {
type: "Identifier",
start: 21,
end: 24,
loc: {
start: {
line: 1,
column: 21
},
end: {
line: 1,
column: 24
}
},
name: "foo"
}
},
alternate: null
},
label: {
type: "Identifier",
start: 0,
end: 3,
loc: {
start: {
line: 1,
column: 0
},
end: {
line: 1,
column: 3
}
},
name: "foo"
}
}
]
});

// Failure tests

testFail("{",
Expand Down

0 comments on commit 805dfd3

Please sign in to comment.