Skip to content

Commit c9b182a

Browse files
aardvark179gbrail
authored andcommitted
Support reserved words in XML attribute names.
1 parent fa8532e commit c9b182a

File tree

3 files changed

+68
-4
lines changed

3 files changed

+68
-4
lines changed

rhino/src/main/java/org/mozilla/javascript/Parser.java

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3269,7 +3269,10 @@ private AstNode attributeAccess() throws IOException {
32693269
// handles: @name, @ns::name, @ns::*, @ns::[expr]
32703270
case Token.NAME:
32713271
return propertyName(atPos, 0);
3272-
3272+
case Token.RESERVED:
3273+
String name = ts.getString();
3274+
saveNameTokenData(ts.tokenBeg, name, lineNumber(), columnNumber());
3275+
return propertyName(atPos, 0);
32733276
// handles: @*, @*::name, @*::*, @*::[expr]
32743277
case Token.MUL:
32753278
saveNameTokenData(ts.tokenBeg, "*", lineNumber(), columnNumber());
@@ -3280,6 +3283,16 @@ private AstNode attributeAccess() throws IOException {
32803283
return xmlElemRef(atPos, null, -1);
32813284

32823285
default:
3286+
{
3287+
if (compilerEnv.isReservedKeywordAsIdentifier()) {
3288+
// allow keywords as property names, e.g. ({if: 1})
3289+
name = Token.keywordToName(tt);
3290+
if (name != null) {
3291+
saveNameTokenData(ts.tokenBeg, name, lineNumber(), columnNumber());
3292+
return propertyName(atPos, 0);
3293+
}
3294+
}
3295+
}
32833296
reportError("msg.no.name.after.xmlAttr");
32843297
return makeErrorNode();
32853298
}
@@ -3304,13 +3317,19 @@ private AstNode propertyName(int atPos, int memberTypeFlags) throws IOException
33043317
ns = name;
33053318
colonPos = ts.tokenBeg;
33063319

3307-
switch (nextToken()) {
3320+
int nt = nextToken();
3321+
switch (nt) {
33083322
// handles name::name
33093323
case Token.NAME:
33103324
name = createNameNode();
33113325
break;
3312-
3313-
// handles name::*
3326+
case Token.RESERVED:
3327+
{
3328+
String realName = ts.getString();
3329+
saveNameTokenData(ts.tokenBeg, realName, lineNumber(), columnNumber());
3330+
name = createNameNode(false, -1);
3331+
break;
3332+
}
33143333
case Token.MUL:
33153334
saveNameTokenData(ts.tokenBeg, "*", lineNumber(), columnNumber());
33163335
name = createNameNode(false, -1);
@@ -3321,6 +3340,18 @@ private AstNode propertyName(int atPos, int memberTypeFlags) throws IOException
33213340
return xmlElemRef(atPos, ns, colonPos);
33223341

33233342
default:
3343+
{
3344+
if (compilerEnv.isReservedKeywordAsIdentifier()) {
3345+
// allow keywords as property names, e.g. ({if: 1})
3346+
String realName = Token.keywordToName(nt);
3347+
if (name != null) {
3348+
saveNameTokenData(
3349+
ts.tokenBeg, realName, lineNumber(), columnNumber());
3350+
name = createNameNode(false, -1);
3351+
break;
3352+
}
3353+
}
3354+
}
33243355
reportError("msg.no.name.after.coloncolon");
33253356
return makeErrorNode();
33263357
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package org.mozilla.javascript.tests;
2+
3+
import org.mozilla.javascript.Context;
4+
import org.mozilla.javascript.drivers.LanguageVersion;
5+
import org.mozilla.javascript.drivers.RhinoTest;
6+
import org.mozilla.javascript.drivers.ScriptTestsBase;
7+
8+
@RhinoTest("testsrc/jstests/xml-reserved-words-as-attributes.js")
9+
@LanguageVersion(Context.VERSION_ES6)
10+
public class XMLReservedWordsAttributesTest extends ScriptTestsBase {}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// This Source Code Form is subject to the terms of the Mozilla Public
2+
// License, v. 2.0. If a copy of the MPL was not distributed with this
3+
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
4+
5+
// Test that reserved words can be used as both XML attribute names
6+
// and as part of a name space qualified name.
7+
8+
load('testsrc/assert.js');
9+
10+
x =
11+
<alpha>
12+
<bravo for="value1" ns:for="value3" xmlns:ns="http://someuri">
13+
<charlie class="value2" ns:class="value4"/>
14+
</bravo>
15+
</alpha>
16+
17+
assertEquals("value1", x.bravo.@for.toXMLString());
18+
assertEquals("value2", x.bravo.charlie.@class.toXMLString());
19+
n = new Namespace("http://someuri");
20+
assertEquals("value3", x.bravo.@n::for.toXMLString());
21+
assertEquals("value4", x.bravo.charlie.@n::class.toXMLString());
22+
23+
"success"

0 commit comments

Comments
 (0)