Assign parenthesized expressions a range that includes the parens

This way, composite expressions that they are part of won't get bogus
unsyntactic substrings as their range (i.e. in '(1)+1', the binop expression
would span '1)+1').

Closes #14
This commit is contained in:
Marijn Haverbeke
2012-11-18 21:17:49 +01:00
parent f91d7f5836
commit 905124c291
3 changed files with 54 additions and 36 deletions

View File

@@ -1433,8 +1433,17 @@
return finishNode(node, "Literal");
case _parenL:
var tokStartLoc1 = tokStartLoc, tokStart1 = tokStart;
next();
var val = parseExpression();
val.start = tokStart1;
val.end = tokEnd;
if (options.locations) {
val.loc.start = tokStartLoc1;
val.loc.end = tokEndLoc;
}
if (options.ranges)
val.range = [tokStart1, tokEnd];
expect(_parenR);
return val;

View File

@@ -1045,8 +1045,17 @@ or <code>{}</code>.</p> </td> <td class="code">
<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="s2">&quot;Literal&quot;</span><span class="p">);</span>
<span class="k">case</span> <span class="nx">_parenL</span><span class="o">:</span>
<span class="kd">var</span> <span class="nx">tokStartLoc1</span> <span class="o">=</span> <span class="nx">tokStartLoc</span><span class="p">,</span> <span class="nx">tokStart1</span> <span class="o">=</span> <span class="nx">tokStart</span><span class="p">;</span>
<span class="nx">next</span><span class="p">();</span>
<span class="kd">var</span> <span class="nx">val</span> <span class="o">=</span> <span class="nx">parseExpression</span><span class="p">();</span>
<span class="nx">val</span><span class="p">.</span><span class="nx">start</span> <span class="o">=</span> <span class="nx">tokStart1</span><span class="p">;</span>
<span class="nx">val</span><span class="p">.</span><span class="nx">end</span> <span class="o">=</span> <span class="nx">tokEnd</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">options</span><span class="p">.</span><span class="nx">locations</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">val</span><span class="p">.</span><span class="nx">loc</span><span class="p">.</span><span class="nx">start</span> <span class="o">=</span> <span class="nx">tokStartLoc1</span><span class="p">;</span>
<span class="nx">val</span><span class="p">.</span><span class="nx">loc</span><span class="p">.</span><span class="nx">end</span> <span class="o">=</span> <span class="nx">tokEndLoc</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">options</span><span class="p">.</span><span class="nx">ranges</span><span class="p">)</span>
<span class="nx">val</span><span class="p">.</span><span class="nx">range</span> <span class="o">=</span> <span class="p">[</span><span class="nx">tokStart1</span><span class="p">,</span> <span class="nx">tokEnd</span><span class="p">];</span>
<span class="nx">expect</span><span class="p">(</span><span class="nx">_parenR</span><span class="p">);</span>
<span class="k">return</span> <span class="nx">val</span><span class="p">;</span>

View File

@@ -175,11 +175,11 @@ test("(1 + 2 ) * 3", {
loc: {
start: {
line: 1,
column: 1
column: 0
},
end: {
line: 1,
column: 6
column: 8
}
}
},
@@ -201,7 +201,7 @@ test("(1 + 2 ) * 3", {
loc: {
start: {
line: 1,
column: 1
column: 0
},
end: {
line: 1,
@@ -8175,11 +8175,11 @@ test("( new foo).bar()", {
loc: {
start: {
line: 1,
column: 2
column: 0
},
end: {
line: 1,
column: 9
column: 10
}
}
},
@@ -8201,7 +8201,7 @@ test("( new foo).bar()", {
loc: {
start: {
line: 1,
column: 2
column: 0
},
end: {
line: 1,
@@ -8213,7 +8213,7 @@ test("( new foo).bar()", {
loc: {
start: {
line: 1,
column: 2
column: 0
},
end: {
line: 1,
@@ -8344,11 +8344,11 @@ test("( foo )()", {
loc: {
start: {
line: 1,
column: 5
column: 0
},
end: {
line: 1,
column: 8
column: 11
}
}
},
@@ -8356,7 +8356,7 @@ test("( foo )()", {
loc: {
start: {
line: 1,
column: 5
column: 0
},
end: {
line: 1,
@@ -17190,11 +17190,11 @@ test("if (morning) (function(){})", {
loc: {
start: {
line: 1,
column: 14
column: 13
},
end: {
line: 1,
column: 26
column: 27
}
}
},
@@ -20481,11 +20481,11 @@ test("(function(){ return })", {
loc: {
start: {
line: 1,
column: 1
column: 0
},
end: {
line: 1,
column: 21
column: 22
}
}
},
@@ -20554,11 +20554,11 @@ test("(function(){ return; })", {
loc: {
start: {
line: 1,
column: 1
column: 0
},
end: {
line: 1,
column: 22
column: 23
}
}
},
@@ -20640,11 +20640,11 @@ test("(function(){ return x; })", {
loc: {
start: {
line: 1,
column: 1
column: 0
},
end: {
line: 1,
column: 24
column: 25
}
}
},
@@ -20754,11 +20754,11 @@ test("(function(){ return x * y })", {
loc: {
start: {
line: 1,
column: 1
column: 0
},
end: {
line: 1,
column: 27
column: 28
}
}
},
@@ -23193,11 +23193,11 @@ test("(function test(t, t) { })", {
loc: {
start: {
line: 1,
column: 1
column: 0
},
end: {
line: 1,
column: 24
column: 25
}
}
},
@@ -24099,11 +24099,11 @@ test("(function(){})", {
loc: {
start: {
line: 1,
column: 1
column: 0
},
end: {
line: 1,
column: 13
column: 14
}
}
},
@@ -25209,11 +25209,11 @@ test("(function(){ return\nx; })", {
loc: {
start: {
line: 1,
column: 1
column: 0
},
end: {
line: 2,
column: 4
column: 5
}
}
},
@@ -25309,11 +25309,11 @@ test("(function(){ return // Comment\nx; })", {
loc: {
start: {
line: 1,
column: 1
column: 0
},
end: {
line: 2,
column: 4
column: 5
}
}
},
@@ -25409,11 +25409,11 @@ test("(function(){ return/* Multiline\nComment */x; })", {
loc: {
start: {
line: 1,
column: 1
column: 0
},
end: {
line: 2,
column: 14
column: 15
}
}
},
@@ -25854,15 +25854,15 @@ test("(function () { 'use strict'; '\0'; }())", {
},
expression: {
type: "CallExpression",
start: 1,
start: 0,
loc: {
start: {
line: 1,
column: 1
column: 0
},
end: {
line: 1,
column: 37
column: 38
}
},
callee: {
@@ -25962,7 +25962,7 @@ test("(function () { 'use strict'; '\0'; }())", {
}
},
arguments: [],
end: 37
end: 38
}
}
]
@@ -26120,7 +26120,7 @@ testFail("func() = 4",
"Assigning to rvalue (1:0)");
testFail("(1 + 1) = 10",
"Assigning to rvalue (1:1)");
"Assigning to rvalue (1:0)");
testFail("1++",
"Assigning to rvalue (1:0)");
@@ -26135,7 +26135,7 @@ testFail("--1",
"Assigning to rvalue (1:2)");
testFail("for((1 + 1) in list) process(x);",
"Assigning to rvalue (1:5)");
"Assigning to rvalue (1:4)");
testFail("[",
"Unexpected token (1:1)");