JavaScript: Skip XML processing instructions in E4X content.

This commit is contained in:
Max Schaefer
2019-02-04 09:36:43 +00:00
parent be67d5129a
commit 81b86d9a0f
3 changed files with 63 additions and 32 deletions

View File

@@ -545,22 +545,52 @@ public class CustomParser extends FlowParser {
}
@Override
protected Either<Integer, Token> jsx_readChunk(StringBuilder out, int chunkStart, int ch) {
// skip HTML comments (which are allowed in E4X, but not in JSX)
if (this.options.e4x() && ch == '<' && charAt(this.pos+1) == '!' &&
charAt(this.pos+2) == '-' && charAt(this.pos+3) == '-') {
out.append(inputSubstring(chunkStart, this.pos));
this.pos += 4;
while (this.pos+2 < this.input.length()) {
if (charAt(this.pos) == '-' && charAt(this.pos+1) == '-' && charAt(this.pos+2) == '>') {
this.pos += 3;
protected Token readToken(int code) {
// skip XML processing instructions (which are allowed in E4X, but not in JSX)
if (this.options.e4x()) {
while (code == '<') {
if (charAt(this.pos+1) == '?') {
this.pos += 2;
jsx_readUntil("?>");
} else {
break;
}
++this.pos;
this.skipSpace();
code = this.fullCharCodeAtPos();
}
}
return super.readToken(code);
}
@Override
protected Either<Integer, Token> jsx_readChunk(StringBuilder out, int chunkStart, int ch) {
// skip XML comments and processing instructions (which are allowed in E4X, but not in JSX)
if (this.options.e4x() && ch == '<') {
if (inputSubstring(this.pos+1, this.pos+4).equals("!--")) {
out.append(inputSubstring(chunkStart, this.pos));
this.pos += 4;
jsx_readUntil("-->");
return Either.left(this.pos);
} else if (charAt(this.pos+1) == '?') {
out.append(inputSubstring(chunkStart, this.pos));
this.pos += 2;
jsx_readUntil("?>");
return Either.left(this.pos);
}
return Either.left(this.pos);
}
return super.jsx_readChunk(out, chunkStart, ch);
}
private void jsx_readUntil(String terminator) {
char fst = terminator.charAt(0);
while (this.pos+terminator.length() <= this.input.length()) {
if (charAt(this.pos) == fst &&
inputSubstring(this.pos, this.pos+terminator.length()).equals(terminator)) {
this.pos += terminator.length();
break;
}
++this.pos;
}
}
}

View File

@@ -7,6 +7,6 @@ message.soap::Body;
items.@[f()];
message.soap::[g()];
var e = <elt>
var e = <?xml version="1.0" encoding="UTF-8"?> <elt>
<!-- comment -->
</elt>;
</elt>;

View File

@@ -64,10 +64,10 @@ lines(#20018,#20001,"","
locations_default(#20019,#10000,9,1,9,0)
hasLocation(#20018,#20019)
#20020=*
lines(#20020,#20001,"var e = <elt>","
lines(#20020,#20001,"var e = <?xml version=""1.0"" encoding=""UTF-8""?> <elt>","
")
#20021=@"loc,{#10000},10,1,10,13"
locations_default(#20021,#10000,10,1,10,13)
#20021=@"loc,{#10000},10,1,10,52"
locations_default(#20021,#10000,10,1,10,52)
hasLocation(#20020,#20021)
#20022=*
lines(#20022,#20001," <!-- comment -->","
@@ -77,7 +77,8 @@ locations_default(#20023,#10000,11,1,11,18)
hasLocation(#20022,#20023)
indentation(#10000,11," ",2)
#20024=*
lines(#20024,#20001," </elt>;","")
lines(#20024,#20001," </elt>;","
")
#20025=@"loc,{#10000},12,1,12,9"
locations_default(#20025,#10000,12,1,12,9)
hasLocation(#20024,#20025)
@@ -424,26 +425,26 @@ tokeninfo(#20160,8,#20001,67,"=")
locations_default(#20161,#10000,10,7,10,7)
hasLocation(#20160,#20161)
#20162=*
tokeninfo(#20162,8,#20001,68,"<")
#20163=@"loc,{#10000},10,9,10,9"
locations_default(#20163,#10000,10,9,10,9)
tokeninfo(#20162,8,#20001,68,"<?xml version=""1.0"" encoding=""UTF-8""?> <")
#20163=@"loc,{#10000},10,9,10,48"
locations_default(#20163,#10000,10,9,10,48)
hasLocation(#20162,#20163)
#20164=*
tokeninfo(#20164,6,#20001,69,"elt")
#20165=@"loc,{#10000},10,10,10,12"
locations_default(#20165,#10000,10,10,10,12)
#20165=@"loc,{#10000},10,49,10,51"
locations_default(#20165,#10000,10,49,10,51)
hasLocation(#20164,#20165)
#20166=*
tokeninfo(#20166,8,#20001,70,">")
#20167=@"loc,{#10000},10,13,10,13"
locations_default(#20167,#10000,10,13,10,13)
#20167=@"loc,{#10000},10,52,10,52"
locations_default(#20167,#10000,10,52,10,52)
hasLocation(#20166,#20167)
#20168=*
tokeninfo(#20168,4,#20001,71,"
<!-- comment -->
")
#20169=@"loc,{#10000},10,14,12,2"
locations_default(#20169,#10000,10,14,12,2)
#20169=@"loc,{#10000},10,53,12,2"
locations_default(#20169,#10000,10,53,12,2)
hasLocation(#20168,#20169)
#20170=*
tokeninfo(#20170,8,#20001,72,"<")
@@ -472,12 +473,12 @@ locations_default(#20179,#10000,12,9,12,9)
hasLocation(#20178,#20179)
#20180=*
tokeninfo(#20180,0,#20001,77,"")
#20181=@"loc,{#10000},12,10,12,9"
locations_default(#20181,#10000,12,10,12,9)
#20181=@"loc,{#10000},13,1,13,0"
locations_default(#20181,#10000,13,1,13,0)
hasLocation(#20180,#20181)
toplevels(#20001,0)
#20182=@"loc,{#10000},1,1,12,9"
locations_default(#20182,#10000,1,1,12,9)
#20182=@"loc,{#10000},1,1,13,0"
locations_default(#20182,#10000,1,1,13,0)
hasLocation(#20001,#20182)
#20183=@"var;{e};{#20000}"
variables(#20183,"e",#20000)
@@ -855,7 +856,7 @@ locations_default(#20271,#10000,10,1,12,9)
hasLocation(#20270,#20271)
stmtContainers(#20270,#20001)
#20272=*
exprs(#20272,64,#20270,0,"e = <el ... </elt>")
exprs(#20272,64,#20270,0,"e = <?x ... </elt>")
#20273=@"loc,{#10000},10,5,12,8"
locations_default(#20273,#10000,10,5,12,8)
hasLocation(#20272,#20273)
@@ -869,7 +870,7 @@ exprContainers(#20274,#20001)
literals("e","e",#20274)
decl(#20274,#20183)
#20275=*
exprs(#20275,89,#20272,1,"<elt>\n ... </elt>")
exprs(#20275,89,#20272,1,"<?xml v ... </elt>")
#20276=@"loc,{#10000},10,9,12,8"
locations_default(#20276,#10000,10,9,12,8)
hasLocation(#20275,#20276)