Merge pull request #2252 from asger-semmle/regexp

JS: Parse regular expressions from string literals
This commit is contained in:
Max Schaefer
2019-11-15 11:47:33 +00:00
committed by GitHub
101 changed files with 8907 additions and 5316 deletions

View File

@@ -53,6 +53,11 @@
## Changes to libraries
* `Expr.getDocumentation()` now handles chain assignments.
* String literals are now parsed as regular expressions.
Consequently, a `RegExpTerm` may occur as part of a string literal or
as a regular expression literal. Queries that search for regular expressions may need to
use `RegExpTerm.isPartOfRegExpLiteral` or `RegExpTerm.isUsedAsRegExp` to restrict the search.
A regular expression AST can be obtained from a string literal using `StringLiteral.asRegExp`.
## Removal of deprecated queries

View File

@@ -59,6 +59,11 @@ public class Literal extends Expression implements ITypeExpression {
return tokenType == TokenType.regexp;
}
/** Is this a string literal? */
public boolean isStringLiteral() {
return tokenType == TokenType.string;
}
/** The value of this literal expressed as a string. */
public String getStringValue() {
// regular expressions may have a null value; use the raw value instead

View File

@@ -516,10 +516,97 @@ public class ASTExtractor {
String valueString = nd.getStringValue();
trapwriter.addTuple("literals", valueString, source, key);
if (nd.isRegExp()) regexpExtractor.extract(source.substring(1, source.lastIndexOf('/')), nd);
if (nd.isRegExp()) {
OffsetTranslation offsets = new OffsetTranslation();
offsets.set(0, 1); // skip the initial '/'
regexpExtractor.extract(source.substring(1, source.lastIndexOf('/')), offsets, nd, false);
} else if (nd.isStringLiteral() && !c.isInsideType()) {
regexpExtractor.extract(valueString, makeStringLiteralOffsets(nd.getRaw()), nd, true);
}
return key;
}
private boolean isOctalDigit(char ch) {
return '0' <= ch && ch <= '7';
}
/**
* Builds a translation from offsets in a string value back to its original raw literal text
* (including quotes).
*
* <p>This is not a 1:1 mapping since escape sequences take up more characters in the raw
* literal than in the resulting string value. This mapping includes the surrounding quotes.
*
* <p>For example: for the raw literal value <code>'x\.y'</code> (quotes included), the <code>y
* </code> at index 2 in <code>x.y</code> maps to index 4 in the raw literal.
*/
public OffsetTranslation makeStringLiteralOffsets(String rawLiteral) {
OffsetTranslation offsets = new OffsetTranslation();
offsets.set(0, 1); // Skip the initial quote
// Invariant: raw character at 'pos' corresponds to decoded character at 'pos - delta'
int pos = 1;
int delta = 1;
while (pos < rawLiteral.length() - 1) {
if (rawLiteral.charAt(pos) != '\\') {
++pos;
continue;
}
final int length; // Length of the escape sequence, including slash.
int outputLength = 1; // Number characters the sequence expands to.
char ch = rawLiteral.charAt(pos + 1);
if ('0' <= ch && ch <= '7') {
// Octal escape: \N, \NN, or \NNN
int firstDigit = pos + 1;
int end = firstDigit;
int maxEnd = Math.min(firstDigit + (ch <= '3' ? 3 : 2), rawLiteral.length());
while (end < maxEnd && isOctalDigit(rawLiteral.charAt(end))) {
++end;
}
length = end - pos;
} else if (ch == 'x') {
// Hex escape: \xNN
length = 4;
} else if (ch == 'u' && pos + 2 < rawLiteral.length()) {
if (rawLiteral.charAt(pos + 2) == '{') {
// Variable-length unicode escape: \U{N...}
// Scan for the ending '}'
int firstDigit = pos + 3;
int end = firstDigit;
int leadingZeros = 0;
while (end < rawLiteral.length() && rawLiteral.charAt(end) == '0') {
++end;
++leadingZeros;
}
while (end < rawLiteral.length() && rawLiteral.charAt(end) != '}') {
++end;
}
int numDigits = end - firstDigit;
if (numDigits - leadingZeros > 4) {
outputLength = 2; // Encoded as a surrogate pair
}
++end; // Include '}' character
length = end - pos;
} else {
// Fixed-length unicode escape: \UNNNN
length = 6;
}
} else {
// Simple escape: \n or similar.
length = 2;
}
int end = pos + length;
if (end > rawLiteral.length()) {
end = rawLiteral.length();
}
int outputPos = pos - delta;
// Map the next character to the adjusted offset.
offsets.set(outputPos + outputLength, end);
delta += length - outputLength;
pos = end;
}
return offsets;
}
@Override
public Label visit(MemberExpression nd, Context c) {
Label key = super.visit(nd, c);

View File

@@ -65,7 +65,8 @@ public class LocationManager {
/**
* Emit location information for an AST node. The node's location is translated from the parser's
* 0-based column numbering scheme into our 1-based scheme and then emitted as a snippet location.
* 0-based column numbering scheme with exclusive offsets into our 1-based scheme with inclusive
* end-offsets and then emitted as a snippet location.
*/
public void emitNodeLocation(SourceElement nd, Label lbl) {
int sl = nd.getLoc().getStart().getLine(),
@@ -86,7 +87,15 @@ public class LocationManager {
emitSnippetLocation(lbl, sl, sc, el, ec);
}
/** Emit a relative location in the current snippet. */
/**
* Emit a relative location in the current snippet.
*
* @param lbl label to associate with the location
* @param sl start line (1-based)
* @param sc start column (1-based, inclusive)
* @param el end line (1-based)
* @param ec end column (1-based, inclusive)
*/
public void emitSnippetLocation(Label lbl, int sl, int sc, int el, int ec) {
Position start = translatePosition(new Position(sl, sc, -1));
Position end = translatePosition(new Position(el, ec, -1));

View File

@@ -37,7 +37,7 @@ public class Main {
* A version identifier that should be updated every time the extractor changes in such a way that
* it may produce different tuples for the same file under the same {@link ExtractorConfig}.
*/
public static final String EXTRACTOR_VERSION = "2019-10-08";
public static final String EXTRACTOR_VERSION = "2019-10-23";
public static final Pattern NEWLINE = Pattern.compile("\n");

View File

@@ -0,0 +1,39 @@
package com.semmle.js.extractor;
import com.semmle.util.data.IntList;
/**
* A mapping of some source range into a set of intervals in an output source range.
*
* <p>The mapping is constructed by adding "anchors": input/output pairs that correspond to the
* beginning of an interval, which is assumed to end at the next anchor.
*/
public class OffsetTranslation {
private IntList anchors = IntList.create();
private IntList deltas = IntList.create();
/** Returns the mapping of x. */
public int get(int x) {
int index = anchors.binarySearch(x);
if (index < 0) {
// The insertion point is -index - 1.
// Get the index immediately before that.
index = -index - 2;
if (index < 0) {
// If queried before the first anchor, use the first anchor anyway.
index = 0;
}
}
return x + deltas.get(index);
}
/**
* Maps the given input offset to the given output offset.
*
* <p>This is added as an anchor. Any offset is mapped based on its closest preceding anchor.
*/
public void set(int from, int to) {
anchors.add(from);
deltas.add(to - from);
}
}

View File

@@ -51,6 +51,7 @@ public class RegExpExtractor {
private final LocationManager locationManager;
private final RegExpParser parser = new RegExpParser();
private Position literalStart;
private OffsetTranslation offsets;
public RegExpExtractor(TrapWriter trapwriter, LocationManager locationManager) {
this.trapwriter = trapwriter;
@@ -119,10 +120,14 @@ public class RegExpExtractor {
}
public void emitLocation(SourceElement term, Label lbl) {
int col = literalStart.getColumn();
int sl, sc, el, ec;
sl = el = literalStart.getLine();
sc = literalStart.getColumn() + 2 + term.getLoc().getStart().getColumn();
ec = literalStart.getColumn() + 1 + term.getLoc().getEnd().getColumn();
sc = col + offsets.get(term.getLoc().getStart().getColumn());
ec = col + offsets.get(term.getLoc().getEnd().getColumn());
sc += 1; // convert to 1-based
ec += 1; // convert to 1-based
ec -= 1; // convert to inclusive
locationManager.emitSnippetLocation(lbl, sl, sc, el, ec);
}
@@ -341,9 +346,16 @@ public class RegExpExtractor {
}
}
public void extract(String src, Node parent) {
this.literalStart = parent.getLoc().getStart();
public void extract(
String src, OffsetTranslation offsets, Node parent, boolean isSpeculativeParsing) {
Result res = parser.parse(src);
if (isSpeculativeParsing && res.getErrors().size() > 0) {
return;
}
this.literalStart = parent.getLoc().getStart();
this.offsets = offsets;
RegExpTerm ast = res.getAST();
new V().visit(ast, trapwriter.localID(parent), 0);

View File

@@ -0,0 +1,50 @@
package com.semmle.js.extractor.test;
import com.semmle.js.extractor.OffsetTranslation;
import org.junit.Assert;
import org.junit.Test;
public class OffsetTranslationTest {
@Test
public void testBasic() {
OffsetTranslation table = new OffsetTranslation();
table.set(0, 10);
table.set(100, 250);
Assert.assertEquals(10, table.get(0));
Assert.assertEquals(15, table.get(5));
Assert.assertEquals(85, table.get(75));
Assert.assertEquals(109, table.get(99));
Assert.assertEquals(250, table.get(100));
Assert.assertEquals(251, table.get(101));
}
@Test
public void testLookupBefore() {
OffsetTranslation table = new OffsetTranslation();
table.set(0, 10);
table.set(100, 250);
Assert.assertEquals(9, table.get(-1));
}
@Test
public void testIdentity() {
OffsetTranslation table = new OffsetTranslation();
table.set(0, 0);
Assert.assertEquals(0, table.get(0));
Assert.assertEquals(75, table.get(75));
}
@Test
public void testDuplicateAnchor() {
OffsetTranslation table = new OffsetTranslation();
table.set(0, 0);
table.set(10, 100);
table.set(10, 100);
table.set(20, 150);
Assert.assertEquals(1, table.get(1));
Assert.assertEquals(100, table.get(10));
Assert.assertEquals(101, table.get(11));
Assert.assertEquals(150, table.get(20));
Assert.assertEquals(151, table.get(21));
}
}

View File

@@ -314,9 +314,40 @@ public class RegExpParser {
return this.finishTerm(new Group(loc, capture, number, name, dis));
}
char c = this.nextChar();
if ("^$\\.*+?()[]{}|".indexOf(c) != -1) this.error(Error.UNEXPECTED_CHARACTER, this.pos - 1);
return this.finishTerm(new Constant(loc, String.valueOf(c)));
// Parse consecutive constants into a single Constant node.
// Due to speculative parsing of string literals, this part of the code is fairly hot.
int startPos = this.pos;
int endPos = startPos;
while (endPos < src.length()) {
if ("^$\\.*+?()[]{}|".indexOf(src.charAt(endPos)) != -1) break;
++endPos;
}
if (startPos == endPos) {
this.error(Error.UNEXPECTED_CHARACTER, endPos);
endPos = startPos + 1; // To ensure progress, make sure we parse at least one character.
}
// Check if the end of the constant belongs under an upcoming quantifier.
if (endPos != startPos + 1
&& endPos < src.length()
&& "*+?{".indexOf(src.charAt(endPos)) != -1) {
if (Character.isLowSurrogate(src.charAt(endPos - 1))
&& Character.isHighSurrogate(src.charAt(endPos - 2))) {
// Don't split the surrogate pair.
if (endPos == startPos + 2) {
// The whole constant is a single wide character.
} else {
endPos -= 2; // Last 2 characters belong to an upcoming quantifier.
}
} else {
endPos--; // Last character belongs to an upcoming quantifier.
}
}
String str = src.substring(startPos, endPos);
this.pos = endPos;
loc.setEnd(pos());
loc.setSource(str);
// Do not call finishTerm as it will create another copy of 'str'.
return new Constant(loc, str);
}
private RegExpTerm parseAtomEscape(SourceLocation loc, boolean inCharClass) {
@@ -469,6 +500,11 @@ public class RegExpParser {
if (this.match("b")) return this.finishTerm(new ControlEscape(loc, "\b", 8, "\\b"));
return this.finishTerm(this.parseAtomEscape(loc, true));
}
return this.finishTerm(new Constant(loc, String.valueOf(c)));
String value = String.valueOf(c);
// Extract a surrogate pair as a single constant.
if (Character.isHighSurrogate(c) && Character.isLowSurrogate(peekChar(true))) {
value += this.nextChar();
}
return this.finishTerm(new Constant(loc, value));
}
}

View File

@@ -150,54 +150,60 @@ enclosingStmt(#20047,#20039)
exprContainers(#20047,#20001)
literals("test","'test'",#20047)
#20048=*
stmts(#20048,30,#20001,1,"export let x = 5;")
hasLocation(#20048,#20007)
stmtContainers(#20048,#20001)
#20049=*
stmts(#20049,23,#20048,-1,"let x = 5;")
#20050=@"loc,{#10000},3,8,3,17"
locations_default(#20050,#10000,3,8,3,17)
hasLocation(#20049,#20050)
stmtContainers(#20049,#20001)
regexpterm(#20048,14,#20047,0,"test")
#20049=@"loc,{#10000},1,23,1,26"
locations_default(#20049,#10000,1,23,1,26)
hasLocation(#20048,#20049)
regexpConstValue(#20048,"test")
#20050=*
stmts(#20050,30,#20001,1,"export let x = 5;")
hasLocation(#20050,#20007)
stmtContainers(#20050,#20001)
#20051=*
exprs(#20051,64,#20049,0,"x = 5")
#20052=@"loc,{#10000},3,12,3,16"
locations_default(#20052,#10000,3,12,3,16)
stmts(#20051,23,#20050,-1,"let x = 5;")
#20052=@"loc,{#10000},3,8,3,17"
locations_default(#20052,#10000,3,8,3,17)
hasLocation(#20051,#20052)
enclosingStmt(#20051,#20049)
exprContainers(#20051,#20001)
stmtContainers(#20051,#20001)
#20053=*
exprs(#20053,78,#20051,0,"x")
hasLocation(#20053,#20027)
enclosingStmt(#20053,#20049)
exprs(#20053,64,#20051,0,"x = 5")
#20054=@"loc,{#10000},3,12,3,16"
locations_default(#20054,#10000,3,12,3,16)
hasLocation(#20053,#20054)
enclosingStmt(#20053,#20051)
exprContainers(#20053,#20001)
literals("x","x",#20053)
decl(#20053,#20038)
#20054=*
exprs(#20054,3,#20051,1,"5")
hasLocation(#20054,#20031)
enclosingStmt(#20054,#20049)
exprContainers(#20054,#20001)
literals("5","5",#20054)
#20055=*
entry_cfg_node(#20055,#20001)
#20056=@"loc,{#10000},1,1,1,0"
locations_default(#20056,#10000,1,1,1,0)
hasLocation(#20055,#20056)
exprs(#20055,78,#20053,0,"x")
hasLocation(#20055,#20027)
enclosingStmt(#20055,#20051)
exprContainers(#20055,#20001)
literals("x","x",#20055)
decl(#20055,#20038)
#20056=*
exprs(#20056,3,#20053,1,"5")
hasLocation(#20056,#20031)
enclosingStmt(#20056,#20051)
exprContainers(#20056,#20001)
literals("5","5",#20056)
#20057=*
exit_cfg_node(#20057,#20001)
hasLocation(#20057,#20035)
successor(#20048,#20049)
successor(#20049,#20053)
successor(#20054,#20051)
successor(#20053,#20054)
successor(#20051,#20057)
entry_cfg_node(#20057,#20001)
#20058=@"loc,{#10000},1,1,1,0"
locations_default(#20058,#10000,1,1,1,0)
hasLocation(#20057,#20058)
#20059=*
exit_cfg_node(#20059,#20001)
hasLocation(#20059,#20035)
successor(#20050,#20051)
successor(#20051,#20055)
successor(#20056,#20053)
successor(#20055,#20056)
successor(#20053,#20059)
successor(#20039,#20044)
successor(#20047,#20040)
successor(#20046,#20042)
successor(#20044,#20046)
successor(#20042,#20047)
successor(#20040,#20048)
successor(#20055,#20039)
successor(#20040,#20050)
successor(#20057,#20039)
numlines(#10000,3,2,0)
filetype(#10000,"javascript")

View File

@@ -187,97 +187,103 @@ enclosingStmt(#20062,#20054)
exprContainers(#20062,#20001)
literals("test","'test'",#20062)
#20063=*
stmts(#20063,18,#20001,1,"var x = 5;")
hasLocation(#20063,#20005)
stmtContainers(#20063,#20001)
#20064=*
exprs(#20064,64,#20063,0,"x = 5")
#20065=@"loc,{#10000},2,5,2,9"
locations_default(#20065,#10000,2,5,2,9)
hasLocation(#20064,#20065)
enclosingStmt(#20064,#20063)
exprContainers(#20064,#20001)
regexpterm(#20063,14,#20062,0,"test")
#20064=@"loc,{#10000},1,14,1,17"
locations_default(#20064,#10000,1,14,1,17)
hasLocation(#20063,#20064)
regexpConstValue(#20063,"test")
#20065=*
stmts(#20065,18,#20001,1,"var x = 5;")
hasLocation(#20065,#20005)
stmtContainers(#20065,#20001)
#20066=*
exprs(#20066,78,#20064,0,"x")
hasLocation(#20066,#20025)
enclosingStmt(#20066,#20063)
exprs(#20066,64,#20065,0,"x = 5")
#20067=@"loc,{#10000},2,5,2,9"
locations_default(#20067,#10000,2,5,2,9)
hasLocation(#20066,#20067)
enclosingStmt(#20066,#20065)
exprContainers(#20066,#20001)
literals("x","x",#20066)
decl(#20066,#20053)
#20067=*
exprs(#20067,3,#20064,1,"5")
hasLocation(#20067,#20029)
enclosingStmt(#20067,#20063)
exprContainers(#20067,#20001)
literals("5","5",#20067)
#20068=*
stmts(#20068,2,#20001,2,"exports = { x: x };")
hasLocation(#20068,#20007)
stmtContainers(#20068,#20001)
exprs(#20068,78,#20066,0,"x")
hasLocation(#20068,#20025)
enclosingStmt(#20068,#20065)
exprContainers(#20068,#20001)
literals("x","x",#20068)
decl(#20068,#20053)
#20069=*
exprs(#20069,47,#20068,0,"exports = { x: x }")
#20070=@"loc,{#10000},3,1,3,18"
locations_default(#20070,#10000,3,1,3,18)
hasLocation(#20069,#20070)
enclosingStmt(#20069,#20068)
exprs(#20069,3,#20066,1,"5")
hasLocation(#20069,#20029)
enclosingStmt(#20069,#20065)
exprContainers(#20069,#20001)
literals("5","5",#20069)
#20070=*
stmts(#20070,2,#20001,2,"exports = { x: x };")
hasLocation(#20070,#20007)
stmtContainers(#20070,#20001)
#20071=*
exprs(#20071,79,#20069,0,"exports")
hasLocation(#20071,#20033)
enclosingStmt(#20071,#20068)
exprs(#20071,47,#20070,0,"exports = { x: x }")
#20072=@"loc,{#10000},3,1,3,18"
locations_default(#20072,#10000,3,1,3,18)
hasLocation(#20071,#20072)
enclosingStmt(#20071,#20070)
exprContainers(#20071,#20001)
literals("exports","exports",#20071)
bind(#20071,#20052)
#20072=*
exprs(#20072,8,#20069,1,"{ x: x }")
#20073=@"loc,{#10000},3,11,3,18"
locations_default(#20073,#10000,3,11,3,18)
hasLocation(#20072,#20073)
enclosingStmt(#20072,#20068)
exprContainers(#20072,#20001)
#20073=*
exprs(#20073,79,#20071,0,"exports")
hasLocation(#20073,#20033)
enclosingStmt(#20073,#20070)
exprContainers(#20073,#20001)
literals("exports","exports",#20073)
bind(#20073,#20052)
#20074=*
properties(#20074,#20072,0,0,"x: x")
#20075=@"loc,{#10000},3,13,3,16"
locations_default(#20075,#10000,3,13,3,16)
exprs(#20074,8,#20071,1,"{ x: x }")
#20075=@"loc,{#10000},3,11,3,18"
locations_default(#20075,#10000,3,11,3,18)
hasLocation(#20074,#20075)
enclosingStmt(#20074,#20070)
exprContainers(#20074,#20001)
#20076=*
exprs(#20076,0,#20074,0,"x")
hasLocation(#20076,#20039)
enclosingStmt(#20076,#20068)
exprContainers(#20076,#20001)
literals("x","x",#20076)
#20077=*
exprs(#20077,79,#20074,1,"x")
hasLocation(#20077,#20043)
enclosingStmt(#20077,#20068)
exprContainers(#20077,#20001)
literals("x","x",#20077)
bind(#20077,#20053)
properties(#20076,#20074,0,0,"x: x")
#20077=@"loc,{#10000},3,13,3,16"
locations_default(#20077,#10000,3,13,3,16)
hasLocation(#20076,#20077)
#20078=*
entry_cfg_node(#20078,#20001)
#20079=@"loc,{#10000},1,1,1,0"
locations_default(#20079,#10000,1,1,1,0)
hasLocation(#20078,#20079)
exprs(#20078,0,#20076,0,"x")
hasLocation(#20078,#20039)
enclosingStmt(#20078,#20070)
exprContainers(#20078,#20001)
literals("x","x",#20078)
#20079=*
exprs(#20079,79,#20076,1,"x")
hasLocation(#20079,#20043)
enclosingStmt(#20079,#20070)
exprContainers(#20079,#20001)
literals("x","x",#20079)
bind(#20079,#20053)
#20080=*
exit_cfg_node(#20080,#20001)
hasLocation(#20080,#20049)
successor(#20068,#20071)
successor(#20072,#20076)
successor(#20077,#20074)
successor(#20076,#20077)
successor(#20074,#20069)
successor(#20071,#20072)
successor(#20069,#20080)
successor(#20063,#20066)
successor(#20067,#20064)
successor(#20066,#20067)
successor(#20064,#20068)
entry_cfg_node(#20080,#20001)
#20081=@"loc,{#10000},1,1,1,0"
locations_default(#20081,#10000,1,1,1,0)
hasLocation(#20080,#20081)
#20082=*
exit_cfg_node(#20082,#20001)
hasLocation(#20082,#20049)
successor(#20070,#20073)
successor(#20074,#20078)
successor(#20079,#20076)
successor(#20078,#20079)
successor(#20076,#20071)
successor(#20073,#20074)
successor(#20071,#20082)
successor(#20065,#20068)
successor(#20069,#20066)
successor(#20068,#20069)
successor(#20066,#20070)
successor(#20054,#20059)
successor(#20062,#20055)
successor(#20061,#20057)
successor(#20059,#20061)
successor(#20057,#20062)
successor(#20055,#20063)
successor(#20078,#20054)
successor(#20055,#20065)
successor(#20080,#20054)
numlines(#10000,3,3,0)
filetype(#10000,"javascript")

View File

@@ -142,64 +142,86 @@ enclosingStmt(#20045,#20037)
exprContainers(#20045,#20001)
literals("test.x","'test.x'",#20045)
#20046=*
stmts(#20046,2,#20001,1,"test.x = 5;")
hasLocation(#20046,#20007)
stmtContainers(#20046,#20001)
#20047=*
exprs(#20047,47,#20046,0,"test.x = 5")
#20048=@"loc,{#10000},3,1,3,10"
locations_default(#20048,#10000,3,1,3,10)
hasLocation(#20047,#20048)
enclosingStmt(#20047,#20046)
exprContainers(#20047,#20001)
#20049=*
exprs(#20049,14,#20047,0,"test.x")
#20050=@"loc,{#10000},3,1,3,6"
locations_default(#20050,#10000,3,1,3,6)
hasLocation(#20049,#20050)
enclosingStmt(#20049,#20046)
exprContainers(#20049,#20001)
#20051=*
exprs(#20051,79,#20049,0,"test")
hasLocation(#20051,#20023)
enclosingStmt(#20051,#20046)
exprContainers(#20051,#20001)
literals("test","test",#20051)
#20052=@"var;{test};{#20000}"
variables(#20052,"test",#20000)
bind(#20051,#20052)
#20053=*
exprs(#20053,0,#20049,1,"x")
hasLocation(#20053,#20027)
enclosingStmt(#20053,#20046)
exprContainers(#20053,#20001)
literals("x","x",#20053)
regexpterm(#20046,1,#20045,0,"test.x")
#20047=@"loc,{#10000},1,15,1,20"
locations_default(#20047,#10000,1,15,1,20)
hasLocation(#20046,#20047)
#20048=*
regexpterm(#20048,14,#20046,0,"test")
#20049=@"loc,{#10000},1,15,1,18"
locations_default(#20049,#10000,1,15,1,18)
hasLocation(#20048,#20049)
regexpConstValue(#20048,"test")
#20050=*
regexpterm(#20050,12,#20046,1,".")
#20051=@"loc,{#10000},1,19,1,19"
locations_default(#20051,#10000,1,19,1,19)
hasLocation(#20050,#20051)
#20052=*
regexpterm(#20052,14,#20046,2,"x")
#20053=@"loc,{#10000},1,20,1,20"
locations_default(#20053,#10000,1,20,1,20)
hasLocation(#20052,#20053)
regexpConstValue(#20052,"x")
#20054=*
exprs(#20054,3,#20047,1,"5")
hasLocation(#20054,#20031)
enclosingStmt(#20054,#20046)
exprContainers(#20054,#20001)
literals("5","5",#20054)
stmts(#20054,2,#20001,1,"test.x = 5;")
hasLocation(#20054,#20007)
stmtContainers(#20054,#20001)
#20055=*
entry_cfg_node(#20055,#20001)
#20056=@"loc,{#10000},1,1,1,0"
locations_default(#20056,#10000,1,1,1,0)
exprs(#20055,47,#20054,0,"test.x = 5")
#20056=@"loc,{#10000},3,1,3,10"
locations_default(#20056,#10000,3,1,3,10)
hasLocation(#20055,#20056)
enclosingStmt(#20055,#20054)
exprContainers(#20055,#20001)
#20057=*
exit_cfg_node(#20057,#20001)
hasLocation(#20057,#20035)
successor(#20046,#20051)
successor(#20054,#20047)
successor(#20053,#20049)
successor(#20051,#20053)
successor(#20049,#20054)
successor(#20047,#20057)
exprs(#20057,14,#20055,0,"test.x")
#20058=@"loc,{#10000},3,1,3,6"
locations_default(#20058,#10000,3,1,3,6)
hasLocation(#20057,#20058)
enclosingStmt(#20057,#20054)
exprContainers(#20057,#20001)
#20059=*
exprs(#20059,79,#20057,0,"test")
hasLocation(#20059,#20023)
enclosingStmt(#20059,#20054)
exprContainers(#20059,#20001)
literals("test","test",#20059)
#20060=@"var;{test};{#20000}"
variables(#20060,"test",#20000)
bind(#20059,#20060)
#20061=*
exprs(#20061,0,#20057,1,"x")
hasLocation(#20061,#20027)
enclosingStmt(#20061,#20054)
exprContainers(#20061,#20001)
literals("x","x",#20061)
#20062=*
exprs(#20062,3,#20055,1,"5")
hasLocation(#20062,#20031)
enclosingStmt(#20062,#20054)
exprContainers(#20062,#20001)
literals("5","5",#20062)
#20063=*
entry_cfg_node(#20063,#20001)
#20064=@"loc,{#10000},1,1,1,0"
locations_default(#20064,#10000,1,1,1,0)
hasLocation(#20063,#20064)
#20065=*
exit_cfg_node(#20065,#20001)
hasLocation(#20065,#20035)
successor(#20054,#20059)
successor(#20062,#20055)
successor(#20061,#20057)
successor(#20059,#20061)
successor(#20057,#20062)
successor(#20055,#20065)
successor(#20037,#20042)
successor(#20045,#20038)
successor(#20044,#20040)
successor(#20042,#20044)
successor(#20040,#20045)
successor(#20038,#20046)
successor(#20055,#20037)
successor(#20038,#20054)
successor(#20063,#20037)
numlines(#10000,3,2,0)
filetype(#10000,"javascript")

View File

@@ -220,129 +220,129 @@ enclosingStmt(#20075,#20074)
exprContainers(#20075,#20001)
literals("?","'\ud800'",#20075)
#20076=*
stmts(#20076,2,#20001,1,"'foo\ud800';")
hasLocation(#20076,#20012)
stmtContainers(#20076,#20001)
#20077=*
exprs(#20077,4,#20076,0,"'foo\ud800'")
hasLocation(#20077,#20036)
enclosingStmt(#20077,#20076)
exprContainers(#20077,#20001)
literals("foo?","'foo\ud800'",#20077)
regexpterm(#20076,14,#20075,0,"?")
#20077=@"loc,{#10000},2,2,2,7"
locations_default(#20077,#10000,2,2,2,7)
hasLocation(#20076,#20077)
regexpConstValue(#20076,"?")
#20078=*
stmts(#20078,2,#20001,2,"'\ud800bar';")
hasLocation(#20078,#20014)
stmts(#20078,2,#20001,1,"'foo\ud800';")
hasLocation(#20078,#20012)
stmtContainers(#20078,#20001)
#20079=*
exprs(#20079,4,#20078,0,"'\ud800bar'")
hasLocation(#20079,#20040)
exprs(#20079,4,#20078,0,"'foo\ud800'")
hasLocation(#20079,#20036)
enclosingStmt(#20079,#20078)
exprContainers(#20079,#20001)
literals("?bar","'\ud800bar'",#20079)
literals("foo?","'foo\ud800'",#20079)
#20080=*
stmts(#20080,2,#20001,3,"'foo\ud800bar';")
hasLocation(#20080,#20016)
stmtContainers(#20080,#20001)
#20081=*
exprs(#20081,4,#20080,0,"'foo\ud800bar'")
hasLocation(#20081,#20044)
enclosingStmt(#20081,#20080)
exprContainers(#20081,#20001)
literals("foo?bar","'foo\ud800bar'",#20081)
regexpterm(#20080,14,#20079,0,"foo?")
#20081=@"loc,{#10000},3,2,3,10"
locations_default(#20081,#10000,3,2,3,10)
hasLocation(#20080,#20081)
regexpConstValue(#20080,"foo?")
#20082=*
stmts(#20082,2,#20001,4,"/\uD800/;")
hasLocation(#20082,#20018)
stmts(#20082,2,#20001,2,"'\ud800bar';")
hasLocation(#20082,#20014)
stmtContainers(#20082,#20001)
#20083=*
exprs(#20083,5,#20082,0,"/\uD800/")
hasLocation(#20083,#20048)
exprs(#20083,4,#20082,0,"'\ud800bar'")
hasLocation(#20083,#20040)
enclosingStmt(#20083,#20082)
exprContainers(#20083,#20001)
literals("/\uD800/","/\uD800/",#20083)
literals("?bar","'\ud800bar'",#20083)
#20084=*
regexpterm(#20084,16,#20083,0,"\uD800")
#20085=@"loc,{#10000},6,2,6,7"
locations_default(#20085,#10000,6,2,6,7)
regexpterm(#20084,14,#20083,0,"?bar")
#20085=@"loc,{#10000},4,2,4,10"
locations_default(#20085,#10000,4,2,4,10)
hasLocation(#20084,#20085)
regexpConstValue(#20084,"?")
regexpConstValue(#20084,"?bar")
#20086=*
stmts(#20086,2,#20001,5,"/foo\ud800/;")
hasLocation(#20086,#20020)
stmts(#20086,2,#20001,3,"'foo\ud800bar';")
hasLocation(#20086,#20016)
stmtContainers(#20086,#20001)
#20087=*
exprs(#20087,5,#20086,0,"/foo\ud800/")
hasLocation(#20087,#20052)
exprs(#20087,4,#20086,0,"'foo\ud800bar'")
hasLocation(#20087,#20044)
enclosingStmt(#20087,#20086)
exprContainers(#20087,#20001)
literals("/foo\ud800/","/foo\ud800/",#20087)
literals("foo?bar","'foo\ud800bar'",#20087)
#20088=*
regexpterm(#20088,1,#20087,0,"foo\ud800")
#20089=@"loc,{#10000},7,2,7,10"
locations_default(#20089,#10000,7,2,7,10)
regexpterm(#20088,14,#20087,0,"foo?bar")
#20089=@"loc,{#10000},5,2,5,13"
locations_default(#20089,#10000,5,2,5,13)
hasLocation(#20088,#20089)
regexpConstValue(#20088,"foo?bar")
#20090=*
regexpterm(#20090,14,#20088,0,"f")
#20091=@"loc,{#10000},7,2,7,2"
locations_default(#20091,#10000,7,2,7,2)
hasLocation(#20090,#20091)
regexpConstValue(#20090,"f")
stmts(#20090,2,#20001,4,"/\uD800/;")
hasLocation(#20090,#20018)
stmtContainers(#20090,#20001)
#20091=*
exprs(#20091,5,#20090,0,"/\uD800/")
hasLocation(#20091,#20048)
enclosingStmt(#20091,#20090)
exprContainers(#20091,#20001)
literals("/\uD800/","/\uD800/",#20091)
#20092=*
regexpterm(#20092,14,#20088,1,"o")
#20093=@"loc,{#10000},7,3,7,3"
locations_default(#20093,#10000,7,3,7,3)
regexpterm(#20092,16,#20091,0,"\uD800")
#20093=@"loc,{#10000},6,2,6,7"
locations_default(#20093,#10000,6,2,6,7)
hasLocation(#20092,#20093)
regexpConstValue(#20092,"o")
regexpConstValue(#20092,"?")
#20094=*
regexpterm(#20094,14,#20088,2,"o")
#20095=@"loc,{#10000},7,4,7,4"
locations_default(#20095,#10000,7,4,7,4)
hasLocation(#20094,#20095)
regexpConstValue(#20094,"o")
stmts(#20094,2,#20001,5,"/foo\ud800/;")
hasLocation(#20094,#20020)
stmtContainers(#20094,#20001)
#20095=*
exprs(#20095,5,#20094,0,"/foo\ud800/")
hasLocation(#20095,#20052)
enclosingStmt(#20095,#20094)
exprContainers(#20095,#20001)
literals("/foo\ud800/","/foo\ud800/",#20095)
#20096=*
regexpterm(#20096,16,#20088,3,"\ud800")
#20097=@"loc,{#10000},7,5,7,10"
locations_default(#20097,#10000,7,5,7,10)
regexpterm(#20096,1,#20095,0,"foo\ud800")
#20097=@"loc,{#10000},7,2,7,10"
locations_default(#20097,#10000,7,2,7,10)
hasLocation(#20096,#20097)
regexpConstValue(#20096,"?")
#20098=*
stmts(#20098,2,#20001,6,"/\ud800bar/;")
hasLocation(#20098,#20022)
stmtContainers(#20098,#20001)
#20099=*
exprs(#20099,5,#20098,0,"/\ud800bar/")
hasLocation(#20099,#20056)
enclosingStmt(#20099,#20098)
exprContainers(#20099,#20001)
literals("/\ud800bar/","/\ud800bar/",#20099)
regexpterm(#20098,14,#20096,0,"foo")
#20099=@"loc,{#10000},7,2,7,4"
locations_default(#20099,#10000,7,2,7,4)
hasLocation(#20098,#20099)
regexpConstValue(#20098,"foo")
#20100=*
regexpterm(#20100,1,#20099,0,"\ud800bar")
#20101=@"loc,{#10000},8,2,8,10"
locations_default(#20101,#10000,8,2,8,10)
regexpterm(#20100,16,#20096,1,"\ud800")
#20101=@"loc,{#10000},7,5,7,10"
locations_default(#20101,#10000,7,5,7,10)
hasLocation(#20100,#20101)
regexpConstValue(#20100,"?")
#20102=*
regexpterm(#20102,16,#20100,0,"\ud800")
#20103=@"loc,{#10000},8,2,8,7"
locations_default(#20103,#10000,8,2,8,7)
hasLocation(#20102,#20103)
regexpConstValue(#20102,"?")
stmts(#20102,2,#20001,6,"/\ud800bar/;")
hasLocation(#20102,#20022)
stmtContainers(#20102,#20001)
#20103=*
exprs(#20103,5,#20102,0,"/\ud800bar/")
hasLocation(#20103,#20056)
enclosingStmt(#20103,#20102)
exprContainers(#20103,#20001)
literals("/\ud800bar/","/\ud800bar/",#20103)
#20104=*
regexpterm(#20104,14,#20100,1,"b")
#20105=@"loc,{#10000},8,8,8,8"
locations_default(#20105,#10000,8,8,8,8)
regexpterm(#20104,1,#20103,0,"\ud800bar")
#20105=@"loc,{#10000},8,2,8,10"
locations_default(#20105,#10000,8,2,8,10)
hasLocation(#20104,#20105)
regexpConstValue(#20104,"b")
#20106=*
regexpterm(#20106,14,#20100,2,"a")
#20107=@"loc,{#10000},8,9,8,9"
locations_default(#20107,#10000,8,9,8,9)
regexpterm(#20106,16,#20104,0,"\ud800")
#20107=@"loc,{#10000},8,2,8,7"
locations_default(#20107,#10000,8,2,8,7)
hasLocation(#20106,#20107)
regexpConstValue(#20106,"a")
regexpConstValue(#20106,"?")
#20108=*
regexpterm(#20108,14,#20100,3,"r")
#20109=@"loc,{#10000},8,10,8,10"
locations_default(#20109,#10000,8,10,8,10)
regexpterm(#20108,14,#20104,1,"bar")
#20109=@"loc,{#10000},8,8,8,10"
locations_default(#20109,#10000,8,8,8,10)
hasLocation(#20108,#20109)
regexpConstValue(#20108,"r")
regexpConstValue(#20108,"bar")
#20110=*
stmts(#20110,2,#20001,7,"/foo\ud800bar/;")
hasLocation(#20110,#20024)
@@ -359,95 +359,83 @@ regexpterm(#20112,1,#20111,0,"foo\ud800bar")
locations_default(#20113,#10000,9,2,9,13)
hasLocation(#20112,#20113)
#20114=*
regexpterm(#20114,14,#20112,0,"f")
#20115=@"loc,{#10000},9,2,9,2"
locations_default(#20115,#10000,9,2,9,2)
regexpterm(#20114,14,#20112,0,"foo")
#20115=@"loc,{#10000},9,2,9,4"
locations_default(#20115,#10000,9,2,9,4)
hasLocation(#20114,#20115)
regexpConstValue(#20114,"f")
regexpConstValue(#20114,"foo")
#20116=*
regexpterm(#20116,14,#20112,1,"o")
#20117=@"loc,{#10000},9,3,9,3"
locations_default(#20117,#10000,9,3,9,3)
regexpterm(#20116,16,#20112,1,"\ud800")
#20117=@"loc,{#10000},9,5,9,10"
locations_default(#20117,#10000,9,5,9,10)
hasLocation(#20116,#20117)
regexpConstValue(#20116,"o")
regexpConstValue(#20116,"?")
#20118=*
regexpterm(#20118,14,#20112,2,"o")
#20119=@"loc,{#10000},9,4,9,4"
locations_default(#20119,#10000,9,4,9,4)
regexpterm(#20118,14,#20112,2,"bar")
#20119=@"loc,{#10000},9,11,9,13"
locations_default(#20119,#10000,9,11,9,13)
hasLocation(#20118,#20119)
regexpConstValue(#20118,"o")
regexpConstValue(#20118,"bar")
#20120=*
regexpterm(#20120,16,#20112,3,"\ud800")
#20121=@"loc,{#10000},9,5,9,10"
locations_default(#20121,#10000,9,5,9,10)
hasLocation(#20120,#20121)
regexpConstValue(#20120,"?")
stmts(#20120,2,#20001,8,"'\udc00\ud800';")
hasLocation(#20120,#20027)
stmtContainers(#20120,#20001)
#20121=*
exprs(#20121,4,#20120,0,"'\udc00\ud800'")
hasLocation(#20121,#20064)
enclosingStmt(#20121,#20120)
exprContainers(#20121,#20001)
literals("??","'\udc00\ud800'",#20121)
#20122=*
regexpterm(#20122,14,#20112,4,"b")
#20123=@"loc,{#10000},9,11,9,11"
locations_default(#20123,#10000,9,11,9,11)
regexpterm(#20122,14,#20121,0,"??")
#20123=@"loc,{#10000},11,2,11,13"
locations_default(#20123,#10000,11,2,11,13)
hasLocation(#20122,#20123)
regexpConstValue(#20122,"b")
regexpConstValue(#20122,"??")
#20124=*
regexpterm(#20124,14,#20112,5,"a")
#20125=@"loc,{#10000},9,12,9,12"
locations_default(#20125,#10000,9,12,9,12)
hasLocation(#20124,#20125)
regexpConstValue(#20124,"a")
stmts(#20124,2,#20001,9,"'\uD834\uDF06';")
hasLocation(#20124,#20030)
stmtContainers(#20124,#20001)
#20125=*
exprs(#20125,4,#20124,0,"'\uD834\uDF06'")
hasLocation(#20125,#20068)
enclosingStmt(#20125,#20124)
exprContainers(#20125,#20001)
literals("𝌆","'\uD834\uDF06'",#20125)
#20126=*
regexpterm(#20126,14,#20112,6,"r")
#20127=@"loc,{#10000},9,13,9,13"
locations_default(#20127,#10000,9,13,9,13)
regexpterm(#20126,14,#20125,0,"𝌆")
#20127=@"loc,{#10000},13,2,13,13"
locations_default(#20127,#10000,13,2,13,13)
hasLocation(#20126,#20127)
regexpConstValue(#20126,"r")
regexpConstValue(#20126,"𝌆")
#20128=*
stmts(#20128,2,#20001,8,"'\udc00\ud800';")
hasLocation(#20128,#20027)
stmtContainers(#20128,#20001)
#20129=*
exprs(#20129,4,#20128,0,"'\udc00\ud800'")
hasLocation(#20129,#20064)
enclosingStmt(#20129,#20128)
exprContainers(#20129,#20001)
literals("??","'\udc00\ud800'",#20129)
entry_cfg_node(#20128,#20001)
#20129=@"loc,{#10000},1,1,1,0"
locations_default(#20129,#10000,1,1,1,0)
hasLocation(#20128,#20129)
#20130=*
stmts(#20130,2,#20001,9,"'\uD834\uDF06';")
hasLocation(#20130,#20030)
stmtContainers(#20130,#20001)
#20131=*
exprs(#20131,4,#20130,0,"'\uD834\uDF06'")
hasLocation(#20131,#20068)
enclosingStmt(#20131,#20130)
exprContainers(#20131,#20001)
literals("𝌆","'\uD834\uDF06'",#20131)
#20132=*
entry_cfg_node(#20132,#20001)
#20133=@"loc,{#10000},1,1,1,0"
locations_default(#20133,#10000,1,1,1,0)
hasLocation(#20132,#20133)
#20134=*
exit_cfg_node(#20134,#20001)
hasLocation(#20134,#20072)
successor(#20130,#20131)
successor(#20131,#20134)
successor(#20128,#20129)
successor(#20129,#20130)
exit_cfg_node(#20130,#20001)
hasLocation(#20130,#20072)
successor(#20124,#20125)
successor(#20125,#20130)
successor(#20120,#20121)
successor(#20121,#20124)
successor(#20110,#20111)
successor(#20111,#20128)
successor(#20098,#20099)
successor(#20099,#20110)
successor(#20111,#20120)
successor(#20102,#20103)
successor(#20103,#20110)
successor(#20094,#20095)
successor(#20095,#20102)
successor(#20090,#20091)
successor(#20091,#20094)
successor(#20086,#20087)
successor(#20087,#20098)
successor(#20087,#20090)
successor(#20082,#20083)
successor(#20083,#20086)
successor(#20080,#20081)
successor(#20081,#20082)
successor(#20078,#20079)
successor(#20079,#20080)
successor(#20076,#20077)
successor(#20077,#20078)
successor(#20079,#20082)
successor(#20074,#20075)
successor(#20075,#20076)
successor(#20132,#20074)
successor(#20075,#20078)
successor(#20128,#20074)
numlines(#10000,13,10,3)
filetype(#10000,"javascript")

View File

@@ -36,15 +36,21 @@ enclosingStmt(#20008,#20007)
exprContainers(#20008,#20001)
literals("Semmlé","""Semmlé""",#20008)
#20009=*
entry_cfg_node(#20009,#20001)
#20010=@"loc,{#10000},1,1,1,0"
locations_default(#20010,#10000,1,1,1,0)
regexpterm(#20009,14,#20008,0,"Semmlé")
#20010=@"loc,{#10000},1,2,1,7"
locations_default(#20010,#10000,1,2,1,7)
hasLocation(#20009,#20010)
regexpConstValue(#20009,"Semmlé")
#20011=*
exit_cfg_node(#20011,#20001)
hasLocation(#20011,#20006)
entry_cfg_node(#20011,#20001)
#20012=@"loc,{#10000},1,1,1,0"
locations_default(#20012,#10000,1,1,1,0)
hasLocation(#20011,#20012)
#20013=*
exit_cfg_node(#20013,#20001)
hasLocation(#20013,#20006)
successor(#20007,#20008)
successor(#20008,#20011)
successor(#20009,#20007)
successor(#20008,#20013)
successor(#20011,#20007)
numlines(#10000,1,1,0)
filetype(#10000,"javascript")

View File

@@ -288,253 +288,277 @@ enclosingStmt(#20106,#20099)
exprContainers(#20106,#20001)
literals("a","""a""",#20106)
#20107=*
exprs(#20107,4,#20104,1,"""ab""")
hasLocation(#20107,#20015)
enclosingStmt(#20107,#20099)
exprContainers(#20107,#20001)
literals("ab","""ab""",#20107)
#20108=*
exprs(#20108,4,#20104,2,"""abc""")
hasLocation(#20108,#20019)
enclosingStmt(#20108,#20099)
exprContainers(#20108,#20001)
literals("abc","""abc""",#20108)
arraySize(#20104,3)
regexpterm(#20107,14,#20106,0,"a")
#20108=@"loc,{#10000},1,3,1,3"
locations_default(#20108,#10000,1,3,1,3)
hasLocation(#20107,#20108)
regexpConstValue(#20107,"a")
#20109=*
exprs(#20109,0,#20102,1,"map")
hasLocation(#20109,#20025)
exprs(#20109,4,#20104,1,"""ab""")
hasLocation(#20109,#20015)
enclosingStmt(#20109,#20099)
exprContainers(#20109,#20001)
literals("map","map",#20109)
literals("ab","""ab""",#20109)
#20110=*
exprs(#20110,65,#20100,0,"s => s.length")
#20111=@"loc,{#10000},1,24,1,36"
locations_default(#20111,#10000,1,24,1,36)
regexpterm(#20110,14,#20109,0,"ab")
#20111=@"loc,{#10000},1,8,1,9"
locations_default(#20111,#10000,1,8,1,9)
hasLocation(#20110,#20111)
enclosingStmt(#20110,#20099)
exprContainers(#20110,#20001)
regexpConstValue(#20110,"ab")
#20112=*
scopes(#20112,1)
scopenodes(#20110,#20112)
scopenesting(#20112,#20000)
#20113=@"var;{s};{#20112}"
variables(#20113,"s",#20112)
#20114=*
exprs(#20114,78,#20110,0,"s")
hasLocation(#20114,#20029)
exprContainers(#20114,#20110)
literals("s","s",#20114)
decl(#20114,#20113)
exprs(#20112,4,#20104,2,"""abc""")
hasLocation(#20112,#20019)
enclosingStmt(#20112,#20099)
exprContainers(#20112,#20001)
literals("abc","""abc""",#20112)
#20113=*
regexpterm(#20113,14,#20112,0,"abc")
#20114=@"loc,{#10000},1,14,1,16"
locations_default(#20114,#10000,1,14,1,16)
hasLocation(#20113,#20114)
regexpConstValue(#20113,"abc")
arraySize(#20104,3)
#20115=*
exprs(#20115,14,#20110,-2,"s.length")
#20116=@"loc,{#10000},1,29,1,36"
locations_default(#20116,#10000,1,29,1,36)
hasLocation(#20115,#20116)
exprContainers(#20115,#20110)
#20117=*
exprs(#20117,79,#20115,0,"s")
hasLocation(#20117,#20033)
exprContainers(#20117,#20110)
literals("s","s",#20117)
bind(#20117,#20113)
exprs(#20115,0,#20102,1,"map")
hasLocation(#20115,#20025)
enclosingStmt(#20115,#20099)
exprContainers(#20115,#20001)
literals("map","map",#20115)
#20116=*
exprs(#20116,65,#20100,0,"s => s.length")
#20117=@"loc,{#10000},1,24,1,36"
locations_default(#20117,#10000,1,24,1,36)
hasLocation(#20116,#20117)
enclosingStmt(#20116,#20099)
exprContainers(#20116,#20001)
#20118=*
exprs(#20118,0,#20115,1,"length")
hasLocation(#20118,#20037)
exprContainers(#20118,#20110)
literals("length","length",#20118)
#20119=*
stmts(#20119,2,#20001,1,"setInte ... 1000);")
hasLocation(#20119,#20005)
stmtContainers(#20119,#20001)
scopes(#20118,1)
scopenodes(#20116,#20118)
scopenesting(#20118,#20000)
#20119=@"var;{s};{#20118}"
variables(#20119,"s",#20118)
#20120=*
exprs(#20120,13,#20119,0,"setInte ... , 1000)")
#20121=@"loc,{#10000},2,1,2,30"
locations_default(#20121,#10000,2,1,2,30)
hasLocation(#20120,#20121)
enclosingStmt(#20120,#20119)
exprContainers(#20120,#20001)
#20122=*
exprs(#20122,79,#20120,-1,"setInterval")
hasLocation(#20122,#20043)
enclosingStmt(#20122,#20119)
exprContainers(#20122,#20001)
literals("setInterval","setInterval",#20122)
#20123=@"var;{setInterval};{#20000}"
variables(#20123,"setInterval",#20000)
bind(#20122,#20123)
exprs(#20120,78,#20116,0,"s")
hasLocation(#20120,#20029)
exprContainers(#20120,#20116)
literals("s","s",#20120)
decl(#20120,#20119)
#20121=*
exprs(#20121,14,#20116,-2,"s.length")
#20122=@"loc,{#10000},1,29,1,36"
locations_default(#20122,#10000,1,29,1,36)
hasLocation(#20121,#20122)
exprContainers(#20121,#20116)
#20123=*
exprs(#20123,79,#20121,0,"s")
hasLocation(#20123,#20033)
exprContainers(#20123,#20116)
literals("s","s",#20123)
bind(#20123,#20119)
#20124=*
exprs(#20124,65,#20120,0,"() => ++cnt")
#20125=@"loc,{#10000},2,13,2,23"
locations_default(#20125,#10000,2,13,2,23)
hasLocation(#20124,#20125)
enclosingStmt(#20124,#20119)
exprContainers(#20124,#20001)
exprs(#20124,0,#20121,1,"length")
hasLocation(#20124,#20037)
exprContainers(#20124,#20116)
literals("length","length",#20124)
#20125=*
stmts(#20125,2,#20001,1,"setInte ... 1000);")
hasLocation(#20125,#20005)
stmtContainers(#20125,#20001)
#20126=*
scopes(#20126,1)
scopenodes(#20124,#20126)
scopenesting(#20126,#20000)
#20127=*
exprs(#20127,59,#20124,-2,"++cnt")
#20128=@"loc,{#10000},2,19,2,23"
locations_default(#20128,#10000,2,19,2,23)
hasLocation(#20127,#20128)
exprContainers(#20127,#20124)
#20129=*
exprs(#20129,79,#20127,0,"cnt")
hasLocation(#20129,#20055)
exprContainers(#20129,#20124)
literals("cnt","cnt",#20129)
#20130=@"var;{cnt};{#20000}"
variables(#20130,"cnt",#20000)
bind(#20129,#20130)
#20131=*
exprs(#20131,3,#20120,1,"1000")
hasLocation(#20131,#20059)
enclosingStmt(#20131,#20119)
exprContainers(#20131,#20001)
literals("1000","1000",#20131)
exprs(#20126,13,#20125,0,"setInte ... , 1000)")
#20127=@"loc,{#10000},2,1,2,30"
locations_default(#20127,#10000,2,1,2,30)
hasLocation(#20126,#20127)
enclosingStmt(#20126,#20125)
exprContainers(#20126,#20001)
#20128=*
exprs(#20128,79,#20126,-1,"setInterval")
hasLocation(#20128,#20043)
enclosingStmt(#20128,#20125)
exprContainers(#20128,#20001)
literals("setInterval","setInterval",#20128)
#20129=@"var;{setInterval};{#20000}"
variables(#20129,"setInterval",#20000)
bind(#20128,#20129)
#20130=*
exprs(#20130,65,#20126,0,"() => ++cnt")
#20131=@"loc,{#10000},2,13,2,23"
locations_default(#20131,#10000,2,13,2,23)
hasLocation(#20130,#20131)
enclosingStmt(#20130,#20125)
exprContainers(#20130,#20001)
#20132=*
stmts(#20132,2,#20001,2,"setTime ... 60000);")
hasLocation(#20132,#20007)
stmtContainers(#20132,#20001)
scopes(#20132,1)
scopenodes(#20130,#20132)
scopenesting(#20132,#20000)
#20133=*
exprs(#20133,13,#20132,0,"setTime ... 60000)")
#20134=@"loc,{#10000},3,1,3,47"
locations_default(#20134,#10000,3,1,3,47)
exprs(#20133,59,#20130,-2,"++cnt")
#20134=@"loc,{#10000},2,19,2,23"
locations_default(#20134,#10000,2,19,2,23)
hasLocation(#20133,#20134)
enclosingStmt(#20133,#20132)
exprContainers(#20133,#20001)
exprContainers(#20133,#20130)
#20135=*
exprs(#20135,79,#20133,-1,"setTimeout")
hasLocation(#20135,#20065)
enclosingStmt(#20135,#20132)
exprContainers(#20135,#20001)
literals("setTimeout","setTimeout",#20135)
#20136=@"var;{setTimeout};{#20000}"
variables(#20136,"setTimeout",#20000)
exprs(#20135,79,#20133,0,"cnt")
hasLocation(#20135,#20055)
exprContainers(#20135,#20130)
literals("cnt","cnt",#20135)
#20136=@"var;{cnt};{#20000}"
variables(#20136,"cnt",#20000)
bind(#20135,#20136)
#20137=*
exprs(#20137,65,#20133,0,"() => { ... p!""); }")
#20138=@"loc,{#10000},3,12,3,39"
locations_default(#20138,#10000,3,12,3,39)
hasLocation(#20137,#20138)
enclosingStmt(#20137,#20132)
exprs(#20137,3,#20126,1,"1000")
hasLocation(#20137,#20059)
enclosingStmt(#20137,#20125)
exprContainers(#20137,#20001)
literals("1000","1000",#20137)
#20138=*
stmts(#20138,2,#20001,2,"setTime ... 60000);")
hasLocation(#20138,#20007)
stmtContainers(#20138,#20001)
#20139=*
scopes(#20139,1)
scopenodes(#20137,#20139)
scopenesting(#20139,#20000)
#20140=*
stmts(#20140,1,#20137,-2,"{ alert ... p!""); }")
#20141=@"loc,{#10000},3,18,3,39"
locations_default(#20141,#10000,3,18,3,39)
hasLocation(#20140,#20141)
stmtContainers(#20140,#20137)
#20142=*
stmts(#20142,2,#20140,0,"alert(""Wake up!"");")
#20143=@"loc,{#10000},3,20,3,37"
locations_default(#20143,#10000,3,20,3,37)
hasLocation(#20142,#20143)
stmtContainers(#20142,#20137)
#20144=*
exprs(#20144,13,#20142,0,"alert(""Wake up!"")")
#20145=@"loc,{#10000},3,20,3,36"
locations_default(#20145,#10000,3,20,3,36)
hasLocation(#20144,#20145)
enclosingStmt(#20144,#20142)
exprContainers(#20144,#20137)
exprs(#20139,13,#20138,0,"setTime ... 60000)")
#20140=@"loc,{#10000},3,1,3,47"
locations_default(#20140,#10000,3,1,3,47)
hasLocation(#20139,#20140)
enclosingStmt(#20139,#20138)
exprContainers(#20139,#20001)
#20141=*
exprs(#20141,79,#20139,-1,"setTimeout")
hasLocation(#20141,#20065)
enclosingStmt(#20141,#20138)
exprContainers(#20141,#20001)
literals("setTimeout","setTimeout",#20141)
#20142=@"var;{setTimeout};{#20000}"
variables(#20142,"setTimeout",#20000)
bind(#20141,#20142)
#20143=*
exprs(#20143,65,#20139,0,"() => { ... p!""); }")
#20144=@"loc,{#10000},3,12,3,39"
locations_default(#20144,#10000,3,12,3,39)
hasLocation(#20143,#20144)
enclosingStmt(#20143,#20138)
exprContainers(#20143,#20001)
#20145=*
scopes(#20145,1)
scopenodes(#20143,#20145)
scopenesting(#20145,#20000)
#20146=*
exprs(#20146,79,#20144,-1,"alert")
hasLocation(#20146,#20077)
enclosingStmt(#20146,#20142)
exprContainers(#20146,#20137)
literals("alert","alert",#20146)
#20147=@"var;{alert};{#20000}"
variables(#20147,"alert",#20000)
bind(#20146,#20147)
stmts(#20146,1,#20143,-2,"{ alert ... p!""); }")
#20147=@"loc,{#10000},3,18,3,39"
locations_default(#20147,#10000,3,18,3,39)
hasLocation(#20146,#20147)
stmtContainers(#20146,#20143)
#20148=*
exprs(#20148,4,#20144,0,"""Wake up!""")
hasLocation(#20148,#20081)
enclosingStmt(#20148,#20142)
exprContainers(#20148,#20137)
literals("Wake up!","""Wake up!""",#20148)
#20149=*
exprs(#20149,3,#20133,1,"60000")
hasLocation(#20149,#20091)
enclosingStmt(#20149,#20132)
exprContainers(#20149,#20001)
literals("60000","60000",#20149)
stmts(#20148,2,#20146,0,"alert(""Wake up!"");")
#20149=@"loc,{#10000},3,20,3,37"
locations_default(#20149,#10000,3,20,3,37)
hasLocation(#20148,#20149)
stmtContainers(#20148,#20143)
#20150=*
entry_cfg_node(#20150,#20001)
#20151=@"loc,{#10000},1,1,1,0"
locations_default(#20151,#10000,1,1,1,0)
exprs(#20150,13,#20148,0,"alert(""Wake up!"")")
#20151=@"loc,{#10000},3,20,3,36"
locations_default(#20151,#10000,3,20,3,36)
hasLocation(#20150,#20151)
enclosingStmt(#20150,#20148)
exprContainers(#20150,#20143)
#20152=*
exit_cfg_node(#20152,#20001)
hasLocation(#20152,#20097)
successor(#20132,#20135)
successor(#20149,#20133)
successor(#20137,#20149)
#20153=*
entry_cfg_node(#20153,#20137)
#20154=@"loc,{#10000},3,12,3,11"
locations_default(#20154,#10000,3,12,3,11)
hasLocation(#20153,#20154)
exprs(#20152,79,#20150,-1,"alert")
hasLocation(#20152,#20077)
enclosingStmt(#20152,#20148)
exprContainers(#20152,#20143)
literals("alert","alert",#20152)
#20153=@"var;{alert};{#20000}"
variables(#20153,"alert",#20000)
bind(#20152,#20153)
#20154=*
exprs(#20154,4,#20150,0,"""Wake up!""")
hasLocation(#20154,#20081)
enclosingStmt(#20154,#20148)
exprContainers(#20154,#20143)
literals("Wake up!","""Wake up!""",#20154)
#20155=*
exit_cfg_node(#20155,#20137)
#20156=@"loc,{#10000},3,40,3,39"
locations_default(#20156,#10000,3,40,3,39)
regexpterm(#20155,14,#20154,0,"Wake up!")
#20156=@"loc,{#10000},3,27,3,34"
locations_default(#20156,#10000,3,27,3,34)
hasLocation(#20155,#20156)
successor(#20140,#20142)
successor(#20142,#20146)
successor(#20148,#20144)
successor(#20146,#20148)
successor(#20144,#20155)
successor(#20153,#20140)
successor(#20135,#20137)
successor(#20133,#20152)
successor(#20119,#20122)
successor(#20131,#20120)
successor(#20124,#20131)
regexpConstValue(#20155,"Wake up!")
#20157=*
entry_cfg_node(#20157,#20124)
#20158=@"loc,{#10000},2,13,2,12"
locations_default(#20158,#10000,2,13,2,12)
hasLocation(#20157,#20158)
#20159=*
exit_cfg_node(#20159,#20124)
#20160=@"loc,{#10000},2,24,2,23"
locations_default(#20160,#10000,2,24,2,23)
hasLocation(#20159,#20160)
successor(#20129,#20127)
successor(#20127,#20159)
successor(#20157,#20129)
successor(#20122,#20124)
successor(#20120,#20132)
successor(#20099,#20104)
successor(#20110,#20100)
exprs(#20157,3,#20139,1,"60000")
hasLocation(#20157,#20091)
enclosingStmt(#20157,#20138)
exprContainers(#20157,#20001)
literals("60000","60000",#20157)
#20158=*
entry_cfg_node(#20158,#20001)
#20159=@"loc,{#10000},1,1,1,0"
locations_default(#20159,#10000,1,1,1,0)
hasLocation(#20158,#20159)
#20160=*
exit_cfg_node(#20160,#20001)
hasLocation(#20160,#20097)
successor(#20138,#20141)
successor(#20157,#20139)
successor(#20143,#20157)
#20161=*
entry_cfg_node(#20161,#20110)
#20162=@"loc,{#10000},1,24,1,23"
locations_default(#20162,#10000,1,24,1,23)
entry_cfg_node(#20161,#20143)
#20162=@"loc,{#10000},3,12,3,11"
locations_default(#20162,#10000,3,12,3,11)
hasLocation(#20161,#20162)
#20163=*
exit_cfg_node(#20163,#20110)
#20164=@"loc,{#10000},1,37,1,36"
locations_default(#20164,#10000,1,37,1,36)
exit_cfg_node(#20163,#20143)
#20164=@"loc,{#10000},3,40,3,39"
locations_default(#20164,#10000,3,40,3,39)
hasLocation(#20163,#20164)
successor(#20118,#20115)
successor(#20117,#20118)
successor(#20115,#20163)
successor(#20114,#20117)
successor(#20161,#20114)
successor(#20109,#20102)
successor(#20146,#20148)
successor(#20148,#20152)
successor(#20154,#20150)
successor(#20152,#20154)
successor(#20150,#20163)
successor(#20161,#20146)
successor(#20141,#20143)
successor(#20139,#20160)
successor(#20125,#20128)
successor(#20137,#20126)
successor(#20130,#20137)
#20165=*
entry_cfg_node(#20165,#20130)
#20166=@"loc,{#10000},2,13,2,12"
locations_default(#20166,#10000,2,13,2,12)
hasLocation(#20165,#20166)
#20167=*
exit_cfg_node(#20167,#20130)
#20168=@"loc,{#10000},2,24,2,23"
locations_default(#20168,#10000,2,24,2,23)
hasLocation(#20167,#20168)
successor(#20135,#20133)
successor(#20133,#20167)
successor(#20165,#20135)
successor(#20128,#20130)
successor(#20126,#20138)
successor(#20099,#20104)
successor(#20116,#20100)
#20169=*
entry_cfg_node(#20169,#20116)
#20170=@"loc,{#10000},1,24,1,23"
locations_default(#20170,#10000,1,24,1,23)
hasLocation(#20169,#20170)
#20171=*
exit_cfg_node(#20171,#20116)
#20172=@"loc,{#10000},1,37,1,36"
locations_default(#20172,#10000,1,37,1,36)
hasLocation(#20171,#20172)
successor(#20124,#20121)
successor(#20123,#20124)
successor(#20121,#20171)
successor(#20120,#20123)
successor(#20169,#20120)
successor(#20115,#20102)
successor(#20104,#20106)
successor(#20108,#20109)
successor(#20107,#20108)
successor(#20106,#20107)
successor(#20102,#20110)
successor(#20100,#20119)
successor(#20150,#20099)
successor(#20112,#20115)
successor(#20109,#20112)
successor(#20106,#20109)
successor(#20102,#20116)
successor(#20100,#20125)
successor(#20158,#20099)
numlines(#10000,3,3,0)
filetype(#10000,"javascript")

View File

@@ -177,74 +177,80 @@ hasLocation(#20056,#20031)
enclosingStmt(#20056,#20054)
exprContainers(#20056,#20048)
literals("A","""A""",#20056)
#20057=*
regexpterm(#20057,14,#20056,0,"A")
#20058=@"loc,{#10000},3,13,3,13"
locations_default(#20058,#10000,3,13,3,13)
hasLocation(#20057,#20058)
regexpConstValue(#20057,"A")
isMethod(#20045)
isStatic(#20045)
#20057=*
properties(#20057,#20042,3,0,"constructor() {}")
#20058=@"loc,{#10000},1,9,1,8"
locations_default(#20058,#10000,1,9,1,8)
hasLocation(#20057,#20058)
#20059=*
exprs(#20059,0,#20057,0,"constructor")
hasLocation(#20059,#20058)
enclosingStmt(#20059,#20042)
exprContainers(#20059,#20001)
literals("constructor","constructor",#20059)
#20060=*
exprs(#20060,9,#20057,1,"() {}")
hasLocation(#20060,#20058)
enclosingStmt(#20060,#20042)
exprContainers(#20060,#20001)
properties(#20059,#20042,3,0,"constructor() {}")
#20060=@"loc,{#10000},1,9,1,8"
locations_default(#20060,#10000,1,9,1,8)
hasLocation(#20059,#20060)
#20061=*
scopes(#20061,1)
scopenodes(#20060,#20061)
scopenesting(#20061,#20044)
#20062=@"var;{arguments};{#20061}"
variables(#20062,"arguments",#20061)
isArgumentsObject(#20062)
exprs(#20061,0,#20059,0,"constructor")
hasLocation(#20061,#20060)
enclosingStmt(#20061,#20042)
exprContainers(#20061,#20001)
literals("constructor","constructor",#20061)
#20062=*
exprs(#20062,9,#20059,1,"() {}")
hasLocation(#20062,#20060)
enclosingStmt(#20062,#20042)
exprContainers(#20062,#20001)
#20063=*
stmts(#20063,1,#20060,-2,"{}")
hasLocation(#20063,#20058)
stmtContainers(#20063,#20060)
isMethod(#20057)
#20064=*
entry_cfg_node(#20064,#20001)
#20065=@"loc,{#10000},1,1,1,0"
locations_default(#20065,#10000,1,1,1,0)
hasLocation(#20064,#20065)
scopes(#20063,1)
scopenodes(#20062,#20063)
scopenesting(#20063,#20044)
#20064=@"var;{arguments};{#20063}"
variables(#20064,"arguments",#20063)
isArgumentsObject(#20064)
#20065=*
stmts(#20065,1,#20062,-2,"{}")
hasLocation(#20065,#20060)
stmtContainers(#20065,#20062)
isMethod(#20059)
#20066=*
exit_cfg_node(#20066,#20001)
hasLocation(#20066,#20038)
successor(#20060,#20057)
#20067=*
entry_cfg_node(#20067,#20060)
hasLocation(#20067,#20058)
entry_cfg_node(#20066,#20001)
#20067=@"loc,{#10000},1,1,1,0"
locations_default(#20067,#10000,1,1,1,0)
hasLocation(#20066,#20067)
#20068=*
exit_cfg_node(#20068,#20060)
hasLocation(#20068,#20058)
successor(#20063,#20068)
successor(#20067,#20063)
successor(#20059,#20060)
successor(#20057,#20042)
successor(#20048,#20045)
exit_cfg_node(#20068,#20001)
hasLocation(#20068,#20038)
successor(#20062,#20059)
#20069=*
entry_cfg_node(#20069,#20048)
#20070=@"loc,{#10000},2,19,2,18"
locations_default(#20070,#10000,2,19,2,18)
hasLocation(#20069,#20070)
entry_cfg_node(#20069,#20062)
hasLocation(#20069,#20060)
#20070=*
exit_cfg_node(#20070,#20062)
hasLocation(#20070,#20060)
successor(#20065,#20070)
successor(#20069,#20065)
successor(#20061,#20062)
successor(#20059,#20042)
successor(#20048,#20045)
#20071=*
exit_cfg_node(#20071,#20048)
#20072=@"loc,{#10000},4,4,4,3"
locations_default(#20072,#10000,4,4,4,3)
entry_cfg_node(#20071,#20048)
#20072=@"loc,{#10000},2,19,2,18"
locations_default(#20072,#10000,2,19,2,18)
hasLocation(#20071,#20072)
#20073=*
exit_cfg_node(#20073,#20048)
#20074=@"loc,{#10000},4,4,4,3"
locations_default(#20074,#10000,4,4,4,3)
hasLocation(#20073,#20074)
successor(#20052,#20056)
successor(#20056,#20054)
successor(#20054,#20071)
successor(#20069,#20052)
successor(#20054,#20073)
successor(#20071,#20052)
successor(#20047,#20048)
successor(#20045,#20059)
successor(#20045,#20061)
successor(#20043,#20047)
successor(#20042,#20066)
successor(#20064,#20043)
successor(#20042,#20068)
successor(#20066,#20043)
numlines(#10000,5,5,0)
filetype(#10000,"javascript")

View File

@@ -64,15 +64,21 @@ enclosingStmt(#20018,#20017)
exprContainers(#20018,#20001)
literals("foo","'foo'",#20018)
#20019=*
entry_cfg_node(#20019,#20001)
#20020=@"loc,{#10000},1,1,1,0"
locations_default(#20020,#10000,1,1,1,0)
regexpterm(#20019,14,#20018,0,"foo")
#20020=@"loc,{#10000},1,16,1,18"
locations_default(#20020,#10000,1,16,1,18)
hasLocation(#20019,#20020)
regexpConstValue(#20019,"foo")
#20021=*
exit_cfg_node(#20021,#20001)
hasLocation(#20021,#20015)
entry_cfg_node(#20021,#20001)
#20022=@"loc,{#10000},1,1,1,0"
locations_default(#20022,#10000,1,1,1,0)
hasLocation(#20021,#20022)
#20023=*
exit_cfg_node(#20023,#20001)
hasLocation(#20023,#20015)
successor(#20017,#20018)
successor(#20018,#20021)
successor(#20019,#20017)
successor(#20018,#20023)
successor(#20021,#20017)
numlines(#10000,1,1,0)
filetype(#10000,"javascript")

View File

@@ -94,57 +94,63 @@ enclosingStmt(#20030,#20029)
exprContainers(#20030,#20001)
literals("foo","'foo'",#20030)
#20031=*
exprs(#20031,86,#20029,0,"x")
hasLocation(#20031,#20009)
enclosingStmt(#20031,#20029)
exprContainers(#20031,#20001)
#20032=*
exprs(#20032,0,#20031,0,"x")
hasLocation(#20032,#20009)
enclosingStmt(#20032,#20029)
exprContainers(#20032,#20001)
literals("x","x",#20032)
regexpterm(#20031,14,#20030,0,"foo")
#20032=@"loc,{#10000},1,28,1,30"
locations_default(#20032,#10000,1,28,1,30)
hasLocation(#20031,#20032)
regexpConstValue(#20031,"foo")
#20033=*
exprs(#20033,0,#20031,1,"x")
exprs(#20033,86,#20029,0,"x")
hasLocation(#20033,#20009)
enclosingStmt(#20033,#20029)
exprContainers(#20033,#20001)
literals("x","x",#20033)
#20034=*
exprs(#20034,86,#20029,1,"y as z")
#20035=@"loc,{#10000},1,13,1,18"
locations_default(#20035,#10000,1,13,1,18)
hasLocation(#20034,#20035)
exprs(#20034,0,#20033,0,"x")
hasLocation(#20034,#20009)
enclosingStmt(#20034,#20029)
exprContainers(#20034,#20001)
literals("x","x",#20034)
#20035=*
exprs(#20035,0,#20033,1,"x")
hasLocation(#20035,#20009)
enclosingStmt(#20035,#20029)
exprContainers(#20035,#20001)
literals("x","x",#20035)
#20036=*
exprs(#20036,0,#20034,0,"y")
hasLocation(#20036,#20013)
exprs(#20036,86,#20029,1,"y as z")
#20037=@"loc,{#10000},1,13,1,18"
locations_default(#20037,#10000,1,13,1,18)
hasLocation(#20036,#20037)
enclosingStmt(#20036,#20029)
exprContainers(#20036,#20001)
literals("y","y",#20036)
#20037=*
exprs(#20037,0,#20034,1,"z")
hasLocation(#20037,#20017)
enclosingStmt(#20037,#20029)
exprContainers(#20037,#20001)
literals("z","z",#20037)
#20038=*
entry_cfg_node(#20038,#20001)
#20039=@"loc,{#10000},1,1,1,0"
locations_default(#20039,#10000,1,1,1,0)
hasLocation(#20038,#20039)
exprs(#20038,0,#20036,0,"y")
hasLocation(#20038,#20013)
enclosingStmt(#20038,#20029)
exprContainers(#20038,#20001)
literals("y","y",#20038)
#20039=*
exprs(#20039,0,#20036,1,"z")
hasLocation(#20039,#20017)
enclosingStmt(#20039,#20029)
exprContainers(#20039,#20001)
literals("z","z",#20039)
#20040=*
exit_cfg_node(#20040,#20001)
hasLocation(#20040,#20027)
entry_cfg_node(#20040,#20001)
#20041=@"loc,{#10000},1,1,1,0"
locations_default(#20041,#10000,1,1,1,0)
hasLocation(#20040,#20041)
#20042=*
exit_cfg_node(#20042,#20001)
hasLocation(#20042,#20027)
successor(#20029,#20030)
successor(#20034,#20036)
successor(#20037,#20040)
successor(#20036,#20037)
successor(#20031,#20032)
successor(#20036,#20038)
successor(#20039,#20042)
successor(#20038,#20039)
successor(#20033,#20034)
successor(#20032,#20033)
successor(#20030,#20031)
successor(#20038,#20029)
successor(#20035,#20036)
successor(#20034,#20035)
successor(#20030,#20033)
successor(#20040,#20029)
numlines(#10000,1,1,0)
filetype(#10000,"javascript")

View File

@@ -73,29 +73,35 @@ enclosingStmt(#20021,#20020)
exprContainers(#20021,#20001)
literals("foo","'foo'",#20021)
#20022=*
exprs(#20022,84,#20020,0,"x")
hasLocation(#20022,#20007)
enclosingStmt(#20022,#20020)
exprContainers(#20022,#20001)
#20023=*
exprs(#20023,78,#20022,1,"x")
hasLocation(#20023,#20007)
enclosingStmt(#20023,#20020)
exprContainers(#20023,#20001)
literals("x","x",#20023)
decl(#20023,#20017)
typedecl(#20023,#20018)
namespacedecl(#20023,#20019)
regexpterm(#20022,14,#20021,0,"foo")
#20023=@"loc,{#10000},1,16,1,18"
locations_default(#20023,#10000,1,16,1,18)
hasLocation(#20022,#20023)
regexpConstValue(#20022,"foo")
#20024=*
entry_cfg_node(#20024,#20001)
#20025=@"loc,{#10000},1,1,1,0"
locations_default(#20025,#10000,1,1,1,0)
hasLocation(#20024,#20025)
exprs(#20024,84,#20020,0,"x")
hasLocation(#20024,#20007)
enclosingStmt(#20024,#20020)
exprContainers(#20024,#20001)
#20025=*
exprs(#20025,78,#20024,1,"x")
hasLocation(#20025,#20007)
enclosingStmt(#20025,#20020)
exprContainers(#20025,#20001)
literals("x","x",#20025)
decl(#20025,#20017)
typedecl(#20025,#20018)
namespacedecl(#20025,#20019)
#20026=*
exit_cfg_node(#20026,#20001)
hasLocation(#20026,#20015)
successor(#20020,#20026)
successor(#20022,#20020)
successor(#20024,#20022)
entry_cfg_node(#20026,#20001)
#20027=@"loc,{#10000},1,1,1,0"
locations_default(#20027,#10000,1,1,1,0)
hasLocation(#20026,#20027)
#20028=*
exit_cfg_node(#20028,#20001)
hasLocation(#20028,#20015)
successor(#20020,#20028)
successor(#20024,#20020)
successor(#20026,#20024)
numlines(#10000,1,1,0)
filetype(#10000,"javascript")

View File

@@ -83,35 +83,41 @@ enclosingStmt(#20025,#20024)
exprContainers(#20025,#20001)
literals("foo","'foo'",#20025)
#20026=*
exprs(#20026,83,#20024,0,"y")
hasLocation(#20026,#20009)
enclosingStmt(#20026,#20024)
exprContainers(#20026,#20001)
#20027=*
exprs(#20027,0,#20026,0,"y")
hasLocation(#20027,#20009)
enclosingStmt(#20027,#20024)
exprContainers(#20027,#20001)
literals("y","y",#20027)
regexpterm(#20026,14,#20025,0,"foo")
#20027=@"loc,{#10000},1,20,1,22"
locations_default(#20027,#10000,1,20,1,22)
hasLocation(#20026,#20027)
regexpConstValue(#20026,"foo")
#20028=*
exprs(#20028,78,#20026,1,"y")
exprs(#20028,83,#20024,0,"y")
hasLocation(#20028,#20009)
enclosingStmt(#20028,#20024)
exprContainers(#20028,#20001)
literals("y","y",#20028)
decl(#20028,#20021)
typedecl(#20028,#20022)
namespacedecl(#20028,#20023)
#20029=*
entry_cfg_node(#20029,#20001)
#20030=@"loc,{#10000},1,1,1,0"
locations_default(#20030,#10000,1,1,1,0)
hasLocation(#20029,#20030)
exprs(#20029,0,#20028,0,"y")
hasLocation(#20029,#20009)
enclosingStmt(#20029,#20024)
exprContainers(#20029,#20001)
literals("y","y",#20029)
#20030=*
exprs(#20030,78,#20028,1,"y")
hasLocation(#20030,#20009)
enclosingStmt(#20030,#20024)
exprContainers(#20030,#20001)
literals("y","y",#20030)
decl(#20030,#20021)
typedecl(#20030,#20022)
namespacedecl(#20030,#20023)
#20031=*
exit_cfg_node(#20031,#20001)
hasLocation(#20031,#20019)
successor(#20024,#20031)
successor(#20026,#20024)
successor(#20029,#20026)
entry_cfg_node(#20031,#20001)
#20032=@"loc,{#10000},1,1,1,0"
locations_default(#20032,#10000,1,1,1,0)
hasLocation(#20031,#20032)
#20033=*
exit_cfg_node(#20033,#20001)
hasLocation(#20033,#20019)
successor(#20024,#20033)
successor(#20028,#20024)
successor(#20031,#20028)
numlines(#10000,1,1,0)
filetype(#10000,"javascript")

View File

@@ -93,37 +93,43 @@ enclosingStmt(#20029,#20028)
exprContainers(#20029,#20001)
literals("foo","'foo'",#20029)
#20030=*
exprs(#20030,83,#20028,0,"y as z")
#20031=@"loc,{#10000},1,10,1,15"
locations_default(#20031,#10000,1,10,1,15)
regexpterm(#20030,14,#20029,0,"foo")
#20031=@"loc,{#10000},1,25,1,27"
locations_default(#20031,#10000,1,25,1,27)
hasLocation(#20030,#20031)
enclosingStmt(#20030,#20028)
exprContainers(#20030,#20001)
regexpConstValue(#20030,"foo")
#20032=*
exprs(#20032,0,#20030,0,"y")
hasLocation(#20032,#20009)
exprs(#20032,83,#20028,0,"y as z")
#20033=@"loc,{#10000},1,10,1,15"
locations_default(#20033,#10000,1,10,1,15)
hasLocation(#20032,#20033)
enclosingStmt(#20032,#20028)
exprContainers(#20032,#20001)
literals("y","y",#20032)
#20033=*
exprs(#20033,78,#20030,1,"z")
hasLocation(#20033,#20013)
enclosingStmt(#20033,#20028)
exprContainers(#20033,#20001)
literals("z","z",#20033)
decl(#20033,#20025)
typedecl(#20033,#20026)
namespacedecl(#20033,#20027)
#20034=*
entry_cfg_node(#20034,#20001)
#20035=@"loc,{#10000},1,1,1,0"
locations_default(#20035,#10000,1,1,1,0)
hasLocation(#20034,#20035)
exprs(#20034,0,#20032,0,"y")
hasLocation(#20034,#20009)
enclosingStmt(#20034,#20028)
exprContainers(#20034,#20001)
literals("y","y",#20034)
#20035=*
exprs(#20035,78,#20032,1,"z")
hasLocation(#20035,#20013)
enclosingStmt(#20035,#20028)
exprContainers(#20035,#20001)
literals("z","z",#20035)
decl(#20035,#20025)
typedecl(#20035,#20026)
namespacedecl(#20035,#20027)
#20036=*
exit_cfg_node(#20036,#20001)
hasLocation(#20036,#20023)
successor(#20028,#20036)
successor(#20030,#20028)
successor(#20034,#20030)
entry_cfg_node(#20036,#20001)
#20037=@"loc,{#10000},1,1,1,0"
locations_default(#20037,#10000,1,1,1,0)
hasLocation(#20036,#20037)
#20038=*
exit_cfg_node(#20038,#20001)
hasLocation(#20038,#20023)
successor(#20028,#20038)
successor(#20032,#20028)
successor(#20036,#20032)
numlines(#10000,1,1,0)
filetype(#10000,"javascript")

View File

@@ -112,52 +112,58 @@ enclosingStmt(#20036,#20035)
exprContainers(#20036,#20001)
literals("foo","'foo'",#20036)
#20037=*
exprs(#20037,84,#20035,0,"x")
hasLocation(#20037,#20007)
enclosingStmt(#20037,#20035)
exprContainers(#20037,#20001)
#20038=*
exprs(#20038,78,#20037,1,"x")
hasLocation(#20038,#20007)
enclosingStmt(#20038,#20035)
exprContainers(#20038,#20001)
literals("x","x",#20038)
decl(#20038,#20029)
typedecl(#20038,#20031)
namespacedecl(#20038,#20033)
regexpterm(#20037,14,#20036,0,"foo")
#20038=@"loc,{#10000},1,28,1,30"
locations_default(#20038,#10000,1,28,1,30)
hasLocation(#20037,#20038)
regexpConstValue(#20037,"foo")
#20039=*
exprs(#20039,83,#20035,1,"y as z")
#20040=@"loc,{#10000},1,13,1,18"
locations_default(#20040,#10000,1,13,1,18)
hasLocation(#20039,#20040)
exprs(#20039,84,#20035,0,"x")
hasLocation(#20039,#20007)
enclosingStmt(#20039,#20035)
exprContainers(#20039,#20001)
#20040=*
exprs(#20040,78,#20039,1,"x")
hasLocation(#20040,#20007)
enclosingStmt(#20040,#20035)
exprContainers(#20040,#20001)
literals("x","x",#20040)
decl(#20040,#20029)
typedecl(#20040,#20031)
namespacedecl(#20040,#20033)
#20041=*
exprs(#20041,0,#20039,0,"y")
hasLocation(#20041,#20013)
exprs(#20041,83,#20035,1,"y as z")
#20042=@"loc,{#10000},1,13,1,18"
locations_default(#20042,#10000,1,13,1,18)
hasLocation(#20041,#20042)
enclosingStmt(#20041,#20035)
exprContainers(#20041,#20001)
literals("y","y",#20041)
#20042=*
exprs(#20042,78,#20039,1,"z")
hasLocation(#20042,#20017)
enclosingStmt(#20042,#20035)
exprContainers(#20042,#20001)
literals("z","z",#20042)
decl(#20042,#20030)
typedecl(#20042,#20032)
namespacedecl(#20042,#20034)
#20043=*
entry_cfg_node(#20043,#20001)
#20044=@"loc,{#10000},1,1,1,0"
locations_default(#20044,#10000,1,1,1,0)
hasLocation(#20043,#20044)
exprs(#20043,0,#20041,0,"y")
hasLocation(#20043,#20013)
enclosingStmt(#20043,#20035)
exprContainers(#20043,#20001)
literals("y","y",#20043)
#20044=*
exprs(#20044,78,#20041,1,"z")
hasLocation(#20044,#20017)
enclosingStmt(#20044,#20035)
exprContainers(#20044,#20001)
literals("z","z",#20044)
decl(#20044,#20030)
typedecl(#20044,#20032)
namespacedecl(#20044,#20034)
#20045=*
exit_cfg_node(#20045,#20001)
hasLocation(#20045,#20027)
successor(#20035,#20045)
successor(#20039,#20035)
successor(#20037,#20039)
successor(#20043,#20037)
entry_cfg_node(#20045,#20001)
#20046=@"loc,{#10000},1,1,1,0"
locations_default(#20046,#10000,1,1,1,0)
hasLocation(#20045,#20046)
#20047=*
exit_cfg_node(#20047,#20001)
hasLocation(#20047,#20027)
successor(#20035,#20047)
successor(#20041,#20035)
successor(#20039,#20041)
successor(#20045,#20039)
numlines(#10000,1,1,0)
filetype(#10000,"javascript")

View File

@@ -83,31 +83,37 @@ enclosingStmt(#20025,#20024)
exprContainers(#20025,#20001)
literals("foo","'foo'",#20025)
#20026=*
exprs(#20026,85,#20024,0,"* as foo")
#20027=@"loc,{#10000},1,8,1,15"
locations_default(#20027,#10000,1,8,1,15)
regexpterm(#20026,14,#20025,0,"foo")
#20027=@"loc,{#10000},1,23,1,25"
locations_default(#20027,#10000,1,23,1,25)
hasLocation(#20026,#20027)
enclosingStmt(#20026,#20024)
exprContainers(#20026,#20001)
regexpConstValue(#20026,"foo")
#20028=*
exprs(#20028,78,#20026,1,"foo")
hasLocation(#20028,#20011)
exprs(#20028,85,#20024,0,"* as foo")
#20029=@"loc,{#10000},1,8,1,15"
locations_default(#20029,#10000,1,8,1,15)
hasLocation(#20028,#20029)
enclosingStmt(#20028,#20024)
exprContainers(#20028,#20001)
literals("foo","foo",#20028)
decl(#20028,#20021)
typedecl(#20028,#20022)
namespacedecl(#20028,#20023)
#20029=*
entry_cfg_node(#20029,#20001)
#20030=@"loc,{#10000},1,1,1,0"
locations_default(#20030,#10000,1,1,1,0)
hasLocation(#20029,#20030)
#20030=*
exprs(#20030,78,#20028,1,"foo")
hasLocation(#20030,#20011)
enclosingStmt(#20030,#20024)
exprContainers(#20030,#20001)
literals("foo","foo",#20030)
decl(#20030,#20021)
typedecl(#20030,#20022)
namespacedecl(#20030,#20023)
#20031=*
exit_cfg_node(#20031,#20001)
hasLocation(#20031,#20019)
successor(#20024,#20031)
successor(#20026,#20024)
successor(#20029,#20026)
entry_cfg_node(#20031,#20001)
#20032=@"loc,{#10000},1,1,1,0"
locations_default(#20032,#10000,1,1,1,0)
hasLocation(#20031,#20032)
#20033=*
exit_cfg_node(#20033,#20001)
hasLocation(#20033,#20019)
successor(#20024,#20033)
successor(#20028,#20024)
successor(#20031,#20028)
numlines(#10000,1,1,0)
filetype(#10000,"javascript")

View File

@@ -54,14 +54,20 @@ enclosingStmt(#20014,#20013)
exprContainers(#20014,#20001)
literals("foo","'foo'",#20014)
#20015=*
entry_cfg_node(#20015,#20001)
#20016=@"loc,{#10000},1,1,1,0"
locations_default(#20016,#10000,1,1,1,0)
regexpterm(#20015,14,#20014,0,"foo")
#20016=@"loc,{#10000},1,9,1,11"
locations_default(#20016,#10000,1,9,1,11)
hasLocation(#20015,#20016)
regexpConstValue(#20015,"foo")
#20017=*
exit_cfg_node(#20017,#20001)
hasLocation(#20017,#20011)
successor(#20013,#20017)
successor(#20015,#20013)
entry_cfg_node(#20017,#20001)
#20018=@"loc,{#10000},1,1,1,0"
locations_default(#20018,#10000,1,1,1,0)
hasLocation(#20017,#20018)
#20019=*
exit_cfg_node(#20019,#20001)
hasLocation(#20019,#20011)
successor(#20013,#20019)
successor(#20017,#20013)
numlines(#10000,1,1,0)
filetype(#10000,"javascript")

View File

@@ -156,74 +156,92 @@ enclosingStmt(#20053,#20052)
exprContainers(#20053,#20001)
literals("foo","'foo'",#20053)
#20054=*
exprs(#20054,84,#20052,0,"x")
hasLocation(#20054,#20011)
enclosingStmt(#20054,#20052)
exprContainers(#20054,#20001)
#20055=*
exprs(#20055,78,#20054,1,"x")
hasLocation(#20055,#20011)
enclosingStmt(#20055,#20052)
exprContainers(#20055,#20001)
literals("x","x",#20055)
decl(#20055,#20046)
typedecl(#20055,#20048)
namespacedecl(#20055,#20050)
regexpterm(#20054,14,#20053,0,"foo")
#20055=@"loc,{#10000},1,16,1,18"
locations_default(#20055,#10000,1,16,1,18)
hasLocation(#20054,#20055)
regexpConstValue(#20054,"foo")
#20056=*
stmts(#20056,27,#20001,1,"import 'bar';")
hasLocation(#20056,#20005)
stmtContainers(#20056,#20001)
exprs(#20056,84,#20052,0,"x")
hasLocation(#20056,#20011)
enclosingStmt(#20056,#20052)
exprContainers(#20056,#20001)
#20057=*
exprs(#20057,4,#20056,-1,"'bar'")
hasLocation(#20057,#20021)
enclosingStmt(#20057,#20056)
exprs(#20057,78,#20056,1,"x")
hasLocation(#20057,#20011)
enclosingStmt(#20057,#20052)
exprContainers(#20057,#20001)
literals("bar","'bar'",#20057)
literals("x","x",#20057)
decl(#20057,#20046)
typedecl(#20057,#20048)
namespacedecl(#20057,#20050)
#20058=*
stmts(#20058,27,#20001,2,"import ... 'baz';")
hasLocation(#20058,#20007)
stmts(#20058,27,#20001,1,"import 'bar';")
hasLocation(#20058,#20005)
stmtContainers(#20058,#20001)
#20059=*
exprs(#20059,4,#20058,-1,"'baz'")
hasLocation(#20059,#20039)
exprs(#20059,4,#20058,-1,"'bar'")
hasLocation(#20059,#20021)
enclosingStmt(#20059,#20058)
exprContainers(#20059,#20001)
literals("baz","'baz'",#20059)
literals("bar","'bar'",#20059)
#20060=*
exprs(#20060,83,#20058,0,"y as z")
#20061=@"loc,{#10000},3,10,3,15"
locations_default(#20061,#10000,3,10,3,15)
regexpterm(#20060,14,#20059,0,"bar")
#20061=@"loc,{#10000},2,9,2,11"
locations_default(#20061,#10000,2,9,2,11)
hasLocation(#20060,#20061)
enclosingStmt(#20060,#20058)
exprContainers(#20060,#20001)
regexpConstValue(#20060,"bar")
#20062=*
exprs(#20062,0,#20060,0,"y")
hasLocation(#20062,#20029)
enclosingStmt(#20062,#20058)
exprContainers(#20062,#20001)
literals("y","y",#20062)
stmts(#20062,27,#20001,2,"import ... 'baz';")
hasLocation(#20062,#20007)
stmtContainers(#20062,#20001)
#20063=*
exprs(#20063,78,#20060,1,"z")
hasLocation(#20063,#20033)
enclosingStmt(#20063,#20058)
exprs(#20063,4,#20062,-1,"'baz'")
hasLocation(#20063,#20039)
enclosingStmt(#20063,#20062)
exprContainers(#20063,#20001)
literals("z","z",#20063)
decl(#20063,#20047)
typedecl(#20063,#20049)
namespacedecl(#20063,#20051)
literals("baz","'baz'",#20063)
#20064=*
entry_cfg_node(#20064,#20001)
#20065=@"loc,{#10000},1,1,1,0"
locations_default(#20065,#10000,1,1,1,0)
regexpterm(#20064,14,#20063,0,"baz")
#20065=@"loc,{#10000},3,25,3,27"
locations_default(#20065,#10000,3,25,3,27)
hasLocation(#20064,#20065)
regexpConstValue(#20064,"baz")
#20066=*
exit_cfg_node(#20066,#20001)
hasLocation(#20066,#20043)
successor(#20058,#20066)
successor(#20056,#20058)
successor(#20052,#20056)
successor(#20060,#20052)
successor(#20054,#20060)
successor(#20064,#20054)
exprs(#20066,83,#20062,0,"y as z")
#20067=@"loc,{#10000},3,10,3,15"
locations_default(#20067,#10000,3,10,3,15)
hasLocation(#20066,#20067)
enclosingStmt(#20066,#20062)
exprContainers(#20066,#20001)
#20068=*
exprs(#20068,0,#20066,0,"y")
hasLocation(#20068,#20029)
enclosingStmt(#20068,#20062)
exprContainers(#20068,#20001)
literals("y","y",#20068)
#20069=*
exprs(#20069,78,#20066,1,"z")
hasLocation(#20069,#20033)
enclosingStmt(#20069,#20062)
exprContainers(#20069,#20001)
literals("z","z",#20069)
decl(#20069,#20047)
typedecl(#20069,#20049)
namespacedecl(#20069,#20051)
#20070=*
entry_cfg_node(#20070,#20001)
#20071=@"loc,{#10000},1,1,1,0"
locations_default(#20071,#10000,1,1,1,0)
hasLocation(#20070,#20071)
#20072=*
exit_cfg_node(#20072,#20001)
hasLocation(#20072,#20043)
successor(#20062,#20072)
successor(#20058,#20062)
successor(#20052,#20058)
successor(#20066,#20052)
successor(#20056,#20066)
successor(#20070,#20056)
numlines(#10000,3,3,0)
filetype(#10000,"javascript")

View File

@@ -206,149 +206,161 @@ enclosingStmt(#20072,#20071)
exprContainers(#20072,#20001)
literals("m","'m'",#20072)
#20073=*
exprs(#20073,83,#20071,0,"x")
hasLocation(#20073,#20017)
enclosingStmt(#20073,#20071)
exprContainers(#20073,#20001)
#20074=*
exprs(#20074,0,#20073,0,"x")
hasLocation(#20074,#20017)
enclosingStmt(#20074,#20071)
exprContainers(#20074,#20001)
literals("x","x",#20074)
regexpterm(#20073,14,#20072,0,"m")
#20074=@"loc,{#10000},1,20,1,20"
locations_default(#20074,#10000,1,20,1,20)
hasLocation(#20073,#20074)
regexpConstValue(#20073,"m")
#20075=*
exprs(#20075,78,#20073,1,"x")
exprs(#20075,83,#20071,0,"x")
hasLocation(#20075,#20017)
enclosingStmt(#20075,#20071)
exprContainers(#20075,#20001)
literals("x","x",#20075)
decl(#20075,#20065)
typedecl(#20075,#20067)
namespacedecl(#20075,#20069)
#20076=*
stmts(#20076,3,#20001,1,"if (!x) ... = y;\n}")
#20077=@"loc,{#10000},2,1,5,1"
locations_default(#20077,#10000,2,1,5,1)
hasLocation(#20076,#20077)
stmtContainers(#20076,#20001)
exprs(#20076,0,#20075,0,"x")
hasLocation(#20076,#20017)
enclosingStmt(#20076,#20071)
exprContainers(#20076,#20001)
literals("x","x",#20076)
#20077=*
exprs(#20077,78,#20075,1,"x")
hasLocation(#20077,#20017)
enclosingStmt(#20077,#20071)
exprContainers(#20077,#20001)
literals("x","x",#20077)
decl(#20077,#20065)
typedecl(#20077,#20067)
namespacedecl(#20077,#20069)
#20078=*
exprs(#20078,18,#20076,0,"!x")
#20079=@"loc,{#10000},2,5,2,6"
locations_default(#20079,#10000,2,5,2,6)
stmts(#20078,3,#20001,1,"if (!x) ... = y;\n}")
#20079=@"loc,{#10000},2,1,5,1"
locations_default(#20079,#10000,2,1,5,1)
hasLocation(#20078,#20079)
enclosingStmt(#20078,#20076)
exprContainers(#20078,#20001)
stmtContainers(#20078,#20001)
#20080=*
exprs(#20080,79,#20078,0,"x")
hasLocation(#20080,#20033)
enclosingStmt(#20080,#20076)
exprs(#20080,18,#20078,0,"!x")
#20081=@"loc,{#10000},2,5,2,6"
locations_default(#20081,#10000,2,5,2,6)
hasLocation(#20080,#20081)
enclosingStmt(#20080,#20078)
exprContainers(#20080,#20001)
literals("x","x",#20080)
bind(#20080,#20065)
#20081=*
stmts(#20081,1,#20076,1,"{\n imp ... = y;\n}")
#20082=@"loc,{#10000},2,9,5,1"
locations_default(#20082,#10000,2,9,5,1)
hasLocation(#20081,#20082)
stmtContainers(#20081,#20001)
#20082=*
exprs(#20082,79,#20080,0,"x")
hasLocation(#20082,#20033)
enclosingStmt(#20082,#20078)
exprContainers(#20082,#20001)
literals("x","x",#20082)
bind(#20082,#20065)
#20083=*
scopes(#20083,4)
scopenodes(#20081,#20083)
scopenesting(#20083,#20064)
#20084=@"var;{y};{#20083}"
variables(#20084,"y",#20083)
#20085=@"local_type_name;{y};{#20083}"
local_type_names(#20085,"y",#20083)
#20086=@"local_namespace_name;{y};{#20083}"
local_namespace_names(#20086,"y",#20083)
#20087=*
stmts(#20087,27,#20081,0,"import ... om 'm';")
#20088=@"loc,{#10000},3,3,3,24"
locations_default(#20088,#10000,3,3,3,24)
hasLocation(#20087,#20088)
stmtContainers(#20087,#20001)
stmts(#20083,1,#20078,1,"{\n imp ... = y;\n}")
#20084=@"loc,{#10000},2,9,5,1"
locations_default(#20084,#10000,2,9,5,1)
hasLocation(#20083,#20084)
stmtContainers(#20083,#20001)
#20085=*
scopes(#20085,4)
scopenodes(#20083,#20085)
scopenesting(#20085,#20064)
#20086=@"var;{y};{#20085}"
variables(#20086,"y",#20085)
#20087=@"local_type_name;{y};{#20085}"
local_type_names(#20087,"y",#20085)
#20088=@"local_namespace_name;{y};{#20085}"
local_namespace_names(#20088,"y",#20085)
#20089=*
exprs(#20089,4,#20087,-1,"'m'")
hasLocation(#20089,#20049)
enclosingStmt(#20089,#20087)
exprContainers(#20089,#20001)
literals("m","'m'",#20089)
#20090=*
exprs(#20090,83,#20087,0,"y")
hasLocation(#20090,#20043)
enclosingStmt(#20090,#20087)
exprContainers(#20090,#20001)
stmts(#20089,27,#20083,0,"import ... om 'm';")
#20090=@"loc,{#10000},3,3,3,24"
locations_default(#20090,#10000,3,3,3,24)
hasLocation(#20089,#20090)
stmtContainers(#20089,#20001)
#20091=*
exprs(#20091,0,#20090,0,"y")
hasLocation(#20091,#20043)
enclosingStmt(#20091,#20087)
exprs(#20091,4,#20089,-1,"'m'")
hasLocation(#20091,#20049)
enclosingStmt(#20091,#20089)
exprContainers(#20091,#20001)
literals("y","y",#20091)
literals("m","'m'",#20091)
#20092=*
exprs(#20092,78,#20090,1,"y")
hasLocation(#20092,#20043)
enclosingStmt(#20092,#20087)
exprContainers(#20092,#20001)
literals("y","y",#20092)
decl(#20092,#20084)
typedecl(#20092,#20085)
namespacedecl(#20092,#20086)
#20093=*
stmts(#20093,2,#20081,1,"x = y;")
#20094=@"loc,{#10000},4,3,4,8"
locations_default(#20094,#10000,4,3,4,8)
hasLocation(#20093,#20094)
stmtContainers(#20093,#20001)
regexpterm(#20092,14,#20091,0,"m")
#20093=@"loc,{#10000},3,22,3,22"
locations_default(#20093,#10000,3,22,3,22)
hasLocation(#20092,#20093)
regexpConstValue(#20092,"m")
#20094=*
exprs(#20094,83,#20089,0,"y")
hasLocation(#20094,#20043)
enclosingStmt(#20094,#20089)
exprContainers(#20094,#20001)
#20095=*
exprs(#20095,47,#20093,0,"x = y")
#20096=@"loc,{#10000},4,3,4,7"
locations_default(#20096,#10000,4,3,4,7)
hasLocation(#20095,#20096)
enclosingStmt(#20095,#20093)
exprs(#20095,0,#20094,0,"y")
hasLocation(#20095,#20043)
enclosingStmt(#20095,#20089)
exprContainers(#20095,#20001)
literals("y","y",#20095)
#20096=*
exprs(#20096,78,#20094,1,"y")
hasLocation(#20096,#20043)
enclosingStmt(#20096,#20089)
exprContainers(#20096,#20001)
literals("y","y",#20096)
decl(#20096,#20086)
typedecl(#20096,#20087)
namespacedecl(#20096,#20088)
#20097=*
exprs(#20097,79,#20095,0,"x")
hasLocation(#20097,#20053)
enclosingStmt(#20097,#20093)
exprContainers(#20097,#20001)
literals("x","x",#20097)
bind(#20097,#20065)
#20098=*
exprs(#20098,79,#20095,1,"y")
hasLocation(#20098,#20057)
enclosingStmt(#20098,#20093)
exprContainers(#20098,#20001)
literals("y","y",#20098)
bind(#20098,#20084)
stmts(#20097,2,#20083,1,"x = y;")
#20098=@"loc,{#10000},4,3,4,8"
locations_default(#20098,#10000,4,3,4,8)
hasLocation(#20097,#20098)
stmtContainers(#20097,#20001)
#20099=*
entry_cfg_node(#20099,#20001)
#20100=@"loc,{#10000},1,1,1,0"
locations_default(#20100,#10000,1,1,1,0)
exprs(#20099,47,#20097,0,"x = y")
#20100=@"loc,{#10000},4,3,4,7"
locations_default(#20100,#10000,4,3,4,7)
hasLocation(#20099,#20100)
enclosingStmt(#20099,#20097)
exprContainers(#20099,#20001)
#20101=*
exit_cfg_node(#20101,#20001)
hasLocation(#20101,#20062)
successor(#20076,#20080)
successor(#20080,#20078)
exprs(#20101,79,#20099,0,"x")
hasLocation(#20101,#20053)
enclosingStmt(#20101,#20097)
exprContainers(#20101,#20001)
literals("x","x",#20101)
bind(#20101,#20065)
#20102=*
guard_node(#20102,0,#20080)
hasLocation(#20102,#20033)
successor(#20102,#20081)
exprs(#20102,79,#20099,1,"y")
hasLocation(#20102,#20057)
enclosingStmt(#20102,#20097)
exprContainers(#20102,#20001)
literals("y","y",#20102)
bind(#20102,#20086)
#20103=*
guard_node(#20103,1,#20080)
hasLocation(#20103,#20033)
successor(#20103,#20101)
successor(#20078,#20102)
successor(#20078,#20103)
successor(#20081,#20087)
successor(#20093,#20097)
successor(#20098,#20095)
successor(#20097,#20098)
successor(#20095,#20101)
successor(#20087,#20090)
successor(#20090,#20093)
successor(#20071,#20076)
successor(#20073,#20071)
successor(#20099,#20073)
entry_cfg_node(#20103,#20001)
#20104=@"loc,{#10000},1,1,1,0"
locations_default(#20104,#10000,1,1,1,0)
hasLocation(#20103,#20104)
#20105=*
exit_cfg_node(#20105,#20001)
hasLocation(#20105,#20062)
successor(#20078,#20082)
successor(#20082,#20080)
#20106=*
guard_node(#20106,0,#20082)
hasLocation(#20106,#20033)
successor(#20106,#20083)
#20107=*
guard_node(#20107,1,#20082)
hasLocation(#20107,#20033)
successor(#20107,#20105)
successor(#20080,#20106)
successor(#20080,#20107)
successor(#20083,#20089)
successor(#20097,#20101)
successor(#20102,#20099)
successor(#20101,#20102)
successor(#20099,#20105)
successor(#20089,#20094)
successor(#20094,#20097)
successor(#20071,#20078)
successor(#20075,#20071)
successor(#20103,#20075)
numlines(#10000,5,5,0)
filetype(#10000,"javascript")

View File

@@ -287,144 +287,150 @@ enclosingStmt(#20097,#20083)
exprContainers(#20097,#20001)
literals("prop","""prop""",#20097)
#20098=*
exprs(#20098,13,#20095,1,"Math.random()")
#20099=@"loc,{#10000},3,19,3,31"
locations_default(#20099,#10000,3,19,3,31)
regexpterm(#20098,14,#20097,0,"prop")
#20099=@"loc,{#10000},3,11,3,14"
locations_default(#20099,#10000,3,11,3,14)
hasLocation(#20098,#20099)
enclosingStmt(#20098,#20083)
exprContainers(#20098,#20001)
regexpConstValue(#20098,"prop")
#20100=*
exprs(#20100,14,#20098,-1,"Math.random")
#20101=@"loc,{#10000},3,19,3,29"
locations_default(#20101,#10000,3,19,3,29)
exprs(#20100,13,#20095,1,"Math.random()")
#20101=@"loc,{#10000},3,19,3,31"
locations_default(#20101,#10000,3,19,3,31)
hasLocation(#20100,#20101)
enclosingStmt(#20100,#20083)
exprContainers(#20100,#20001)
#20102=*
exprs(#20102,79,#20100,0,"Math")
hasLocation(#20102,#20037)
exprs(#20102,14,#20100,-1,"Math.random")
#20103=@"loc,{#10000},3,19,3,29"
locations_default(#20103,#10000,3,19,3,29)
hasLocation(#20102,#20103)
enclosingStmt(#20102,#20083)
exprContainers(#20102,#20001)
literals("Math","Math",#20102)
#20103=@"var;{Math};{#20000}"
variables(#20103,"Math",#20000)
bind(#20102,#20103)
#20104=*
exprs(#20104,0,#20100,1,"random")
hasLocation(#20104,#20041)
exprs(#20104,79,#20102,0,"Math")
hasLocation(#20104,#20037)
enclosingStmt(#20104,#20083)
exprContainers(#20104,#20001)
literals("random","random",#20104)
#20105=*
exprs(#20105,3,#20093,1,"23")
hasLocation(#20105,#20051)
enclosingStmt(#20105,#20083)
exprContainers(#20105,#20001)
literals("23","23",#20105)
isComputed(#20093)
literals("Math","Math",#20104)
#20105=@"var;{Math};{#20000}"
variables(#20105,"Math",#20000)
bind(#20104,#20105)
#20106=*
properties(#20106,#20091,1,0,"x")
hasLocation(#20106,#20055)
exprs(#20106,0,#20102,1,"random")
hasLocation(#20106,#20041)
enclosingStmt(#20106,#20083)
exprContainers(#20106,#20001)
literals("random","random",#20106)
#20107=*
exprs(#20107,0,#20106,0,"x")
hasLocation(#20107,#20055)
exprs(#20107,3,#20093,1,"23")
hasLocation(#20107,#20051)
enclosingStmt(#20107,#20083)
exprContainers(#20107,#20001)
literals("x","x",#20107)
literals("23","23",#20107)
isComputed(#20093)
#20108=*
exprs(#20108,79,#20106,1,"x")
properties(#20108,#20091,1,0,"x")
hasLocation(#20108,#20055)
enclosingStmt(#20108,#20083)
exprContainers(#20108,#20001)
literals("x","x",#20108)
bind(#20108,#20081)
#20109=*
properties(#20109,#20091,2,0,"m() { return 56; }")
#20110=@"loc,{#10000},5,9,5,26"
locations_default(#20110,#10000,5,9,5,26)
hasLocation(#20109,#20110)
exprs(#20109,0,#20108,0,"x")
hasLocation(#20109,#20055)
enclosingStmt(#20109,#20083)
exprContainers(#20109,#20001)
literals("x","x",#20109)
#20110=*
exprs(#20110,79,#20108,1,"x")
hasLocation(#20110,#20055)
enclosingStmt(#20110,#20083)
exprContainers(#20110,#20001)
literals("x","x",#20110)
bind(#20110,#20081)
#20111=*
exprs(#20111,0,#20109,0,"m")
hasLocation(#20111,#20059)
enclosingStmt(#20111,#20083)
exprContainers(#20111,#20001)
literals("m","m",#20111)
#20112=*
exprs(#20112,9,#20109,1,"() { return 56; }")
#20113=@"loc,{#10000},5,10,5,26"
locations_default(#20113,#10000,5,10,5,26)
hasLocation(#20112,#20113)
enclosingStmt(#20112,#20083)
exprContainers(#20112,#20001)
properties(#20111,#20091,2,0,"m() { return 56; }")
#20112=@"loc,{#10000},5,9,5,26"
locations_default(#20112,#10000,5,9,5,26)
hasLocation(#20111,#20112)
#20113=*
exprs(#20113,0,#20111,0,"m")
hasLocation(#20113,#20059)
enclosingStmt(#20113,#20083)
exprContainers(#20113,#20001)
literals("m","m",#20113)
#20114=*
scopes(#20114,1)
scopenodes(#20112,#20114)
scopenesting(#20114,#20000)
#20115=@"var;{arguments};{#20114}"
variables(#20115,"arguments",#20114)
isArgumentsObject(#20115)
exprs(#20114,9,#20111,1,"() { return 56; }")
#20115=@"loc,{#10000},5,10,5,26"
locations_default(#20115,#10000,5,10,5,26)
hasLocation(#20114,#20115)
enclosingStmt(#20114,#20083)
exprContainers(#20114,#20001)
#20116=*
stmts(#20116,1,#20112,-2,"{ return 56; }")
#20117=@"loc,{#10000},5,13,5,26"
locations_default(#20117,#10000,5,13,5,26)
hasLocation(#20116,#20117)
stmtContainers(#20116,#20112)
scopes(#20116,1)
scopenodes(#20114,#20116)
scopenesting(#20116,#20000)
#20117=@"var;{arguments};{#20116}"
variables(#20117,"arguments",#20116)
isArgumentsObject(#20117)
#20118=*
stmts(#20118,9,#20116,0,"return 56;")
#20119=@"loc,{#10000},5,15,5,24"
locations_default(#20119,#10000,5,15,5,24)
stmts(#20118,1,#20114,-2,"{ return 56; }")
#20119=@"loc,{#10000},5,13,5,26"
locations_default(#20119,#10000,5,13,5,26)
hasLocation(#20118,#20119)
stmtContainers(#20118,#20112)
stmtContainers(#20118,#20114)
#20120=*
exprs(#20120,3,#20118,0,"56")
hasLocation(#20120,#20069)
enclosingStmt(#20120,#20118)
exprContainers(#20120,#20112)
literals("56","56",#20120)
isMethod(#20109)
#20121=*
entry_cfg_node(#20121,#20001)
#20122=@"loc,{#10000},1,1,1,0"
locations_default(#20122,#10000,1,1,1,0)
hasLocation(#20121,#20122)
stmts(#20120,9,#20118,0,"return 56;")
#20121=@"loc,{#10000},5,15,5,24"
locations_default(#20121,#10000,5,15,5,24)
hasLocation(#20120,#20121)
stmtContainers(#20120,#20114)
#20122=*
exprs(#20122,3,#20120,0,"56")
hasLocation(#20122,#20069)
enclosingStmt(#20122,#20120)
exprContainers(#20122,#20114)
literals("56","56",#20122)
isMethod(#20111)
#20123=*
exit_cfg_node(#20123,#20001)
hasLocation(#20123,#20079)
entry_cfg_node(#20123,#20001)
#20124=@"loc,{#10000},1,1,1,0"
locations_default(#20124,#10000,1,1,1,0)
hasLocation(#20123,#20124)
#20125=*
exit_cfg_node(#20125,#20001)
hasLocation(#20125,#20079)
successor(#20083,#20086)
successor(#20091,#20097)
successor(#20112,#20109)
#20124=*
entry_cfg_node(#20124,#20112)
#20125=@"loc,{#10000},5,10,5,9"
locations_default(#20125,#10000,5,10,5,9)
hasLocation(#20124,#20125)
successor(#20114,#20111)
#20126=*
exit_cfg_node(#20126,#20112)
#20127=@"loc,{#10000},5,27,5,26"
locations_default(#20127,#10000,5,27,5,26)
entry_cfg_node(#20126,#20114)
#20127=@"loc,{#10000},5,10,5,9"
locations_default(#20127,#10000,5,10,5,9)
hasLocation(#20126,#20127)
successor(#20116,#20120)
successor(#20120,#20118)
successor(#20118,#20126)
successor(#20124,#20116)
successor(#20111,#20112)
successor(#20109,#20088)
successor(#20108,#20106)
successor(#20107,#20108)
successor(#20106,#20111)
successor(#20105,#20093)
successor(#20104,#20100)
successor(#20102,#20104)
successor(#20100,#20098)
successor(#20098,#20095)
successor(#20097,#20102)
successor(#20095,#20105)
successor(#20093,#20107)
#20128=*
exit_cfg_node(#20128,#20114)
#20129=@"loc,{#10000},5,27,5,26"
locations_default(#20129,#10000,5,27,5,26)
hasLocation(#20128,#20129)
successor(#20118,#20122)
successor(#20122,#20120)
successor(#20120,#20128)
successor(#20126,#20118)
successor(#20113,#20114)
successor(#20111,#20088)
successor(#20110,#20108)
successor(#20109,#20110)
successor(#20108,#20113)
successor(#20107,#20093)
successor(#20106,#20102)
successor(#20104,#20106)
successor(#20102,#20100)
successor(#20100,#20095)
successor(#20097,#20104)
successor(#20095,#20107)
successor(#20093,#20109)
successor(#20090,#20091)
successor(#20088,#20123)
successor(#20088,#20125)
successor(#20087,#20084)
successor(#20086,#20087)
successor(#20084,#20090)
successor(#20121,#20083)
successor(#20123,#20083)
numlines(#10000,6,6,0)
filetype(#10000,"javascript")

View File

@@ -468,274 +468,286 @@ enclosingStmt(#20172,#20168)
exprContainers(#20172,#20157)
literals("values: ","""values: """,#20172)
#20173=*
exprs(#20173,13,#20170,1,"values.join(', ')")
#20174=@"loc,{#10000},2,23,2,39"
locations_default(#20174,#10000,2,23,2,39)
regexpterm(#20173,14,#20172,0,"values: ")
#20174=@"loc,{#10000},2,11,2,18"
locations_default(#20174,#10000,2,11,2,18)
hasLocation(#20173,#20174)
enclosingStmt(#20173,#20168)
exprContainers(#20173,#20157)
regexpConstValue(#20173,"values: ")
#20175=*
exprs(#20175,14,#20173,-1,"values.join")
#20176=@"loc,{#10000},2,23,2,33"
locations_default(#20176,#10000,2,23,2,33)
exprs(#20175,13,#20170,1,"values.join(', ')")
#20176=@"loc,{#10000},2,23,2,39"
locations_default(#20176,#10000,2,23,2,39)
hasLocation(#20175,#20176)
enclosingStmt(#20175,#20168)
exprContainers(#20175,#20157)
#20177=*
exprs(#20177,79,#20175,0,"values")
hasLocation(#20177,#20043)
exprs(#20177,14,#20175,-1,"values.join")
#20178=@"loc,{#10000},2,23,2,33"
locations_default(#20178,#10000,2,23,2,33)
hasLocation(#20177,#20178)
enclosingStmt(#20177,#20168)
exprContainers(#20177,#20157)
literals("values","values",#20177)
bind(#20177,#20163)
#20178=*
exprs(#20178,0,#20175,1,"join")
hasLocation(#20178,#20047)
enclosingStmt(#20178,#20168)
exprContainers(#20178,#20157)
literals("join","join",#20178)
#20179=*
exprs(#20179,4,#20173,0,"', '")
hasLocation(#20179,#20051)
exprs(#20179,79,#20177,0,"values")
hasLocation(#20179,#20043)
enclosingStmt(#20179,#20168)
exprContainers(#20179,#20157)
literals(", ","', '",#20179)
literals("values","values",#20179)
bind(#20179,#20163)
#20180=*
stmts(#20180,18,#20001,1,"var x = 23;")
hasLocation(#20180,#20011)
stmtContainers(#20180,#20001)
exprs(#20180,0,#20177,1,"join")
hasLocation(#20180,#20047)
enclosingStmt(#20180,#20168)
exprContainers(#20180,#20157)
literals("join","join",#20180)
#20181=*
exprs(#20181,64,#20180,0,"x = 23")
#20182=@"loc,{#10000},5,5,5,10"
locations_default(#20182,#10000,5,5,5,10)
hasLocation(#20181,#20182)
enclosingStmt(#20181,#20180)
exprContainers(#20181,#20001)
#20183=*
exprs(#20183,78,#20181,0,"x")
hasLocation(#20183,#20060)
enclosingStmt(#20183,#20180)
exprContainers(#20183,#20001)
literals("x","x",#20183)
decl(#20183,#20155)
exprs(#20181,4,#20175,0,"', '")
hasLocation(#20181,#20051)
enclosingStmt(#20181,#20168)
exprContainers(#20181,#20157)
literals(", ","', '",#20181)
#20182=*
regexpterm(#20182,14,#20181,0,", ")
#20183=@"loc,{#10000},2,36,2,37"
locations_default(#20183,#10000,2,36,2,37)
hasLocation(#20182,#20183)
regexpConstValue(#20182,", ")
#20184=*
exprs(#20184,3,#20181,1,"23")
hasLocation(#20184,#20064)
enclosingStmt(#20184,#20180)
exprContainers(#20184,#20001)
literals("23","23",#20184)
stmts(#20184,18,#20001,1,"var x = 23;")
hasLocation(#20184,#20011)
stmtContainers(#20184,#20001)
#20185=*
stmts(#20185,18,#20001,2,"var y = 19;")
hasLocation(#20185,#20013)
stmtContainers(#20185,#20001)
#20186=*
exprs(#20186,64,#20185,0,"y = 19")
#20187=@"loc,{#10000},6,5,6,10"
locations_default(#20187,#10000,6,5,6,10)
hasLocation(#20186,#20187)
enclosingStmt(#20186,#20185)
exprContainers(#20186,#20001)
exprs(#20185,64,#20184,0,"x = 23")
#20186=@"loc,{#10000},5,5,5,10"
locations_default(#20186,#10000,5,5,5,10)
hasLocation(#20185,#20186)
enclosingStmt(#20185,#20184)
exprContainers(#20185,#20001)
#20187=*
exprs(#20187,78,#20185,0,"x")
hasLocation(#20187,#20060)
enclosingStmt(#20187,#20184)
exprContainers(#20187,#20001)
literals("x","x",#20187)
decl(#20187,#20155)
#20188=*
exprs(#20188,78,#20186,0,"y")
hasLocation(#20188,#20070)
enclosingStmt(#20188,#20185)
exprs(#20188,3,#20185,1,"23")
hasLocation(#20188,#20064)
enclosingStmt(#20188,#20184)
exprContainers(#20188,#20001)
literals("y","y",#20188)
decl(#20188,#20156)
literals("23","23",#20188)
#20189=*
exprs(#20189,3,#20186,1,"19")
hasLocation(#20189,#20074)
enclosingStmt(#20189,#20185)
exprContainers(#20189,#20001)
literals("19","19",#20189)
stmts(#20189,18,#20001,2,"var y = 19;")
hasLocation(#20189,#20013)
stmtContainers(#20189,#20001)
#20190=*
stmts(#20190,2,#20001,3,"`${x} + ... + y}`;")
hasLocation(#20190,#20015)
stmtContainers(#20190,#20001)
#20191=*
exprs(#20191,71,#20190,0,"`${x} + ... x + y}`")
#20192=@"loc,{#10000},7,1,7,24"
locations_default(#20192,#10000,7,1,7,24)
hasLocation(#20191,#20192)
enclosingStmt(#20191,#20190)
exprContainers(#20191,#20001)
exprs(#20190,64,#20189,0,"y = 19")
#20191=@"loc,{#10000},6,5,6,10"
locations_default(#20191,#10000,6,5,6,10)
hasLocation(#20190,#20191)
enclosingStmt(#20190,#20189)
exprContainers(#20190,#20001)
#20192=*
exprs(#20192,78,#20190,0,"y")
hasLocation(#20192,#20070)
enclosingStmt(#20192,#20189)
exprContainers(#20192,#20001)
literals("y","y",#20192)
decl(#20192,#20156)
#20193=*
exprs(#20193,79,#20191,0,"x")
hasLocation(#20193,#20084)
enclosingStmt(#20193,#20190)
exprs(#20193,3,#20190,1,"19")
hasLocation(#20193,#20074)
enclosingStmt(#20193,#20189)
exprContainers(#20193,#20001)
literals("x","x",#20193)
bind(#20193,#20155)
literals("19","19",#20193)
#20194=*
exprs(#20194,72,#20191,1," + ")
hasLocation(#20194,#20088)
enclosingStmt(#20194,#20190)
exprContainers(#20194,#20001)
literals(" + "," + ",#20194)
stmts(#20194,2,#20001,3,"`${x} + ... + y}`;")
hasLocation(#20194,#20015)
stmtContainers(#20194,#20001)
#20195=*
exprs(#20195,79,#20191,2,"y")
hasLocation(#20195,#20092)
enclosingStmt(#20195,#20190)
exprs(#20195,71,#20194,0,"`${x} + ... x + y}`")
#20196=@"loc,{#10000},7,1,7,24"
locations_default(#20196,#10000,7,1,7,24)
hasLocation(#20195,#20196)
enclosingStmt(#20195,#20194)
exprContainers(#20195,#20001)
literals("y","y",#20195)
bind(#20195,#20156)
#20196=*
exprs(#20196,72,#20191,3," = ")
hasLocation(#20196,#20096)
enclosingStmt(#20196,#20190)
exprContainers(#20196,#20001)
literals(" = "," = ",#20196)
#20197=*
exprs(#20197,34,#20191,4,"x + y")
#20198=@"loc,{#10000},7,18,7,22"
locations_default(#20198,#10000,7,18,7,22)
hasLocation(#20197,#20198)
enclosingStmt(#20197,#20190)
exprs(#20197,79,#20195,0,"x")
hasLocation(#20197,#20084)
enclosingStmt(#20197,#20194)
exprContainers(#20197,#20001)
literals("x","x",#20197)
bind(#20197,#20155)
#20198=*
exprs(#20198,72,#20195,1," + ")
hasLocation(#20198,#20088)
enclosingStmt(#20198,#20194)
exprContainers(#20198,#20001)
literals(" + "," + ",#20198)
#20199=*
exprs(#20199,79,#20197,0,"x")
hasLocation(#20199,#20100)
enclosingStmt(#20199,#20190)
exprs(#20199,79,#20195,2,"y")
hasLocation(#20199,#20092)
enclosingStmt(#20199,#20194)
exprContainers(#20199,#20001)
literals("x","x",#20199)
bind(#20199,#20155)
literals("y","y",#20199)
bind(#20199,#20156)
#20200=*
exprs(#20200,79,#20197,1,"y")
hasLocation(#20200,#20104)
enclosingStmt(#20200,#20190)
exprs(#20200,72,#20195,3," = ")
hasLocation(#20200,#20096)
enclosingStmt(#20200,#20194)
exprContainers(#20200,#20001)
literals("y","y",#20200)
bind(#20200,#20156)
literals(" = "," = ",#20200)
#20201=*
stmts(#20201,2,#20001,4,"tag `${ ... + y}`;")
hasLocation(#20201,#20017)
stmtContainers(#20201,#20001)
#20202=*
exprs(#20202,70,#20201,0,"tag `${ ... x + y}`")
#20203=@"loc,{#10000},8,1,8,28"
locations_default(#20203,#10000,8,1,8,28)
hasLocation(#20202,#20203)
enclosingStmt(#20202,#20201)
exprContainers(#20202,#20001)
exprs(#20201,34,#20195,4,"x + y")
#20202=@"loc,{#10000},7,18,7,22"
locations_default(#20202,#10000,7,18,7,22)
hasLocation(#20201,#20202)
enclosingStmt(#20201,#20194)
exprContainers(#20201,#20001)
#20203=*
exprs(#20203,79,#20201,0,"x")
hasLocation(#20203,#20100)
enclosingStmt(#20203,#20194)
exprContainers(#20203,#20001)
literals("x","x",#20203)
bind(#20203,#20155)
#20204=*
exprs(#20204,79,#20202,0,"tag")
hasLocation(#20204,#20114)
enclosingStmt(#20204,#20201)
exprs(#20204,79,#20201,1,"y")
hasLocation(#20204,#20104)
enclosingStmt(#20204,#20194)
exprContainers(#20204,#20001)
literals("tag","tag",#20204)
bind(#20204,#20154)
literals("y","y",#20204)
bind(#20204,#20156)
#20205=*
exprs(#20205,71,#20202,1,"`${x} + ... x + y}`")
#20206=@"loc,{#10000},8,5,8,28"
locations_default(#20206,#10000,8,5,8,28)
hasLocation(#20205,#20206)
enclosingStmt(#20205,#20201)
exprContainers(#20205,#20001)
#20207=*
exprs(#20207,79,#20205,0,"x")
hasLocation(#20207,#20122)
enclosingStmt(#20207,#20201)
exprContainers(#20207,#20001)
literals("x","x",#20207)
bind(#20207,#20155)
stmts(#20205,2,#20001,4,"tag `${ ... + y}`;")
hasLocation(#20205,#20017)
stmtContainers(#20205,#20001)
#20206=*
exprs(#20206,70,#20205,0,"tag `${ ... x + y}`")
#20207=@"loc,{#10000},8,1,8,28"
locations_default(#20207,#10000,8,1,8,28)
hasLocation(#20206,#20207)
enclosingStmt(#20206,#20205)
exprContainers(#20206,#20001)
#20208=*
exprs(#20208,72,#20205,1," + ")
hasLocation(#20208,#20126)
enclosingStmt(#20208,#20201)
exprs(#20208,79,#20206,0,"tag")
hasLocation(#20208,#20114)
enclosingStmt(#20208,#20205)
exprContainers(#20208,#20001)
literals(" + "," + ",#20208)
literals("tag","tag",#20208)
bind(#20208,#20154)
#20209=*
exprs(#20209,79,#20205,2,"y")
hasLocation(#20209,#20130)
enclosingStmt(#20209,#20201)
exprs(#20209,71,#20206,1,"`${x} + ... x + y}`")
#20210=@"loc,{#10000},8,5,8,28"
locations_default(#20210,#10000,8,5,8,28)
hasLocation(#20209,#20210)
enclosingStmt(#20209,#20205)
exprContainers(#20209,#20001)
literals("y","y",#20209)
bind(#20209,#20156)
#20210=*
exprs(#20210,72,#20205,3," = ")
hasLocation(#20210,#20134)
enclosingStmt(#20210,#20201)
exprContainers(#20210,#20001)
literals(" = "," = ",#20210)
#20211=*
exprs(#20211,34,#20205,4,"x + y")
#20212=@"loc,{#10000},8,22,8,26"
locations_default(#20212,#10000,8,22,8,26)
hasLocation(#20211,#20212)
enclosingStmt(#20211,#20201)
exprs(#20211,79,#20209,0,"x")
hasLocation(#20211,#20122)
enclosingStmt(#20211,#20205)
exprContainers(#20211,#20001)
literals("x","x",#20211)
bind(#20211,#20155)
#20212=*
exprs(#20212,72,#20209,1," + ")
hasLocation(#20212,#20126)
enclosingStmt(#20212,#20205)
exprContainers(#20212,#20001)
literals(" + "," + ",#20212)
#20213=*
exprs(#20213,79,#20211,0,"x")
hasLocation(#20213,#20138)
enclosingStmt(#20213,#20201)
exprs(#20213,79,#20209,2,"y")
hasLocation(#20213,#20130)
enclosingStmt(#20213,#20205)
exprContainers(#20213,#20001)
literals("x","x",#20213)
bind(#20213,#20155)
literals("y","y",#20213)
bind(#20213,#20156)
#20214=*
exprs(#20214,79,#20211,1,"y")
hasLocation(#20214,#20142)
enclosingStmt(#20214,#20201)
exprs(#20214,72,#20209,3," = ")
hasLocation(#20214,#20134)
enclosingStmt(#20214,#20205)
exprContainers(#20214,#20001)
literals("y","y",#20214)
bind(#20214,#20156)
literals(" = "," = ",#20214)
#20215=*
entry_cfg_node(#20215,#20001)
#20216=@"loc,{#10000},1,1,1,0"
locations_default(#20216,#10000,1,1,1,0)
exprs(#20215,34,#20209,4,"x + y")
#20216=@"loc,{#10000},8,22,8,26"
locations_default(#20216,#10000,8,22,8,26)
hasLocation(#20215,#20216)
enclosingStmt(#20215,#20205)
exprContainers(#20215,#20001)
#20217=*
exit_cfg_node(#20217,#20001)
hasLocation(#20217,#20152)
successor(#20201,#20202)
successor(#20202,#20204)
successor(#20205,#20207)
successor(#20214,#20211)
successor(#20213,#20214)
successor(#20211,#20217)
successor(#20210,#20213)
successor(#20209,#20210)
successor(#20208,#20209)
successor(#20207,#20208)
successor(#20204,#20205)
successor(#20190,#20191)
successor(#20191,#20193)
successor(#20200,#20197)
successor(#20199,#20200)
successor(#20197,#20201)
successor(#20196,#20199)
successor(#20195,#20196)
successor(#20194,#20195)
successor(#20193,#20194)
successor(#20185,#20188)
successor(#20189,#20186)
successor(#20188,#20189)
successor(#20186,#20190)
successor(#20180,#20183)
successor(#20184,#20181)
successor(#20183,#20184)
successor(#20181,#20185)
successor(#20157,#20180)
exprs(#20217,79,#20215,0,"x")
hasLocation(#20217,#20138)
enclosingStmt(#20217,#20205)
exprContainers(#20217,#20001)
literals("x","x",#20217)
bind(#20217,#20155)
#20218=*
entry_cfg_node(#20218,#20157)
hasLocation(#20218,#20216)
exprs(#20218,79,#20215,1,"y")
hasLocation(#20218,#20142)
enclosingStmt(#20218,#20205)
exprContainers(#20218,#20001)
literals("y","y",#20218)
bind(#20218,#20156)
#20219=*
exit_cfg_node(#20219,#20157)
#20220=@"loc,{#10000},3,2,3,1"
locations_default(#20220,#10000,3,2,3,1)
entry_cfg_node(#20219,#20001)
#20220=@"loc,{#10000},1,1,1,0"
locations_default(#20220,#10000,1,1,1,0)
hasLocation(#20219,#20220)
#20221=*
exit_cfg_node(#20221,#20001)
hasLocation(#20221,#20152)
successor(#20205,#20206)
successor(#20206,#20208)
successor(#20209,#20211)
successor(#20218,#20215)
successor(#20217,#20218)
successor(#20215,#20221)
successor(#20214,#20217)
successor(#20213,#20214)
successor(#20212,#20213)
successor(#20211,#20212)
successor(#20208,#20209)
successor(#20194,#20195)
successor(#20195,#20197)
successor(#20204,#20201)
successor(#20203,#20204)
successor(#20201,#20205)
successor(#20200,#20203)
successor(#20199,#20200)
successor(#20198,#20199)
successor(#20197,#20198)
successor(#20189,#20192)
successor(#20193,#20190)
successor(#20192,#20193)
successor(#20190,#20194)
successor(#20184,#20187)
successor(#20188,#20185)
successor(#20187,#20188)
successor(#20185,#20189)
successor(#20157,#20184)
#20222=*
entry_cfg_node(#20222,#20157)
hasLocation(#20222,#20220)
#20223=*
exit_cfg_node(#20223,#20157)
#20224=@"loc,{#10000},3,2,3,1"
locations_default(#20224,#10000,3,2,3,1)
hasLocation(#20223,#20224)
successor(#20166,#20172)
successor(#20179,#20173)
successor(#20178,#20175)
successor(#20177,#20178)
successor(#20175,#20179)
successor(#20173,#20170)
successor(#20172,#20177)
successor(#20181,#20175)
successor(#20180,#20177)
successor(#20179,#20180)
successor(#20177,#20181)
successor(#20175,#20170)
successor(#20172,#20179)
successor(#20170,#20168)
successor(#20168,#20219)
successor(#20168,#20223)
successor(#20164,#20166)
successor(#20162,#20164)
successor(#20218,#20162)
successor(#20222,#20162)
successor(#20159,#20157)
successor(#20215,#20159)
successor(#20219,#20159)
numlines(#10000,8,7,0)
filetype(#10000,"javascript")

View File

@@ -128,36 +128,42 @@ enclosingStmt(#20040,#20038)
exprContainers(#20040,#20029)
literals("use strict","'use strict'",#20040)
#20041=*
entry_cfg_node(#20041,#20001)
#20042=@"loc,{#10000},1,1,1,0"
locations_default(#20042,#10000,1,1,1,0)
regexpterm(#20041,14,#20040,0,"use strict")
#20042=@"loc,{#10000},1,20,1,29"
locations_default(#20042,#10000,1,20,1,29)
hasLocation(#20041,#20042)
regexpConstValue(#20041,"use strict")
#20043=*
exit_cfg_node(#20043,#20001)
hasLocation(#20043,#20027)
successor(#20029,#20043)
#20044=*
entry_cfg_node(#20044,#20029)
hasLocation(#20044,#20042)
entry_cfg_node(#20043,#20001)
#20044=@"loc,{#10000},1,1,1,0"
locations_default(#20044,#10000,1,1,1,0)
hasLocation(#20043,#20044)
#20045=*
exit_cfg_node(#20045,#20029)
exit_cfg_node(#20045,#20001)
hasLocation(#20045,#20027)
successor(#20029,#20045)
#20046=*
entry_cfg_node(#20046,#20029)
hasLocation(#20046,#20044)
#20047=*
exit_cfg_node(#20047,#20029)
hasLocation(#20047,#20027)
successor(#20036,#20038)
successor(#20038,#20040)
successor(#20040,#20045)
successor(#20040,#20047)
successor(#20033,#20036)
successor(#20035,#20033)
successor(#20044,#20035)
successor(#20046,#20035)
successor(#20030,#20029)
successor(#20041,#20030)
#20046=*
jsParseErrors(#20046,#20001,"Error: Illegal 'use strict' directive in function with non-simple parameter list","function f(a=2) { 'use strict'; }")
#20047=@"loc,{#10000},1,19,1,19"
locations_default(#20047,#10000,1,19,1,19)
hasLocation(#20046,#20047)
successor(#20043,#20030)
#20048=*
lines(#20048,#20001,"function f(a=2) { 'use strict'; }","")
hasLocation(#20048,#20003)
jsParseErrors(#20048,#20001,"Error: Illegal 'use strict' directive in function with non-simple parameter list","function f(a=2) { 'use strict'; }")
#20049=@"loc,{#10000},1,19,1,19"
locations_default(#20049,#10000,1,19,1,19)
hasLocation(#20048,#20049)
#20050=*
lines(#20050,#20001,"function f(a=2) { 'use strict'; }","")
hasLocation(#20050,#20003)
numlines(#20001,1,0,0)
numlines(#10000,1,1,0)
filetype(#10000,"javascript")

View File

@@ -120,47 +120,59 @@ enclosingStmt(#20039,#20034)
exprContainers(#20039,#20001)
literals("abc","""abc""",#20039)
#20040=*
stmts(#20040,18,#20001,1,"var s2 = ""ab\u2029c"";")
#20041=@"loc,{#10000},2,1,2,16"
locations_default(#20041,#10000,2,1,2,16)
regexpterm(#20040,14,#20039,0,"abc")
#20041=@"loc,{#10000},1,11,1,14"
locations_default(#20041,#10000,1,11,1,14)
hasLocation(#20040,#20041)
stmtContainers(#20040,#20001)
regexpConstValue(#20040,"abc")
#20042=*
exprs(#20042,64,#20040,0,"s2 = ""ab\u2029c""")
#20043=@"loc,{#10000},2,5,2,15"
locations_default(#20043,#10000,2,5,2,15)
stmts(#20042,18,#20001,1,"var s2 = ""ab\u2029c"";")
#20043=@"loc,{#10000},2,1,2,16"
locations_default(#20043,#10000,2,1,2,16)
hasLocation(#20042,#20043)
enclosingStmt(#20042,#20040)
exprContainers(#20042,#20001)
stmtContainers(#20042,#20001)
#20044=*
exprs(#20044,78,#20042,0,"s2")
hasLocation(#20044,#20022)
enclosingStmt(#20044,#20040)
exprs(#20044,64,#20042,0,"s2 = ""ab\u2029c""")
#20045=@"loc,{#10000},2,5,2,15"
locations_default(#20045,#10000,2,5,2,15)
hasLocation(#20044,#20045)
enclosingStmt(#20044,#20042)
exprContainers(#20044,#20001)
literals("s2","s2",#20044)
decl(#20044,#20033)
#20045=*
exprs(#20045,4,#20042,1,"""ab\u2029c""")
hasLocation(#20045,#20026)
enclosingStmt(#20045,#20040)
exprContainers(#20045,#20001)
literals("abc","""abc""",#20045)
#20046=*
entry_cfg_node(#20046,#20001)
#20047=@"loc,{#10000},1,1,1,0"
locations_default(#20047,#10000,1,1,1,0)
hasLocation(#20046,#20047)
exprs(#20046,78,#20044,0,"s2")
hasLocation(#20046,#20022)
enclosingStmt(#20046,#20042)
exprContainers(#20046,#20001)
literals("s2","s2",#20046)
decl(#20046,#20033)
#20047=*
exprs(#20047,4,#20044,1,"""ab\u2029c""")
hasLocation(#20047,#20026)
enclosingStmt(#20047,#20042)
exprContainers(#20047,#20001)
literals("abc","""abc""",#20047)
#20048=*
exit_cfg_node(#20048,#20001)
hasLocation(#20048,#20030)
successor(#20040,#20044)
successor(#20045,#20042)
successor(#20044,#20045)
successor(#20042,#20048)
regexpterm(#20048,14,#20047,0,"abc")
#20049=@"loc,{#10000},2,11,2,14"
locations_default(#20049,#10000,2,11,2,14)
hasLocation(#20048,#20049)
regexpConstValue(#20048,"abc")
#20050=*
entry_cfg_node(#20050,#20001)
#20051=@"loc,{#10000},1,1,1,0"
locations_default(#20051,#10000,1,1,1,0)
hasLocation(#20050,#20051)
#20052=*
exit_cfg_node(#20052,#20001)
hasLocation(#20052,#20030)
successor(#20042,#20046)
successor(#20047,#20044)
successor(#20046,#20047)
successor(#20044,#20052)
successor(#20034,#20038)
successor(#20039,#20036)
successor(#20038,#20039)
successor(#20036,#20040)
successor(#20046,#20034)
successor(#20036,#20042)
successor(#20050,#20034)
numlines(#10000,4,2,0)
filetype(#10000,"javascript")

View File

@@ -211,153 +211,171 @@ enclosingStmt(#20075,#20072)
exprContainers(#20075,#20001)
literals("m","""m""",#20075)
#20076=*
stmts(#20076,2,#20001,1,"b ? imp ... ) : {};")
hasLocation(#20076,#20005)
stmtContainers(#20076,#20001)
#20077=*
exprs(#20077,11,#20076,0,"b ? import(""n"") : {}")
#20078=@"loc,{#10000},2,1,2,20"
locations_default(#20078,#10000,2,1,2,20)
hasLocation(#20077,#20078)
enclosingStmt(#20077,#20076)
exprContainers(#20077,#20001)
regexpterm(#20076,14,#20075,0,"m")
#20077=@"loc,{#10000},1,9,1,9"
locations_default(#20077,#10000,1,9,1,9)
hasLocation(#20076,#20077)
regexpConstValue(#20076,"m")
#20078=*
stmts(#20078,2,#20001,1,"b ? imp ... ) : {};")
hasLocation(#20078,#20005)
stmtContainers(#20078,#20001)
#20079=*
exprs(#20079,79,#20077,0,"b")
hasLocation(#20079,#20019)
enclosingStmt(#20079,#20076)
exprs(#20079,11,#20078,0,"b ? import(""n"") : {}")
#20080=@"loc,{#10000},2,1,2,20"
locations_default(#20080,#10000,2,1,2,20)
hasLocation(#20079,#20080)
enclosingStmt(#20079,#20078)
exprContainers(#20079,#20001)
literals("b","b",#20079)
#20080=@"var;{b};{#20000}"
variables(#20080,"b",#20000)
bind(#20079,#20080)
#20081=*
exprs(#20081,99,#20077,1,"import(""n"")")
#20082=@"loc,{#10000},2,5,2,15"
locations_default(#20082,#10000,2,5,2,15)
hasLocation(#20081,#20082)
enclosingStmt(#20081,#20076)
exprs(#20081,79,#20079,0,"b")
hasLocation(#20081,#20019)
enclosingStmt(#20081,#20078)
exprContainers(#20081,#20001)
literals("b","b",#20081)
#20082=@"var;{b};{#20000}"
variables(#20082,"b",#20000)
bind(#20081,#20082)
#20083=*
exprs(#20083,4,#20081,0,"""n""")
hasLocation(#20083,#20027)
enclosingStmt(#20083,#20076)
exprs(#20083,99,#20079,1,"import(""n"")")
#20084=@"loc,{#10000},2,5,2,15"
locations_default(#20084,#10000,2,5,2,15)
hasLocation(#20083,#20084)
enclosingStmt(#20083,#20078)
exprContainers(#20083,#20001)
literals("n","""n""",#20083)
#20084=*
exprs(#20084,8,#20077,2,"{}")
#20085=@"loc,{#10000},2,19,2,20"
locations_default(#20085,#10000,2,19,2,20)
hasLocation(#20084,#20085)
enclosingStmt(#20084,#20076)
exprContainers(#20084,#20001)
#20085=*
exprs(#20085,4,#20083,0,"""n""")
hasLocation(#20085,#20027)
enclosingStmt(#20085,#20078)
exprContainers(#20085,#20001)
literals("n","""n""",#20085)
#20086=*
stmts(#20086,2,#20001,2,"import( ... => {});")
hasLocation(#20086,#20007)
stmtContainers(#20086,#20001)
#20087=*
exprs(#20087,13,#20086,0,"import( ... => {})")
#20088=@"loc,{#10000},3,1,3,27"
locations_default(#20088,#10000,3,1,3,27)
hasLocation(#20087,#20088)
enclosingStmt(#20087,#20086)
exprContainers(#20087,#20001)
#20089=*
exprs(#20089,14,#20087,-1,"import(""o"").then")
#20090=@"loc,{#10000},3,1,3,16"
locations_default(#20090,#10000,3,1,3,16)
hasLocation(#20089,#20090)
enclosingStmt(#20089,#20086)
exprContainers(#20089,#20001)
regexpterm(#20086,14,#20085,0,"n")
#20087=@"loc,{#10000},2,13,2,13"
locations_default(#20087,#10000,2,13,2,13)
hasLocation(#20086,#20087)
regexpConstValue(#20086,"n")
#20088=*
exprs(#20088,8,#20079,2,"{}")
#20089=@"loc,{#10000},2,19,2,20"
locations_default(#20089,#10000,2,19,2,20)
hasLocation(#20088,#20089)
enclosingStmt(#20088,#20078)
exprContainers(#20088,#20001)
#20090=*
stmts(#20090,2,#20001,2,"import( ... => {});")
hasLocation(#20090,#20007)
stmtContainers(#20090,#20001)
#20091=*
exprs(#20091,99,#20089,0,"import(""o"")")
#20092=@"loc,{#10000},3,1,3,11"
locations_default(#20092,#10000,3,1,3,11)
exprs(#20091,13,#20090,0,"import( ... => {})")
#20092=@"loc,{#10000},3,1,3,27"
locations_default(#20092,#10000,3,1,3,27)
hasLocation(#20091,#20092)
enclosingStmt(#20091,#20086)
enclosingStmt(#20091,#20090)
exprContainers(#20091,#20001)
#20093=*
exprs(#20093,4,#20091,0,"""o""")
hasLocation(#20093,#20043)
enclosingStmt(#20093,#20086)
exprs(#20093,14,#20091,-1,"import(""o"").then")
#20094=@"loc,{#10000},3,1,3,16"
locations_default(#20094,#10000,3,1,3,16)
hasLocation(#20093,#20094)
enclosingStmt(#20093,#20090)
exprContainers(#20093,#20001)
literals("o","""o""",#20093)
#20094=*
exprs(#20094,0,#20089,1,"then")
hasLocation(#20094,#20049)
enclosingStmt(#20094,#20086)
exprContainers(#20094,#20001)
literals("then","then",#20094)
#20095=*
exprs(#20095,65,#20087,0,"(o) => {}")
#20096=@"loc,{#10000},3,18,3,26"
locations_default(#20096,#10000,3,18,3,26)
exprs(#20095,99,#20093,0,"import(""o"")")
#20096=@"loc,{#10000},3,1,3,11"
locations_default(#20096,#10000,3,1,3,11)
hasLocation(#20095,#20096)
enclosingStmt(#20095,#20086)
enclosingStmt(#20095,#20090)
exprContainers(#20095,#20001)
#20097=*
scopes(#20097,1)
scopenodes(#20095,#20097)
scopenesting(#20097,#20071)
#20098=@"var;{o};{#20097}"
variables(#20098,"o",#20097)
#20099=*
exprs(#20099,78,#20095,0,"o")
hasLocation(#20099,#20055)
exprContainers(#20099,#20095)
literals("o","o",#20099)
decl(#20099,#20098)
exprs(#20097,4,#20095,0,"""o""")
hasLocation(#20097,#20043)
enclosingStmt(#20097,#20090)
exprContainers(#20097,#20001)
literals("o","""o""",#20097)
#20098=*
regexpterm(#20098,14,#20097,0,"o")
#20099=@"loc,{#10000},3,9,3,9"
locations_default(#20099,#10000,3,9,3,9)
hasLocation(#20098,#20099)
regexpConstValue(#20098,"o")
#20100=*
stmts(#20100,1,#20095,-2,"{}")
#20101=@"loc,{#10000},3,25,3,26"
locations_default(#20101,#10000,3,25,3,26)
hasLocation(#20100,#20101)
stmtContainers(#20100,#20095)
#20102=*
entry_cfg_node(#20102,#20001)
#20103=@"loc,{#10000},1,1,1,0"
locations_default(#20103,#10000,1,1,1,0)
hasLocation(#20102,#20103)
#20104=*
exit_cfg_node(#20104,#20001)
hasLocation(#20104,#20069)
successor(#20086,#20093)
successor(#20095,#20087)
exprs(#20100,0,#20093,1,"then")
hasLocation(#20100,#20049)
enclosingStmt(#20100,#20090)
exprContainers(#20100,#20001)
literals("then","then",#20100)
#20101=*
exprs(#20101,65,#20091,0,"(o) => {}")
#20102=@"loc,{#10000},3,18,3,26"
locations_default(#20102,#10000,3,18,3,26)
hasLocation(#20101,#20102)
enclosingStmt(#20101,#20090)
exprContainers(#20101,#20001)
#20103=*
scopes(#20103,1)
scopenodes(#20101,#20103)
scopenesting(#20103,#20071)
#20104=@"var;{o};{#20103}"
variables(#20104,"o",#20103)
#20105=*
entry_cfg_node(#20105,#20095)
#20106=@"loc,{#10000},3,18,3,17"
locations_default(#20106,#10000,3,18,3,17)
hasLocation(#20105,#20106)
#20107=*
exit_cfg_node(#20107,#20095)
#20108=@"loc,{#10000},3,27,3,26"
locations_default(#20108,#10000,3,27,3,26)
hasLocation(#20107,#20108)
successor(#20100,#20107)
successor(#20099,#20100)
successor(#20105,#20099)
successor(#20094,#20089)
successor(#20093,#20091)
successor(#20091,#20094)
successor(#20089,#20095)
successor(#20087,#20104)
successor(#20076,#20077)
successor(#20077,#20079)
#20109=*
guard_node(#20109,1,#20079)
hasLocation(#20109,#20019)
successor(#20109,#20083)
exprs(#20105,78,#20101,0,"o")
hasLocation(#20105,#20055)
exprContainers(#20105,#20101)
literals("o","o",#20105)
decl(#20105,#20104)
#20106=*
stmts(#20106,1,#20101,-2,"{}")
#20107=@"loc,{#10000},3,25,3,26"
locations_default(#20107,#10000,3,25,3,26)
hasLocation(#20106,#20107)
stmtContainers(#20106,#20101)
#20108=*
entry_cfg_node(#20108,#20001)
#20109=@"loc,{#10000},1,1,1,0"
locations_default(#20109,#10000,1,1,1,0)
hasLocation(#20108,#20109)
#20110=*
guard_node(#20110,0,#20079)
hasLocation(#20110,#20019)
successor(#20110,#20084)
successor(#20079,#20109)
successor(#20079,#20110)
successor(#20083,#20081)
successor(#20081,#20086)
successor(#20084,#20086)
exit_cfg_node(#20110,#20001)
hasLocation(#20110,#20069)
successor(#20090,#20097)
successor(#20101,#20091)
#20111=*
entry_cfg_node(#20111,#20101)
#20112=@"loc,{#10000},3,18,3,17"
locations_default(#20112,#10000,3,18,3,17)
hasLocation(#20111,#20112)
#20113=*
exit_cfg_node(#20113,#20101)
#20114=@"loc,{#10000},3,27,3,26"
locations_default(#20114,#10000,3,27,3,26)
hasLocation(#20113,#20114)
successor(#20106,#20113)
successor(#20105,#20106)
successor(#20111,#20105)
successor(#20100,#20093)
successor(#20097,#20095)
successor(#20095,#20100)
successor(#20093,#20101)
successor(#20091,#20110)
successor(#20078,#20079)
successor(#20079,#20081)
#20115=*
guard_node(#20115,1,#20081)
hasLocation(#20115,#20019)
successor(#20115,#20085)
#20116=*
guard_node(#20116,0,#20081)
hasLocation(#20116,#20019)
successor(#20116,#20088)
successor(#20081,#20115)
successor(#20081,#20116)
successor(#20085,#20083)
successor(#20083,#20090)
successor(#20088,#20090)
successor(#20072,#20075)
successor(#20075,#20073)
successor(#20073,#20076)
successor(#20102,#20072)
successor(#20073,#20078)
successor(#20108,#20072)
numlines(#10000,3,3,0)
filetype(#10000,"javascript")

View File

@@ -169,95 +169,101 @@ enclosingStmt(#20059,#20058)
exprContainers(#20059,#20001)
literals("settings","'settings'",#20059)
#20060=*
exprs(#20060,83,#20058,0,"language")
hasLocation(#20060,#20011)
enclosingStmt(#20060,#20058)
exprContainers(#20060,#20001)
#20061=*
exprs(#20061,0,#20060,0,"language")
hasLocation(#20061,#20011)
enclosingStmt(#20061,#20058)
exprContainers(#20061,#20001)
literals("language","language",#20061)
regexpterm(#20060,14,#20059,0,"settings")
#20061=@"loc,{#10000},1,27,1,34"
locations_default(#20061,#10000,1,27,1,34)
hasLocation(#20060,#20061)
regexpConstValue(#20060,"settings")
#20062=*
exprs(#20062,78,#20060,1,"language")
exprs(#20062,83,#20058,0,"language")
hasLocation(#20062,#20011)
enclosingStmt(#20062,#20058)
exprContainers(#20062,#20001)
literals("language","language",#20062)
decl(#20062,#20054)
typedecl(#20062,#20055)
namespacedecl(#20062,#20056)
#20063=*
stmts(#20063,22,#20001,1,"const s ... age}`);")
hasLocation(#20063,#20005)
stmtContainers(#20063,#20001)
exprs(#20063,0,#20062,0,"language")
hasLocation(#20063,#20011)
enclosingStmt(#20063,#20058)
exprContainers(#20063,#20001)
literals("language","language",#20063)
#20064=*
exprs(#20064,64,#20063,0,"strings ... uage}`)")
#20065=@"loc,{#10000},2,7,2,50"
locations_default(#20065,#10000,2,7,2,50)
hasLocation(#20064,#20065)
enclosingStmt(#20064,#20063)
exprs(#20064,78,#20062,1,"language")
hasLocation(#20064,#20011)
enclosingStmt(#20064,#20058)
exprContainers(#20064,#20001)
literals("language","language",#20064)
decl(#20064,#20054)
typedecl(#20064,#20055)
namespacedecl(#20064,#20056)
#20065=*
stmts(#20065,22,#20001,1,"const s ... age}`);")
hasLocation(#20065,#20005)
stmtContainers(#20065,#20001)
#20066=*
exprs(#20066,78,#20064,0,"strings")
hasLocation(#20066,#20023)
enclosingStmt(#20066,#20063)
exprs(#20066,64,#20065,0,"strings ... uage}`)")
#20067=@"loc,{#10000},2,7,2,50"
locations_default(#20067,#10000,2,7,2,50)
hasLocation(#20066,#20067)
enclosingStmt(#20066,#20065)
exprContainers(#20066,#20001)
literals("strings","strings",#20066)
decl(#20066,#20057)
#20067=*
exprs(#20067,92,#20064,1,"await i ... uage}`)")
#20068=@"loc,{#10000},2,17,2,50"
locations_default(#20068,#10000,2,17,2,50)
hasLocation(#20067,#20068)
enclosingStmt(#20067,#20063)
exprContainers(#20067,#20001)
#20068=*
exprs(#20068,78,#20066,0,"strings")
hasLocation(#20068,#20023)
enclosingStmt(#20068,#20065)
exprContainers(#20068,#20001)
literals("strings","strings",#20068)
decl(#20068,#20057)
#20069=*
exprs(#20069,99,#20067,0,"import( ... uage}`)")
#20070=@"loc,{#10000},2,23,2,50"
locations_default(#20070,#10000,2,23,2,50)
exprs(#20069,92,#20066,1,"await i ... uage}`)")
#20070=@"loc,{#10000},2,17,2,50"
locations_default(#20070,#10000,2,17,2,50)
hasLocation(#20069,#20070)
enclosingStmt(#20069,#20063)
enclosingStmt(#20069,#20065)
exprContainers(#20069,#20001)
#20071=*
exprs(#20071,71,#20069,0,"`./i18n/${language}`")
#20072=@"loc,{#10000},2,30,2,49"
locations_default(#20072,#10000,2,30,2,49)
exprs(#20071,99,#20069,0,"import( ... uage}`)")
#20072=@"loc,{#10000},2,23,2,50"
locations_default(#20072,#10000,2,23,2,50)
hasLocation(#20071,#20072)
enclosingStmt(#20071,#20063)
enclosingStmt(#20071,#20065)
exprContainers(#20071,#20001)
#20073=*
exprs(#20073,72,#20071,0,"./i18n/")
hasLocation(#20073,#20035)
enclosingStmt(#20073,#20063)
exprs(#20073,71,#20071,0,"`./i18n/${language}`")
#20074=@"loc,{#10000},2,30,2,49"
locations_default(#20074,#10000,2,30,2,49)
hasLocation(#20073,#20074)
enclosingStmt(#20073,#20065)
exprContainers(#20073,#20001)
literals("./i18n/","./i18n/",#20073)
#20074=*
exprs(#20074,79,#20071,1,"language")
hasLocation(#20074,#20039)
enclosingStmt(#20074,#20063)
exprContainers(#20074,#20001)
literals("language","language",#20074)
bind(#20074,#20054)
#20075=*
entry_cfg_node(#20075,#20001)
#20076=@"loc,{#10000},1,1,1,0"
locations_default(#20076,#10000,1,1,1,0)
hasLocation(#20075,#20076)
exprs(#20075,72,#20073,0,"./i18n/")
hasLocation(#20075,#20035)
enclosingStmt(#20075,#20065)
exprContainers(#20075,#20001)
literals("./i18n/","./i18n/",#20075)
#20076=*
exprs(#20076,79,#20073,1,"language")
hasLocation(#20076,#20039)
enclosingStmt(#20076,#20065)
exprContainers(#20076,#20001)
literals("language","language",#20076)
bind(#20076,#20054)
#20077=*
exit_cfg_node(#20077,#20001)
hasLocation(#20077,#20051)
successor(#20063,#20066)
successor(#20071,#20073)
successor(#20074,#20069)
successor(#20073,#20074)
successor(#20069,#20067)
successor(#20067,#20064)
successor(#20066,#20071)
successor(#20064,#20077)
successor(#20058,#20063)
successor(#20060,#20058)
successor(#20075,#20060)
entry_cfg_node(#20077,#20001)
#20078=@"loc,{#10000},1,1,1,0"
locations_default(#20078,#10000,1,1,1,0)
hasLocation(#20077,#20078)
#20079=*
exit_cfg_node(#20079,#20001)
hasLocation(#20079,#20051)
successor(#20065,#20068)
successor(#20073,#20075)
successor(#20076,#20071)
successor(#20075,#20076)
successor(#20071,#20069)
successor(#20069,#20066)
successor(#20068,#20073)
successor(#20066,#20079)
successor(#20058,#20065)
successor(#20062,#20058)
successor(#20077,#20062)
numlines(#10000,2,2,0)
filetype(#10000,"javascript")

View File

@@ -149,29 +149,35 @@ enclosingStmt(#20047,#20042)
exprContainers(#20047,#20035)
literals("foo","""foo""",#20047)
#20048=*
entry_cfg_node(#20048,#20001)
#20049=@"loc,{#10000},1,1,1,0"
locations_default(#20049,#10000,1,1,1,0)
regexpterm(#20048,14,#20047,0,"foo")
#20049=@"loc,{#10000},2,17,2,19"
locations_default(#20049,#10000,2,17,2,19)
hasLocation(#20048,#20049)
regexpConstValue(#20048,"foo")
#20050=*
exit_cfg_node(#20050,#20001)
hasLocation(#20050,#20032)
successor(#20035,#20050)
#20051=*
entry_cfg_node(#20051,#20035)
hasLocation(#20051,#20049)
entry_cfg_node(#20050,#20001)
#20051=@"loc,{#10000},1,1,1,0"
locations_default(#20051,#10000,1,1,1,0)
hasLocation(#20050,#20051)
#20052=*
exit_cfg_node(#20052,#20035)
#20053=@"loc,{#10000},3,2,3,1"
locations_default(#20053,#10000,3,2,3,1)
hasLocation(#20052,#20053)
exit_cfg_node(#20052,#20001)
hasLocation(#20052,#20032)
successor(#20035,#20052)
#20053=*
entry_cfg_node(#20053,#20035)
hasLocation(#20053,#20051)
#20054=*
exit_cfg_node(#20054,#20035)
#20055=@"loc,{#10000},3,2,3,1"
locations_default(#20055,#10000,3,2,3,1)
hasLocation(#20054,#20055)
successor(#20040,#20042)
successor(#20042,#20047)
successor(#20047,#20045)
successor(#20045,#20044)
successor(#20044,#20052)
successor(#20051,#20040)
successor(#20044,#20054)
successor(#20053,#20040)
successor(#20037,#20035)
successor(#20048,#20037)
successor(#20050,#20037)
numlines(#10000,3,3,0)
filetype(#10000,"javascript")

View File

@@ -685,112 +685,118 @@ enclosingStmt(#20215,#20212)
exprContainers(#20215,#20001)
literals("prototype","'prototype'",#20215)
#20216=*
exprs(#20216,79,#20213,1,"Object")
hasLocation(#20216,#20125)
enclosingStmt(#20216,#20212)
exprContainers(#20216,#20001)
literals("Object","Object",#20216)
#20217=@"var;{Object};{#20000}"
variables(#20217,"Object",#20000)
bind(#20216,#20217)
regexpterm(#20216,14,#20215,0,"prototype")
#20217=@"loc,{#10000},12,2,12,10"
locations_default(#20217,#10000,12,2,12,10)
hasLocation(#20216,#20217)
regexpConstValue(#20216,"prototype")
#20218=*
stmts(#20218,2,#20001,12,"[] instanceof Array;")
hasLocation(#20218,#20027)
stmtContainers(#20218,#20001)
#20219=*
exprs(#20219,43,#20218,0,"[] instanceof Array")
#20220=@"loc,{#10000},13,1,13,19"
locations_default(#20220,#10000,13,1,13,19)
hasLocation(#20219,#20220)
enclosingStmt(#20219,#20218)
exprContainers(#20219,#20001)
exprs(#20218,79,#20213,1,"Object")
hasLocation(#20218,#20125)
enclosingStmt(#20218,#20212)
exprContainers(#20218,#20001)
literals("Object","Object",#20218)
#20219=@"var;{Object};{#20000}"
variables(#20219,"Object",#20000)
bind(#20218,#20219)
#20220=*
stmts(#20220,2,#20001,12,"[] instanceof Array;")
hasLocation(#20220,#20027)
stmtContainers(#20220,#20001)
#20221=*
exprs(#20221,7,#20219,0,"[]")
#20222=@"loc,{#10000},13,1,13,2"
locations_default(#20222,#10000,13,1,13,2)
exprs(#20221,43,#20220,0,"[] instanceof Array")
#20222=@"loc,{#10000},13,1,13,19"
locations_default(#20222,#10000,13,1,13,19)
hasLocation(#20221,#20222)
enclosingStmt(#20221,#20218)
enclosingStmt(#20221,#20220)
exprContainers(#20221,#20001)
arraySize(#20221,0)
#20223=*
exprs(#20223,79,#20219,1,"Array")
hasLocation(#20223,#20135)
enclosingStmt(#20223,#20218)
exprs(#20223,7,#20221,0,"[]")
#20224=@"loc,{#10000},13,1,13,2"
locations_default(#20224,#10000,13,1,13,2)
hasLocation(#20223,#20224)
enclosingStmt(#20223,#20220)
exprContainers(#20223,#20001)
literals("Array","Array",#20223)
#20224=@"var;{Array};{#20000}"
variables(#20224,"Array",#20000)
bind(#20223,#20224)
arraySize(#20223,0)
#20225=*
stmts(#20225,2,#20001,13,"1 && 2;")
hasLocation(#20225,#20029)
stmtContainers(#20225,#20001)
#20226=*
exprs(#20226,44,#20225,0,"1 && 2")
#20227=@"loc,{#10000},14,1,14,6"
locations_default(#20227,#10000,14,1,14,6)
hasLocation(#20226,#20227)
enclosingStmt(#20226,#20225)
exprContainers(#20226,#20001)
exprs(#20225,79,#20221,1,"Array")
hasLocation(#20225,#20135)
enclosingStmt(#20225,#20220)
exprContainers(#20225,#20001)
literals("Array","Array",#20225)
#20226=@"var;{Array};{#20000}"
variables(#20226,"Array",#20000)
bind(#20225,#20226)
#20227=*
stmts(#20227,2,#20001,13,"1 && 2;")
hasLocation(#20227,#20029)
stmtContainers(#20227,#20001)
#20228=*
exprs(#20228,3,#20226,0,"1")
hasLocation(#20228,#20139)
enclosingStmt(#20228,#20225)
exprs(#20228,44,#20227,0,"1 && 2")
#20229=@"loc,{#10000},14,1,14,6"
locations_default(#20229,#10000,14,1,14,6)
hasLocation(#20228,#20229)
enclosingStmt(#20228,#20227)
exprContainers(#20228,#20001)
literals("1","1",#20228)
#20229=*
exprs(#20229,3,#20226,1,"2")
hasLocation(#20229,#20143)
enclosingStmt(#20229,#20225)
exprContainers(#20229,#20001)
literals("2","2",#20229)
#20230=*
stmts(#20230,2,#20001,14,"1 || 2;")
hasLocation(#20230,#20031)
stmtContainers(#20230,#20001)
exprs(#20230,3,#20228,0,"1")
hasLocation(#20230,#20139)
enclosingStmt(#20230,#20227)
exprContainers(#20230,#20001)
literals("1","1",#20230)
#20231=*
exprs(#20231,45,#20230,0,"1 || 2")
#20232=@"loc,{#10000},15,1,15,6"
locations_default(#20232,#10000,15,1,15,6)
hasLocation(#20231,#20232)
enclosingStmt(#20231,#20230)
exprs(#20231,3,#20228,1,"2")
hasLocation(#20231,#20143)
enclosingStmt(#20231,#20227)
exprContainers(#20231,#20001)
literals("2","2",#20231)
#20232=*
stmts(#20232,2,#20001,14,"1 || 2;")
hasLocation(#20232,#20031)
stmtContainers(#20232,#20001)
#20233=*
exprs(#20233,3,#20231,0,"1")
hasLocation(#20233,#20147)
enclosingStmt(#20233,#20230)
exprs(#20233,45,#20232,0,"1 || 2")
#20234=@"loc,{#10000},15,1,15,6"
locations_default(#20234,#10000,15,1,15,6)
hasLocation(#20233,#20234)
enclosingStmt(#20233,#20232)
exprContainers(#20233,#20001)
literals("1","1",#20233)
#20234=*
exprs(#20234,3,#20231,1,"2")
hasLocation(#20234,#20151)
enclosingStmt(#20234,#20230)
exprContainers(#20234,#20001)
literals("2","2",#20234)
#20235=*
entry_cfg_node(#20235,#20001)
#20236=@"loc,{#10000},1,1,1,0"
locations_default(#20236,#10000,1,1,1,0)
hasLocation(#20235,#20236)
exprs(#20235,3,#20233,0,"1")
hasLocation(#20235,#20147)
enclosingStmt(#20235,#20232)
exprContainers(#20235,#20001)
literals("1","1",#20235)
#20236=*
exprs(#20236,3,#20233,1,"2")
hasLocation(#20236,#20151)
enclosingStmt(#20236,#20232)
exprContainers(#20236,#20001)
literals("2","2",#20236)
#20237=*
exit_cfg_node(#20237,#20001)
hasLocation(#20237,#20155)
entry_cfg_node(#20237,#20001)
#20238=@"loc,{#10000},1,1,1,0"
locations_default(#20238,#10000,1,1,1,0)
hasLocation(#20237,#20238)
#20239=*
exit_cfg_node(#20239,#20001)
hasLocation(#20239,#20155)
successor(#20232,#20233)
successor(#20233,#20235)
successor(#20235,#20239)
successor(#20236,#20239)
successor(#20227,#20228)
successor(#20228,#20230)
successor(#20230,#20231)
successor(#20231,#20233)
successor(#20233,#20237)
successor(#20234,#20237)
successor(#20225,#20226)
successor(#20226,#20228)
successor(#20228,#20229)
successor(#20229,#20230)
successor(#20218,#20221)
successor(#20223,#20219)
successor(#20221,#20223)
successor(#20219,#20225)
successor(#20231,#20232)
successor(#20220,#20223)
successor(#20225,#20221)
successor(#20223,#20225)
successor(#20221,#20227)
successor(#20212,#20215)
successor(#20216,#20213)
successor(#20215,#20216)
successor(#20213,#20218)
successor(#20218,#20213)
successor(#20215,#20218)
successor(#20213,#20220)
successor(#20207,#20210)
successor(#20211,#20208)
successor(#20210,#20211)
@@ -835,6 +841,6 @@ successor(#20157,#20160)
successor(#20161,#20158)
successor(#20160,#20161)
successor(#20158,#20162)
successor(#20235,#20157)
successor(#20237,#20157)
numlines(#10000,15,15,0)
filetype(#10000,"javascript")

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -106,19 +106,25 @@ enclosingStmt(#20030,#20022)
exprContainers(#20030,#20001)
literals("Hello ES6","""Hello ES6""",#20030)
#20031=*
entry_cfg_node(#20031,#20001)
#20032=@"loc,{#10000},1,1,1,0"
locations_default(#20032,#10000,1,1,1,0)
regexpterm(#20031,14,#20030,0,"Hello ES6")
#20032=@"loc,{#10000},1,14,1,22"
locations_default(#20032,#10000,1,14,1,22)
hasLocation(#20031,#20032)
regexpConstValue(#20031,"Hello ES6")
#20033=*
exit_cfg_node(#20033,#20001)
hasLocation(#20033,#20019)
entry_cfg_node(#20033,#20001)
#20034=@"loc,{#10000},1,1,1,0"
locations_default(#20034,#10000,1,1,1,0)
hasLocation(#20033,#20034)
#20035=*
exit_cfg_node(#20035,#20001)
hasLocation(#20035,#20019)
successor(#20022,#20027)
successor(#20030,#20023)
successor(#20029,#20025)
successor(#20027,#20029)
successor(#20025,#20030)
successor(#20023,#20033)
successor(#20031,#20022)
successor(#20023,#20035)
successor(#20033,#20022)
numlines(#10000,1,1,0)
filetype(#10000,"javascript")

View File

@@ -106,19 +106,25 @@ enclosingStmt(#20030,#20022)
exprContainers(#20030,#20001)
literals("Hello ES","""Hello ES""",#20030)
#20031=*
entry_cfg_node(#20031,#20001)
#20032=@"loc,{#10000},1,1,1,0"
locations_default(#20032,#10000,1,1,1,0)
regexpterm(#20031,14,#20030,0,"Hello ES")
#20032=@"loc,{#10000},1,14,1,21"
locations_default(#20032,#10000,1,14,1,21)
hasLocation(#20031,#20032)
regexpConstValue(#20031,"Hello ES")
#20033=*
exit_cfg_node(#20033,#20001)
hasLocation(#20033,#20019)
entry_cfg_node(#20033,#20001)
#20034=@"loc,{#10000},1,1,1,0"
locations_default(#20034,#10000,1,1,1,0)
hasLocation(#20033,#20034)
#20035=*
exit_cfg_node(#20035,#20001)
hasLocation(#20035,#20019)
successor(#20022,#20027)
successor(#20030,#20023)
successor(#20029,#20025)
successor(#20027,#20029)
successor(#20025,#20030)
successor(#20023,#20033)
successor(#20031,#20022)
successor(#20023,#20035)
successor(#20033,#20022)
numlines(#10000,1,1,0)
filetype(#10000,"javascript")

View File

@@ -835,31 +835,43 @@ enclosingStmt(#20265,#20258)
exprContainers(#20265,#20001)
literals("final","'final'",#20265)
#20266=*
stmts(#20266,2,#20001,9,"'use strict';")
hasLocation(#20266,#20036)
stmtContainers(#20266,#20001)
#20267=*
exprs(#20267,4,#20266,0,"'use strict'")
hasLocation(#20267,#20170)
enclosingStmt(#20267,#20266)
exprContainers(#20267,#20001)
literals("use strict","'use strict'",#20267)
regexpterm(#20266,14,#20265,0,"final")
#20267=@"loc,{#10000},15,18,15,22"
locations_default(#20267,#10000,15,18,15,22)
hasLocation(#20266,#20267)
regexpConstValue(#20266,"final")
#20268=*
entry_cfg_node(#20268,#20001)
#20269=@"loc,{#10000},1,1,1,0"
locations_default(#20269,#10000,1,1,1,0)
hasLocation(#20268,#20269)
stmts(#20268,2,#20001,9,"'use strict';")
hasLocation(#20268,#20036)
stmtContainers(#20268,#20001)
#20269=*
exprs(#20269,4,#20268,0,"'use strict'")
hasLocation(#20269,#20170)
enclosingStmt(#20269,#20268)
exprContainers(#20269,#20001)
literals("use strict","'use strict'",#20269)
#20270=*
exit_cfg_node(#20270,#20001)
hasLocation(#20270,#20174)
successor(#20266,#20267)
successor(#20267,#20270)
regexpterm(#20270,14,#20269,0,"use strict")
#20271=@"loc,{#10000},17,2,17,11"
locations_default(#20271,#10000,17,2,17,11)
hasLocation(#20270,#20271)
regexpConstValue(#20270,"use strict")
#20272=*
entry_cfg_node(#20272,#20001)
#20273=@"loc,{#10000},1,1,1,0"
locations_default(#20273,#10000,1,1,1,0)
hasLocation(#20272,#20273)
#20274=*
exit_cfg_node(#20274,#20001)
hasLocation(#20274,#20174)
successor(#20268,#20269)
successor(#20269,#20274)
successor(#20258,#20263)
successor(#20265,#20259)
successor(#20264,#20261)
successor(#20263,#20264)
successor(#20261,#20265)
successor(#20259,#20266)
successor(#20259,#20268)
successor(#20255,#20257)
successor(#20257,#20256)
successor(#20256,#20258)
@@ -868,18 +880,18 @@ successor(#20254,#20253)
successor(#20253,#20255)
successor(#20239,#20244)
successor(#20246,#20240)
#20271=*
entry_cfg_node(#20271,#20246)
#20272=@"loc,{#10000},8,13,8,12"
locations_default(#20272,#10000,8,13,8,12)
hasLocation(#20271,#20272)
#20273=*
exit_cfg_node(#20273,#20246)
#20274=@"loc,{#10000},8,26,8,25"
locations_default(#20274,#10000,8,26,8,25)
hasLocation(#20273,#20274)
successor(#20250,#20273)
successor(#20271,#20250)
#20275=*
entry_cfg_node(#20275,#20246)
#20276=@"loc,{#10000},8,13,8,12"
locations_default(#20276,#10000,8,13,8,12)
hasLocation(#20275,#20276)
#20277=*
exit_cfg_node(#20277,#20246)
#20278=@"loc,{#10000},8,26,8,25"
locations_default(#20278,#10000,8,26,8,25)
hasLocation(#20277,#20278)
successor(#20250,#20277)
successor(#20275,#20250)
successor(#20245,#20242)
successor(#20244,#20245)
successor(#20242,#20246)
@@ -904,20 +916,20 @@ successor(#20217,#20224)
successor(#20215,#20226)
successor(#20194,#20201)
successor(#20204,#20195)
#20275=*
entry_cfg_node(#20275,#20204)
#20276=@"loc,{#10000},3,24,3,23"
locations_default(#20276,#10000,3,24,3,23)
hasLocation(#20275,#20276)
#20277=*
exit_cfg_node(#20277,#20204)
#20278=@"loc,{#10000},3,43,3,42"
locations_default(#20278,#10000,3,43,3,42)
hasLocation(#20277,#20278)
successor(#20212,#20277)
#20279=*
entry_cfg_node(#20279,#20204)
#20280=@"loc,{#10000},3,24,3,23"
locations_default(#20280,#10000,3,24,3,23)
hasLocation(#20279,#20280)
#20281=*
exit_cfg_node(#20281,#20204)
#20282=@"loc,{#10000},3,43,3,42"
locations_default(#20282,#10000,3,43,3,42)
hasLocation(#20281,#20282)
successor(#20212,#20281)
successor(#20210,#20212)
successor(#20208,#20210)
successor(#20275,#20208)
successor(#20279,#20208)
successor(#20203,#20197)
successor(#20202,#20199)
successor(#20201,#20202)
@@ -925,20 +937,20 @@ successor(#20199,#20203)
successor(#20197,#20204)
successor(#20195,#20214)
successor(#20184,#20194)
#20279=*
entry_cfg_node(#20279,#20184)
hasLocation(#20279,#20269)
#20280=*
exit_cfg_node(#20280,#20184)
#20281=@"loc,{#10000},1,24,1,23"
locations_default(#20281,#10000,1,24,1,23)
hasLocation(#20280,#20281)
successor(#20192,#20280)
#20283=*
entry_cfg_node(#20283,#20184)
hasLocation(#20283,#20273)
#20284=*
exit_cfg_node(#20284,#20184)
#20285=@"loc,{#10000},1,24,1,23"
locations_default(#20285,#10000,1,24,1,23)
hasLocation(#20284,#20285)
successor(#20192,#20284)
successor(#20190,#20192)
successor(#20188,#20190)
successor(#20279,#20188)
successor(#20283,#20188)
successor(#20185,#20184)
successor(#20268,#20185)
successor(#20272,#20185)
isExterns(#20001)
numlines(#10000,17,10,1)
filetype(#10000,"javascript")

View File

@@ -235,47 +235,59 @@ enclosingStmt(#20085,#20084)
exprContainers(#20085,#20001)
literals("m","""m""",#20085)
#20086=*
exprs(#20086,86,#20084,0,"a")
hasLocation(#20086,#20017)
enclosingStmt(#20086,#20084)
exprContainers(#20086,#20001)
#20087=*
exprs(#20087,0,#20086,0,"a")
hasLocation(#20087,#20017)
enclosingStmt(#20087,#20084)
exprContainers(#20087,#20001)
literals("a","a",#20087)
regexpterm(#20086,14,#20085,0,"m")
#20087=@"loc,{#10000},1,20,1,20"
locations_default(#20087,#10000,1,20,1,20)
hasLocation(#20086,#20087)
regexpConstValue(#20086,"m")
#20088=*
exprs(#20088,0,#20086,1,"a")
exprs(#20088,86,#20084,0,"a")
hasLocation(#20088,#20017)
enclosingStmt(#20088,#20084)
exprContainers(#20088,#20001)
literals("a","a",#20088)
#20089=*
stmts(#20089,28,#20001,1,"export * from ""m"";")
hasLocation(#20089,#20005)
stmtContainers(#20089,#20001)
exprs(#20089,0,#20088,0,"a")
hasLocation(#20089,#20017)
enclosingStmt(#20089,#20084)
exprContainers(#20089,#20001)
literals("a","a",#20089)
#20090=*
exprs(#20090,4,#20089,0,"""m""")
hasLocation(#20090,#20033)
enclosingStmt(#20090,#20089)
exprs(#20090,0,#20088,1,"a")
hasLocation(#20090,#20017)
enclosingStmt(#20090,#20084)
exprContainers(#20090,#20001)
literals("m","""m""",#20090)
literals("a","a",#20090)
#20091=*
entry_cfg_node(#20091,#20001)
#20092=@"loc,{#10000},1,1,1,0"
locations_default(#20092,#10000,1,1,1,0)
hasLocation(#20091,#20092)
stmts(#20091,28,#20001,1,"export * from ""m"";")
hasLocation(#20091,#20005)
stmtContainers(#20091,#20001)
#20092=*
exprs(#20092,4,#20091,0,"""m""")
hasLocation(#20092,#20033)
enclosingStmt(#20092,#20091)
exprContainers(#20092,#20001)
literals("m","""m""",#20092)
#20093=*
exit_cfg_node(#20093,#20001)
hasLocation(#20093,#20081)
successor(#20089,#20090)
successor(#20090,#20093)
regexpterm(#20093,14,#20092,0,"m")
#20094=@"loc,{#10000},2,16,2,16"
locations_default(#20094,#10000,2,16,2,16)
hasLocation(#20093,#20094)
regexpConstValue(#20093,"m")
#20095=*
entry_cfg_node(#20095,#20001)
#20096=@"loc,{#10000},1,1,1,0"
locations_default(#20096,#10000,1,1,1,0)
hasLocation(#20095,#20096)
#20097=*
exit_cfg_node(#20097,#20001)
hasLocation(#20097,#20081)
successor(#20091,#20092)
successor(#20092,#20097)
successor(#20084,#20085)
successor(#20086,#20087)
successor(#20088,#20089)
successor(#20087,#20088)
successor(#20085,#20086)
successor(#20091,#20084)
successor(#20090,#20091)
successor(#20089,#20090)
successor(#20085,#20088)
successor(#20095,#20084)
numlines(#10000,5,5,0)
filetype(#10000,"javascript")

View File

@@ -207,35 +207,41 @@ enclosingStmt(#20074,#20073)
exprContainers(#20074,#20001)
literals("m","'m'",#20074)
#20075=*
exprs(#20075,83,#20073,0,"type")
hasLocation(#20075,#20013)
enclosingStmt(#20075,#20073)
exprContainers(#20075,#20001)
#20076=*
exprs(#20076,0,#20075,0,"type")
hasLocation(#20076,#20013)
enclosingStmt(#20076,#20073)
exprContainers(#20076,#20001)
literals("type","type",#20076)
regexpterm(#20075,14,#20074,0,"m")
#20076=@"loc,{#10000},1,43,1,43"
locations_default(#20076,#10000,1,43,1,43)
hasLocation(#20075,#20076)
regexpConstValue(#20075,"m")
#20077=*
exprs(#20077,78,#20075,1,"type")
exprs(#20077,83,#20073,0,"type")
hasLocation(#20077,#20013)
enclosingStmt(#20077,#20073)
exprContainers(#20077,#20001)
literals("type","type",#20077)
decl(#20077,#20070)
typedecl(#20077,#20071)
namespacedecl(#20077,#20072)
#20078=*
entry_cfg_node(#20078,#20001)
#20079=@"loc,{#10000},1,1,1,0"
locations_default(#20079,#10000,1,1,1,0)
hasLocation(#20078,#20079)
exprs(#20078,0,#20077,0,"type")
hasLocation(#20078,#20013)
enclosingStmt(#20078,#20073)
exprContainers(#20078,#20001)
literals("type","type",#20078)
#20079=*
exprs(#20079,78,#20077,1,"type")
hasLocation(#20079,#20013)
enclosingStmt(#20079,#20073)
exprContainers(#20079,#20001)
literals("type","type",#20079)
decl(#20079,#20070)
typedecl(#20079,#20071)
namespacedecl(#20079,#20072)
#20080=*
exit_cfg_node(#20080,#20001)
hasLocation(#20080,#20067)
successor(#20073,#20080)
successor(#20075,#20073)
successor(#20078,#20075)
entry_cfg_node(#20080,#20001)
#20081=@"loc,{#10000},1,1,1,0"
locations_default(#20081,#10000,1,1,1,0)
hasLocation(#20080,#20081)
#20082=*
exit_cfg_node(#20082,#20001)
hasLocation(#20082,#20067)
successor(#20073,#20082)
successor(#20077,#20073)
successor(#20080,#20077)
numlines(#10000,3,3,0)
filetype(#10000,"javascript")

View File

@@ -446,19 +446,25 @@ enclosingStmt(#20138,#20131)
exprContainers(#20138,#20001)
literals("x","""x""",#20138)
#20139=*
entry_cfg_node(#20139,#20001)
#20140=@"loc,{#10000},1,1,1,0"
locations_default(#20140,#10000,1,1,1,0)
regexpterm(#20139,14,#20138,0,"x")
#20140=@"loc,{#10000},5,18,5,18"
locations_default(#20140,#10000,5,18,5,18)
hasLocation(#20139,#20140)
regexpConstValue(#20139,"x")
#20141=*
exit_cfg_node(#20141,#20001)
hasLocation(#20141,#20087)
entry_cfg_node(#20141,#20001)
#20142=@"loc,{#10000},1,1,1,0"
locations_default(#20142,#10000,1,1,1,0)
hasLocation(#20141,#20142)
#20143=*
exit_cfg_node(#20143,#20001)
hasLocation(#20143,#20087)
successor(#20131,#20136)
successor(#20138,#20132)
successor(#20137,#20134)
successor(#20136,#20137)
successor(#20134,#20138)
successor(#20132,#20141)
successor(#20132,#20143)
successor(#20121,#20124)
successor(#20125,#20129)
successor(#20130,#20127)
@@ -485,6 +491,6 @@ successor(#20098,#20100)
successor(#20096,#20101)
successor(#20094,#20106)
successor(#20092,#20109)
successor(#20139,#20091)
successor(#20141,#20091)
numlines(#10000,5,4,0)
filetype(#10000,"javascript")

View File

@@ -74,17 +74,23 @@ enclosingStmt(#20021,#20016)
exprContainers(#20021,#20001)
literals("Hello, world!","""Hello, world!""",#20021)
#20022=*
entry_cfg_node(#20022,#20001)
#20023=@"loc,{#10000},1,1,1,0"
locations_default(#20023,#10000,1,1,1,0)
regexpterm(#20022,14,#20021,0,"Hello, world!")
#20023=@"loc,{#10000},1,8,1,20"
locations_default(#20023,#10000,1,8,1,20)
hasLocation(#20022,#20023)
regexpConstValue(#20022,"Hello, world!")
#20024=*
exit_cfg_node(#20024,#20001)
hasLocation(#20024,#20015)
entry_cfg_node(#20024,#20001)
#20025=@"loc,{#10000},1,1,1,0"
locations_default(#20025,#10000,1,1,1,0)
hasLocation(#20024,#20025)
#20026=*
exit_cfg_node(#20026,#20001)
hasLocation(#20026,#20015)
successor(#20016,#20019)
successor(#20021,#20017)
successor(#20019,#20021)
successor(#20017,#20024)
successor(#20022,#20016)
successor(#20017,#20026)
successor(#20024,#20016)
numlines(#10000,1,1,0)
filetype(#10000,"javascript")

View File

@@ -96,49 +96,55 @@ enclosingStmt(#20028,#20020)
exprContainers(#20028,#20001)
literals("Nope!","""Nope!""",#20028)
#20029=*
entry_cfg_node(#20029,#20001)
#20030=@"loc,{#10000},6,29,6,28"
locations_default(#20030,#10000,6,29,6,28)
regexpterm(#20029,14,#20028,0,"Nope!")
#20030=@"loc,{#10000},6,41,6,45"
locations_default(#20030,#10000,6,41,6,45)
hasLocation(#20029,#20030)
regexpConstValue(#20029,"Nope!")
#20031=*
exit_cfg_node(#20031,#20001)
hasLocation(#20031,#20019)
entry_cfg_node(#20031,#20001)
#20032=@"loc,{#10000},6,29,6,28"
locations_default(#20032,#10000,6,29,6,28)
hasLocation(#20031,#20032)
#20033=*
exit_cfg_node(#20033,#20001)
hasLocation(#20033,#20019)
successor(#20020,#20022)
successor(#20022,#20026)
successor(#20028,#20024)
successor(#20026,#20028)
successor(#20024,#20021)
successor(#20021,#20031)
successor(#20029,#20020)
#20032=*
xmlElements(#20032,"html",#10000,0,#10000)
#20033=@"loc,{#10000},1,1,8,7"
locations_default(#20033,#10000,1,1,8,7)
xmllocations(#20032,#20033)
successor(#20021,#20033)
successor(#20031,#20020)
#20034=*
xmlElements(#20034,"head",#20032,0,#10000)
#20035=@"loc,{#10000},2,5,4,11"
locations_default(#20035,#10000,2,5,4,11)
xmlElements(#20034,"html",#10000,0,#10000)
#20035=@"loc,{#10000},1,1,8,7"
locations_default(#20035,#10000,1,1,8,7)
xmllocations(#20034,#20035)
#20036=*
xmlElements(#20036,"body",#20032,1,#10000)
#20037=@"loc,{#10000},5,5,7,11"
locations_default(#20037,#10000,5,5,7,11)
xmlElements(#20036,"head",#20034,0,#10000)
#20037=@"loc,{#10000},2,5,4,11"
locations_default(#20037,#10000,2,5,4,11)
xmllocations(#20036,#20037)
#20038=*
xmlElements(#20038,"title",#20034,0,#10000)
#20039=@"loc,{#10000},3,9,3,32"
locations_default(#20039,#10000,3,9,3,32)
xmlElements(#20038,"body",#20034,1,#10000)
#20039=@"loc,{#10000},5,5,7,11"
locations_default(#20039,#10000,5,5,7,11)
xmllocations(#20038,#20039)
#20040=*
xmlElements(#20040,"a",#20036,0,#10000)
#20041=@"loc,{#10000},6,9,6,80"
locations_default(#20041,#10000,6,9,6,80)
xmlElements(#20040,"title",#20036,0,#10000)
#20041=@"loc,{#10000},3,9,3,32"
locations_default(#20041,#10000,3,9,3,32)
xmllocations(#20040,#20041)
#20042=*
xmlAttrs(#20042,#20040,"href","javascript:void(alert(""Nope!""))",0,#10000)
#20043=@"loc,{#10000},6,12,6,65"
locations_default(#20043,#10000,6,12,6,65)
xmlElements(#20042,"a",#20038,0,#10000)
#20043=@"loc,{#10000},6,9,6,80"
locations_default(#20043,#10000,6,9,6,80)
xmllocations(#20042,#20043)
#20044=*
xmlAttrs(#20044,#20042,"href","javascript:void(alert(""Nope!""))",0,#10000)
#20045=@"loc,{#10000},6,12,6,65"
locations_default(#20045,#10000,6,12,6,65)
xmllocations(#20044,#20045)
numlines(#10000,8,1,0)
filetype(#10000,"html")

View File

@@ -127,95 +127,101 @@ enclosingStmt(#20041,#20039)
exprContainers(#20041,#20001)
literals("bar","'bar'",#20041)
#20042=*
exprs(#20042,84,#20039,0,"foo")
hasLocation(#20042,#20013)
enclosingStmt(#20042,#20039)
exprContainers(#20042,#20001)
#20043=*
exprs(#20043,78,#20042,1,"foo")
hasLocation(#20043,#20013)
enclosingStmt(#20043,#20039)
exprContainers(#20043,#20001)
literals("foo","foo",#20043)
decl(#20043,#20036)
typedecl(#20043,#20037)
namespacedecl(#20043,#20038)
regexpterm(#20042,14,#20041,0,"bar")
#20043=@"loc,{#10000},5,30,5,32"
locations_default(#20043,#10000,5,30,5,32)
hasLocation(#20042,#20043)
regexpConstValue(#20042,"bar")
#20044=*
stmts(#20044,2,#20001,1,"foo.baz();")
#20045=@"loc,{#10000},6,13,6,22"
locations_default(#20045,#10000,6,13,6,22)
hasLocation(#20044,#20045)
stmtContainers(#20044,#20001)
exprs(#20044,84,#20039,0,"foo")
hasLocation(#20044,#20013)
enclosingStmt(#20044,#20039)
exprContainers(#20044,#20001)
#20045=*
exprs(#20045,78,#20044,1,"foo")
hasLocation(#20045,#20013)
enclosingStmt(#20045,#20039)
exprContainers(#20045,#20001)
literals("foo","foo",#20045)
decl(#20045,#20036)
typedecl(#20045,#20037)
namespacedecl(#20045,#20038)
#20046=*
exprs(#20046,13,#20044,0,"foo.baz()")
#20047=@"loc,{#10000},6,13,6,21"
locations_default(#20047,#10000,6,13,6,21)
stmts(#20046,2,#20001,1,"foo.baz();")
#20047=@"loc,{#10000},6,13,6,22"
locations_default(#20047,#10000,6,13,6,22)
hasLocation(#20046,#20047)
enclosingStmt(#20046,#20044)
exprContainers(#20046,#20001)
stmtContainers(#20046,#20001)
#20048=*
exprs(#20048,14,#20046,-1,"foo.baz")
#20049=@"loc,{#10000},6,13,6,19"
locations_default(#20049,#10000,6,13,6,19)
exprs(#20048,13,#20046,0,"foo.baz()")
#20049=@"loc,{#10000},6,13,6,21"
locations_default(#20049,#10000,6,13,6,21)
hasLocation(#20048,#20049)
enclosingStmt(#20048,#20044)
enclosingStmt(#20048,#20046)
exprContainers(#20048,#20001)
#20050=*
exprs(#20050,79,#20048,0,"foo")
hasLocation(#20050,#20021)
enclosingStmt(#20050,#20044)
exprs(#20050,14,#20048,-1,"foo.baz")
#20051=@"loc,{#10000},6,13,6,19"
locations_default(#20051,#10000,6,13,6,19)
hasLocation(#20050,#20051)
enclosingStmt(#20050,#20046)
exprContainers(#20050,#20001)
literals("foo","foo",#20050)
bind(#20050,#20036)
#20051=*
exprs(#20051,0,#20048,1,"baz")
hasLocation(#20051,#20025)
enclosingStmt(#20051,#20044)
exprContainers(#20051,#20001)
literals("baz","baz",#20051)
#20052=*
entry_cfg_node(#20052,#20001)
hasLocation(#20052,#20003)
exprs(#20052,79,#20050,0,"foo")
hasLocation(#20052,#20021)
enclosingStmt(#20052,#20046)
exprContainers(#20052,#20001)
literals("foo","foo",#20052)
bind(#20052,#20036)
#20053=*
exit_cfg_node(#20053,#20001)
hasLocation(#20053,#20033)
successor(#20044,#20050)
successor(#20051,#20048)
successor(#20050,#20051)
successor(#20048,#20046)
successor(#20046,#20053)
successor(#20039,#20044)
successor(#20042,#20039)
successor(#20052,#20042)
exprs(#20053,0,#20050,1,"baz")
hasLocation(#20053,#20025)
enclosingStmt(#20053,#20046)
exprContainers(#20053,#20001)
literals("baz","baz",#20053)
#20054=*
xmlElements(#20054,"html",#10000,0,#10000)
#20055=@"loc,{#10000},1,1,11,7"
locations_default(#20055,#10000,1,1,11,7)
xmllocations(#20054,#20055)
entry_cfg_node(#20054,#20001)
hasLocation(#20054,#20003)
#20055=*
exit_cfg_node(#20055,#20001)
hasLocation(#20055,#20033)
successor(#20046,#20052)
successor(#20053,#20050)
successor(#20052,#20053)
successor(#20050,#20048)
successor(#20048,#20055)
successor(#20039,#20046)
successor(#20044,#20039)
successor(#20054,#20044)
#20056=*
xmlElements(#20056,"head",#20054,0,#10000)
#20057=@"loc,{#10000},2,5,8,11"
locations_default(#20057,#10000,2,5,8,11)
xmlElements(#20056,"html",#10000,0,#10000)
#20057=@"loc,{#10000},1,1,11,7"
locations_default(#20057,#10000,1,1,11,7)
xmllocations(#20056,#20057)
#20058=*
xmlElements(#20058,"body",#20054,1,#10000)
#20059=@"loc,{#10000},9,5,10,11"
locations_default(#20059,#10000,9,5,10,11)
xmlElements(#20058,"head",#20056,0,#10000)
#20059=@"loc,{#10000},2,5,8,11"
locations_default(#20059,#10000,2,5,8,11)
xmllocations(#20058,#20059)
#20060=*
xmlElements(#20060,"title",#20056,0,#10000)
#20061=@"loc,{#10000},3,9,3,32"
locations_default(#20061,#10000,3,9,3,32)
xmlElements(#20060,"body",#20056,1,#10000)
#20061=@"loc,{#10000},9,5,10,11"
locations_default(#20061,#10000,9,5,10,11)
xmllocations(#20060,#20061)
#20062=*
xmlElements(#20062,"script",#20056,1,#10000)
#20063=@"loc,{#10000},4,9,7,17"
locations_default(#20063,#10000,4,9,7,17)
xmlElements(#20062,"title",#20058,0,#10000)
#20063=@"loc,{#10000},3,9,3,32"
locations_default(#20063,#10000,3,9,3,32)
xmllocations(#20062,#20063)
#20064=*
xmlAttrs(#20064,#20062,"type","module",0,#10000)
#20065=@"loc,{#10000},4,17,4,29"
locations_default(#20065,#10000,4,17,4,29)
xmlElements(#20064,"script",#20058,1,#10000)
#20065=@"loc,{#10000},4,9,7,17"
locations_default(#20065,#10000,4,9,7,17)
xmllocations(#20064,#20065)
#20066=*
xmlAttrs(#20066,#20064,"type","module",0,#10000)
#20067=@"loc,{#10000},4,17,4,29"
locations_default(#20067,#10000,4,17,4,29)
xmllocations(#20066,#20067)
numlines(#10000,11,2,0)
filetype(#10000,"html")

View File

@@ -91,365 +91,383 @@ enclosingStmt(#20027,#20021)
exprContainers(#20027,#20001)
literals("Hello, world!","""Hello, world!""",#20027)
#20028=*
entry_cfg_node(#20028,#20001)
hasLocation(#20028,#20003)
#20029=*
exit_cfg_node(#20029,#20001)
hasLocation(#20029,#20019)
regexpterm(#20028,14,#20027,0,"Hello, world!")
#20029=@"loc,{#10000},6,20,6,32"
locations_default(#20029,#10000,6,20,6,32)
hasLocation(#20028,#20029)
regexpConstValue(#20028,"Hello, world!")
#20030=*
entry_cfg_node(#20030,#20001)
hasLocation(#20030,#20003)
#20031=*
exit_cfg_node(#20031,#20001)
hasLocation(#20031,#20019)
successor(#20021,#20025)
successor(#20027,#20023)
successor(#20025,#20027)
successor(#20023,#20029)
successor(#20028,#20021)
#20030=@"script;{#10000},8,17"
#20031=*
lines(#20031,#20030,";","")
#20032=@"loc,{#10000},8,17,8,17"
locations_default(#20032,#10000,8,17,8,17)
hasLocation(#20031,#20032)
numlines(#20030,1,1,0)
successor(#20023,#20031)
successor(#20030,#20021)
#20032=@"script;{#10000},8,17"
#20033=*
tokeninfo(#20033,8,#20030,0,";")
hasLocation(#20033,#20032)
#20034=*
tokeninfo(#20034,0,#20030,1,"")
#20035=@"loc,{#10000},8,18,8,17"
locations_default(#20035,#10000,8,18,8,17)
hasLocation(#20034,#20035)
toplevels(#20030,1)
hasLocation(#20030,#20032)
lines(#20033,#20032,";","")
#20034=@"loc,{#10000},8,17,8,17"
locations_default(#20034,#10000,8,17,8,17)
hasLocation(#20033,#20034)
numlines(#20032,1,1,0)
#20035=*
tokeninfo(#20035,8,#20032,0,";")
hasLocation(#20035,#20034)
#20036=*
stmts(#20036,0,#20030,0,";")
hasLocation(#20036,#20032)
stmtContainers(#20036,#20030)
#20037=*
entry_cfg_node(#20037,#20030)
#20038=@"loc,{#10000},8,17,8,16"
locations_default(#20038,#10000,8,17,8,16)
hasLocation(#20037,#20038)
tokeninfo(#20036,0,#20032,1,"")
#20037=@"loc,{#10000},8,18,8,17"
locations_default(#20037,#10000,8,18,8,17)
hasLocation(#20036,#20037)
toplevels(#20032,1)
hasLocation(#20032,#20034)
#20038=*
stmts(#20038,0,#20032,0,";")
hasLocation(#20038,#20034)
stmtContainers(#20038,#20032)
#20039=*
exit_cfg_node(#20039,#20030)
hasLocation(#20039,#20035)
successor(#20036,#20039)
successor(#20037,#20036)
#20040=@"script;{#10000},11,29"
entry_cfg_node(#20039,#20032)
#20040=@"loc,{#10000},8,17,8,16"
locations_default(#20040,#10000,8,17,8,16)
hasLocation(#20039,#20040)
#20041=*
lines(#20041,#20040,"void(alert('Nope!'))","")
#20042=@"loc,{#10000},11,29,11,48"
locations_default(#20042,#10000,11,29,11,48)
hasLocation(#20041,#20042)
numlines(#20040,1,1,0)
exit_cfg_node(#20041,#20032)
hasLocation(#20041,#20037)
successor(#20038,#20041)
successor(#20039,#20038)
#20042=@"script;{#10000},11,29"
#20043=*
tokeninfo(#20043,7,#20040,0,"void")
#20044=@"loc,{#10000},11,29,11,32"
locations_default(#20044,#10000,11,29,11,32)
lines(#20043,#20042,"void(alert('Nope!'))","")
#20044=@"loc,{#10000},11,29,11,48"
locations_default(#20044,#10000,11,29,11,48)
hasLocation(#20043,#20044)
numlines(#20042,1,1,0)
#20045=*
tokeninfo(#20045,8,#20040,1,"(")
#20046=@"loc,{#10000},11,33,11,33"
locations_default(#20046,#10000,11,33,11,33)
tokeninfo(#20045,7,#20042,0,"void")
#20046=@"loc,{#10000},11,29,11,32"
locations_default(#20046,#10000,11,29,11,32)
hasLocation(#20045,#20046)
#20047=*
tokeninfo(#20047,6,#20040,2,"alert")
#20048=@"loc,{#10000},11,34,11,38"
locations_default(#20048,#10000,11,34,11,38)
tokeninfo(#20047,8,#20042,1,"(")
#20048=@"loc,{#10000},11,33,11,33"
locations_default(#20048,#10000,11,33,11,33)
hasLocation(#20047,#20048)
#20049=*
tokeninfo(#20049,8,#20040,3,"(")
#20050=@"loc,{#10000},11,39,11,39"
locations_default(#20050,#10000,11,39,11,39)
tokeninfo(#20049,6,#20042,2,"alert")
#20050=@"loc,{#10000},11,34,11,38"
locations_default(#20050,#10000,11,34,11,38)
hasLocation(#20049,#20050)
#20051=*
tokeninfo(#20051,4,#20040,4,"'Nope!'")
#20052=@"loc,{#10000},11,40,11,46"
locations_default(#20052,#10000,11,40,11,46)
tokeninfo(#20051,8,#20042,3,"(")
#20052=@"loc,{#10000},11,39,11,39"
locations_default(#20052,#10000,11,39,11,39)
hasLocation(#20051,#20052)
#20053=*
tokeninfo(#20053,8,#20040,5,")")
#20054=@"loc,{#10000},11,47,11,47"
locations_default(#20054,#10000,11,47,11,47)
tokeninfo(#20053,4,#20042,4,"'Nope!'")
#20054=@"loc,{#10000},11,40,11,46"
locations_default(#20054,#10000,11,40,11,46)
hasLocation(#20053,#20054)
#20055=*
tokeninfo(#20055,8,#20040,6,")")
#20056=@"loc,{#10000},11,48,11,48"
locations_default(#20056,#10000,11,48,11,48)
tokeninfo(#20055,8,#20042,5,")")
#20056=@"loc,{#10000},11,47,11,47"
locations_default(#20056,#10000,11,47,11,47)
hasLocation(#20055,#20056)
#20057=*
tokeninfo(#20057,0,#20040,7,"")
#20058=@"loc,{#10000},11,49,11,48"
locations_default(#20058,#10000,11,49,11,48)
tokeninfo(#20057,8,#20042,6,")")
#20058=@"loc,{#10000},11,48,11,48"
locations_default(#20058,#10000,11,48,11,48)
hasLocation(#20057,#20058)
toplevels(#20040,3)
hasLocation(#20040,#20042)
#20059=*
stmts(#20059,2,#20040,0,"void(alert('Nope!'))")
hasLocation(#20059,#20042)
stmtContainers(#20059,#20040)
#20060=*
exprs(#20060,21,#20059,0,"void(alert('Nope!'))")
hasLocation(#20060,#20042)
enclosingStmt(#20060,#20059)
exprContainers(#20060,#20040)
tokeninfo(#20059,0,#20042,7,"")
#20060=@"loc,{#10000},11,49,11,48"
locations_default(#20060,#10000,11,49,11,48)
hasLocation(#20059,#20060)
toplevels(#20042,3)
hasLocation(#20042,#20044)
#20061=*
exprs(#20061,63,#20060,0,"(alert('Nope!'))")
#20062=@"loc,{#10000},11,33,11,48"
locations_default(#20062,#10000,11,33,11,48)
hasLocation(#20061,#20062)
enclosingStmt(#20061,#20059)
exprContainers(#20061,#20040)
stmts(#20061,2,#20042,0,"void(alert('Nope!'))")
hasLocation(#20061,#20044)
stmtContainers(#20061,#20042)
#20062=*
exprs(#20062,21,#20061,0,"void(alert('Nope!'))")
hasLocation(#20062,#20044)
enclosingStmt(#20062,#20061)
exprContainers(#20062,#20042)
#20063=*
exprs(#20063,13,#20061,0,"alert('Nope!')")
#20064=@"loc,{#10000},11,34,11,47"
locations_default(#20064,#10000,11,34,11,47)
exprs(#20063,63,#20062,0,"(alert('Nope!'))")
#20064=@"loc,{#10000},11,33,11,48"
locations_default(#20064,#10000,11,33,11,48)
hasLocation(#20063,#20064)
enclosingStmt(#20063,#20059)
exprContainers(#20063,#20040)
enclosingStmt(#20063,#20061)
exprContainers(#20063,#20042)
#20065=*
exprs(#20065,79,#20063,-1,"alert")
hasLocation(#20065,#20048)
enclosingStmt(#20065,#20059)
exprContainers(#20065,#20040)
literals("alert","alert",#20065)
bind(#20065,#20026)
#20066=*
exprs(#20066,4,#20063,0,"'Nope!'")
hasLocation(#20066,#20052)
enclosingStmt(#20066,#20059)
exprContainers(#20066,#20040)
literals("Nope!","'Nope!'",#20066)
exprs(#20065,13,#20063,0,"alert('Nope!')")
#20066=@"loc,{#10000},11,34,11,47"
locations_default(#20066,#10000,11,34,11,47)
hasLocation(#20065,#20066)
enclosingStmt(#20065,#20061)
exprContainers(#20065,#20042)
#20067=*
entry_cfg_node(#20067,#20040)
#20068=@"loc,{#10000},11,29,11,28"
locations_default(#20068,#10000,11,29,11,28)
hasLocation(#20067,#20068)
exprs(#20067,79,#20065,-1,"alert")
hasLocation(#20067,#20050)
enclosingStmt(#20067,#20061)
exprContainers(#20067,#20042)
literals("alert","alert",#20067)
bind(#20067,#20026)
#20068=*
exprs(#20068,4,#20065,0,"'Nope!'")
hasLocation(#20068,#20054)
enclosingStmt(#20068,#20061)
exprContainers(#20068,#20042)
literals("Nope!","'Nope!'",#20068)
#20069=*
exit_cfg_node(#20069,#20040)
hasLocation(#20069,#20058)
successor(#20059,#20061)
successor(#20061,#20065)
successor(#20066,#20063)
successor(#20065,#20066)
successor(#20063,#20060)
successor(#20060,#20069)
successor(#20067,#20059)
#20070=@"script;{#10000},12,23"
regexpterm(#20069,14,#20068,0,"Nope!")
#20070=@"loc,{#10000},11,41,11,45"
locations_default(#20070,#10000,11,41,11,45)
hasLocation(#20069,#20070)
regexpConstValue(#20069,"Nope!")
#20071=*
lines(#20071,#20070,"alert('I said don\'t click!')","")
#20072=@"loc,{#10000},12,23,12,51"
locations_default(#20072,#10000,12,23,12,51)
entry_cfg_node(#20071,#20042)
#20072=@"loc,{#10000},11,29,11,28"
locations_default(#20072,#10000,11,29,11,28)
hasLocation(#20071,#20072)
numlines(#20070,1,1,0)
#20073=*
tokeninfo(#20073,6,#20070,0,"alert")
#20074=@"loc,{#10000},12,23,12,27"
locations_default(#20074,#10000,12,23,12,27)
hasLocation(#20073,#20074)
exit_cfg_node(#20073,#20042)
hasLocation(#20073,#20060)
successor(#20061,#20063)
successor(#20063,#20067)
successor(#20068,#20065)
successor(#20067,#20068)
successor(#20065,#20062)
successor(#20062,#20073)
successor(#20071,#20061)
#20074=@"script;{#10000},12,23"
#20075=*
tokeninfo(#20075,8,#20070,1,"(")
#20076=@"loc,{#10000},12,28,12,28"
locations_default(#20076,#10000,12,28,12,28)
lines(#20075,#20074,"alert('I said don\'t click!')","")
#20076=@"loc,{#10000},12,23,12,51"
locations_default(#20076,#10000,12,23,12,51)
hasLocation(#20075,#20076)
numlines(#20074,1,1,0)
#20077=*
tokeninfo(#20077,4,#20070,2,"'I said don\'t click!'")
#20078=@"loc,{#10000},12,29,12,50"
locations_default(#20078,#10000,12,29,12,50)
tokeninfo(#20077,6,#20074,0,"alert")
#20078=@"loc,{#10000},12,23,12,27"
locations_default(#20078,#10000,12,23,12,27)
hasLocation(#20077,#20078)
#20079=*
tokeninfo(#20079,8,#20070,3,")")
#20080=@"loc,{#10000},12,51,12,51"
locations_default(#20080,#10000,12,51,12,51)
tokeninfo(#20079,8,#20074,1,"(")
#20080=@"loc,{#10000},12,28,12,28"
locations_default(#20080,#10000,12,28,12,28)
hasLocation(#20079,#20080)
#20081=*
tokeninfo(#20081,0,#20070,4,"")
#20082=@"loc,{#10000},12,52,12,51"
locations_default(#20082,#10000,12,52,12,51)
tokeninfo(#20081,4,#20074,2,"'I said don\'t click!'")
#20082=@"loc,{#10000},12,29,12,50"
locations_default(#20082,#10000,12,29,12,50)
hasLocation(#20081,#20082)
toplevels(#20070,2)
hasLocation(#20070,#20072)
#20083=*
stmts(#20083,2,#20070,0,"alert(' ... lick!')")
hasLocation(#20083,#20072)
stmtContainers(#20083,#20070)
#20084=*
exprs(#20084,13,#20083,0,"alert(' ... lick!')")
hasLocation(#20084,#20072)
enclosingStmt(#20084,#20083)
exprContainers(#20084,#20070)
tokeninfo(#20083,8,#20074,3,")")
#20084=@"loc,{#10000},12,51,12,51"
locations_default(#20084,#10000,12,51,12,51)
hasLocation(#20083,#20084)
#20085=*
exprs(#20085,79,#20084,-1,"alert")
hasLocation(#20085,#20074)
enclosingStmt(#20085,#20083)
exprContainers(#20085,#20070)
literals("alert","alert",#20085)
bind(#20085,#20026)
#20086=*
exprs(#20086,4,#20084,0,"'I said ... click!'")
hasLocation(#20086,#20078)
enclosingStmt(#20086,#20083)
exprContainers(#20086,#20070)
literals("I said don't click!","'I said don\'t click!'",#20086)
tokeninfo(#20085,0,#20074,4,"")
#20086=@"loc,{#10000},12,52,12,51"
locations_default(#20086,#10000,12,52,12,51)
hasLocation(#20085,#20086)
toplevels(#20074,2)
hasLocation(#20074,#20076)
#20087=*
entry_cfg_node(#20087,#20070)
#20088=@"loc,{#10000},12,23,12,22"
locations_default(#20088,#10000,12,23,12,22)
hasLocation(#20087,#20088)
stmts(#20087,2,#20074,0,"alert(' ... lick!')")
hasLocation(#20087,#20076)
stmtContainers(#20087,#20074)
#20088=*
exprs(#20088,13,#20087,0,"alert(' ... lick!')")
hasLocation(#20088,#20076)
enclosingStmt(#20088,#20087)
exprContainers(#20088,#20074)
#20089=*
exit_cfg_node(#20089,#20070)
hasLocation(#20089,#20082)
successor(#20083,#20085)
successor(#20086,#20084)
successor(#20085,#20086)
successor(#20084,#20089)
successor(#20087,#20083)
#20090=@"script;{#10000},13,21"
exprs(#20089,79,#20088,-1,"alert")
hasLocation(#20089,#20078)
enclosingStmt(#20089,#20087)
exprContainers(#20089,#20074)
literals("alert","alert",#20089)
bind(#20089,#20026)
#20090=*
exprs(#20090,4,#20088,0,"'I said ... click!'")
hasLocation(#20090,#20082)
enclosingStmt(#20090,#20087)
exprContainers(#20090,#20074)
literals("I said don't click!","'I said don\'t click!'",#20090)
#20091=*
lines(#20091,#20090,"return false;","")
#20092=@"loc,{#10000},13,21,13,33"
locations_default(#20092,#10000,13,21,13,33)
regexpterm(#20091,14,#20090,0,"I said don't click!")
#20092=@"loc,{#10000},12,30,12,49"
locations_default(#20092,#10000,12,30,12,49)
hasLocation(#20091,#20092)
numlines(#20090,1,1,0)
regexpConstValue(#20091,"I said don't click!")
#20093=*
tokeninfo(#20093,7,#20090,0,"return")
#20094=@"loc,{#10000},13,21,13,26"
locations_default(#20094,#10000,13,21,13,26)
entry_cfg_node(#20093,#20074)
#20094=@"loc,{#10000},12,23,12,22"
locations_default(#20094,#10000,12,23,12,22)
hasLocation(#20093,#20094)
#20095=*
tokeninfo(#20095,2,#20090,1,"false")
#20096=@"loc,{#10000},13,28,13,32"
locations_default(#20096,#10000,13,28,13,32)
hasLocation(#20095,#20096)
exit_cfg_node(#20095,#20074)
hasLocation(#20095,#20086)
successor(#20087,#20089)
successor(#20090,#20088)
successor(#20089,#20090)
successor(#20088,#20095)
successor(#20093,#20087)
#20096=@"script;{#10000},13,21"
#20097=*
tokeninfo(#20097,8,#20090,2,";")
#20098=@"loc,{#10000},13,33,13,33"
locations_default(#20098,#10000,13,33,13,33)
lines(#20097,#20096,"return false;","")
#20098=@"loc,{#10000},13,21,13,33"
locations_default(#20098,#10000,13,21,13,33)
hasLocation(#20097,#20098)
numlines(#20096,1,1,0)
#20099=*
tokeninfo(#20099,0,#20090,3,"")
#20100=@"loc,{#10000},13,34,13,33"
locations_default(#20100,#10000,13,34,13,33)
tokeninfo(#20099,7,#20096,0,"return")
#20100=@"loc,{#10000},13,21,13,26"
locations_default(#20100,#10000,13,21,13,26)
hasLocation(#20099,#20100)
toplevels(#20090,2)
hasLocation(#20090,#20092)
#20101=*
stmts(#20101,9,#20090,0,"return false;")
hasLocation(#20101,#20092)
stmtContainers(#20101,#20090)
#20102=*
exprs(#20102,2,#20101,0,"false")
hasLocation(#20102,#20096)
enclosingStmt(#20102,#20101)
exprContainers(#20102,#20090)
literals("false","false",#20102)
tokeninfo(#20101,2,#20096,1,"false")
#20102=@"loc,{#10000},13,28,13,32"
locations_default(#20102,#10000,13,28,13,32)
hasLocation(#20101,#20102)
#20103=*
entry_cfg_node(#20103,#20090)
#20104=@"loc,{#10000},13,21,13,20"
locations_default(#20104,#10000,13,21,13,20)
tokeninfo(#20103,8,#20096,2,";")
#20104=@"loc,{#10000},13,33,13,33"
locations_default(#20104,#10000,13,33,13,33)
hasLocation(#20103,#20104)
#20105=*
exit_cfg_node(#20105,#20090)
hasLocation(#20105,#20100)
successor(#20102,#20101)
successor(#20101,#20105)
successor(#20103,#20102)
#20106=*
xmlElements(#20106,"html",#10000,0,#10000)
#20107=@"loc,{#10000},1,1,18,7"
locations_default(#20107,#10000,1,1,18,7)
xmllocations(#20106,#20107)
tokeninfo(#20105,0,#20096,3,"")
#20106=@"loc,{#10000},13,34,13,33"
locations_default(#20106,#10000,13,34,13,33)
hasLocation(#20105,#20106)
toplevels(#20096,2)
hasLocation(#20096,#20098)
#20107=*
stmts(#20107,9,#20096,0,"return false;")
hasLocation(#20107,#20098)
stmtContainers(#20107,#20096)
#20108=*
xmlElements(#20108,"head",#20106,0,#10000)
#20109=@"loc,{#10000},2,5,9,11"
locations_default(#20109,#10000,2,5,9,11)
xmllocations(#20108,#20109)
#20110=*
xmlElements(#20110,"body",#20106,1,#10000)
#20111=@"loc,{#10000},10,5,14,11"
locations_default(#20111,#10000,10,5,14,11)
xmllocations(#20110,#20111)
exprs(#20108,2,#20107,0,"false")
hasLocation(#20108,#20102)
enclosingStmt(#20108,#20107)
exprContainers(#20108,#20096)
literals("false","false",#20108)
#20109=*
entry_cfg_node(#20109,#20096)
#20110=@"loc,{#10000},13,21,13,20"
locations_default(#20110,#10000,13,21,13,20)
hasLocation(#20109,#20110)
#20111=*
exit_cfg_node(#20111,#20096)
hasLocation(#20111,#20106)
successor(#20108,#20107)
successor(#20107,#20111)
successor(#20109,#20108)
#20112=*
xmlElements(#20112,"script",#20106,2,#10000)
#20113=@"loc,{#10000},15,5,15,71"
locations_default(#20113,#10000,15,5,15,71)
xmlElements(#20112,"html",#10000,0,#10000)
#20113=@"loc,{#10000},1,1,18,7"
locations_default(#20113,#10000,1,1,18,7)
xmllocations(#20112,#20113)
#20114=*
xmlElements(#20114,"script",#20106,3,#10000)
#20115=@"loc,{#10000},16,5,16,71"
locations_default(#20115,#10000,16,5,16,71)
xmlElements(#20114,"head",#20112,0,#10000)
#20115=@"loc,{#10000},2,5,9,11"
locations_default(#20115,#10000,2,5,9,11)
xmllocations(#20114,#20115)
#20116=*
xmlElements(#20116,"script",#20106,4,#10000)
#20117=@"loc,{#10000},17,5,17,29"
locations_default(#20117,#10000,17,5,17,29)
xmlElements(#20116,"body",#20112,1,#10000)
#20117=@"loc,{#10000},10,5,14,11"
locations_default(#20117,#10000,10,5,14,11)
xmllocations(#20116,#20117)
#20118=*
xmlElements(#20118,"title",#20108,0,#10000)
#20119=@"loc,{#10000},3,9,3,32"
locations_default(#20119,#10000,3,9,3,32)
xmlElements(#20118,"script",#20112,2,#10000)
#20119=@"loc,{#10000},15,5,15,71"
locations_default(#20119,#10000,15,5,15,71)
xmllocations(#20118,#20119)
#20120=*
xmlElements(#20120,"script",#20108,1,#10000)
#20121=@"loc,{#10000},4,9,4,43"
locations_default(#20121,#10000,4,9,4,43)
xmlElements(#20120,"script",#20112,3,#10000)
#20121=@"loc,{#10000},16,5,16,71"
locations_default(#20121,#10000,16,5,16,71)
xmllocations(#20120,#20121)
#20122=*
xmlElements(#20122,"script",#20108,2,#10000)
#20123=@"loc,{#10000},5,9,7,17"
locations_default(#20123,#10000,5,9,7,17)
xmlElements(#20122,"script",#20112,4,#10000)
#20123=@"loc,{#10000},17,5,17,29"
locations_default(#20123,#10000,17,5,17,29)
xmllocations(#20122,#20123)
#20124=*
xmlElements(#20124,"script",#20108,3,#10000)
#20125=@"loc,{#10000},8,9,8,26"
locations_default(#20125,#10000,8,9,8,26)
xmlElements(#20124,"title",#20114,0,#10000)
#20125=@"loc,{#10000},3,9,3,32"
locations_default(#20125,#10000,3,9,3,32)
xmllocations(#20124,#20125)
#20126=*
xmlAttrs(#20126,#20120,"src","external.js",0,#10000)
#20127=@"loc,{#10000},4,17,4,33"
locations_default(#20127,#10000,4,17,4,33)
xmlElements(#20126,"script",#20114,1,#10000)
#20127=@"loc,{#10000},4,9,4,43"
locations_default(#20127,#10000,4,9,4,43)
xmllocations(#20126,#20127)
#20128=*
xmlElements(#20128,"a",#20110,0,#10000)
#20129=@"loc,{#10000},11,9,11,64"
locations_default(#20129,#10000,11,9,11,64)
xmlElements(#20128,"script",#20114,2,#10000)
#20129=@"loc,{#10000},5,9,7,17"
locations_default(#20129,#10000,5,9,7,17)
xmllocations(#20128,#20129)
#20130=*
xmlElements(#20130,"div",#20110,1,#10000)
#20131=@"loc,{#10000},12,9,12,75"
locations_default(#20131,#10000,12,9,12,75)
xmlElements(#20130,"script",#20114,3,#10000)
#20131=@"loc,{#10000},8,9,8,26"
locations_default(#20131,#10000,8,9,8,26)
xmllocations(#20130,#20131)
#20132=*
xmlElements(#20132,"a",#20110,2,#10000)
#20133=@"loc,{#10000},13,9,13,59"
locations_default(#20133,#10000,13,9,13,59)
xmlAttrs(#20132,#20126,"src","external.js",0,#10000)
#20133=@"loc,{#10000},4,17,4,33"
locations_default(#20133,#10000,4,17,4,33)
xmllocations(#20132,#20133)
#20134=*
xmlAttrs(#20134,#20128,"href","javascript:void(alert('Nope!'))",0,#10000)
#20135=@"loc,{#10000},11,12,11,49"
locations_default(#20135,#10000,11,12,11,49)
xmlElements(#20134,"a",#20116,0,#10000)
#20135=@"loc,{#10000},11,9,11,64"
locations_default(#20135,#10000,11,9,11,64)
xmllocations(#20134,#20135)
#20136=*
xmlAttrs(#20136,#20130,"onclick","alert('I said don\'t click!')",0,#10000)
#20137=@"loc,{#10000},12,14,12,52"
locations_default(#20137,#10000,12,14,12,52)
xmlElements(#20136,"div",#20116,1,#10000)
#20137=@"loc,{#10000},12,9,12,75"
locations_default(#20137,#10000,12,9,12,75)
xmllocations(#20136,#20137)
#20138=*
xmlAttrs(#20138,#20132,"onclick","return false;",0,#10000)
#20139=@"loc,{#10000},13,12,13,34"
locations_default(#20139,#10000,13,12,13,34)
xmlElements(#20138,"a",#20116,2,#10000)
#20139=@"loc,{#10000},13,9,13,59"
locations_default(#20139,#10000,13,9,13,59)
xmllocations(#20138,#20139)
#20140=*
xmlAttrs(#20140,#20112,"type","text/x-handlebars-template",0,#10000)
#20141=@"loc,{#10000},15,13,15,45"
locations_default(#20141,#10000,15,13,15,45)
xmlAttrs(#20140,#20134,"href","javascript:void(alert('Nope!'))",0,#10000)
#20141=@"loc,{#10000},11,12,11,49"
locations_default(#20141,#10000,11,12,11,49)
xmllocations(#20140,#20141)
#20142=*
xmlAttrs(#20142,#20114,"TYPE","text/x-handlebars-template",0,#10000)
#20143=@"loc,{#10000},16,13,16,45"
locations_default(#20143,#10000,16,13,16,45)
xmlAttrs(#20142,#20136,"onclick","alert('I said don\'t click!')",0,#10000)
#20143=@"loc,{#10000},12,14,12,52"
locations_default(#20143,#10000,12,14,12,52)
xmllocations(#20142,#20143)
#20144=*
xmlAttrs(#20144,#20116,"type","",0,#10000)
#20145=@"loc,{#10000},17,13,17,19"
locations_default(#20145,#10000,17,13,17,19)
xmlAttrs(#20144,#20138,"onclick","return false;",0,#10000)
#20145=@"loc,{#10000},13,12,13,34"
locations_default(#20145,#10000,13,12,13,34)
xmllocations(#20144,#20145)
#20146=*
xmlAttrs(#20146,#20118,"type","text/x-handlebars-template",0,#10000)
#20147=@"loc,{#10000},15,13,15,45"
locations_default(#20147,#10000,15,13,15,45)
xmllocations(#20146,#20147)
#20148=*
xmlAttrs(#20148,#20120,"TYPE","text/x-handlebars-template",0,#10000)
#20149=@"loc,{#10000},16,13,16,45"
locations_default(#20149,#10000,16,13,16,45)
xmllocations(#20148,#20149)
#20150=*
xmlAttrs(#20150,#20122,"type","",0,#10000)
#20151=@"loc,{#10000},17,13,17,19"
locations_default(#20151,#10000,17,13,17,19)
xmllocations(#20150,#20151)
numlines(#10000,18,5,0)
filetype(#10000,"html")

View File

@@ -283,82 +283,88 @@ enclosingStmt(#20085,#20083)
exprContainers(#20085,#20061)
literals("f","""f""",#20085)
#20086=*
exprs(#20086,84,#20083,0,"f")
hasLocation(#20086,#20071)
enclosingStmt(#20086,#20083)
exprContainers(#20086,#20061)
#20087=*
exprs(#20087,78,#20086,1,"f")
hasLocation(#20087,#20071)
enclosingStmt(#20087,#20083)
exprContainers(#20087,#20061)
literals("f","f",#20087)
decl(#20087,#20080)
typedecl(#20087,#20081)
namespacedecl(#20087,#20082)
regexpterm(#20086,14,#20085,0,"f")
#20087=@"loc,{#10000},8,22,8,22"
locations_default(#20087,#10000,8,22,8,22)
hasLocation(#20086,#20087)
regexpConstValue(#20086,"f")
#20088=*
entry_cfg_node(#20088,#20061)
hasLocation(#20088,#20063)
exprs(#20088,84,#20083,0,"f")
hasLocation(#20088,#20071)
enclosingStmt(#20088,#20083)
exprContainers(#20088,#20061)
#20089=*
exit_cfg_node(#20089,#20061)
hasLocation(#20089,#20077)
successor(#20083,#20089)
successor(#20086,#20083)
successor(#20088,#20086)
exprs(#20089,78,#20088,1,"f")
hasLocation(#20089,#20071)
enclosingStmt(#20089,#20083)
exprContainers(#20089,#20061)
literals("f","f",#20089)
decl(#20089,#20080)
typedecl(#20089,#20081)
namespacedecl(#20089,#20082)
#20090=*
xmlElements(#20090,"html",#10000,0,#10000)
#20091=@"loc,{#10000},1,1,10,7"
locations_default(#20091,#10000,1,1,10,7)
xmllocations(#20090,#20091)
entry_cfg_node(#20090,#20061)
hasLocation(#20090,#20063)
#20091=*
exit_cfg_node(#20091,#20061)
hasLocation(#20091,#20077)
successor(#20083,#20091)
successor(#20088,#20083)
successor(#20090,#20088)
#20092=*
xmlElements(#20092,"script",#20090,0,#10000)
#20093=@"loc,{#10000},2,5,2,49"
locations_default(#20093,#10000,2,5,2,49)
xmlElements(#20092,"html",#10000,0,#10000)
#20093=@"loc,{#10000},1,1,10,7"
locations_default(#20093,#10000,1,1,10,7)
xmllocations(#20092,#20093)
#20094=*
xmlElements(#20094,"script",#20090,1,#10000)
#20095=@"loc,{#10000},3,5,3,47"
locations_default(#20095,#10000,3,5,3,47)
xmlElements(#20094,"script",#20092,0,#10000)
#20095=@"loc,{#10000},2,5,2,49"
locations_default(#20095,#10000,2,5,2,49)
xmllocations(#20094,#20095)
#20096=*
xmlElements(#20096,"script",#20090,2,#10000)
#20097=@"loc,{#10000},4,5,6,13"
locations_default(#20097,#10000,4,5,6,13)
xmlElements(#20096,"script",#20092,1,#10000)
#20097=@"loc,{#10000},3,5,3,47"
locations_default(#20097,#10000,3,5,3,47)
xmllocations(#20096,#20097)
#20098=*
xmlElements(#20098,"script",#20090,3,#10000)
#20099=@"loc,{#10000},7,5,9,13"
locations_default(#20099,#10000,7,5,9,13)
xmlElements(#20098,"script",#20092,2,#10000)
#20099=@"loc,{#10000},4,5,6,13"
locations_default(#20099,#10000,4,5,6,13)
xmllocations(#20098,#20099)
#20100=*
xmlAttrs(#20100,#20092,"type","text/babel",0,#10000)
#20101=@"loc,{#10000},2,13,2,29"
locations_default(#20101,#10000,2,13,2,29)
xmlElements(#20100,"script",#20092,3,#10000)
#20101=@"loc,{#10000},7,5,9,13"
locations_default(#20101,#10000,7,5,9,13)
xmllocations(#20100,#20101)
#20102=*
xmlAttrs(#20102,#20094,"type","text/jsx",0,#10000)
#20103=@"loc,{#10000},3,13,3,27"
locations_default(#20103,#10000,3,13,3,27)
xmlAttrs(#20102,#20094,"type","text/babel",0,#10000)
#20103=@"loc,{#10000},2,13,2,29"
locations_default(#20103,#10000,2,13,2,29)
xmllocations(#20102,#20103)
#20104=*
xmlAttrs(#20104,#20096,"type","text/babel",0,#10000)
#20105=@"loc,{#10000},4,13,4,29"
locations_default(#20105,#10000,4,13,4,29)
xmlAttrs(#20104,#20096,"type","text/jsx",0,#10000)
#20105=@"loc,{#10000},3,13,3,27"
locations_default(#20105,#10000,3,13,3,27)
xmllocations(#20104,#20105)
#20106=*
xmlAttrs(#20106,#20096,"data-plugins","transform-es2015-modules-umd",1,#10000)
#20107=@"loc,{#10000},4,31,4,73"
locations_default(#20107,#10000,4,31,4,73)
xmlAttrs(#20106,#20098,"type","text/babel",0,#10000)
#20107=@"loc,{#10000},4,13,4,29"
locations_default(#20107,#10000,4,13,4,29)
xmllocations(#20106,#20107)
#20108=*
xmlAttrs(#20108,#20098,"type","text/babel",0,#10000)
#20109=@"loc,{#10000},7,13,7,29"
locations_default(#20109,#10000,7,13,7,29)
xmlAttrs(#20108,#20098,"data-plugins","transform-es2015-modules-umd",1,#10000)
#20109=@"loc,{#10000},4,31,4,73"
locations_default(#20109,#10000,4,31,4,73)
xmllocations(#20108,#20109)
#20110=*
xmlAttrs(#20110,#20098,"data-plugins","transform-es2015-modules-umd",1,#10000)
#20111=@"loc,{#10000},7,31,7,73"
locations_default(#20111,#10000,7,31,7,73)
xmlAttrs(#20110,#20100,"type","text/babel",0,#10000)
#20111=@"loc,{#10000},7,13,7,29"
locations_default(#20111,#10000,7,13,7,29)
xmllocations(#20110,#20111)
#20112=*
xmlAttrs(#20112,#20100,"data-plugins","transform-es2015-modules-umd",1,#10000)
#20113=@"loc,{#10000},7,31,7,73"
locations_default(#20113,#10000,7,31,7,73)
xmllocations(#20112,#20113)
numlines(#10000,10,4,0)
filetype(#10000,"html")

View File

@@ -541,200 +541,218 @@ enclosingStmt(#20191,#20181)
exprContainers(#20191,#20001)
literals("b&r","""b&amp;r""",#20191)
#20192=*
properties(#20192,#20182,1,3,"i={""a""+""b""}")
#20193=@"loc,{#10000},3,18,3,28"
locations_default(#20193,#10000,3,18,3,28)
regexpterm(#20192,14,#20191,0,"b&r")
#20193=@"loc,{#10000},3,9,3,11"
locations_default(#20193,#10000,3,9,3,11)
hasLocation(#20192,#20193)
regexpConstValue(#20192,"b&r")
#20194=*
exprs(#20194,0,#20192,0,"i")
hasLocation(#20194,#20057)
enclosingStmt(#20194,#20181)
exprContainers(#20194,#20001)
literals("i","i",#20194)
#20195=*
exprs(#20195,34,#20192,1,"""a""+""b""")
#20196=@"loc,{#10000},3,21,3,27"
locations_default(#20196,#10000,3,21,3,27)
hasLocation(#20195,#20196)
enclosingStmt(#20195,#20181)
exprContainers(#20195,#20001)
properties(#20194,#20182,1,3,"i={""a""+""b""}")
#20195=@"loc,{#10000},3,18,3,28"
locations_default(#20195,#10000,3,18,3,28)
hasLocation(#20194,#20195)
#20196=*
exprs(#20196,0,#20194,0,"i")
hasLocation(#20196,#20057)
enclosingStmt(#20196,#20181)
exprContainers(#20196,#20001)
literals("i","i",#20196)
#20197=*
exprs(#20197,4,#20195,0,"""a""")
hasLocation(#20197,#20063)
exprs(#20197,34,#20194,1,"""a""+""b""")
#20198=@"loc,{#10000},3,21,3,27"
locations_default(#20198,#10000,3,21,3,27)
hasLocation(#20197,#20198)
enclosingStmt(#20197,#20181)
exprContainers(#20197,#20001)
literals("a","""a""",#20197)
#20198=*
exprs(#20198,4,#20195,1,"""b""")
hasLocation(#20198,#20067)
enclosingStmt(#20198,#20181)
exprContainers(#20198,#20001)
literals("b","""b""",#20198)
#20199=*
exprs(#20199,79,#20182,-2,"j")
hasLocation(#20199,#20075)
exprs(#20199,4,#20197,0,"""a""")
hasLocation(#20199,#20063)
enclosingStmt(#20199,#20181)
exprContainers(#20199,#20001)
literals("j","j",#20199)
#20200=@"var;{j};{#20000}"
variables(#20200,"j",#20000)
bind(#20199,#20200)
#20201=*
exprs(#20201,89,#20182,-3,"<k.l><M/></k.l>")
#20202=@"loc,{#10000},3,33,3,47"
locations_default(#20202,#10000,3,33,3,47)
hasLocation(#20201,#20202)
enclosingStmt(#20201,#20181)
exprContainers(#20201,#20001)
literals("a","""a""",#20199)
#20200=*
regexpterm(#20200,14,#20199,0,"a")
#20201=@"loc,{#10000},3,22,3,22"
locations_default(#20201,#10000,3,22,3,22)
hasLocation(#20200,#20201)
regexpConstValue(#20200,"a")
#20202=*
exprs(#20202,4,#20197,1,"""b""")
hasLocation(#20202,#20067)
enclosingStmt(#20202,#20181)
exprContainers(#20202,#20001)
literals("b","""b""",#20202)
#20203=*
exprs(#20203,14,#20201,-1,"k.l")
#20204=@"loc,{#10000},3,34,3,36"
locations_default(#20204,#10000,3,34,3,36)
regexpterm(#20203,14,#20202,0,"b")
#20204=@"loc,{#10000},3,26,3,26"
locations_default(#20204,#10000,3,26,3,26)
hasLocation(#20203,#20204)
enclosingStmt(#20203,#20181)
exprContainers(#20203,#20001)
regexpConstValue(#20203,"b")
#20205=*
exprs(#20205,79,#20203,0,"k")
hasLocation(#20205,#20081)
exprs(#20205,79,#20182,-2,"j")
hasLocation(#20205,#20075)
enclosingStmt(#20205,#20181)
exprContainers(#20205,#20001)
literals("k","k",#20205)
#20206=@"var;{k};{#20000}"
variables(#20206,"k",#20000)
literals("j","j",#20205)
#20206=@"var;{j};{#20000}"
variables(#20206,"j",#20000)
bind(#20205,#20206)
#20207=*
exprs(#20207,0,#20203,1,"l")
hasLocation(#20207,#20085)
exprs(#20207,89,#20182,-3,"<k.l><M/></k.l>")
#20208=@"loc,{#10000},3,33,3,47"
locations_default(#20208,#10000,3,33,3,47)
hasLocation(#20207,#20208)
enclosingStmt(#20207,#20181)
exprContainers(#20207,#20001)
literals("l","l",#20207)
#20208=*
exprs(#20208,89,#20201,-2,"<M/>")
#20209=@"loc,{#10000},3,38,3,41"
locations_default(#20209,#10000,3,38,3,41)
hasLocation(#20208,#20209)
enclosingStmt(#20208,#20181)
exprContainers(#20208,#20001)
#20210=*
exprs(#20210,79,#20208,-1,"M")
hasLocation(#20210,#20091)
enclosingStmt(#20210,#20181)
exprContainers(#20210,#20001)
literals("M","M",#20210)
#20211=@"var;{M};{#20000}"
variables(#20211,"M",#20000)
bind(#20210,#20211)
#20212=*
stmts(#20212,2,#20001,3,"<n {...props}/>;")
hasLocation(#20212,#20009)
stmtContainers(#20212,#20001)
#20209=*
exprs(#20209,14,#20207,-1,"k.l")
#20210=@"loc,{#10000},3,34,3,36"
locations_default(#20210,#10000,3,34,3,36)
hasLocation(#20209,#20210)
enclosingStmt(#20209,#20181)
exprContainers(#20209,#20001)
#20211=*
exprs(#20211,79,#20209,0,"k")
hasLocation(#20211,#20081)
enclosingStmt(#20211,#20181)
exprContainers(#20211,#20001)
literals("k","k",#20211)
#20212=@"var;{k};{#20000}"
variables(#20212,"k",#20000)
bind(#20211,#20212)
#20213=*
exprs(#20213,89,#20212,0,"<n {...props}/>")
#20214=@"loc,{#10000},4,1,4,15"
locations_default(#20214,#10000,4,1,4,15)
hasLocation(#20213,#20214)
enclosingStmt(#20213,#20212)
exprs(#20213,0,#20209,1,"l")
hasLocation(#20213,#20085)
enclosingStmt(#20213,#20181)
exprContainers(#20213,#20001)
#20215=*
exprs(#20215,0,#20213,-1,"n")
hasLocation(#20215,#20121)
enclosingStmt(#20215,#20212)
exprContainers(#20215,#20001)
literals("n","n",#20215)
literals("l","l",#20213)
#20214=*
exprs(#20214,89,#20207,-2,"<M/>")
#20215=@"loc,{#10000},3,38,3,41"
locations_default(#20215,#10000,3,38,3,41)
hasLocation(#20214,#20215)
enclosingStmt(#20214,#20181)
exprContainers(#20214,#20001)
#20216=*
properties(#20216,#20213,0,3,"{...props}")
#20217=@"loc,{#10000},4,4,4,13"
locations_default(#20217,#10000,4,4,4,13)
hasLocation(#20216,#20217)
exprs(#20216,79,#20214,-1,"M")
hasLocation(#20216,#20091)
enclosingStmt(#20216,#20181)
exprContainers(#20216,#20001)
literals("M","M",#20216)
#20217=@"var;{M};{#20000}"
variables(#20217,"M",#20000)
bind(#20216,#20217)
#20218=*
exprs(#20218,66,#20216,1,"...props")
hasLocation(#20218,#20217)
enclosingStmt(#20218,#20212)
exprContainers(#20218,#20001)
stmts(#20218,2,#20001,3,"<n {...props}/>;")
hasLocation(#20218,#20009)
stmtContainers(#20218,#20001)
#20219=*
exprs(#20219,79,#20218,0,"props")
hasLocation(#20219,#20127)
enclosingStmt(#20219,#20212)
exprs(#20219,89,#20218,0,"<n {...props}/>")
#20220=@"loc,{#10000},4,1,4,15"
locations_default(#20220,#10000,4,1,4,15)
hasLocation(#20219,#20220)
enclosingStmt(#20219,#20218)
exprContainers(#20219,#20001)
literals("props","props",#20219)
#20220=@"var;{props};{#20000}"
variables(#20220,"props",#20000)
bind(#20219,#20220)
#20221=*
stmts(#20221,2,#20001,4,"<><a/><b/></>")
hasLocation(#20221,#20011)
stmtContainers(#20221,#20001)
exprs(#20221,0,#20219,-1,"n")
hasLocation(#20221,#20121)
enclosingStmt(#20221,#20218)
exprContainers(#20221,#20001)
literals("n","n",#20221)
#20222=*
exprs(#20222,89,#20221,0,"<><a/><b/></>")
hasLocation(#20222,#20011)
enclosingStmt(#20222,#20221)
exprContainers(#20222,#20001)
#20223=*
exprs(#20223,89,#20222,-2,"<a/>")
#20224=@"loc,{#10000},5,3,5,6"
locations_default(#20224,#10000,5,3,5,6)
hasLocation(#20223,#20224)
enclosingStmt(#20223,#20221)
exprContainers(#20223,#20001)
properties(#20222,#20219,0,3,"{...props}")
#20223=@"loc,{#10000},4,4,4,13"
locations_default(#20223,#10000,4,4,4,13)
hasLocation(#20222,#20223)
#20224=*
exprs(#20224,66,#20222,1,"...props")
hasLocation(#20224,#20223)
enclosingStmt(#20224,#20218)
exprContainers(#20224,#20001)
#20225=*
exprs(#20225,0,#20223,-1,"a")
hasLocation(#20225,#20143)
enclosingStmt(#20225,#20221)
exprs(#20225,79,#20224,0,"props")
hasLocation(#20225,#20127)
enclosingStmt(#20225,#20218)
exprContainers(#20225,#20001)
literals("a","a",#20225)
#20226=*
exprs(#20226,89,#20222,-3,"<b/>")
#20227=@"loc,{#10000},5,7,5,10"
locations_default(#20227,#10000,5,7,5,10)
hasLocation(#20226,#20227)
enclosingStmt(#20226,#20221)
exprContainers(#20226,#20001)
literals("props","props",#20225)
#20226=@"var;{props};{#20000}"
variables(#20226,"props",#20000)
bind(#20225,#20226)
#20227=*
stmts(#20227,2,#20001,4,"<><a/><b/></>")
hasLocation(#20227,#20011)
stmtContainers(#20227,#20001)
#20228=*
exprs(#20228,0,#20226,-1,"b")
hasLocation(#20228,#20151)
enclosingStmt(#20228,#20221)
exprs(#20228,89,#20227,0,"<><a/><b/></>")
hasLocation(#20228,#20011)
enclosingStmt(#20228,#20227)
exprContainers(#20228,#20001)
literals("b","b",#20228)
#20229=*
entry_cfg_node(#20229,#20001)
#20230=@"loc,{#10000},1,1,1,0"
locations_default(#20230,#10000,1,1,1,0)
exprs(#20229,89,#20228,-2,"<a/>")
#20230=@"loc,{#10000},5,3,5,6"
locations_default(#20230,#10000,5,3,5,6)
hasLocation(#20229,#20230)
enclosingStmt(#20229,#20227)
exprContainers(#20229,#20001)
#20231=*
exit_cfg_node(#20231,#20001)
hasLocation(#20231,#20163)
exprs(#20231,0,#20229,-1,"a")
hasLocation(#20231,#20143)
enclosingStmt(#20231,#20227)
exprContainers(#20231,#20001)
literals("a","a",#20231)
#20232=*
exprs(#20232,89,#20228,-3,"<b/>")
#20233=@"loc,{#10000},5,7,5,10"
locations_default(#20233,#10000,5,7,5,10)
hasLocation(#20232,#20233)
enclosingStmt(#20232,#20227)
exprContainers(#20232,#20001)
#20234=*
exprs(#20234,0,#20232,-1,"b")
hasLocation(#20234,#20151)
enclosingStmt(#20234,#20227)
exprContainers(#20234,#20001)
literals("b","b",#20234)
#20235=*
entry_cfg_node(#20235,#20001)
#20236=@"loc,{#10000},1,1,1,0"
locations_default(#20236,#10000,1,1,1,0)
hasLocation(#20235,#20236)
#20237=*
exit_cfg_node(#20237,#20001)
hasLocation(#20237,#20163)
successor(#20227,#20231)
successor(#20234,#20232)
successor(#20232,#20228)
successor(#20231,#20229)
successor(#20229,#20234)
successor(#20228,#20237)
successor(#20218,#20221)
successor(#20225,#20224)
successor(#20224,#20222)
successor(#20222,#20219)
successor(#20221,#20225)
successor(#20228,#20226)
successor(#20226,#20222)
successor(#20225,#20223)
successor(#20223,#20228)
successor(#20222,#20231)
successor(#20212,#20215)
successor(#20219,#20218)
successor(#20218,#20216)
successor(#20216,#20213)
successor(#20215,#20219)
successor(#20213,#20221)
successor(#20219,#20227)
successor(#20181,#20184)
successor(#20210,#20208)
successor(#20208,#20201)
successor(#20207,#20203)
successor(#20205,#20207)
successor(#20203,#20210)
successor(#20201,#20182)
successor(#20199,#20205)
successor(#20198,#20195)
successor(#20197,#20198)
successor(#20195,#20192)
successor(#20194,#20197)
successor(#20192,#20199)
successor(#20216,#20214)
successor(#20214,#20207)
successor(#20213,#20209)
successor(#20211,#20213)
successor(#20209,#20216)
successor(#20207,#20182)
successor(#20205,#20211)
successor(#20202,#20197)
successor(#20199,#20202)
successor(#20197,#20194)
successor(#20196,#20199)
successor(#20194,#20205)
successor(#20191,#20185)
successor(#20190,#20187)
successor(#20189,#20190)
successor(#20187,#20191)
successor(#20185,#20194)
successor(#20185,#20196)
successor(#20184,#20189)
successor(#20182,#20212)
successor(#20182,#20218)
successor(#20169,#20174)
successor(#20180,#20178)
successor(#20179,#20180)
@@ -747,6 +765,6 @@ successor(#20170,#20181)
successor(#20165,#20168)
successor(#20168,#20166)
successor(#20166,#20169)
successor(#20229,#20165)
successor(#20235,#20165)
numlines(#10000,5,5,0)
filetype(#10000,"javascript")

View File

@@ -241,197 +241,209 @@ hasLocation(#20083,#20029)
exprContainers(#20083,#20075)
literals("result","""result""",#20083)
#20084=*
stmts(#20084,2,#20001,1,"functio ... )\n }\n}")
#20085=@"loc,{#10000},3,1,7,1"
locations_default(#20085,#10000,3,1,7,1)
regexpterm(#20084,14,#20083,0,"result")
#20085=@"loc,{#10000},1,16,1,21"
locations_default(#20085,#10000,1,16,1,21)
hasLocation(#20084,#20085)
stmtContainers(#20084,#20001)
regexpConstValue(#20084,"result")
#20086=*
exprs(#20086,9,#20084,0,"functio ... )\n }\n}")
hasLocation(#20086,#20085)
enclosingStmt(#20086,#20084)
exprContainers(#20086,#20001)
#20087=*
scopes(#20087,1)
scopenodes(#20086,#20087)
scopenesting(#20087,#20000)
#20088=@"var;{g};{#20087}"
variables(#20088,"g",#20087)
#20089=@"var;{b};{#20087}"
variables(#20089,"b",#20087)
#20090=*
exprs(#20090,78,#20086,0,"b")
hasLocation(#20090,#20037)
exprContainers(#20090,#20086)
literals("b","b",#20090)
decl(#20090,#20089)
#20091=@"var;{arguments};{#20087}"
variables(#20091,"arguments",#20087)
isArgumentsObject(#20091)
stmts(#20086,2,#20001,1,"functio ... )\n }\n}")
#20087=@"loc,{#10000},3,1,7,1"
locations_default(#20087,#10000,3,1,7,1)
hasLocation(#20086,#20087)
stmtContainers(#20086,#20001)
#20088=*
exprs(#20088,9,#20086,0,"functio ... )\n }\n}")
hasLocation(#20088,#20087)
enclosingStmt(#20088,#20086)
exprContainers(#20088,#20001)
#20089=*
scopes(#20089,1)
scopenodes(#20088,#20089)
scopenesting(#20089,#20000)
#20090=@"var;{g};{#20089}"
variables(#20090,"g",#20089)
#20091=@"var;{b};{#20089}"
variables(#20091,"b",#20089)
#20092=*
stmts(#20092,1,#20086,-2,"{\n if ... )\n }\n}")
#20093=@"loc,{#10000},3,13,7,1"
locations_default(#20093,#10000,3,13,7,1)
hasLocation(#20092,#20093)
stmtContainers(#20092,#20086)
exprs(#20092,78,#20088,0,"b")
hasLocation(#20092,#20037)
exprContainers(#20092,#20088)
literals("b","b",#20092)
decl(#20092,#20091)
#20093=@"var;{arguments};{#20089}"
variables(#20093,"arguments",#20089)
isArgumentsObject(#20093)
#20094=*
stmts(#20094,3,#20092,0,"if (b) ... t"")\n }")
#20095=@"loc,{#10000},4,3,6,3"
locations_default(#20095,#10000,4,3,6,3)
stmts(#20094,1,#20088,-2,"{\n if ... )\n }\n}")
#20095=@"loc,{#10000},3,13,7,1"
locations_default(#20095,#10000,3,13,7,1)
hasLocation(#20094,#20095)
stmtContainers(#20094,#20086)
stmtContainers(#20094,#20088)
#20096=*
exprs(#20096,79,#20094,0,"b")
hasLocation(#20096,#20047)
enclosingStmt(#20096,#20094)
exprContainers(#20096,#20086)
literals("b","b",#20096)
bind(#20096,#20089)
#20097=*
stmts(#20097,1,#20094,1,"{\n f ... t"")\n }")
#20098=@"loc,{#10000},4,10,6,3"
locations_default(#20098,#10000,4,10,6,3)
hasLocation(#20097,#20098)
stmtContainers(#20097,#20086)
stmts(#20096,3,#20094,0,"if (b) ... t"")\n }")
#20097=@"loc,{#10000},4,3,6,3"
locations_default(#20097,#10000,4,3,6,3)
hasLocation(#20096,#20097)
stmtContainers(#20096,#20088)
#20098=*
exprs(#20098,79,#20096,0,"b")
hasLocation(#20098,#20047)
enclosingStmt(#20098,#20096)
exprContainers(#20098,#20088)
literals("b","b",#20098)
bind(#20098,#20091)
#20099=*
stmts(#20099,17,#20097,0,"functio ... esult"")")
#20100=@"loc,{#10000},5,5,5,33"
locations_default(#20100,#10000,5,5,5,33)
stmts(#20099,1,#20096,1,"{\n f ... t"")\n }")
#20100=@"loc,{#10000},4,10,6,3"
locations_default(#20100,#10000,4,10,6,3)
hasLocation(#20099,#20100)
stmtContainers(#20099,#20086)
stmtContainers(#20099,#20088)
#20101=*
exprs(#20101,78,#20099,-1,"g")
hasLocation(#20101,#20055)
exprContainers(#20101,#20099)
literals("g","g",#20101)
decl(#20101,#20088)
#20102=*
scopes(#20102,1)
scopenodes(#20099,#20102)
scopenesting(#20102,#20087)
#20103=@"var;{y};{#20102}"
variables(#20103,"y",#20102)
stmts(#20101,17,#20099,0,"functio ... esult"")")
#20102=@"loc,{#10000},5,5,5,33"
locations_default(#20102,#10000,5,5,5,33)
hasLocation(#20101,#20102)
stmtContainers(#20101,#20088)
#20103=*
exprs(#20103,78,#20101,-1,"g")
hasLocation(#20103,#20055)
exprContainers(#20103,#20101)
literals("g","g",#20103)
decl(#20103,#20090)
#20104=*
exprs(#20104,78,#20099,0,"y")
hasLocation(#20104,#20059)
exprContainers(#20104,#20099)
literals("y","y",#20104)
decl(#20104,#20103)
#20105=@"var;{arguments};{#20102}"
variables(#20105,"arguments",#20102)
isArgumentsObject(#20105)
scopes(#20104,1)
scopenodes(#20101,#20104)
scopenesting(#20104,#20089)
#20105=@"var;{y};{#20104}"
variables(#20105,"y",#20104)
#20106=*
exprs(#20106,63,#20099,-2,"(""other result"")")
#20107=@"loc,{#10000},5,18,5,33"
locations_default(#20107,#10000,5,18,5,33)
hasLocation(#20106,#20107)
exprContainers(#20106,#20099)
exprs(#20106,78,#20101,0,"y")
hasLocation(#20106,#20059)
exprContainers(#20106,#20101)
literals("y","y",#20106)
decl(#20106,#20105)
#20107=@"var;{arguments};{#20104}"
variables(#20107,"arguments",#20104)
isArgumentsObject(#20107)
#20108=*
exprs(#20108,4,#20106,0,"""other result""")
hasLocation(#20108,#20065)
exprContainers(#20108,#20099)
literals("other result","""other result""",#20108)
#20109=*
entry_cfg_node(#20109,#20001)
#20110=@"loc,{#10000},1,1,1,0"
locations_default(#20110,#10000,1,1,1,0)
hasLocation(#20109,#20110)
exprs(#20108,63,#20101,-2,"(""other result"")")
#20109=@"loc,{#10000},5,18,5,33"
locations_default(#20109,#10000,5,18,5,33)
hasLocation(#20108,#20109)
exprContainers(#20108,#20101)
#20110=*
exprs(#20110,4,#20108,0,"""other result""")
hasLocation(#20110,#20065)
exprContainers(#20110,#20101)
literals("other result","""other result""",#20110)
#20111=*
exit_cfg_node(#20111,#20001)
hasLocation(#20111,#20072)
successor(#20084,#20086)
successor(#20086,#20111)
#20112=*
entry_cfg_node(#20112,#20086)
#20113=@"loc,{#10000},3,1,3,0"
locations_default(#20113,#10000,3,1,3,0)
hasLocation(#20112,#20113)
#20114=*
exit_cfg_node(#20114,#20086)
#20115=@"loc,{#10000},7,2,7,1"
locations_default(#20115,#10000,7,2,7,1)
hasLocation(#20114,#20115)
successor(#20092,#20094)
successor(#20094,#20096)
regexpterm(#20111,14,#20110,0,"other result")
#20112=@"loc,{#10000},5,20,5,31"
locations_default(#20112,#10000,5,20,5,31)
hasLocation(#20111,#20112)
regexpConstValue(#20111,"other result")
#20113=*
entry_cfg_node(#20113,#20001)
#20114=@"loc,{#10000},1,1,1,0"
locations_default(#20114,#10000,1,1,1,0)
hasLocation(#20113,#20114)
#20115=*
exit_cfg_node(#20115,#20001)
hasLocation(#20115,#20072)
successor(#20086,#20088)
successor(#20088,#20115)
#20116=*
guard_node(#20116,1,#20096)
hasLocation(#20116,#20047)
successor(#20116,#20097)
#20117=*
guard_node(#20117,0,#20096)
hasLocation(#20117,#20047)
successor(#20117,#20114)
successor(#20096,#20116)
successor(#20096,#20117)
successor(#20097,#20099)
successor(#20099,#20101)
successor(#20101,#20114)
entry_cfg_node(#20116,#20088)
#20117=@"loc,{#10000},3,1,3,0"
locations_default(#20117,#10000,3,1,3,0)
hasLocation(#20116,#20117)
#20118=*
entry_cfg_node(#20118,#20099)
#20119=@"loc,{#10000},5,5,5,4"
locations_default(#20119,#10000,5,5,5,4)
exit_cfg_node(#20118,#20088)
#20119=@"loc,{#10000},7,2,7,1"
locations_default(#20119,#10000,7,2,7,1)
hasLocation(#20118,#20119)
successor(#20094,#20096)
successor(#20096,#20098)
#20120=*
exit_cfg_node(#20120,#20099)
#20121=@"loc,{#10000},5,34,5,33"
locations_default(#20121,#10000,5,34,5,33)
hasLocation(#20120,#20121)
successor(#20106,#20108)
successor(#20108,#20120)
successor(#20104,#20106)
successor(#20118,#20104)
successor(#20090,#20092)
successor(#20112,#20090)
successor(#20075,#20084)
guard_node(#20120,1,#20098)
hasLocation(#20120,#20047)
successor(#20120,#20099)
#20121=*
guard_node(#20121,0,#20098)
hasLocation(#20121,#20047)
successor(#20121,#20118)
successor(#20098,#20120)
successor(#20098,#20121)
successor(#20099,#20101)
successor(#20101,#20103)
successor(#20103,#20118)
#20122=*
entry_cfg_node(#20122,#20075)
hasLocation(#20122,#20110)
#20123=*
exit_cfg_node(#20123,#20075)
#20124=@"loc,{#10000},1,24,1,23"
locations_default(#20124,#10000,1,24,1,23)
hasLocation(#20123,#20124)
successor(#20081,#20083)
successor(#20083,#20123)
successor(#20079,#20081)
successor(#20122,#20079)
successor(#20076,#20075)
successor(#20109,#20076)
#20125=*
jsParseErrors(#20125,#20001,"Error: Missing function name","function(b) {
")
hasLocation(#20125,#20035)
entry_cfg_node(#20122,#20101)
#20123=@"loc,{#10000},5,5,5,4"
locations_default(#20123,#10000,5,5,5,4)
hasLocation(#20122,#20123)
#20124=*
exit_cfg_node(#20124,#20101)
#20125=@"loc,{#10000},5,34,5,33"
locations_default(#20125,#10000,5,34,5,33)
hasLocation(#20124,#20125)
successor(#20108,#20110)
successor(#20110,#20124)
successor(#20106,#20108)
successor(#20122,#20106)
successor(#20092,#20094)
successor(#20116,#20092)
successor(#20075,#20086)
#20126=*
lines(#20126,#20001,"function f(x)(""result"")","
")
hasLocation(#20126,#20003)
entry_cfg_node(#20126,#20075)
hasLocation(#20126,#20114)
#20127=*
lines(#20127,#20001,"","
")
hasLocation(#20127,#20005)
#20128=*
lines(#20128,#20001,"function(b) {","
")
hasLocation(#20128,#20007)
exit_cfg_node(#20127,#20075)
#20128=@"loc,{#10000},1,24,1,23"
locations_default(#20128,#10000,1,24,1,23)
hasLocation(#20127,#20128)
successor(#20081,#20083)
successor(#20083,#20127)
successor(#20079,#20081)
successor(#20126,#20079)
successor(#20076,#20075)
successor(#20113,#20076)
#20129=*
lines(#20129,#20001," if (b) {","
jsParseErrors(#20129,#20001,"Error: Missing function name","function(b) {
")
hasLocation(#20129,#20009)
indentation(#10000,4," ",2)
hasLocation(#20129,#20035)
#20130=*
lines(#20130,#20001," function g(y)(""other result"")","
lines(#20130,#20001,"function f(x)(""result"")","
")
hasLocation(#20130,#20011)
indentation(#10000,5," ",4)
hasLocation(#20130,#20003)
#20131=*
lines(#20131,#20001," }","
lines(#20131,#20001,"","
")
hasLocation(#20131,#20013)
indentation(#10000,6," ",2)
hasLocation(#20131,#20005)
#20132=*
lines(#20132,#20001,"}","
lines(#20132,#20001,"function(b) {","
")
hasLocation(#20132,#20015)
hasLocation(#20132,#20007)
#20133=*
lines(#20133,#20001," if (b) {","
")
hasLocation(#20133,#20009)
indentation(#10000,4," ",2)
#20134=*
lines(#20134,#20001," function g(y)(""other result"")","
")
hasLocation(#20134,#20011)
indentation(#10000,5," ",4)
#20135=*
lines(#20135,#20001," }","
")
hasLocation(#20135,#20013)
indentation(#10000,6," ",2)
#20136=*
lines(#20136,#20001,"}","
")
hasLocation(#20136,#20015)
numlines(#20001,7,0,0)
numlines(#10000,7,6,0)
filetype(#10000,"javascript")

View File

@@ -452,96 +452,108 @@ enclosingStmt(#20149,#20140)
exprContainers(#20149,#20111)
literals("error!","""error!""",#20149)
#20150=*
stmts(#20150,20,#20119,2,"catch ( ... !"");\n\t}")
#20151=@"loc,{#10000},6,4,8,2"
locations_default(#20151,#10000,6,4,8,2)
regexpterm(#20150,14,#20149,0,"error!")
#20151=@"loc,{#10000},5,16,5,21"
locations_default(#20151,#10000,5,16,5,21)
hasLocation(#20150,#20151)
stmtContainers(#20150,#20111)
regexpConstValue(#20150,"error!")
#20152=*
scopes(#20152,2)
scopenodes(#20150,#20152)
scopenesting(#20152,#20113)
#20153=@"var;{e};{#20152}"
variables(#20153,"e",#20152)
stmts(#20152,20,#20119,2,"catch ( ... !"");\n\t}")
#20153=@"loc,{#10000},6,4,8,2"
locations_default(#20153,#10000,6,4,8,2)
hasLocation(#20152,#20153)
stmtContainers(#20152,#20111)
#20154=*
exprs(#20154,78,#20150,0,"e")
hasLocation(#20154,#20085)
enclosingStmt(#20154,#20150)
exprContainers(#20154,#20111)
literals("e","e",#20154)
decl(#20154,#20153)
#20155=*
stmts(#20155,1,#20150,1,"{\n\t\tcon ... !"");\n\t}")
#20156=@"loc,{#10000},6,14,8,2"
locations_default(#20156,#10000,6,14,8,2)
hasLocation(#20155,#20156)
stmtContainers(#20155,#20111)
scopes(#20154,2)
scopenodes(#20152,#20154)
scopenesting(#20154,#20113)
#20155=@"var;{e};{#20154}"
variables(#20155,"e",#20154)
#20156=*
exprs(#20156,78,#20152,0,"e")
hasLocation(#20156,#20085)
enclosingStmt(#20156,#20152)
exprContainers(#20156,#20111)
literals("e","e",#20156)
decl(#20156,#20155)
#20157=*
stmts(#20157,2,#20155,0,"console ... lse!"");")
#20158=@"loc,{#10000},7,3,7,33"
locations_default(#20158,#10000,7,3,7,33)
stmts(#20157,1,#20152,1,"{\n\t\tcon ... !"");\n\t}")
#20158=@"loc,{#10000},6,14,8,2"
locations_default(#20158,#10000,6,14,8,2)
hasLocation(#20157,#20158)
stmtContainers(#20157,#20111)
#20159=*
exprs(#20159,13,#20157,0,"console ... else!"")")
#20160=@"loc,{#10000},7,3,7,32"
locations_default(#20160,#10000,7,3,7,32)
stmts(#20159,2,#20157,0,"console ... lse!"");")
#20160=@"loc,{#10000},7,3,7,33"
locations_default(#20160,#10000,7,3,7,33)
hasLocation(#20159,#20160)
enclosingStmt(#20159,#20157)
exprContainers(#20159,#20111)
stmtContainers(#20159,#20111)
#20161=*
exprs(#20161,14,#20159,-1,"console.log")
#20162=@"loc,{#10000},7,3,7,13"
locations_default(#20162,#10000,7,3,7,13)
exprs(#20161,13,#20159,0,"console ... else!"")")
#20162=@"loc,{#10000},7,3,7,32"
locations_default(#20162,#10000,7,3,7,32)
hasLocation(#20161,#20162)
enclosingStmt(#20161,#20157)
enclosingStmt(#20161,#20159)
exprContainers(#20161,#20111)
#20163=*
exprs(#20163,79,#20161,0,"console")
hasLocation(#20163,#20091)
enclosingStmt(#20163,#20157)
exprs(#20163,14,#20161,-1,"console.log")
#20164=@"loc,{#10000},7,3,7,13"
locations_default(#20164,#10000,7,3,7,13)
hasLocation(#20163,#20164)
enclosingStmt(#20163,#20159)
exprContainers(#20163,#20111)
literals("console","console",#20163)
bind(#20163,#20147)
#20164=*
exprs(#20164,0,#20161,1,"log")
hasLocation(#20164,#20095)
enclosingStmt(#20164,#20157)
exprContainers(#20164,#20111)
literals("log","log",#20164)
#20165=*
exprs(#20165,4,#20159,0,"""something else!""")
hasLocation(#20165,#20099)
enclosingStmt(#20165,#20157)
exprs(#20165,79,#20163,0,"console")
hasLocation(#20165,#20091)
enclosingStmt(#20165,#20159)
exprContainers(#20165,#20111)
literals("something else!","""something else!""",#20165)
literals("console","console",#20165)
bind(#20165,#20147)
#20166=*
entry_cfg_node(#20166,#20001)
#20167=@"loc,{#10000},1,1,1,0"
locations_default(#20167,#10000,1,1,1,0)
hasLocation(#20166,#20167)
exprs(#20166,0,#20163,1,"log")
hasLocation(#20166,#20095)
enclosingStmt(#20166,#20159)
exprContainers(#20166,#20111)
literals("log","log",#20166)
#20167=*
exprs(#20167,4,#20161,0,"""something else!""")
hasLocation(#20167,#20099)
enclosingStmt(#20167,#20159)
exprContainers(#20167,#20111)
literals("something else!","""something else!""",#20167)
#20168=*
exit_cfg_node(#20168,#20001)
hasLocation(#20168,#20108)
successor(#20111,#20168)
#20169=*
entry_cfg_node(#20169,#20111)
hasLocation(#20169,#20167)
regexpterm(#20168,14,#20167,0,"something else!")
#20169=@"loc,{#10000},7,16,7,30"
locations_default(#20169,#10000,7,16,7,30)
hasLocation(#20168,#20169)
regexpConstValue(#20168,"something else!")
#20170=*
exit_cfg_node(#20170,#20111)
hasLocation(#20170,#20108)
entry_cfg_node(#20170,#20001)
#20171=@"loc,{#10000},1,1,1,0"
locations_default(#20171,#10000,1,1,1,0)
hasLocation(#20170,#20171)
#20172=*
exit_cfg_node(#20172,#20001)
hasLocation(#20172,#20108)
successor(#20111,#20172)
#20173=*
entry_cfg_node(#20173,#20111)
hasLocation(#20173,#20171)
#20174=*
exit_cfg_node(#20174,#20111)
hasLocation(#20174,#20108)
successor(#20117,#20119)
successor(#20119,#20121)
successor(#20121,#20123)
successor(#20123,#20127)
successor(#20127,#20125)
successor(#20125,#20128)
successor(#20125,#20170)
successor(#20125,#20174)
successor(#20128,#20132)
successor(#20136,#20133)
successor(#20135,#20136)
successor(#20133,#20138)
successor(#20133,#20150)
successor(#20133,#20152)
successor(#20132,#20135)
successor(#20138,#20140)
successor(#20140,#20146)
@@ -549,19 +561,19 @@ successor(#20149,#20142)
successor(#20148,#20144)
successor(#20146,#20148)
successor(#20144,#20149)
successor(#20142,#20170)
successor(#20150,#20154)
successor(#20155,#20157)
successor(#20157,#20163)
successor(#20165,#20159)
successor(#20164,#20161)
successor(#20163,#20164)
successor(#20161,#20165)
successor(#20159,#20170)
successor(#20154,#20155)
successor(#20142,#20174)
successor(#20152,#20156)
successor(#20157,#20159)
successor(#20159,#20165)
successor(#20167,#20161)
successor(#20166,#20163)
successor(#20165,#20166)
successor(#20163,#20167)
successor(#20161,#20174)
successor(#20156,#20157)
successor(#20115,#20117)
successor(#20169,#20115)
successor(#20173,#20115)
successor(#20112,#20111)
successor(#20166,#20112)
successor(#20170,#20112)
numlines(#10000,9,9,0)
filetype(#10000,"javascript")

View File

@@ -180,44 +180,50 @@ enclosingStmt(#20058,#20049)
exprContainers(#20058,#20001)
literals("bar","""bar""",#20058)
#20059=*
stmts(#20059,2,#20001,1,"new A()")
hasLocation(#20059,#20013)
stmtContainers(#20059,#20001)
#20060=*
exprs(#20060,12,#20059,0,"new A()")
hasLocation(#20060,#20013)
enclosingStmt(#20060,#20059)
exprContainers(#20060,#20001)
regexpterm(#20059,14,#20058,0,"bar")
#20060=@"loc,{#10000},2,17,2,19"
locations_default(#20060,#10000,2,17,2,19)
hasLocation(#20059,#20060)
regexpConstValue(#20059,"bar")
#20061=*
exprs(#20061,79,#20060,-1,"A")
hasLocation(#20061,#20037)
enclosingStmt(#20061,#20059)
exprContainers(#20061,#20001)
literals("A","A",#20061)
bind(#20061,#20052)
stmts(#20061,2,#20001,1,"new A()")
hasLocation(#20061,#20013)
stmtContainers(#20061,#20001)
#20062=*
stmts(#20062,1,#20001,2,"{}")
hasLocation(#20062,#20015)
stmtContainers(#20062,#20001)
exprs(#20062,12,#20061,0,"new A()")
hasLocation(#20062,#20013)
enclosingStmt(#20062,#20061)
exprContainers(#20062,#20001)
#20063=*
entry_cfg_node(#20063,#20001)
#20064=@"loc,{#10000},1,1,1,0"
locations_default(#20064,#10000,1,1,1,0)
hasLocation(#20063,#20064)
exprs(#20063,79,#20062,-1,"A")
hasLocation(#20063,#20037)
enclosingStmt(#20063,#20061)
exprContainers(#20063,#20001)
literals("A","A",#20063)
bind(#20063,#20052)
#20064=*
stmts(#20064,1,#20001,2,"{}")
hasLocation(#20064,#20015)
stmtContainers(#20064,#20001)
#20065=*
exit_cfg_node(#20065,#20001)
hasLocation(#20065,#20047)
successor(#20062,#20065)
successor(#20059,#20061)
successor(#20061,#20060)
successor(#20060,#20062)
entry_cfg_node(#20065,#20001)
#20066=@"loc,{#10000},1,1,1,0"
locations_default(#20066,#10000,1,1,1,0)
hasLocation(#20065,#20066)
#20067=*
exit_cfg_node(#20067,#20001)
hasLocation(#20067,#20047)
successor(#20064,#20067)
successor(#20061,#20063)
successor(#20063,#20062)
successor(#20062,#20064)
successor(#20049,#20051)
successor(#20053,#20057)
successor(#20058,#20055)
successor(#20057,#20058)
successor(#20055,#20050)
successor(#20051,#20053)
successor(#20050,#20059)
successor(#20063,#20049)
successor(#20050,#20061)
successor(#20065,#20049)
numlines(#10000,6,3,2)
filetype(#10000,"javascript")

View File

@@ -123,26 +123,32 @@ enclosingStmt(#20038,#20031)
exprContainers(#20038,#20001)
literals("Hello, world!","""Hello, world!""",#20038)
#20039=*
entry_cfg_node(#20039,#20001)
#20040=@"loc,{#10000},2,1,2,0"
locations_default(#20040,#10000,2,1,2,0)
regexpterm(#20039,14,#20038,0,"Hello, world!")
#20040=@"loc,{#10000},2,14,2,26"
locations_default(#20040,#10000,2,14,2,26)
hasLocation(#20039,#20040)
regexpConstValue(#20039,"Hello, world!")
#20041=*
exit_cfg_node(#20041,#20001)
hasLocation(#20041,#20019)
entry_cfg_node(#20041,#20001)
#20042=@"loc,{#10000},2,1,2,0"
locations_default(#20042,#10000,2,1,2,0)
hasLocation(#20041,#20042)
#20043=*
exit_cfg_node(#20043,#20001)
hasLocation(#20043,#20019)
successor(#20031,#20036)
successor(#20038,#20032)
successor(#20037,#20034)
successor(#20036,#20037)
successor(#20034,#20038)
successor(#20032,#20041)
successor(#20039,#20031)
successor(#20032,#20043)
successor(#20041,#20031)
isNodejs(#20001)
#20042=*
lines(#20042,#20001,"#!/usr/bin/env node","
#20044=*
lines(#20044,#20001,"#!/usr/bin/env node","
")
#20043=@"loc,{#10000},1,1,1,19"
locations_default(#20043,#10000,1,1,1,19)
hasLocation(#20042,#20043)
#20045=@"loc,{#10000},1,1,1,19"
locations_default(#20045,#10000,1,1,1,19)
hasLocation(#20044,#20045)
numlines(#10000,2,1,0)
filetype(#10000,"javascript")

View File

@@ -233,122 +233,128 @@ enclosingStmt(#20082,#20075)
exprContainers(#20082,#20001)
literals("fs","'fs'",#20082)
#20083=*
stmts(#20083,2,#20001,1,"y = 42;")
hasLocation(#20083,#20005)
stmtContainers(#20083,#20001)
#20084=*
exprs(#20084,47,#20083,0,"y = 42")
#20085=@"loc,{#10000},2,1,2,6"
locations_default(#20085,#10000,2,1,2,6)
hasLocation(#20084,#20085)
enclosingStmt(#20084,#20083)
exprContainers(#20084,#20001)
regexpterm(#20083,14,#20082,0,"fs")
#20084=@"loc,{#10000},1,19,1,20"
locations_default(#20084,#10000,1,19,1,20)
hasLocation(#20083,#20084)
regexpConstValue(#20083,"fs")
#20085=*
stmts(#20085,2,#20001,1,"y = 42;")
hasLocation(#20085,#20005)
stmtContainers(#20085,#20001)
#20086=*
exprs(#20086,79,#20084,0,"y")
hasLocation(#20086,#20027)
enclosingStmt(#20086,#20083)
exprs(#20086,47,#20085,0,"y = 42")
#20087=@"loc,{#10000},2,1,2,6"
locations_default(#20087,#10000,2,1,2,6)
hasLocation(#20086,#20087)
enclosingStmt(#20086,#20085)
exprContainers(#20086,#20001)
literals("y","y",#20086)
#20087=@"var;{y};{#20000}"
variables(#20087,"y",#20000)
bind(#20086,#20087)
#20088=*
exprs(#20088,3,#20084,1,"42")
hasLocation(#20088,#20031)
enclosingStmt(#20088,#20083)
exprs(#20088,79,#20086,0,"y")
hasLocation(#20088,#20027)
enclosingStmt(#20088,#20085)
exprContainers(#20088,#20001)
literals("42","42",#20088)
#20089=*
stmts(#20089,2,#20001,2,"console ... ename);")
hasLocation(#20089,#20007)
stmtContainers(#20089,#20001)
literals("y","y",#20088)
#20089=@"var;{y};{#20000}"
variables(#20089,"y",#20000)
bind(#20088,#20089)
#20090=*
exprs(#20090,13,#20089,0,"console ... lename)")
#20091=@"loc,{#10000},3,1,3,23"
locations_default(#20091,#10000,3,1,3,23)
hasLocation(#20090,#20091)
enclosingStmt(#20090,#20089)
exprs(#20090,3,#20086,1,"42")
hasLocation(#20090,#20031)
enclosingStmt(#20090,#20085)
exprContainers(#20090,#20001)
literals("42","42",#20090)
#20091=*
stmts(#20091,2,#20001,2,"console ... ename);")
hasLocation(#20091,#20007)
stmtContainers(#20091,#20001)
#20092=*
exprs(#20092,14,#20090,-1,"console.log")
#20093=@"loc,{#10000},3,1,3,11"
locations_default(#20093,#10000,3,1,3,11)
exprs(#20092,13,#20091,0,"console ... lename)")
#20093=@"loc,{#10000},3,1,3,23"
locations_default(#20093,#10000,3,1,3,23)
hasLocation(#20092,#20093)
enclosingStmt(#20092,#20089)
enclosingStmt(#20092,#20091)
exprContainers(#20092,#20001)
#20094=*
exprs(#20094,79,#20092,0,"console")
hasLocation(#20094,#20035)
enclosingStmt(#20094,#20089)
exprs(#20094,14,#20092,-1,"console.log")
#20095=@"loc,{#10000},3,1,3,11"
locations_default(#20095,#10000,3,1,3,11)
hasLocation(#20094,#20095)
enclosingStmt(#20094,#20091)
exprContainers(#20094,#20001)
literals("console","console",#20094)
bind(#20094,#20065)
#20095=*
exprs(#20095,0,#20092,1,"log")
hasLocation(#20095,#20039)
enclosingStmt(#20095,#20089)
exprContainers(#20095,#20001)
literals("log","log",#20095)
#20096=*
exprs(#20096,79,#20090,0,"__filename")
hasLocation(#20096,#20043)
enclosingStmt(#20096,#20089)
exprs(#20096,79,#20094,0,"console")
hasLocation(#20096,#20035)
enclosingStmt(#20096,#20091)
exprContainers(#20096,#20001)
literals("__filename","__filename",#20096)
bind(#20096,#20071)
literals("console","console",#20096)
bind(#20096,#20065)
#20097=*
stmts(#20097,9,#20001,3,"return arguments[0];")
hasLocation(#20097,#20009)
stmtContainers(#20097,#20001)
exprs(#20097,0,#20094,1,"log")
hasLocation(#20097,#20039)
enclosingStmt(#20097,#20091)
exprContainers(#20097,#20001)
literals("log","log",#20097)
#20098=*
exprs(#20098,15,#20097,0,"arguments[0]")
#20099=@"loc,{#10000},4,8,4,19"
locations_default(#20099,#10000,4,8,4,19)
hasLocation(#20098,#20099)
enclosingStmt(#20098,#20097)
exprs(#20098,79,#20092,0,"__filename")
hasLocation(#20098,#20043)
enclosingStmt(#20098,#20091)
exprContainers(#20098,#20001)
literals("__filename","__filename",#20098)
bind(#20098,#20071)
#20099=*
stmts(#20099,9,#20001,3,"return arguments[0];")
hasLocation(#20099,#20009)
stmtContainers(#20099,#20001)
#20100=*
exprs(#20100,79,#20098,0,"arguments")
hasLocation(#20100,#20051)
enclosingStmt(#20100,#20097)
exprs(#20100,15,#20099,0,"arguments[0]")
#20101=@"loc,{#10000},4,8,4,19"
locations_default(#20101,#10000,4,8,4,19)
hasLocation(#20100,#20101)
enclosingStmt(#20100,#20099)
exprContainers(#20100,#20001)
literals("arguments","arguments",#20100)
bind(#20100,#20073)
#20101=*
exprs(#20101,3,#20098,1,"0")
hasLocation(#20101,#20055)
enclosingStmt(#20101,#20097)
exprContainers(#20101,#20001)
literals("0","0",#20101)
#20102=*
entry_cfg_node(#20102,#20001)
#20103=@"loc,{#10000},1,1,1,0"
locations_default(#20103,#10000,1,1,1,0)
hasLocation(#20102,#20103)
exprs(#20102,79,#20100,0,"arguments")
hasLocation(#20102,#20051)
enclosingStmt(#20102,#20099)
exprContainers(#20102,#20001)
literals("arguments","arguments",#20102)
bind(#20102,#20073)
#20103=*
exprs(#20103,3,#20100,1,"0")
hasLocation(#20103,#20055)
enclosingStmt(#20103,#20099)
exprContainers(#20103,#20001)
literals("0","0",#20103)
#20104=*
exit_cfg_node(#20104,#20001)
hasLocation(#20104,#20061)
successor(#20101,#20098)
successor(#20100,#20101)
successor(#20098,#20097)
successor(#20097,#20104)
successor(#20089,#20094)
successor(#20096,#20090)
successor(#20095,#20092)
successor(#20094,#20095)
successor(#20092,#20096)
successor(#20090,#20100)
successor(#20083,#20086)
successor(#20088,#20084)
successor(#20086,#20088)
successor(#20084,#20089)
entry_cfg_node(#20104,#20001)
#20105=@"loc,{#10000},1,1,1,0"
locations_default(#20105,#10000,1,1,1,0)
hasLocation(#20104,#20105)
#20106=*
exit_cfg_node(#20106,#20001)
hasLocation(#20106,#20061)
successor(#20103,#20100)
successor(#20102,#20103)
successor(#20100,#20099)
successor(#20099,#20106)
successor(#20091,#20096)
successor(#20098,#20092)
successor(#20097,#20094)
successor(#20096,#20097)
successor(#20094,#20098)
successor(#20092,#20102)
successor(#20085,#20088)
successor(#20090,#20086)
successor(#20088,#20090)
successor(#20086,#20091)
successor(#20075,#20078)
successor(#20082,#20079)
successor(#20081,#20082)
successor(#20079,#20076)
successor(#20078,#20081)
successor(#20076,#20083)
successor(#20102,#20075)
successor(#20076,#20085)
successor(#20104,#20075)
isNodejs(#20001)
numlines(#10000,4,4,0)
filetype(#10000,"javascript")

View File

@@ -43,44 +43,21 @@ enclosingStmt(#20011,#20010)
exprContainers(#20011,#20001)
literals("/dice/y","/dice/y",#20011)
#20012=*
regexpterm(#20012,1,#20011,0,"dice")
regexpterm(#20012,14,#20011,0,"dice")
#20013=@"loc,{#10000},1,2,1,5"
locations_default(#20013,#10000,1,2,1,5)
hasLocation(#20012,#20013)
regexpConstValue(#20012,"dice")
#20014=*
regexpterm(#20014,14,#20012,0,"d")
#20015=@"loc,{#10000},1,2,1,2"
locations_default(#20015,#10000,1,2,1,2)
entry_cfg_node(#20014,#20001)
#20015=@"loc,{#10000},1,1,1,0"
locations_default(#20015,#10000,1,1,1,0)
hasLocation(#20014,#20015)
regexpConstValue(#20014,"d")
#20016=*
regexpterm(#20016,14,#20012,1,"i")
#20017=@"loc,{#10000},1,3,1,3"
locations_default(#20017,#10000,1,3,1,3)
hasLocation(#20016,#20017)
regexpConstValue(#20016,"i")
#20018=*
regexpterm(#20018,14,#20012,2,"c")
#20019=@"loc,{#10000},1,4,1,4"
locations_default(#20019,#10000,1,4,1,4)
hasLocation(#20018,#20019)
regexpConstValue(#20018,"c")
#20020=*
regexpterm(#20020,14,#20012,3,"e")
#20021=@"loc,{#10000},1,5,1,5"
locations_default(#20021,#10000,1,5,1,5)
hasLocation(#20020,#20021)
regexpConstValue(#20020,"e")
#20022=*
entry_cfg_node(#20022,#20001)
#20023=@"loc,{#10000},1,1,1,0"
locations_default(#20023,#10000,1,1,1,0)
hasLocation(#20022,#20023)
#20024=*
exit_cfg_node(#20024,#20001)
hasLocation(#20024,#20009)
exit_cfg_node(#20016,#20001)
hasLocation(#20016,#20009)
successor(#20010,#20011)
successor(#20011,#20024)
successor(#20022,#20010)
successor(#20011,#20016)
successor(#20014,#20010)
numlines(#10000,1,1,0)
filetype(#10000,"javascript")

View File

@@ -240,153 +240,171 @@ enclosingStmt(#20081,#20075)
exprContainers(#20081,#20001)
literals("x","""x""",#20081)
#20082=*
exprs(#20082,44,#20077,1,"(r = /[ ... && r[0]")
#20083=@"loc,{#10000},5,3,5,33"
locations_default(#20083,#10000,5,3,5,33)
regexpterm(#20082,14,#20081,0,"x")
#20083=@"loc,{#10000},4,4,4,4"
locations_default(#20083,#10000,4,4,4,4)
hasLocation(#20082,#20083)
enclosingStmt(#20082,#20075)
exprContainers(#20082,#20001)
regexpConstValue(#20082,"x")
#20084=*
exprs(#20084,63,#20082,0,"(r = /[ ... c(""x""))")
#20085=@"loc,{#10000},5,3,5,25"
locations_default(#20085,#10000,5,3,5,25)
exprs(#20084,44,#20077,1,"(r = /[ ... && r[0]")
#20085=@"loc,{#10000},5,3,5,33"
locations_default(#20085,#10000,5,3,5,33)
hasLocation(#20084,#20085)
enclosingStmt(#20084,#20075)
exprContainers(#20084,#20001)
#20086=*
exprs(#20086,47,#20084,0,"r = /[\ ... ec(""x"")")
#20087=@"loc,{#10000},5,4,5,24"
locations_default(#20087,#10000,5,4,5,24)
exprs(#20086,63,#20084,0,"(r = /[ ... c(""x""))")
#20087=@"loc,{#10000},5,3,5,25"
locations_default(#20087,#10000,5,3,5,25)
hasLocation(#20086,#20087)
enclosingStmt(#20086,#20075)
exprContainers(#20086,#20001)
#20088=*
exprs(#20088,79,#20086,0,"r")
hasLocation(#20088,#20033)
exprs(#20088,47,#20086,0,"r = /[\ ... ec(""x"")")
#20089=@"loc,{#10000},5,4,5,24"
locations_default(#20089,#10000,5,4,5,24)
hasLocation(#20088,#20089)
enclosingStmt(#20088,#20075)
exprContainers(#20088,#20001)
literals("r","r",#20088)
bind(#20088,#20071)
#20089=*
exprs(#20089,13,#20086,1,"/[\x]+/.exec(""x"")")
#20090=@"loc,{#10000},5,8,5,24"
locations_default(#20090,#10000,5,8,5,24)
hasLocation(#20089,#20090)
enclosingStmt(#20089,#20075)
exprContainers(#20089,#20001)
#20090=*
exprs(#20090,79,#20088,0,"r")
hasLocation(#20090,#20033)
enclosingStmt(#20090,#20075)
exprContainers(#20090,#20001)
literals("r","r",#20090)
bind(#20090,#20071)
#20091=*
exprs(#20091,14,#20089,-1,"/[\x]+/.exec")
#20092=@"loc,{#10000},5,8,5,19"
locations_default(#20092,#10000,5,8,5,19)
exprs(#20091,13,#20088,1,"/[\x]+/.exec(""x"")")
#20092=@"loc,{#10000},5,8,5,24"
locations_default(#20092,#10000,5,8,5,24)
hasLocation(#20091,#20092)
enclosingStmt(#20091,#20075)
exprContainers(#20091,#20001)
#20093=*
exprs(#20093,5,#20091,0,"/[\x]+/")
hasLocation(#20093,#20037)
exprs(#20093,14,#20091,-1,"/[\x]+/.exec")
#20094=@"loc,{#10000},5,8,5,19"
locations_default(#20094,#10000,5,8,5,19)
hasLocation(#20093,#20094)
enclosingStmt(#20093,#20075)
exprContainers(#20093,#20001)
literals("/[\x]+/","/[\x]+/",#20093)
#20094=*
regexpterm(#20094,9,#20093,0,"[\x]+")
#20095=@"loc,{#10000},5,9,5,13"
locations_default(#20095,#10000,5,9,5,13)
hasLocation(#20094,#20095)
isGreedy(#20094)
#20095=*
exprs(#20095,5,#20093,0,"/[\x]+/")
hasLocation(#20095,#20037)
enclosingStmt(#20095,#20075)
exprContainers(#20095,#20001)
literals("/[\x]+/","/[\x]+/",#20095)
#20096=*
regexpterm(#20096,23,#20094,0,"[\x]")
#20097=@"loc,{#10000},5,9,5,12"
locations_default(#20097,#10000,5,9,5,12)
regexpterm(#20096,9,#20095,0,"[\x]+")
#20097=@"loc,{#10000},5,9,5,13"
locations_default(#20097,#10000,5,9,5,13)
hasLocation(#20096,#20097)
isGreedy(#20096)
#20098=*
regexpterm(#20098,15,#20096,0,"\x")
#20099=@"loc,{#10000},5,10,5,11"
locations_default(#20099,#10000,5,10,5,11)
regexpterm(#20098,23,#20096,0,"[\x]")
#20099=@"loc,{#10000},5,9,5,12"
locations_default(#20099,#10000,5,9,5,12)
hasLocation(#20098,#20099)
regexpConstValue(#20098,"")
#20100=*
regexpParseErrors(#20100,#20094,"expected hexadecimal digit")
#20101=@"loc,{#10000},5,12,5,12"
locations_default(#20101,#10000,5,12,5,12)
regexpterm(#20100,15,#20098,0,"\x")
#20101=@"loc,{#10000},5,10,5,11"
locations_default(#20101,#10000,5,10,5,11)
hasLocation(#20100,#20101)
regexpConstValue(#20100,"")
#20102=*
regexpParseErrors(#20102,#20094,"expected hexadecimal digit")
hasLocation(#20102,#20101)
#20103=*
exprs(#20103,0,#20091,1,"exec")
hasLocation(#20103,#20041)
enclosingStmt(#20103,#20075)
exprContainers(#20103,#20001)
literals("exec","exec",#20103)
regexpParseErrors(#20102,#20096,"expected hexadecimal digit")
#20103=@"loc,{#10000},5,12,5,12"
locations_default(#20103,#10000,5,12,5,12)
hasLocation(#20102,#20103)
#20104=*
exprs(#20104,4,#20089,0,"""x""")
hasLocation(#20104,#20045)
enclosingStmt(#20104,#20075)
exprContainers(#20104,#20001)
literals("x","""x""",#20104)
regexpParseErrors(#20104,#20096,"expected hexadecimal digit")
hasLocation(#20104,#20103)
#20105=*
exprs(#20105,15,#20082,1,"r[0]")
#20106=@"loc,{#10000},5,30,5,33"
locations_default(#20106,#10000,5,30,5,33)
hasLocation(#20105,#20106)
exprs(#20105,0,#20093,1,"exec")
hasLocation(#20105,#20041)
enclosingStmt(#20105,#20075)
exprContainers(#20105,#20001)
literals("exec","exec",#20105)
#20106=*
exprs(#20106,4,#20091,0,"""x""")
hasLocation(#20106,#20045)
enclosingStmt(#20106,#20075)
exprContainers(#20106,#20001)
literals("x","""x""",#20106)
#20107=*
exprs(#20107,79,#20105,0,"r")
hasLocation(#20107,#20053)
enclosingStmt(#20107,#20075)
exprContainers(#20107,#20001)
literals("r","r",#20107)
bind(#20107,#20071)
#20108=*
exprs(#20108,3,#20105,1,"0")
hasLocation(#20108,#20057)
enclosingStmt(#20108,#20075)
exprContainers(#20108,#20001)
literals("0","0",#20108)
regexpterm(#20107,14,#20106,0,"x")
#20108=@"loc,{#10000},5,22,5,22"
locations_default(#20108,#10000,5,22,5,22)
hasLocation(#20107,#20108)
regexpConstValue(#20107,"x")
#20109=*
exprs(#20109,4,#20077,2,"""Section 1""")
hasLocation(#20109,#20063)
exprs(#20109,15,#20084,1,"r[0]")
#20110=@"loc,{#10000},5,30,5,33"
locations_default(#20110,#10000,5,30,5,33)
hasLocation(#20109,#20110)
enclosingStmt(#20109,#20075)
exprContainers(#20109,#20001)
literals("Section 1","""Section 1""",#20109)
#20110=*
entry_cfg_node(#20110,#20001)
#20111=@"loc,{#10000},1,1,1,0"
locations_default(#20111,#10000,1,1,1,0)
hasLocation(#20110,#20111)
#20111=*
exprs(#20111,79,#20109,0,"r")
hasLocation(#20111,#20053)
enclosingStmt(#20111,#20075)
exprContainers(#20111,#20001)
literals("r","r",#20111)
bind(#20111,#20071)
#20112=*
exit_cfg_node(#20112,#20001)
hasLocation(#20112,#20069)
successor(#20075,#20079)
successor(#20109,#20077)
successor(#20082,#20084)
successor(#20084,#20088)
successor(#20104,#20089)
successor(#20103,#20091)
successor(#20093,#20103)
successor(#20091,#20104)
successor(#20089,#20086)
successor(#20088,#20093)
exprs(#20112,3,#20109,1,"0")
hasLocation(#20112,#20057)
enclosingStmt(#20112,#20075)
exprContainers(#20112,#20001)
literals("0","0",#20112)
#20113=*
guard_node(#20113,1,#20086)
hasLocation(#20113,#20087)
successor(#20113,#20107)
exprs(#20113,4,#20077,2,"""Section 1""")
hasLocation(#20113,#20063)
enclosingStmt(#20113,#20075)
exprContainers(#20113,#20001)
literals("Section 1","""Section 1""",#20113)
#20114=*
guard_node(#20114,0,#20086)
hasLocation(#20114,#20087)
successor(#20114,#20109)
successor(#20086,#20113)
successor(#20086,#20114)
successor(#20108,#20105)
successor(#20107,#20108)
successor(#20105,#20109)
successor(#20081,#20082)
regexpterm(#20114,14,#20113,0,"Section 1")
#20115=@"loc,{#10000},6,4,6,12"
locations_default(#20115,#10000,6,4,6,12)
hasLocation(#20114,#20115)
regexpConstValue(#20114,"Section 1")
#20116=*
entry_cfg_node(#20116,#20001)
#20117=@"loc,{#10000},1,1,1,0"
locations_default(#20117,#10000,1,1,1,0)
hasLocation(#20116,#20117)
#20118=*
exit_cfg_node(#20118,#20001)
hasLocation(#20118,#20069)
successor(#20075,#20079)
successor(#20113,#20077)
successor(#20084,#20086)
successor(#20086,#20090)
successor(#20106,#20091)
successor(#20105,#20093)
successor(#20095,#20105)
successor(#20093,#20106)
successor(#20091,#20088)
successor(#20090,#20095)
#20119=*
guard_node(#20119,1,#20088)
hasLocation(#20119,#20089)
successor(#20119,#20111)
#20120=*
guard_node(#20120,0,#20088)
hasLocation(#20120,#20089)
successor(#20120,#20113)
successor(#20088,#20119)
successor(#20088,#20120)
successor(#20112,#20109)
successor(#20111,#20112)
successor(#20109,#20113)
successor(#20081,#20084)
successor(#20079,#20081)
successor(#20077,#20112)
successor(#20077,#20118)
successor(#20072,#20074)
successor(#20074,#20073)
successor(#20073,#20075)
successor(#20110,#20072)
successor(#20116,#20072)
numlines(#10000,7,6,0)
filetype(#10000,"javascript")

View File

@@ -99,24 +99,30 @@ enclosingStmt(#20032,#20027)
exprContainers(#20032,#20001)
literals("Hi!","""Hi!""",#20032)
#20033=*
entry_cfg_node(#20033,#20001)
#20034=@"loc,{#10000},2,1,2,0"
locations_default(#20034,#10000,2,1,2,0)
regexpterm(#20033,14,#20032,0,"Hi!")
#20034=@"loc,{#10000},2,8,2,10"
locations_default(#20034,#10000,2,8,2,10)
hasLocation(#20033,#20034)
regexpConstValue(#20033,"Hi!")
#20035=*
exit_cfg_node(#20035,#20001)
hasLocation(#20035,#20015)
entry_cfg_node(#20035,#20001)
#20036=@"loc,{#10000},2,1,2,0"
locations_default(#20036,#10000,2,1,2,0)
hasLocation(#20035,#20036)
#20037=*
exit_cfg_node(#20037,#20001)
hasLocation(#20037,#20015)
successor(#20027,#20030)
successor(#20032,#20028)
successor(#20030,#20032)
successor(#20028,#20035)
successor(#20033,#20027)
successor(#20028,#20037)
successor(#20035,#20027)
isNodejs(#20001)
#20036=*
lines(#20036,#20001,"#!/usr/bin/node","
#20038=*
lines(#20038,#20001,"#!/usr/bin/node","
")
#20037=@"loc,{#10000},1,1,1,15"
locations_default(#20037,#10000,1,1,1,15)
hasLocation(#20036,#20037)
#20039=@"loc,{#10000},1,1,1,15"
locations_default(#20039,#10000,1,1,1,15)
hasLocation(#20038,#20039)
numlines(#10000,2,1,0)
filetype(#10000,"javascript")

View File

@@ -234,121 +234,127 @@ enclosingStmt(#20085,#20083)
exprContainers(#20085,#20001)
literals("!","""!""",#20085)
#20086=*
stmts(#20086,20,#20079,1,"catch(x) { ; }")
#20087=@"loc,{#10000},3,3,3,16"
locations_default(#20087,#10000,3,3,3,16)
regexpterm(#20086,14,#20085,0,"!")
#20087=@"loc,{#10000},2,12,2,12"
locations_default(#20087,#10000,2,12,2,12)
hasLocation(#20086,#20087)
stmtContainers(#20086,#20001)
regexpConstValue(#20086,"!")
#20088=*
scopes(#20088,2)
scopenodes(#20086,#20088)
scopenesting(#20088,#20000)
#20089=@"var;{x};{#20088}"
variables(#20089,"x",#20088)
stmts(#20088,20,#20079,1,"catch(x) { ; }")
#20089=@"loc,{#10000},3,3,3,16"
locations_default(#20089,#10000,3,3,3,16)
hasLocation(#20088,#20089)
stmtContainers(#20088,#20001)
#20090=*
exprs(#20090,78,#20086,0,"x")
hasLocation(#20090,#20029)
enclosingStmt(#20090,#20086)
exprContainers(#20090,#20001)
literals("x","x",#20090)
decl(#20090,#20089)
#20091=*
stmts(#20091,1,#20086,1,"{ ; }")
#20092=@"loc,{#10000},3,12,3,16"
locations_default(#20092,#10000,3,12,3,16)
hasLocation(#20091,#20092)
stmtContainers(#20091,#20001)
scopes(#20090,2)
scopenodes(#20088,#20090)
scopenesting(#20090,#20000)
#20091=@"var;{x};{#20090}"
variables(#20091,"x",#20090)
#20092=*
exprs(#20092,78,#20088,0,"x")
hasLocation(#20092,#20029)
enclosingStmt(#20092,#20088)
exprContainers(#20092,#20001)
literals("x","x",#20092)
decl(#20092,#20091)
#20093=*
stmts(#20093,0,#20091,0,";")
hasLocation(#20093,#20035)
stmts(#20093,1,#20088,1,"{ ; }")
#20094=@"loc,{#10000},3,12,3,16"
locations_default(#20094,#10000,3,12,3,16)
hasLocation(#20093,#20094)
stmtContainers(#20093,#20001)
#20094=*
stmts(#20094,11,#20001,1,"try {} finally { ; }")
hasLocation(#20094,#20009)
stmtContainers(#20094,#20001)
#20095=*
stmts(#20095,1,#20094,0,"{}")
#20096=@"loc,{#10000},4,5,4,6"
locations_default(#20096,#10000,4,5,4,6)
hasLocation(#20095,#20096)
stmts(#20095,0,#20093,0,";")
hasLocation(#20095,#20035)
stmtContainers(#20095,#20001)
#20096=*
stmts(#20096,11,#20001,1,"try {} finally { ; }")
hasLocation(#20096,#20009)
stmtContainers(#20096,#20001)
#20097=*
stmts(#20097,1,#20094,-1,"{ ; }")
#20098=@"loc,{#10000},4,16,4,20"
locations_default(#20098,#10000,4,16,4,20)
stmts(#20097,1,#20096,0,"{}")
#20098=@"loc,{#10000},4,5,4,6"
locations_default(#20098,#10000,4,5,4,6)
hasLocation(#20097,#20098)
stmtContainers(#20097,#20001)
#20099=*
stmts(#20099,0,#20097,0,";")
hasLocation(#20099,#20049)
stmts(#20099,1,#20096,-1,"{ ; }")
#20100=@"loc,{#10000},4,16,4,20"
locations_default(#20100,#10000,4,16,4,20)
hasLocation(#20099,#20100)
stmtContainers(#20099,#20001)
#20100=*
stmts(#20100,11,#20001,2,"try {} ... ally {}")
hasLocation(#20100,#20011)
stmtContainers(#20100,#20001)
#20101=*
stmts(#20101,1,#20100,0,"{}")
#20102=@"loc,{#10000},5,5,5,6"
locations_default(#20102,#10000,5,5,5,6)
hasLocation(#20101,#20102)
stmts(#20101,0,#20099,0,";")
hasLocation(#20101,#20049)
stmtContainers(#20101,#20001)
#20102=*
stmts(#20102,11,#20001,2,"try {} ... ally {}")
hasLocation(#20102,#20011)
stmtContainers(#20102,#20001)
#20103=*
stmts(#20103,20,#20100,1,"catch(x) {}")
#20104=@"loc,{#10000},5,8,5,18"
locations_default(#20104,#10000,5,8,5,18)
stmts(#20103,1,#20102,0,"{}")
#20104=@"loc,{#10000},5,5,5,6"
locations_default(#20104,#10000,5,5,5,6)
hasLocation(#20103,#20104)
stmtContainers(#20103,#20001)
#20105=*
scopes(#20105,2)
scopenodes(#20103,#20105)
scopenesting(#20105,#20000)
#20106=@"var;{x};{#20105}"
variables(#20106,"x",#20105)
stmts(#20105,20,#20102,1,"catch(x) {}")
#20106=@"loc,{#10000},5,8,5,18"
locations_default(#20106,#10000,5,8,5,18)
hasLocation(#20105,#20106)
stmtContainers(#20105,#20001)
#20107=*
exprs(#20107,78,#20103,0,"x")
hasLocation(#20107,#20063)
enclosingStmt(#20107,#20103)
exprContainers(#20107,#20001)
literals("x","x",#20107)
decl(#20107,#20106)
#20108=*
stmts(#20108,1,#20103,1,"{}")
#20109=@"loc,{#10000},5,17,5,18"
locations_default(#20109,#10000,5,17,5,18)
hasLocation(#20108,#20109)
stmtContainers(#20108,#20001)
scopes(#20107,2)
scopenodes(#20105,#20107)
scopenesting(#20107,#20000)
#20108=@"var;{x};{#20107}"
variables(#20108,"x",#20107)
#20109=*
exprs(#20109,78,#20105,0,"x")
hasLocation(#20109,#20063)
enclosingStmt(#20109,#20105)
exprContainers(#20109,#20001)
literals("x","x",#20109)
decl(#20109,#20108)
#20110=*
stmts(#20110,1,#20100,-1,"{}")
#20111=@"loc,{#10000},5,28,5,29"
locations_default(#20111,#10000,5,28,5,29)
stmts(#20110,1,#20105,1,"{}")
#20111=@"loc,{#10000},5,17,5,18"
locations_default(#20111,#10000,5,17,5,18)
hasLocation(#20110,#20111)
stmtContainers(#20110,#20001)
#20112=*
entry_cfg_node(#20112,#20001)
#20113=@"loc,{#10000},1,1,1,0"
locations_default(#20113,#10000,1,1,1,0)
stmts(#20112,1,#20102,-1,"{}")
#20113=@"loc,{#10000},5,28,5,29"
locations_default(#20113,#10000,5,28,5,29)
hasLocation(#20112,#20113)
stmtContainers(#20112,#20001)
#20114=*
exit_cfg_node(#20114,#20001)
hasLocation(#20114,#20077)
successor(#20100,#20101)
successor(#20101,#20110)
successor(#20103,#20107)
successor(#20108,#20110)
successor(#20107,#20108)
successor(#20110,#20114)
successor(#20094,#20095)
successor(#20095,#20097)
entry_cfg_node(#20114,#20001)
#20115=@"loc,{#10000},1,1,1,0"
locations_default(#20115,#10000,1,1,1,0)
hasLocation(#20114,#20115)
#20116=*
exit_cfg_node(#20116,#20001)
hasLocation(#20116,#20077)
successor(#20102,#20103)
successor(#20103,#20112)
successor(#20105,#20109)
successor(#20110,#20112)
successor(#20109,#20110)
successor(#20112,#20116)
successor(#20096,#20097)
successor(#20097,#20099)
successor(#20099,#20100)
successor(#20099,#20101)
successor(#20101,#20102)
successor(#20079,#20081)
successor(#20081,#20085)
successor(#20085,#20083)
successor(#20083,#20086)
successor(#20086,#20090)
successor(#20091,#20093)
successor(#20093,#20094)
successor(#20090,#20091)
successor(#20112,#20079)
successor(#20083,#20088)
successor(#20088,#20092)
successor(#20093,#20095)
successor(#20095,#20096)
successor(#20092,#20093)
successor(#20114,#20079)
numlines(#10000,5,5,0)
filetype(#10000,"javascript")

View File

@@ -140,79 +140,85 @@ enclosingStmt(#20045,#20043)
exprContainers(#20045,#20037)
literals("use strict","'use strict'",#20045)
#20046=*
stmts(#20046,2,#20041,1,"arguments = 42;")
#20047=@"loc,{#10000},3,3,3,17"
locations_default(#20047,#10000,3,3,3,17)
regexpterm(#20046,14,#20045,0,"use strict")
#20047=@"loc,{#10000},2,4,2,13"
locations_default(#20047,#10000,2,4,2,13)
hasLocation(#20046,#20047)
stmtContainers(#20046,#20037)
regexpConstValue(#20046,"use strict")
#20048=*
exprs(#20048,47,#20046,0,"arguments = 42")
#20049=@"loc,{#10000},3,3,3,16"
locations_default(#20049,#10000,3,3,3,16)
stmts(#20048,2,#20041,1,"arguments = 42;")
#20049=@"loc,{#10000},3,3,3,17"
locations_default(#20049,#10000,3,3,3,17)
hasLocation(#20048,#20049)
enclosingStmt(#20048,#20046)
exprContainers(#20048,#20037)
stmtContainers(#20048,#20037)
#20050=*
exprs(#20050,79,#20048,0,"arguments")
hasLocation(#20050,#20025)
enclosingStmt(#20050,#20046)
exprs(#20050,47,#20048,0,"arguments = 42")
#20051=@"loc,{#10000},3,3,3,16"
locations_default(#20051,#10000,3,3,3,16)
hasLocation(#20050,#20051)
enclosingStmt(#20050,#20048)
exprContainers(#20050,#20037)
literals("arguments","arguments",#20050)
bind(#20050,#20040)
#20051=*
exprs(#20051,3,#20048,1,"42")
hasLocation(#20051,#20029)
enclosingStmt(#20051,#20046)
exprContainers(#20051,#20037)
literals("42","42",#20051)
#20052=*
entry_cfg_node(#20052,#20001)
#20053=@"loc,{#10000},1,1,1,0"
locations_default(#20053,#10000,1,1,1,0)
hasLocation(#20052,#20053)
exprs(#20052,79,#20050,0,"arguments")
hasLocation(#20052,#20025)
enclosingStmt(#20052,#20048)
exprContainers(#20052,#20037)
literals("arguments","arguments",#20052)
bind(#20052,#20040)
#20053=*
exprs(#20053,3,#20050,1,"42")
hasLocation(#20053,#20029)
enclosingStmt(#20053,#20048)
exprContainers(#20053,#20037)
literals("42","42",#20053)
#20054=*
exit_cfg_node(#20054,#20001)
hasLocation(#20054,#20034)
successor(#20037,#20054)
#20055=*
entry_cfg_node(#20055,#20037)
hasLocation(#20055,#20053)
entry_cfg_node(#20054,#20001)
#20055=@"loc,{#10000},1,1,1,0"
locations_default(#20055,#10000,1,1,1,0)
hasLocation(#20054,#20055)
#20056=*
exit_cfg_node(#20056,#20037)
exit_cfg_node(#20056,#20001)
hasLocation(#20056,#20034)
successor(#20041,#20043)
successor(#20046,#20050)
successor(#20051,#20048)
successor(#20050,#20051)
successor(#20048,#20056)
successor(#20043,#20045)
successor(#20045,#20046)
successor(#20055,#20041)
successor(#20038,#20037)
successor(#20052,#20038)
successor(#20037,#20056)
#20057=*
jsParseErrors(#20057,#20001,"Error: Assigning to arguments in strict mode"," arguments = 42;
")
#20058=@"loc,{#10000},3,3,3,3"
locations_default(#20058,#10000,3,3,3,3)
hasLocation(#20057,#20058)
entry_cfg_node(#20057,#20037)
hasLocation(#20057,#20055)
#20058=*
exit_cfg_node(#20058,#20037)
hasLocation(#20058,#20034)
successor(#20041,#20043)
successor(#20048,#20052)
successor(#20053,#20050)
successor(#20052,#20053)
successor(#20050,#20058)
successor(#20043,#20045)
successor(#20045,#20048)
successor(#20057,#20041)
successor(#20038,#20037)
successor(#20054,#20038)
#20059=*
lines(#20059,#20001,"function f() {","
jsParseErrors(#20059,#20001,"Error: Assigning to arguments in strict mode"," arguments = 42;
")
hasLocation(#20059,#20003)
#20060=*
lines(#20060,#20001," 'use strict';","
")
hasLocation(#20060,#20005)
indentation(#10000,2," ",2)
#20060=@"loc,{#10000},3,3,3,3"
locations_default(#20060,#10000,3,3,3,3)
hasLocation(#20059,#20060)
#20061=*
lines(#20061,#20001," arguments = 42;","
lines(#20061,#20001,"function f() {","
")
hasLocation(#20061,#20007)
indentation(#10000,3," ",2)
hasLocation(#20061,#20003)
#20062=*
lines(#20062,#20001,"}","")
hasLocation(#20062,#20009)
lines(#20062,#20001," 'use strict';","
")
hasLocation(#20062,#20005)
indentation(#10000,2," ",2)
#20063=*
lines(#20063,#20001," arguments = 42;","
")
hasLocation(#20063,#20007)
indentation(#10000,3," ",2)
#20064=*
lines(#20064,#20001,"}","")
hasLocation(#20064,#20009)
numlines(#20001,4,0,0)
numlines(#10000,4,4,0)
filetype(#10000,"javascript")

View File

@@ -54,20 +54,26 @@ enclosingStmt(#20015,#20014)
exprContainers(#20015,#20001)
literals("use strict","'use strict'",#20015)
#20016=*
stmts(#20016,0,#20001,1,";")
hasLocation(#20016,#20005)
stmtContainers(#20016,#20001)
#20017=*
entry_cfg_node(#20017,#20001)
#20018=@"loc,{#10000},1,1,1,0"
locations_default(#20018,#10000,1,1,1,0)
hasLocation(#20017,#20018)
regexpterm(#20016,14,#20015,0,"use strict")
#20017=@"loc,{#10000},1,2,1,11"
locations_default(#20017,#10000,1,2,1,11)
hasLocation(#20016,#20017)
regexpConstValue(#20016,"use strict")
#20018=*
stmts(#20018,0,#20001,1,";")
hasLocation(#20018,#20005)
stmtContainers(#20018,#20001)
#20019=*
exit_cfg_node(#20019,#20001)
hasLocation(#20019,#20012)
successor(#20016,#20019)
entry_cfg_node(#20019,#20001)
#20020=@"loc,{#10000},1,1,1,0"
locations_default(#20020,#10000,1,1,1,0)
hasLocation(#20019,#20020)
#20021=*
exit_cfg_node(#20021,#20001)
hasLocation(#20021,#20012)
successor(#20018,#20021)
successor(#20014,#20015)
successor(#20015,#20016)
successor(#20017,#20014)
successor(#20015,#20018)
successor(#20019,#20014)
numlines(#10000,2,2,0)
filetype(#10000,"javascript")

View File

@@ -242,129 +242,135 @@ enclosingStmt(#20084,#20082)
exprContainers(#20084,#20001)
literals("X","""X""",#20084)
#20085=*
scopes(#20085,15)
scopenodes(#20082,#20085)
scopenesting(#20085,#20000)
#20086=@"local_namespace_name;{M};{#20085}"
local_namespace_names(#20086,"M",#20085)
#20087=@"local_type_name;{M};{#20085}"
local_type_names(#20087,"M",#20085)
#20088=*
stmts(#20088,31,#20082,0,"module ... {}\n }")
#20089=@"loc,{#10000},2,3,4,3"
locations_default(#20089,#10000,2,3,4,3)
hasLocation(#20088,#20089)
stmtContainers(#20088,#20082)
regexpterm(#20085,14,#20084,0,"X")
#20086=@"loc,{#10000},1,17,1,17"
locations_default(#20086,#10000,1,17,1,17)
hasLocation(#20085,#20086)
regexpConstValue(#20085,"X")
#20087=*
scopes(#20087,15)
scopenodes(#20082,#20087)
scopenesting(#20087,#20000)
#20088=@"local_namespace_name;{M};{#20087}"
local_namespace_names(#20088,"M",#20087)
#20089=@"local_type_name;{M};{#20087}"
local_type_names(#20089,"M",#20087)
#20090=*
exprs(#20090,78,#20088,-1,"M")
hasLocation(#20090,#20031)
enclosingStmt(#20090,#20088)
exprContainers(#20090,#20082)
literals("M","M",#20090)
namespacedecl(#20090,#20086)
#20091=*
scopes(#20091,9)
scopenodes(#20088,#20091)
scopenesting(#20091,#20085)
#20092=@"local_type_name;{I};{#20091}"
local_type_names(#20092,"I",#20091)
stmts(#20090,31,#20082,0,"module ... {}\n }")
#20091=@"loc,{#10000},2,3,4,3"
locations_default(#20091,#10000,2,3,4,3)
hasLocation(#20090,#20091)
stmtContainers(#20090,#20082)
#20092=*
exprs(#20092,78,#20090,-1,"M")
hasLocation(#20092,#20031)
enclosingStmt(#20092,#20090)
exprContainers(#20092,#20082)
literals("M","M",#20092)
namespacedecl(#20092,#20088)
#20093=*
stmts(#20093,30,#20088,0,"export ... ce I {}")
#20094=@"loc,{#10000},3,5,3,25"
locations_default(#20094,#10000,3,5,3,25)
hasLocation(#20093,#20094)
stmtContainers(#20093,#20088)
scopes(#20093,9)
scopenodes(#20090,#20093)
scopenesting(#20093,#20087)
#20094=@"local_type_name;{I};{#20093}"
local_type_names(#20094,"I",#20093)
#20095=*
stmts(#20095,34,#20093,-1,"interface I {}")
#20096=@"loc,{#10000},3,12,3,25"
locations_default(#20096,#10000,3,12,3,25)
stmts(#20095,30,#20090,0,"export ... ce I {}")
#20096=@"loc,{#10000},3,5,3,25"
locations_default(#20096,#10000,3,5,3,25)
hasLocation(#20095,#20096)
stmtContainers(#20095,#20088)
stmtContainers(#20095,#20090)
#20097=*
typeexprs(#20097,1,#20095,0,"I")
hasLocation(#20097,#20039)
enclosingStmt(#20097,#20095)
exprContainers(#20097,#20088)
literals("I","I",#20097)
typedecl(#20097,#20092)
#20098=*
stmts(#20098,34,#20082,1,"interfa ... .I;\n }")
#20099=@"loc,{#10000},5,3,7,3"
locations_default(#20099,#10000,5,3,7,3)
hasLocation(#20098,#20099)
stmtContainers(#20098,#20082)
stmts(#20097,34,#20095,-1,"interface I {}")
#20098=@"loc,{#10000},3,12,3,25"
locations_default(#20098,#10000,3,12,3,25)
hasLocation(#20097,#20098)
stmtContainers(#20097,#20090)
#20099=*
typeexprs(#20099,1,#20097,0,"I")
hasLocation(#20099,#20039)
enclosingStmt(#20099,#20097)
exprContainers(#20099,#20090)
literals("I","I",#20099)
typedecl(#20099,#20094)
#20100=*
typeexprs(#20100,1,#20098,0,"M")
hasLocation(#20100,#20049)
enclosingStmt(#20100,#20098)
exprContainers(#20100,#20082)
literals("M","M",#20100)
typedecl(#20100,#20087)
#20101=*
properties(#20101,#20098,2,0,"method(): M.I;")
#20102=@"loc,{#10000},6,5,6,18"
locations_default(#20102,#10000,6,5,6,18)
hasLocation(#20101,#20102)
stmts(#20100,34,#20082,1,"interfa ... .I;\n }")
#20101=@"loc,{#10000},5,3,7,3"
locations_default(#20101,#10000,5,3,7,3)
hasLocation(#20100,#20101)
stmtContainers(#20100,#20082)
#20102=*
typeexprs(#20102,1,#20100,0,"M")
hasLocation(#20102,#20049)
enclosingStmt(#20102,#20100)
exprContainers(#20102,#20082)
literals("M","M",#20102)
typedecl(#20102,#20089)
#20103=*
exprs(#20103,0,#20101,0,"method")
hasLocation(#20103,#20053)
enclosingStmt(#20103,#20098)
exprContainers(#20103,#20082)
literals("method","method",#20103)
#20104=*
exprs(#20104,9,#20101,1,"method(): M.I;")
hasLocation(#20104,#20102)
enclosingStmt(#20104,#20098)
exprContainers(#20104,#20082)
properties(#20103,#20100,2,0,"method(): M.I;")
#20104=@"loc,{#10000},6,5,6,18"
locations_default(#20104,#10000,6,5,6,18)
hasLocation(#20103,#20104)
#20105=*
scopes(#20105,1)
scopenodes(#20104,#20105)
scopenesting(#20105,#20085)
#20106=@"var;{arguments};{#20105}"
variables(#20106,"arguments",#20105)
isArgumentsObject(#20106)
exprs(#20105,0,#20103,0,"method")
hasLocation(#20105,#20053)
enclosingStmt(#20105,#20100)
exprContainers(#20105,#20082)
literals("method","method",#20105)
#20106=*
exprs(#20106,9,#20103,1,"method(): M.I;")
hasLocation(#20106,#20104)
enclosingStmt(#20106,#20100)
exprContainers(#20106,#20082)
#20107=*
typeexprs(#20107,13,#20104,-3,"M.I")
#20108=@"loc,{#10000},6,15,6,17"
locations_default(#20108,#10000,6,15,6,17)
hasLocation(#20107,#20108)
exprContainers(#20107,#20104)
scopes(#20107,1)
scopenodes(#20106,#20107)
scopenesting(#20107,#20087)
#20108=@"var;{arguments};{#20107}"
variables(#20108,"arguments",#20107)
isArgumentsObject(#20108)
#20109=*
typeexprs(#20109,25,#20107,0,"M")
hasLocation(#20109,#20061)
exprContainers(#20109,#20104)
literals("M","M",#20109)
namespacebind(#20109,#20086)
#20110=*
typeexprs(#20110,15,#20107,1,"I")
hasLocation(#20110,#20065)
exprContainers(#20110,#20104)
literals("I","I",#20110)
isMethod(#20101)
isAbstractMember(#20101)
typeexprs(#20109,13,#20106,-3,"M.I")
#20110=@"loc,{#10000},6,15,6,17"
locations_default(#20110,#10000,6,15,6,17)
hasLocation(#20109,#20110)
exprContainers(#20109,#20106)
#20111=*
stmts(#20111,33,#20082,2,"export = M;")
#20112=@"loc,{#10000},8,3,8,13"
locations_default(#20112,#10000,8,3,8,13)
hasLocation(#20111,#20112)
stmtContainers(#20111,#20082)
typeexprs(#20111,25,#20109,0,"M")
hasLocation(#20111,#20061)
exprContainers(#20111,#20106)
literals("M","M",#20111)
namespacebind(#20111,#20088)
#20112=*
typeexprs(#20112,15,#20109,1,"I")
hasLocation(#20112,#20065)
exprContainers(#20112,#20106)
literals("I","I",#20112)
isMethod(#20103)
isAbstractMember(#20103)
#20113=*
exprs(#20113,103,#20111,0,"M")
hasLocation(#20113,#20075)
enclosingStmt(#20113,#20111)
exprContainers(#20113,#20082)
literals("M","M",#20113)
typebind(#20113,#20087)
namespacebind(#20113,#20086)
#20114=*
entry_cfg_node(#20114,#20001)
#20115=@"loc,{#10000},1,1,1,0"
locations_default(#20115,#10000,1,1,1,0)
hasLocation(#20114,#20115)
stmts(#20113,33,#20082,2,"export = M;")
#20114=@"loc,{#10000},8,3,8,13"
locations_default(#20114,#10000,8,3,8,13)
hasLocation(#20113,#20114)
stmtContainers(#20113,#20082)
#20115=*
exprs(#20115,103,#20113,0,"M")
hasLocation(#20115,#20075)
enclosingStmt(#20115,#20113)
exprContainers(#20115,#20082)
literals("M","M",#20115)
typebind(#20115,#20089)
namespacebind(#20115,#20088)
#20116=*
exit_cfg_node(#20116,#20001)
hasLocation(#20116,#20080)
successor(#20082,#20116)
successor(#20114,#20082)
entry_cfg_node(#20116,#20001)
#20117=@"loc,{#10000},1,1,1,0"
locations_default(#20117,#10000,1,1,1,0)
hasLocation(#20116,#20117)
#20118=*
exit_cfg_node(#20118,#20001)
hasLocation(#20118,#20080)
successor(#20082,#20118)
successor(#20116,#20082)
numlines(#10000,9,9,0)
filetype(#10000,"typescript")

View File

@@ -235,91 +235,109 @@ enclosingStmt(#20079,#20073)
exprContainers(#20079,#20063)
literals("Hello, ","""Hello, """,#20079)
#20080=*
exprs(#20080,79,#20077,1,"person")
hasLocation(#20080,#20035)
enclosingStmt(#20080,#20073)
exprContainers(#20080,#20063)
literals("person","person",#20080)
bind(#20080,#20067)
#20081=*
exprs(#20081,4,#20075,1,"""!""")
hasLocation(#20081,#20039)
enclosingStmt(#20081,#20073)
exprContainers(#20081,#20063)
literals("!","""!""",#20081)
regexpterm(#20080,14,#20079,0,"Hello, ")
#20081=@"loc,{#10000},2,13,2,19"
locations_default(#20081,#10000,2,13,2,19)
hasLocation(#20080,#20081)
regexpConstValue(#20080,"Hello, ")
#20082=*
stmts(#20082,2,#20001,1,"alert(g ... rld""));")
hasLocation(#20082,#20011)
stmtContainers(#20082,#20001)
exprs(#20082,79,#20077,1,"person")
hasLocation(#20082,#20035)
enclosingStmt(#20082,#20073)
exprContainers(#20082,#20063)
literals("person","person",#20082)
bind(#20082,#20067)
#20083=*
exprs(#20083,13,#20082,0,"alert(g ... orld""))")
#20084=@"loc,{#10000},5,1,5,23"
locations_default(#20084,#10000,5,1,5,23)
hasLocation(#20083,#20084)
enclosingStmt(#20083,#20082)
exprContainers(#20083,#20001)
#20085=*
exprs(#20085,79,#20083,-1,"alert")
hasLocation(#20085,#20044)
enclosingStmt(#20085,#20082)
exprContainers(#20085,#20001)
literals("alert","alert",#20085)
#20086=@"var;{alert};{#20000}"
variables(#20086,"alert",#20000)
bind(#20085,#20086)
exprs(#20083,4,#20075,1,"""!""")
hasLocation(#20083,#20039)
enclosingStmt(#20083,#20073)
exprContainers(#20083,#20063)
literals("!","""!""",#20083)
#20084=*
regexpterm(#20084,14,#20083,0,"!")
#20085=@"loc,{#10000},2,34,2,34"
locations_default(#20085,#10000,2,34,2,34)
hasLocation(#20084,#20085)
regexpConstValue(#20084,"!")
#20086=*
stmts(#20086,2,#20001,1,"alert(g ... rld""));")
hasLocation(#20086,#20011)
stmtContainers(#20086,#20001)
#20087=*
exprs(#20087,13,#20083,0,"greeter(""world"")")
#20088=@"loc,{#10000},5,7,5,22"
locations_default(#20088,#10000,5,7,5,22)
exprs(#20087,13,#20086,0,"alert(g ... orld""))")
#20088=@"loc,{#10000},5,1,5,23"
locations_default(#20088,#10000,5,1,5,23)
hasLocation(#20087,#20088)
enclosingStmt(#20087,#20082)
enclosingStmt(#20087,#20086)
exprContainers(#20087,#20001)
#20089=*
exprs(#20089,79,#20087,-1,"greeter")
hasLocation(#20089,#20048)
enclosingStmt(#20089,#20082)
exprs(#20089,79,#20087,-1,"alert")
hasLocation(#20089,#20044)
enclosingStmt(#20089,#20086)
exprContainers(#20089,#20001)
literals("greeter","greeter",#20089)
bind(#20089,#20062)
#20090=*
exprs(#20090,4,#20087,0,"""world""")
hasLocation(#20090,#20052)
enclosingStmt(#20090,#20082)
exprContainers(#20090,#20001)
literals("world","""world""",#20090)
literals("alert","alert",#20089)
#20090=@"var;{alert};{#20000}"
variables(#20090,"alert",#20000)
bind(#20089,#20090)
#20091=*
entry_cfg_node(#20091,#20001)
#20092=@"loc,{#10000},1,1,1,0"
locations_default(#20092,#10000,1,1,1,0)
exprs(#20091,13,#20087,0,"greeter(""world"")")
#20092=@"loc,{#10000},5,7,5,22"
locations_default(#20092,#10000,5,7,5,22)
hasLocation(#20091,#20092)
enclosingStmt(#20091,#20086)
exprContainers(#20091,#20001)
#20093=*
exit_cfg_node(#20093,#20001)
hasLocation(#20093,#20060)
successor(#20082,#20085)
successor(#20090,#20087)
successor(#20089,#20090)
successor(#20087,#20083)
successor(#20085,#20089)
successor(#20083,#20093)
successor(#20063,#20082)
exprs(#20093,79,#20091,-1,"greeter")
hasLocation(#20093,#20048)
enclosingStmt(#20093,#20086)
exprContainers(#20093,#20001)
literals("greeter","greeter",#20093)
bind(#20093,#20062)
#20094=*
entry_cfg_node(#20094,#20063)
hasLocation(#20094,#20092)
exprs(#20094,4,#20091,0,"""world""")
hasLocation(#20094,#20052)
enclosingStmt(#20094,#20086)
exprContainers(#20094,#20001)
literals("world","""world""",#20094)
#20095=*
exit_cfg_node(#20095,#20063)
#20096=@"loc,{#10000},3,2,3,1"
locations_default(#20096,#10000,3,2,3,1)
regexpterm(#20095,14,#20094,0,"world")
#20096=@"loc,{#10000},5,16,5,20"
locations_default(#20096,#10000,5,16,5,20)
hasLocation(#20095,#20096)
regexpConstValue(#20095,"world")
#20097=*
entry_cfg_node(#20097,#20001)
#20098=@"loc,{#10000},1,1,1,0"
locations_default(#20098,#10000,1,1,1,0)
hasLocation(#20097,#20098)
#20099=*
exit_cfg_node(#20099,#20001)
hasLocation(#20099,#20060)
successor(#20086,#20089)
successor(#20094,#20091)
successor(#20093,#20094)
successor(#20091,#20087)
successor(#20089,#20093)
successor(#20087,#20099)
successor(#20063,#20086)
#20100=*
entry_cfg_node(#20100,#20063)
hasLocation(#20100,#20098)
#20101=*
exit_cfg_node(#20101,#20063)
#20102=@"loc,{#10000},3,2,3,1"
locations_default(#20102,#10000,3,2,3,1)
hasLocation(#20101,#20102)
successor(#20071,#20079)
successor(#20081,#20075)
successor(#20080,#20077)
successor(#20079,#20080)
successor(#20077,#20081)
successor(#20083,#20075)
successor(#20082,#20077)
successor(#20079,#20082)
successor(#20077,#20083)
successor(#20075,#20073)
successor(#20073,#20095)
successor(#20073,#20101)
successor(#20068,#20071)
successor(#20094,#20068)
successor(#20100,#20068)
successor(#20065,#20063)
successor(#20091,#20065)
successor(#20097,#20065)
numlines(#10000,5,4,0)
filetype(#10000,"typescript")

View File

@@ -147,77 +147,83 @@ enclosingStmt(#20049,#20048)
exprContainers(#20049,#20001)
literals("somewhere","'somewhere'",#20049)
#20050=*
exprs(#20050,85,#20048,0,"* as Something")
#20051=@"loc,{#10000},1,8,1,21"
locations_default(#20051,#10000,1,8,1,21)
regexpterm(#20050,14,#20049,0,"somewhere")
#20051=@"loc,{#10000},1,29,1,37"
locations_default(#20051,#10000,1,29,1,37)
hasLocation(#20050,#20051)
enclosingStmt(#20050,#20048)
exprContainers(#20050,#20001)
regexpConstValue(#20050,"somewhere")
#20052=*
exprs(#20052,78,#20050,1,"Something")
hasLocation(#20052,#20015)
exprs(#20052,85,#20048,0,"* as Something")
#20053=@"loc,{#10000},1,8,1,21"
locations_default(#20053,#10000,1,8,1,21)
hasLocation(#20052,#20053)
enclosingStmt(#20052,#20048)
exprContainers(#20052,#20001)
literals("Something","Something",#20052)
decl(#20052,#20042)
typedecl(#20052,#20044)
namespacedecl(#20052,#20046)
#20053=*
stmts(#20053,30,#20001,1,"export ... thingy;")
hasLocation(#20053,#20007)
stmtContainers(#20053,#20001)
#20054=*
stmts(#20054,32,#20053,-1,"import ... thingy;")
#20055=@"loc,{#10000},3,8,3,46"
locations_default(#20055,#10000,3,8,3,46)
hasLocation(#20054,#20055)
stmtContainers(#20054,#20001)
exprs(#20054,78,#20052,1,"Something")
hasLocation(#20054,#20015)
enclosingStmt(#20054,#20048)
exprContainers(#20054,#20001)
literals("Something","Something",#20054)
decl(#20054,#20042)
typedecl(#20054,#20044)
namespacedecl(#20054,#20046)
#20055=*
stmts(#20055,30,#20001,1,"export ... thingy;")
hasLocation(#20055,#20007)
stmtContainers(#20055,#20001)
#20056=*
exprs(#20056,78,#20054,0,"importExport")
hasLocation(#20056,#20027)
enclosingStmt(#20056,#20054)
exprContainers(#20056,#20001)
literals("importExport","importExport",#20056)
decl(#20056,#20043)
typedecl(#20056,#20045)
namespacedecl(#20056,#20047)
#20057=*
exprs(#20057,14,#20054,1,"Something.thingy")
#20058=@"loc,{#10000},3,30,3,45"
locations_default(#20058,#10000,3,30,3,45)
hasLocation(#20057,#20058)
enclosingStmt(#20057,#20054)
exprContainers(#20057,#20001)
stmts(#20056,32,#20055,-1,"import ... thingy;")
#20057=@"loc,{#10000},3,8,3,46"
locations_default(#20057,#10000,3,8,3,46)
hasLocation(#20056,#20057)
stmtContainers(#20056,#20001)
#20058=*
exprs(#20058,78,#20056,0,"importExport")
hasLocation(#20058,#20027)
enclosingStmt(#20058,#20056)
exprContainers(#20058,#20001)
literals("importExport","importExport",#20058)
decl(#20058,#20043)
typedecl(#20058,#20045)
namespacedecl(#20058,#20047)
#20059=*
exprs(#20059,103,#20057,0,"Something")
hasLocation(#20059,#20031)
enclosingStmt(#20059,#20054)
exprs(#20059,14,#20056,1,"Something.thingy")
#20060=@"loc,{#10000},3,30,3,45"
locations_default(#20060,#10000,3,30,3,45)
hasLocation(#20059,#20060)
enclosingStmt(#20059,#20056)
exprContainers(#20059,#20001)
literals("Something","Something",#20059)
namespacebind(#20059,#20046)
bind(#20059,#20042)
#20060=*
exprs(#20060,0,#20057,1,"thingy")
hasLocation(#20060,#20035)
enclosingStmt(#20060,#20054)
exprContainers(#20060,#20001)
literals("thingy","thingy",#20060)
#20061=*
entry_cfg_node(#20061,#20001)
#20062=@"loc,{#10000},1,1,1,0"
locations_default(#20062,#10000,1,1,1,0)
hasLocation(#20061,#20062)
exprs(#20061,103,#20059,0,"Something")
hasLocation(#20061,#20031)
enclosingStmt(#20061,#20056)
exprContainers(#20061,#20001)
literals("Something","Something",#20061)
namespacebind(#20061,#20046)
bind(#20061,#20042)
#20062=*
exprs(#20062,0,#20059,1,"thingy")
hasLocation(#20062,#20035)
enclosingStmt(#20062,#20056)
exprContainers(#20062,#20001)
literals("thingy","thingy",#20062)
#20063=*
exit_cfg_node(#20063,#20001)
hasLocation(#20063,#20039)
successor(#20053,#20056)
successor(#20060,#20057)
successor(#20059,#20060)
successor(#20057,#20054)
successor(#20056,#20059)
successor(#20054,#20063)
successor(#20048,#20053)
successor(#20050,#20048)
successor(#20061,#20050)
entry_cfg_node(#20063,#20001)
#20064=@"loc,{#10000},1,1,1,0"
locations_default(#20064,#10000,1,1,1,0)
hasLocation(#20063,#20064)
#20065=*
exit_cfg_node(#20065,#20001)
hasLocation(#20065,#20039)
successor(#20055,#20058)
successor(#20062,#20059)
successor(#20061,#20062)
successor(#20059,#20056)
successor(#20058,#20061)
successor(#20056,#20065)
successor(#20048,#20055)
successor(#20052,#20048)
successor(#20063,#20052)
numlines(#10000,3,2,0)
filetype(#10000,"typescript")

View File

@@ -107,17 +107,33 @@ enclosingStmt(#20031,#20027)
exprContainers(#20031,#20001)
literals("./exportassign","""./exportassign""",#20031)
#20032=*
entry_cfg_node(#20032,#20001)
#20033=@"loc,{#10000},1,1,1,0"
locations_default(#20033,#10000,1,1,1,0)
regexpterm(#20032,1,#20031,0,"./exportassign")
#20033=@"loc,{#10000},1,21,1,34"
locations_default(#20033,#10000,1,21,1,34)
hasLocation(#20032,#20033)
#20034=*
exit_cfg_node(#20034,#20001)
hasLocation(#20034,#20021)
regexpterm(#20034,12,#20032,0,".")
#20035=@"loc,{#10000},1,21,1,21"
locations_default(#20035,#10000,1,21,1,21)
hasLocation(#20034,#20035)
#20036=*
regexpterm(#20036,14,#20032,1,"/exportassign")
#20037=@"loc,{#10000},1,22,1,34"
locations_default(#20037,#10000,1,22,1,34)
hasLocation(#20036,#20037)
regexpConstValue(#20036,"/exportassign")
#20038=*
entry_cfg_node(#20038,#20001)
#20039=@"loc,{#10000},1,1,1,0"
locations_default(#20039,#10000,1,1,1,0)
hasLocation(#20038,#20039)
#20040=*
exit_cfg_node(#20040,#20001)
hasLocation(#20040,#20021)
successor(#20031,#20029)
successor(#20029,#20027)
successor(#20028,#20031)
successor(#20027,#20034)
successor(#20032,#20028)
successor(#20027,#20040)
successor(#20038,#20028)
numlines(#10000,1,1,0)
filetype(#10000,"typescript")

View File

@@ -272,100 +272,124 @@ exprContainers(#20091,#20001)
literals("
","",#20091)
#20093=*
exprs(#20093,89,#20079,-3,"<this.props.icon/>")
#20094=@"loc,{#10000},2,3,2,20"
locations_default(#20094,#10000,2,3,2,20)
regexpterm(#20093,14,#20091,0,"
")
#20094=@"loc,{#10000},2,4,2,6"
locations_default(#20094,#10000,2,4,2,6)
hasLocation(#20093,#20094)
enclosingStmt(#20093,#20077)
exprContainers(#20093,#20001)
regexpConstValue(#20093,"
")
#20095=*
exprs(#20095,14,#20093,-1,"this.props.icon")
#20096=@"loc,{#10000},2,4,2,18"
locations_default(#20096,#10000,2,4,2,18)
exprs(#20095,89,#20079,-3,"<this.props.icon/>")
#20096=@"loc,{#10000},2,3,2,20"
locations_default(#20096,#10000,2,3,2,20)
hasLocation(#20095,#20096)
enclosingStmt(#20095,#20077)
exprContainers(#20095,#20001)
#20097=*
exprs(#20097,14,#20095,0,"this.props")
#20098=@"loc,{#10000},2,4,2,13"
locations_default(#20098,#10000,2,4,2,13)
exprs(#20097,14,#20095,-1,"this.props.icon")
#20098=@"loc,{#10000},2,4,2,18"
locations_default(#20098,#10000,2,4,2,18)
hasLocation(#20097,#20098)
enclosingStmt(#20097,#20077)
exprContainers(#20097,#20001)
#20099=*
exprs(#20099,79,#20097,0,"this")
hasLocation(#20099,#20039)
exprs(#20099,14,#20097,0,"this.props")
#20100=@"loc,{#10000},2,4,2,13"
locations_default(#20100,#10000,2,4,2,13)
hasLocation(#20099,#20100)
enclosingStmt(#20099,#20077)
exprContainers(#20099,#20001)
literals("this","this",#20099)
#20100=@"var;{this};{#20000}"
variables(#20100,"this",#20000)
bind(#20099,#20100)
#20101=*
exprs(#20101,0,#20097,1,"props")
hasLocation(#20101,#20043)
exprs(#20101,79,#20099,0,"this")
hasLocation(#20101,#20039)
enclosingStmt(#20101,#20077)
exprContainers(#20101,#20001)
literals("props","props",#20101)
#20102=*
exprs(#20102,0,#20095,1,"icon")
hasLocation(#20102,#20047)
enclosingStmt(#20102,#20077)
exprContainers(#20102,#20001)
literals("icon","icon",#20102)
literals("this","this",#20101)
#20102=@"var;{this};{#20000}"
variables(#20102,"this",#20000)
bind(#20101,#20102)
#20103=*
exprs(#20103,4,#20079,-4,"")
#20104=@"loc,{#10000},3,3,3,2"
locations_default(#20104,#10000,3,3,3,2)
hasLocation(#20103,#20104)
exprs(#20103,0,#20099,1,"props")
hasLocation(#20103,#20043)
enclosingStmt(#20103,#20077)
exprContainers(#20103,#20001)
literals("
","",#20103)
literals("props","props",#20103)
#20104=*
exprs(#20104,0,#20097,1,"icon")
hasLocation(#20104,#20047)
enclosingStmt(#20104,#20077)
exprContainers(#20104,#20001)
literals("icon","icon",#20104)
#20105=*
exprs(#20105,89,#20079,-5,"<name-with-dashes/>")
#20106=@"loc,{#10000},3,3,3,21"
locations_default(#20106,#10000,3,3,3,21)
exprs(#20105,4,#20079,-4,"")
#20106=@"loc,{#10000},3,3,3,2"
locations_default(#20106,#10000,3,3,3,2)
hasLocation(#20105,#20106)
enclosingStmt(#20105,#20077)
exprContainers(#20105,#20001)
literals("
","",#20105)
#20107=*
exprs(#20107,0,#20105,-1,"name-with-dashes")
#20108=@"loc,{#10000},3,4,3,19"
locations_default(#20108,#10000,3,4,3,19)
regexpterm(#20107,14,#20105,0,"
")
#20108=@"loc,{#10000},3,4,3,6"
locations_default(#20108,#10000,3,4,3,6)
hasLocation(#20107,#20108)
enclosingStmt(#20107,#20077)
exprContainers(#20107,#20001)
literals("name-with-dashes","name-with-dashes",#20107)
regexpConstValue(#20107,"
")
#20109=*
exprs(#20109,4,#20079,-6,"")
#20110=@"loc,{#10000},4,1,4,0"
locations_default(#20110,#10000,4,1,4,0)
exprs(#20109,89,#20079,-5,"<name-with-dashes/>")
#20110=@"loc,{#10000},3,3,3,21"
locations_default(#20110,#10000,3,3,3,21)
hasLocation(#20109,#20110)
enclosingStmt(#20109,#20077)
exprContainers(#20109,#20001)
literals("
","",#20109)
#20111=*
entry_cfg_node(#20111,#20001)
#20112=@"loc,{#10000},1,1,1,0"
locations_default(#20112,#10000,1,1,1,0)
exprs(#20111,0,#20109,-1,"name-with-dashes")
#20112=@"loc,{#10000},3,4,3,19"
locations_default(#20112,#10000,3,4,3,19)
hasLocation(#20111,#20112)
enclosingStmt(#20111,#20077)
exprContainers(#20111,#20001)
literals("name-with-dashes","name-with-dashes",#20111)
#20113=*
exit_cfg_node(#20113,#20001)
hasLocation(#20113,#20075)
exprs(#20113,4,#20079,-6,"")
#20114=@"loc,{#10000},4,1,4,0"
locations_default(#20114,#10000,4,1,4,0)
hasLocation(#20113,#20114)
enclosingStmt(#20113,#20077)
exprContainers(#20113,#20001)
literals("
","",#20113)
#20115=*
regexpterm(#20115,14,#20113,0,"
")
#20116=@"loc,{#10000},4,2,4,2"
locations_default(#20116,#10000,4,2,4,2)
hasLocation(#20115,#20116)
regexpConstValue(#20115,"
")
#20117=*
entry_cfg_node(#20117,#20001)
#20118=@"loc,{#10000},1,1,1,0"
locations_default(#20118,#10000,1,1,1,0)
hasLocation(#20117,#20118)
#20119=*
exit_cfg_node(#20119,#20001)
hasLocation(#20119,#20075)
successor(#20077,#20080)
successor(#20109,#20079)
successor(#20107,#20105)
successor(#20105,#20109)
successor(#20103,#20107)
successor(#20102,#20095)
successor(#20101,#20097)
successor(#20099,#20101)
successor(#20097,#20102)
successor(#20095,#20093)
successor(#20093,#20103)
successor(#20091,#20099)
successor(#20113,#20079)
successor(#20111,#20109)
successor(#20109,#20113)
successor(#20105,#20111)
successor(#20104,#20097)
successor(#20103,#20099)
successor(#20101,#20103)
successor(#20099,#20104)
successor(#20097,#20095)
successor(#20095,#20105)
successor(#20091,#20101)
successor(#20089,#20086)
successor(#20088,#20089)
successor(#20086,#20091)
@@ -373,7 +397,7 @@ successor(#20084,#20081)
successor(#20083,#20084)
successor(#20081,#20088)
successor(#20080,#20083)
successor(#20079,#20113)
successor(#20111,#20077)
successor(#20079,#20119)
successor(#20117,#20077)
numlines(#10000,4,4,0)
filetype(#10000,"typescript")

View File

@@ -57,8 +57,8 @@ import javascript
* More precisely, the query constructs an NFA from a regular expression `r`
* as follows:
*
* * Every sub-term `t` gives rise to an NFA state `Match(t)`, representing
* the state of the automaton before attempting to match `t`.
* * Every sub-term `t` gives rise to an NFA state `Match(t,i)`, representing
* the state of the automaton before attempting to match the `i`th character in `t`.
* * There is one additional accepting state `Accept(r)`.
* * Transitions between states may be labelled with epsilon, or an abstract
* input symbol.
@@ -83,17 +83,19 @@ import javascript
* A branch in a disjunction that is the root node in a literal, or a literal
* whose root node is not a disjunction.
*/
class RegExpRoot extends @regexpterm {
// RegExpTerm is abstract, so do not extend it.
class RegExpRoot extends RegExpTerm {
RegExpParent parent;
RegExpRoot() {
exists(RegExpLiteral literal, RegExpAlt alt | alt.getParent() = literal |
this = alt.getAChild()
exists(RegExpAlt alt |
alt.isRootTerm() and
this = alt.getAChild() and
parent = alt.getParent()
)
or
exists(RegExpLiteral literal |
not exists(RegExpAlt alt | alt.getParent() = literal) and
this.(RegExpTerm).getParent() = literal
)
this.isRootTerm() and
not this instanceof RegExpAlt and
parent = this.getParent()
}
/**
@@ -103,10 +105,10 @@ class RegExpRoot extends @regexpterm {
// there is at least one repetition
exists(RegExpRepetition rep | getRoot(rep) = this) and
// there are no lookbehinds
not exists(RegExpLookbehind lbh | getRoot(lbh) = this)
not exists(RegExpLookbehind lbh | getRoot(lbh) = this) and
// is actually used as a RegExp
isUsedAsRegExp()
}
string toString() { result = this.(RegExpTerm).toString() }
}
/**
@@ -134,7 +136,7 @@ RegExpRoot getRoot(RegExpTerm term) {
*/
newtype TInputSymbol =
/** An input symbol corresponding to character `c`. */
Char(string c) { c = any(RegExpConstant cc).getValue() } or
Char(string c) { c = any(RegExpConstant cc).getValue().charAt(_) } or
/**
* An input symbol representing all characters matched by
* (positive, non-universal) character class `recc`.
@@ -262,25 +264,34 @@ predicate compatible(InputSymbol s1, InputSymbol s2) {
}
newtype TState =
Match(RegExpTerm t) { getRoot(t).isRelevant() } or
Match(RegExpTerm t, int i) {
getRoot(t).isRelevant() and
(
i = 0
or
exists(t.(RegExpConstant).getValue().charAt(i))
)
} or
Accept(RegExpRoot l) { l.isRelevant() }
/**
* A state in the NFA corresponding to a regular expression.
*
* Each regular expression literal `l` has one accepting state
* `Accept(l)` and one state `Match(t)` for every subterm `t`,
* `Accept(l)` and a state `Match(t, i)` for every subterm `t`,
* which represents the state of the NFA before starting to
* match `t`.
* match `t`, or the `i`th character in `t` if `t` is a constant.
*/
class State extends TState {
RegExpParent repr;
State() { this = Match(repr) or this = Accept(repr) }
State() { this = Match(repr, _) or this = Accept(repr) }
string toString() {
result = "Match(" + repr.(RegExpTerm) + ")" or
result = "Accept(" + repr.(RegExpRoot) + ")"
exists(int i | this = Match(repr, i) | result = "Match(" + repr + "," + i + ")")
or
this instanceof Accept and
result = "Accept(" + repr + ")"
}
Location getLocation() { result = repr.getLocation() }
@@ -294,6 +305,14 @@ class EdgeLabel extends TInputSymbol {
}
}
/**
* Gets the state before matching `t`.
*/
pragma[inline]
State before(RegExpTerm t) {
result = Match(t, 0)
}
/**
* Gets a state the NFA may be in after matching `t`.
*/
@@ -301,17 +320,17 @@ State after(RegExpTerm t) {
exists(RegExpAlt alt | t = alt.getAChild() | result = after(alt))
or
exists(RegExpSequence seq, int i | t = seq.getChild(i) |
result = Match(seq.getChild(i + 1))
result = before(seq.getChild(i + 1))
or
i + 1 = seq.getNumChild() and result = after(seq)
)
or
exists(RegExpGroup grp | t = grp.getAChild() | result = after(grp))
or
exists(RegExpStar star | t = star.getAChild() | result = Match(star))
exists(RegExpStar star | t = star.getAChild() | result = before(star))
or
exists(RegExpPlus plus | t = plus.getAChild() |
result = Match(plus) or
result = before(plus) or
result = after(plus)
)
or
@@ -324,38 +343,47 @@ State after(RegExpTerm t) {
* Holds if the NFA has a transition from `q1` to `q2` labelled with `lbl`.
*/
predicate delta(State q1, EdgeLabel lbl, State q2) {
exists(RegExpConstant s | q1 = Match(s) and lbl = Char(s.getValue()) and q2 = after(s))
exists(RegExpConstant s, int i |
q1 = Match(s, i) and
lbl = Char(s.getValue().charAt(i)) and
(
q2 = Match(s, i + 1)
or
s.getValue().length() = i + 1 and
q2 = after(s)
)
)
or
exists(RegExpDot dot, RegExpLiteral rel |
q1 = Match(dot) and q2 = after(dot) and rel = dot.getLiteral()
exists(RegExpDot dot |
q1 = before(dot) and q2 = after(dot)
|
if rel.isDotAll() then lbl = Any() else lbl = Dot()
if dot.getLiteral().isDotAll() then lbl = Any() else lbl = Dot()
)
or
exists(RegExpCharacterClass cc |
isUniversalClass(cc) and q1 = Match(cc) and lbl = Any() and q2 = after(cc)
isUniversalClass(cc) and q1 = before(cc) and lbl = Any() and q2 = after(cc)
or
q1 = Match(cc) and lbl = CharClass(cc) and q2 = after(cc)
q1 = before(cc) and lbl = CharClass(cc) and q2 = after(cc)
)
or
exists(RegExpAlt alt | lbl = Epsilon() | q1 = Match(alt) and q2 = Match(alt.getAChild()))
exists(RegExpAlt alt | lbl = Epsilon() | q1 = before(alt) and q2 = before(alt.getAChild()))
or
exists(RegExpSequence seq | lbl = Epsilon() | q1 = Match(seq) and q2 = Match(seq.getChild(0)))
exists(RegExpSequence seq | lbl = Epsilon() | q1 = before(seq) and q2 = before(seq.getChild(0)))
or
exists(RegExpGroup grp | lbl = Epsilon() | q1 = Match(grp) and q2 = Match(grp.getChild(0)))
exists(RegExpGroup grp | lbl = Epsilon() | q1 = before(grp) and q2 = before(grp.getChild(0)))
or
exists(RegExpStar star | lbl = Epsilon() |
q1 = Match(star) and q2 = Match(star.getChild(0))
q1 = before(star) and q2 = before(star.getChild(0))
or
q1 = Match(star) and q2 = after(star)
q1 = before(star) and q2 = after(star)
)
or
exists(RegExpPlus plus | lbl = Epsilon() | q1 = Match(plus) and q2 = Match(plus.getChild(0)))
exists(RegExpPlus plus | lbl = Epsilon() | q1 = before(plus) and q2 = before(plus.getChild(0)))
or
exists(RegExpOpt opt | lbl = Epsilon() |
q1 = Match(opt) and q2 = Match(opt.getChild(0))
q1 = before(opt) and q2 = before(opt.getChild(0))
or
q1 = Match(opt) and q2 = after(opt)
q1 = before(opt) and q2 = after(opt)
)
}
@@ -632,11 +660,22 @@ string escape(string s) {
result = s.replaceAll("\\", "\\\\").replaceAll("\n", "\\n").replaceAll("\r", "\\r")
}
from RegExpTerm t, string c
/**
* Gets `str` with the last `i` characters moved to the front.
*
* We use this to adjust the witness string to match with the beginning of
* a RegExpTerm, so it doesn't start in the middle of a constant.
*/
bindingset[str, i]
string rotate(string str, int i) {
result = str.suffix(str.length() - i) + str.prefix(str.length() - i)
}
from RegExpTerm t, string c, int i
where
c = min(string w | isPumpable(Match(t), w)) and
not isPumpable(epsilonSucc+(Match(t)), _) and
not epsilonSucc*(process(Match(t), c, c.length() - 1)) = Accept(_)
c = min(string w | isPumpable(Match(t, i), w)) and
not isPumpable(epsilonSucc+(Match(t, i)), _) and
not epsilonSucc*(process(Match(t, i), c, c.length() - 1)) = Accept(_)
select t,
"This part of the regular expression may cause exponential backtracking on strings " +
"containing many repetitions of '" + escape(c) + "'."
"containing many repetitions of '" + escape(rotate(c, i)) + "'."

View File

@@ -16,5 +16,6 @@ import javascript
from RegExpBackRef rebr
where
rebr.getLocation().getStartColumn() < rebr.getGroup().getLocation().getEndColumn() and
not rebr.isInBackwardMatchingContext()
not rebr.isInBackwardMatchingContext() and
rebr.isPartOfRegExpLiteral()
select rebr, "This back reference precedes its capture group."

View File

@@ -17,7 +17,8 @@ from RegExpNegativeLookahead neg, RegExpGroup grp, RegExpBackRef back
where
grp.getParent+() = neg and
grp = back.getGroup() and
not back.getParent+() = neg
not back.getParent+() = neg and
neg.isPartOfRegExpLiteral()
select back,
"This back reference always matches the empty string, since it refers to $@, which is contained in $@.",
grp, "this capture group", neg, "a negative lookahead assertion"

View File

@@ -15,4 +15,5 @@ import javascript
from RegExpCharEscape rece
where rece.toString() = "\\b"
and rece.isPartOfRegExpLiteral()
select rece, "Backspace escape in regular expression."

View File

@@ -29,6 +29,7 @@ from RegExpCharacterClass recc, RegExpConstant first, RegExpConstant repeat, int
where
constantInCharacterClass(recc, 1, first, val) and
constantInCharacterClass(recc, rnk, repeat, val) and
rnk > 1
rnk > 1 and
recc.isPartOfRegExpLiteral()
select first, "Character '" + first + "' is repeated $@ in the same character class.", repeat,
"here"

View File

@@ -15,5 +15,6 @@ import javascript
from RegExpCharacterClass recc
where
not exists(recc.getAChild()) and
not recc.isInverted()
not recc.isInverted() and
recc.isPartOfRegExpLiteral()
select recc, "Empty character class."

View File

@@ -31,36 +31,39 @@ predicate matchesString(Expr e, string s) {
*/
language[monotonicAggregates]
predicate regExpMatchesString(RegExpTerm t, string s) {
// constants match themselves
s = t.(RegExpConstant).getValue()
or
// assertions match the empty string
t.isPartOfRegExpLiteral() and
(
t instanceof RegExpCaret or
t instanceof RegExpDollar or
t instanceof RegExpWordBoundary or
t instanceof RegExpNonWordBoundary or
t instanceof RegExpLookahead or
t instanceof RegExpLookbehind
) and
s = ""
or
// groups match their content
regExpMatchesString(t.(RegExpGroup).getAChild(), s)
or
// single-character classes match that character
exists(RegExpCharacterClass recc | recc = t and not recc.isInverted() |
recc.getNumChild() = 1 and
regExpMatchesString(recc.getChild(0), s)
)
or
// sequences match the concatenation of their elements
exists(RegExpSequence seq | seq = t |
s = concat(int i, RegExpTerm child |
child = seq.getChild(i)
|
any(string subs | regExpMatchesString(child, subs)) order by i
)
// constants match themselves
s = t.(RegExpConstant).getValue()
or
// assertions match the empty string
(
t instanceof RegExpCaret or
t instanceof RegExpDollar or
t instanceof RegExpWordBoundary or
t instanceof RegExpNonWordBoundary or
t instanceof RegExpLookahead or
t instanceof RegExpLookbehind
) and
s = ""
or
// groups match their content
regExpMatchesString(t.(RegExpGroup).getAChild(), s)
or
// single-character classes match that character
exists(RegExpCharacterClass recc | recc = t and not recc.isInverted() |
recc.getNumChild() = 1 and
regExpMatchesString(recc.getChild(0), s)
)
or
// sequences match the concatenation of their elements
exists(RegExpSequence seq | seq = t |
s = concat(int i, RegExpTerm child |
child = seq.getChild(i)
|
any(string subs | regExpMatchesString(child, subs)) order by i
)
)
)
}

View File

@@ -16,6 +16,7 @@ import javascript
from RegExpBackRef rebr, string ref
where
rebr.isPartOfRegExpLiteral() and
not exists(rebr.getGroup()) and
(
ref = rebr.getNumber().toString()

View File

@@ -17,6 +17,7 @@ import javascript
from RegExpCaret caret, RegExpTerm t
where
caret.isPartOfRegExpLiteral() and
t = caret.getPredecessor+() and
not t.isNullable() and
// conservative handling of multi-line regular expressions

View File

@@ -17,6 +17,7 @@ import javascript
from RegExpDollar dollar, RegExpTerm t
where
dollar.isPartOfRegExpLiteral() and
t = dollar.getSuccessor+() and
not t.isNullable() and
// conservative handling of multi-line regular expressions

View File

@@ -0,0 +1,109 @@
/**
* Provides predicates for reasoning about regular expressions
* that match URLs and hostname patterns.
*/
import javascript
/**
* Holds if the given constant is unlikely to occur in the origin part of a URL.
*/
predicate isConstantInvalidInsideOrigin(RegExpConstant term) {
// Look for any of these cases:
// - A character that can't occur in the origin
// - Two dashes in a row
// - A colon that is not part of port or scheme separator
// - A slash that is not part of scheme separator
term.getValue().regexpMatch(".*(?:[^a-zA-Z0-9.:/-]|--|:[^0-9/]|(?<![/:]|^)/).*")
}
/** Holds if `term` is a dot constant of form `\.` or `[.]`. */
predicate isDotConstant(RegExpTerm term) {
term.(RegExpCharEscape).getValue() = "."
or
exists(RegExpCharacterClass cls |
term = cls and
not cls.isInverted() and
cls.getNumChild() = 1 and
cls.getAChild().(RegExpConstant).getValue() = "."
)
}
/** Holds if `term` is a wildcard `.` or an actual `.` character. */
predicate isDotLike(RegExpTerm term) {
term instanceof RegExpDot
or
isDotConstant(term)
}
/** Holds if `term` will only ever be matched against the beginning of the input. */
predicate matchesBeginningOfString(RegExpTerm term) {
term.isRootTerm()
or
exists(RegExpTerm parent |
matchesBeginningOfString(parent)
|
term = parent.(RegExpSequence).getChild(0)
or
parent.(RegExpSequence).getChild(0) instanceof RegExpCaret and
term = parent.(RegExpSequence).getChild(1)
or
term = parent.(RegExpAlt).getAChild()
or
term = parent.(RegExpGroup).getAChild()
)
}
/**
* Holds if the given sequence contains top-level domain preceded by a dot, such as `.com`,
* excluding cases where this is at the very beginning of the regexp.
*
* `i` is bound to the index of the last child in the top-level domain part.
*/
predicate hasTopLevelDomainEnding(RegExpSequence seq, int i) {
seq.getChild(i).(RegExpConstant).getValue().regexpMatch("(?i)" + RegExpPatterns::commonTLD() + "(:\\d+)?([/?#].*)?") and
isDotLike(seq.getChild(i - 1)) and
not (i = 1 and matchesBeginningOfString(seq))
}
/**
* Holds if the given regular expression term contains top-level domain preceded by a dot,
* such as `.com`.
*/
predicate hasTopLevelDomainEnding(RegExpSequence seq) {
hasTopLevelDomainEnding(seq, _)
}
/**
* Holds if `term` will always match a hostname, that is, all disjunctions contain
* a hostname pattern that isn't inside a quantifier.
*/
predicate alwaysMatchesHostname(RegExpTerm term) {
hasTopLevelDomainEnding(term, _)
or
// `localhost` is considered a hostname pattern, but has no TLD
term.(RegExpConstant).getValue().regexpMatch("\\blocalhost\\b")
or
not term instanceof RegExpAlt and
not term instanceof RegExpQuantifier and
alwaysMatchesHostname(term.getAChild())
or
alwaysMatchesHostnameAlt(term)
}
/** Holds if every child of `alt` contains a hostname pattern. */
predicate alwaysMatchesHostnameAlt(RegExpAlt alt) {
alwaysMatchesHostnameAlt(alt, alt.getNumChild() - 1)
}
/**
* Holds if the first `i` children of `alt` contains a hostname pattern.
*
* This is used instead of `forall` to avoid materializing the set of alternatives
* that don't contains hostnames, which is much larger.
*/
predicate alwaysMatchesHostnameAlt(RegExpAlt alt, int i) {
alwaysMatchesHostname(alt.getChild(0)) and i = 0
or
alwaysMatchesHostnameAlt(alt, i - 1) and
alwaysMatchesHostname(alt.getChild(i))
}

View File

@@ -12,25 +12,80 @@
import javascript
import semmle.javascript.CharacterEscapes
import HostnameRegexpShared
/**
* Holds if `pattern` is a regular expression pattern for URLs with a host matched by `hostPart`,
* and `pattern` contains a subtle mistake that allows it to match unexpected hosts.
* Holds if `term` occurs inside a quantifier or alternative (and thus
* can not be expected to correspond to a unique match), or as part of
* a lookaround assertion (which are rarely used for capture groups).
*/
bindingset[pattern]
predicate isIncompleteHostNameRegExpPattern(string pattern, string hostPart) {
hostPart = pattern
.regexpCapture("(?i).*" +
// an unescaped single `.`
"(?<!\\\\)[.]" +
// immediately followed by a sequence of subdomains, perhaps with some regex characters mixed in, followed by a known TLD
"([():|?a-z0-9-]+(\\\\)?[.]" + RegExpPatterns::commonTLD() + ")" + ".*", 1)
predicate isInsideChoiceOrSubPattern(RegExpTerm term) {
exists(RegExpParent parent | parent = term.getParent() |
parent instanceof RegExpAlt
or
parent instanceof RegExpQuantifier
or
parent instanceof RegExpSubPattern
or
isInsideChoiceOrSubPattern(parent)
)
}
from RegExpPatternSource re, string pattern, string hostPart, string kind, DataFlow::Node aux
/**
* Holds if `group` is likely to be used as a capture group.
*/
predicate isLikelyCaptureGroup(RegExpGroup group) {
group.isCapture() and
not isInsideChoiceOrSubPattern(group)
}
/**
* Holds if `seq` contains two consecutive dots `..` or escaped dots.
*
* At least one of these dots is not intended to be a subdomain separator,
* so we avoid flagging the pattern in this case.
*/
predicate hasConsecutiveDots(RegExpSequence seq) {
exists(int i |
isDotLike(seq.getChild(i)) and
isDotLike(seq.getChild(i + 1))
)
}
predicate isIncompleteHostNameRegExpPattern(RegExpTerm regexp, RegExpSequence seq, string msg) {
seq = regexp.getAChild*() and
exists(RegExpDot unescapedDot, int i, string hostname |
hasTopLevelDomainEnding(seq, i) and
not isConstantInvalidInsideOrigin(seq.getChild([0 .. i - 1]).getAChild*()) and
not isLikelyCaptureGroup(seq.getChild([i .. seq.getNumChild() - 1]).getAChild*()) and
unescapedDot = seq.getChild([0 .. i - 1]).getAChild*() and
unescapedDot != seq.getChild(i - 1) and // Should not be the '.' immediately before the TLD
not hasConsecutiveDots(unescapedDot.getParent()) and
hostname = seq.getChild(i - 2).getRawValue() + seq.getChild(i - 1).getRawValue() + seq.getChild(i).getRawValue()
|
if unescapedDot.getParent() instanceof RegExpQuantifier then (
// `.*\.example.com` can match `evil.com/?x=.example.com`
//
// This problem only occurs when the pattern is applied against a full URL, not just a hostname/origin.
// We therefore check if the pattern includes a suffix after the TLD, such as `.*\.example.com/`.
// Note that a post-anchored pattern (`.*\.example.com$`) will usually fail to match a full URL,
// and patterns with neither a suffix nor an anchor fall under the purview of MissingRegExpAnchor.
seq.getChild(0) instanceof RegExpCaret and
not seq.getAChild() instanceof RegExpDollar and
seq.getChild([i .. i + 1]).(RegExpConstant).getValue().regexpMatch(".*[/?#].*") and
msg = "has an unrestricted wildcard '" +
unescapedDot.getParent().(RegExpQuantifier).getRawValue() +
"' which may cause '" + hostname + "' to be matched anywhere in the URL, outside the hostname."
) else (
msg = "has an unescaped '.' before '" + hostname + "', so it might match more hosts than expected."
)
)
}
from RegExpPatternSource re, RegExpTerm regexp, RegExpSequence hostSequence, string msg, string kind, DataFlow::Node aux
where
pattern = re.getPattern() and
isIncompleteHostNameRegExpPattern(pattern, hostPart) and
regexp = re.getRegExpTerm() and
isIncompleteHostNameRegExpPattern(regexp, hostSequence, msg) and
(
if re.getAParse() != re
then (
@@ -40,10 +95,6 @@ where
kind = "regular expression" and aux = re
)
) and
// ignore patterns with capture groups after the TLD
not pattern.regexpMatch("(?i).*[.](" + RegExpPatterns::commonTLD() + ").*[(][?]:.*[)].*") and
// avoid double reporting
not CharacterEscapes::hasALikelyRegExpPatternMistake(re)
select re,
"This " + kind + " has an unescaped '.' before '" + hostPart +
"', so it might match more hosts than expected.", aux, "here"
select hostSequence,
"This " + kind + " " + msg, aux, "here"

View File

@@ -11,6 +11,107 @@
*/
import javascript
import HostnameRegexpShared
/** Holds if `term` is one of the transitive left children of a regexp. */
predicate isLeftArmTerm(RegExpTerm term) {
term.isRootTerm()
or
exists(RegExpTerm parent |
term = parent.getChild(0) and
isLeftArmTerm(parent)
)
}
/** Holds if `term` is one of the transitive right children of a regexp. */
predicate isRightArmTerm(RegExpTerm term) {
term.isRootTerm()
or
exists(RegExpTerm parent |
term = parent.getLastChild() and
isRightArmTerm(parent)
)
}
/**
* Holds if `term` is an anchor that is not the first or last node
* in its tree.
*/
predicate isInteriorAnchor(RegExpAnchor term) {
not isLeftArmTerm(term) and
not isRightArmTerm(term)
}
/**
* Holds if `term` contains an anchor that is not the first or last node
* in its tree, such as `(foo|bar$|baz)`.
*/
predicate containsInteriorAnchor(RegExpTerm term) {
isInteriorAnchor(term.getAChild*())
}
/**
* Holds if `term` starts with a word boundary or lookbehind assertion,
* indicating that it's not intended to be anchored on that side.
*/
predicate containsLeadingPseudoAnchor(RegExpSequence term) {
exists(RegExpTerm child | child = term.getChild(0) |
child instanceof RegExpWordBoundary or
child instanceof RegExpNonWordBoundary or
child instanceof RegExpLookbehind
)
}
/**
* Holds if `term` ends with a word boundary or lookahead assertion,
* indicating that it's not intended to be anchored on that side.
*/
predicate containsTrailingPseudoAnchor(RegExpSequence term) {
exists(RegExpTerm child | child = term.getLastChild() |
child instanceof RegExpWordBoundary or
child instanceof RegExpNonWordBoundary or
child instanceof RegExpLookahead
)
}
/**
* Holds if `term` is an empty sequence, usually arising from
* literals with a trailing alternative such as `foo|`.
*/
predicate isEmpty(RegExpSequence term) {
term.getNumChild() = 0
}
/**
* Holds if `term` contains a letter constant.
*
* We use this as a heuristic to filter out uninteresting results.
*/
predicate containsLetters(RegExpTerm term) {
term.getAChild*().(RegExpConstant).getValue().regexpMatch(".*[a-zA-Z].*")
}
/**
* Holds if `term` consists only of an anchor and a parenthesized term,
* such as the left side of `^(foo|bar)|baz`.
*
* The precedence of the anchor is likely to be intentional in this case,
* as the group wouldn't be needed otherwise.
*/
predicate isAnchoredGroup(RegExpSequence term) {
term.getNumChild() = 2 and
term.getAChild() instanceof RegExpAnchor and
term.getAChild() instanceof RegExpGroup
}
/**
* Holds if `alt` has an explicitly anchored group, such as `^(foo|bar)|baz`
* and doesn't have any unnecessary groups, such as in `^(foo)|(bar)`.
*/
predicate hasExplicitAnchorPrecedence(RegExpAlt alt) {
isAnchoredGroup(alt.getAChild()) and
not alt.getAChild() instanceof RegExpGroup
}
/**
* Holds if `src` is a pattern for a collection of alternatives where
@@ -20,25 +121,67 @@ import javascript
* The canonical example of such a mistake is: `^a|b|c`, which is
* parsed as `(^a)|(b)|(c)`.
*/
predicate isInterestingSemiAnchoredRegExpString(RegExpPatternSource src, string msg) {
exists(string str, string maybeGroupedStr, string regex, string anchorPart, string escapedDot |
// a dot that might be escaped in a regular expression, for example `/\./` or `new RegExp('\\.')`
escapedDot = "\\\\[.]" and
// a string that is mostly free from special reqular expression symbols
str = "(?:(?:" + escapedDot + ")|[a-z:/.?_,@0-9 -])+" and
// the string may be wrapped in parentheses
maybeGroupedStr = "(?:" + str + "|\\(" + str + "\\))" and
predicate hasMisleadingAnchorPrecedence(RegExpPatternSource src, string msg) {
exists(RegExpAlt root, RegExpSequence anchoredTerm, string direction |
root = src.getRegExpTerm() and
not containsInteriorAnchor(root) and
not isEmpty(root.getAChild()) and
not hasExplicitAnchorPrecedence(root) and
containsLetters(anchoredTerm) and
(
// a problematic pattern: `^a|b|...|x`
regex = "(?i)(\\^" + maybeGroupedStr + ")(?:\\|" + maybeGroupedStr + ")+"
anchoredTerm = root.getChild(0) and
anchoredTerm.getChild(0) instanceof RegExpCaret and
not containsLeadingPseudoAnchor(root.getChild([ 1 .. root.getNumChild() - 1 ])) and
containsLetters(root.getChild([ 1 .. root.getNumChild() - 1 ])) and
direction = "beginning"
or
// a problematic pattern: `a|b|...|x$`
regex = "(?i)(?:" + maybeGroupedStr + "\\|)+(" + maybeGroupedStr + "\\$)"
anchoredTerm = root.getLastChild() and
anchoredTerm.getLastChild() instanceof RegExpDollar and
not containsTrailingPseudoAnchor(root.getChild([ 0 .. root.getNumChild() - 2 ])) and
containsLetters(root.getChild([ 0 .. root.getNumChild() - 2 ])) and
direction = "end"
) and
anchorPart = src.getPattern().regexpCapture(regex, 1) and
anchorPart.regexpMatch("(?i).*[a-z].*") and
msg = "Misleading operator precedence. The subexpression '" + anchorPart +
"' is anchored, but the other parts of this regular expression are not"
// is not used for replace
not exists(DataFlow::MethodCallNode replace |
replace.getMethodName() = "replace" and
src.getARegExpObject().flowsTo(replace.getArgument(0))
) and
msg = "Misleading operator precedence. The subexpression '" + anchoredTerm.getRawValue() +
"' is anchored at the " + direction + ", but the other parts of this regular expression are not"
)
}
/**
* Holds if `term` is a final term, that is, no term will match anything after this one.
*/
predicate isFinalRegExpTerm(RegExpTerm term) {
term.isRootTerm()
or
exists(RegExpSequence seq |
isFinalRegExpTerm(seq) and
term = seq.getLastChild()
)
or
exists(RegExpTerm parent |
isFinalRegExpTerm(parent) and
term = parent.getAChild() and
not parent instanceof RegExpSequence and
not parent instanceof RegExpQuantifier
)
}
/**
* Holds if `src` contains a hostname pattern that is missing a `$` anchor.
*/
predicate isSemiAnchoredHostnameRegExp(RegExpPatternSource src, string msg) {
not hasMisleadingAnchorPrecedence(src, _) and // avoid double reporting
exists(RegExpTerm term, RegExpSequence tld, int i | term = src.getRegExpTerm() |
not isConstantInvalidInsideOrigin(term.getAChild*()) and
tld = term.getAChild*() and
hasTopLevelDomainEnding(tld, i) and
isFinalRegExpTerm(tld.getChild(i)) and // nothing is matched after the TLD
tld.getChild(0) instanceof RegExpCaret and
msg = "This hostname pattern may match any domain name, as it is missing a '$' or '/' at the end."
)
}
@@ -46,14 +189,13 @@ predicate isInterestingSemiAnchoredRegExpString(RegExpPatternSource src, string
* Holds if `src` is an unanchored pattern for a URL, indicating a
* mistake explained by `msg`.
*/
predicate isInterestingUnanchoredRegExpString(RegExpPatternSource src, string msg) {
exists(string pattern | pattern = src.getPattern() |
// a substring sequence of a protocol and subdomains, perhaps with some regex characters mixed in, followed by a known TLD
pattern
.regexpMatch("(?i)[():|?a-z0-9-\\\\./]+[.]" + RegExpPatterns::commonTLD() +
"([/#?():]\\S*)?") and
// without any anchors
pattern.regexpMatch("[^$^]+") and
predicate isUnanchoredHostnameRegExp(RegExpPatternSource src, string msg) {
exists(RegExpTerm term, RegExpSequence tld | term = src.getRegExpTerm() |
alwaysMatchesHostname(term) and
tld = term.getAChild*() and
hasTopLevelDomainEnding(tld) and
not isConstantInvalidInsideOrigin(term.getAChild*()) and
not term.getAChild*() instanceof RegExpAnchor and
// that is not used for capture or replace
not exists(DataFlow::MethodCallNode mcn, string name | name = mcn.getMethodName() |
name = "exec" and
@@ -78,7 +220,9 @@ predicate isInterestingUnanchoredRegExpString(RegExpPatternSource src, string ms
from DataFlow::Node nd, string msg
where
isInterestingUnanchoredRegExpString(nd, msg)
isUnanchoredHostnameRegExp(nd, msg)
or
isInterestingSemiAnchoredRegExpString(nd, msg)
isSemiAnchoredHostnameRegExp(nd, msg)
or
hasMisleadingAnchorPrecedence(nd, msg)
select nd, msg

View File

@@ -409,6 +409,14 @@ class BigIntLiteral extends @bigintliteral, Literal {
*/
class StringLiteral extends @stringliteral, Literal {
override string getStringValue() { result = getValue() }
/**
* Gets the value of this string literal parsed as a regular expression, if possible.
*
* All string literals have an associated regular expression tree, provided they can
* be parsed without syntax errors.
*/
RegExpTerm asRegExp() { this = result.getParent() }
}
/**
@@ -2656,4 +2664,4 @@ class OptionalChainRoot extends ChainElem {
*/
class ImportMetaExpr extends @importmetaexpr, Expr {
override predicate isImpure() { none() }
}
}

View File

@@ -10,7 +10,8 @@ private import semmle.javascript.dataflow.InferredTypes
/**
* An element containing a regular expression term, that is, either
* a regular expression literal or another regular expression term.
* a regular expression literal, a string literal (parsed as a regular expression),
* or another regular expression term.
*
* Examples:
*
@@ -22,8 +23,14 @@ private import semmle.javascript.dataflow.InferredTypes
class RegExpParent extends Locatable, @regexpparent { }
/**
* A regular expression term, that is, a syntactic part of a regular
* expression literal.
* A regular expression term, that is, a syntactic part of a regular expression.
*
* Regular expression terms may occur as part of a regular expression literal,
* such as `/[a-z]+/`, or as part of a string literal, such as `"[a-z]+"`.
*
* Note that some terms will occur as part of a string literal that isn't actually
* interpreted as regular expression at runtime. Use `isPartOfRegExpLiteral`
* or `isUsedAsRegExp` to check if a term is really used as a regular expression.
*
* Examples:
*
@@ -34,7 +41,7 @@ class RegExpParent extends Locatable, @regexpparent { }
* $
* ```
*/
abstract class RegExpTerm extends Locatable, @regexpterm {
class RegExpTerm extends Locatable, @regexpterm {
override Location getLocation() { hasLocation(this, result) }
/** Gets the `i`th child term of this term. */
@@ -46,14 +53,17 @@ abstract class RegExpTerm extends Locatable, @regexpterm {
/** Gets the number of child terms of this term. */
int getNumChild() { result = count(getAChild()) }
/** Gets the last child term of this term. */
RegExpTerm getLastChild() { result = getChild(getNumChild() - 1) }
/**
* Gets the parent term of this regular expression term, or the
* regular expression literal if this is the root term.
*/
RegExpParent getParent() { regexpterm(this, _, result, _, _) }
/** Gets the regular expression literal this term belongs to. */
RegExpLiteral getLiteral() { result = getParent+() }
/** Gets the regular expression literal this term belongs to, if any. */
RegExpLiteral getLiteral() { result = getRootTerm().getParent() }
override string toString() { regexpterm(this, _, _, _, result) }
@@ -61,7 +71,7 @@ abstract class RegExpTerm extends Locatable, @regexpterm {
string getRawValue() { regexpterm(this, _, _, _, result) }
/** Holds if this regular expression term can match the empty string. */
abstract predicate isNullable();
predicate isNullable() { none() } // Overridden in subclasses.
/** Gets the regular expression term that is matched before this one, if any. */
RegExpTerm getPredecessor() {
@@ -105,6 +115,64 @@ abstract class RegExpTerm extends Locatable, @regexpterm {
* it has an enclosing lookbehind assertions.
*/
predicate isInBackwardMatchingContext() { this = any(RegExpLookbehind lbh).getAChild+() }
/**
* Holds if this is the root term of a regular expression.
*/
predicate isRootTerm() {
not getParent() instanceof RegExpTerm
}
/**
* Gets the outermost term of this regular expression.
*/
RegExpTerm getRootTerm() {
isRootTerm() and
result = this
or
result = getParent().(RegExpTerm).getRootTerm()
}
/**
* Holds if this term occurs as part of a regular expression literal.
*/
predicate isPartOfRegExpLiteral() {
exists(getLiteral())
}
/**
* Holds if this term occurs as part of a string literal.
*
* This predicate holds regardless of whether the string literal is actually
* used as a regular expression. See `isUsedAsRegExp`.
*/
predicate isPartOfStringLiteral() {
getRootTerm().getParent() instanceof StringLiteral
}
/**
* Holds if this term is part of a regular expression literal, or a string literal
* that is interpreted as a regular expression.
*
* Unlike `isPartOfRegExpLiteral` and `isPartOfStringLiteral`, this predicate takes
* data flow into account, to exclude string literals that aren't used as regular expressions.
*
* For example:
* ```js
* location.href.match("^https://example\\.com/") // YES - String is used as regexpp
*
* console.log("Hello world"); // NO - string is not used as regexp
*
* /[a-z]+/g; // YES - Regexp literals are always used as regexp
* ```
*/
predicate isUsedAsRegExp() {
exists(RegExpParent parent | parent = getRootTerm().getParent() |
parent instanceof RegExpLiteral
or
parent.(StringLiteral).flow() instanceof RegExpPatternSource
)
}
}
/**
@@ -116,7 +184,7 @@ abstract class RegExpTerm extends Locatable, @regexpterm {
* ((ECMA|Java)[sS]cript)*
* ```
*/
abstract class RegExpQuantifier extends RegExpTerm, @regexp_quantifier {
class RegExpQuantifier extends RegExpTerm, @regexp_quantifier {
/** Holds if the quantifier of this term is a greedy quantifier. */
predicate isGreedy() { isGreedy(this) }
}
@@ -132,7 +200,7 @@ abstract class RegExpQuantifier extends RegExpTerm, @regexp_quantifier {
* \w
* ```
*/
abstract class RegExpEscape extends RegExpTerm, @regexp_escape { }
class RegExpEscape extends RegExpTerm, @regexp_escape { }
/**
* A constant regular expression term, that is, a regular expression
@@ -141,7 +209,7 @@ abstract class RegExpEscape extends RegExpTerm, @regexp_escape { }
* Example:
*
* ```
* a
* abc
* ```
*/
class RegExpConstant extends RegExpTerm, @regexp_constant {
@@ -209,7 +277,7 @@ class RegExpAlt extends RegExpTerm, @regexp_alt {
* (ECMA|Java)Script
* ```
*
* This is a sequence with elements `(ECMA|Java)`, `S`, `c`, `r`, `i`, `p` and `t`.
* This is a sequence with the elements `(ECMA|Java)` and `Script`.
*/
class RegExpSequence extends RegExpTerm, @regexp_seq {
/** Gets an element of this sequence. */
@@ -223,6 +291,20 @@ class RegExpSequence extends RegExpTerm, @regexp_seq {
}
}
/**
* A dollar `$` or caret assertion `^` matching the beginning or end of a line.
*
* Example:
*
* ```
* ^
* $
* ```
*/
class RegExpAnchor extends RegExpTerm, @regexp_anchor {
override predicate isNullable() { any() }
}
/**
* A caret assertion `^` matching the beginning of a line.
*
@@ -232,8 +314,7 @@ class RegExpSequence extends RegExpTerm, @regexp_seq {
* ^
* ```
*/
class RegExpCaret extends RegExpTerm, @regexp_caret {
override predicate isNullable() { any() }
class RegExpCaret extends RegExpAnchor, @regexp_caret {
}
/**
@@ -245,8 +326,7 @@ class RegExpCaret extends RegExpTerm, @regexp_caret {
* $
* ```
*/
class RegExpDollar extends RegExpTerm, @regexp_dollar {
override predicate isNullable() { any() }
class RegExpDollar extends RegExpAnchor, @regexp_dollar {
}
/**
@@ -472,15 +552,25 @@ class RegExpGroup extends RegExpTerm, @regexp_group {
}
/**
* A normal character without special meaning in a regular expression.
* A sequence of normal characters without special meaning in a regular expression.
*
* Example:
*
* ```
* abc
* ;
* ```
*/
class RegExpNormalChar extends RegExpConstant, @regexp_normal_char { }
class RegExpNormalConstant extends RegExpConstant, @regexp_normal_constant { }
/**
* DEPRECATED. Use `RegExpNormalConstant` instead.
*
* This class used to represent an individual normal character but has been superseded by
* `RegExpNormalConstant`, which represents a sequence of normal characters.
* There is no longer a separate node for each individual character in a constant.
*/
deprecated class RegExpNormalChar = RegExpNormalConstant;
/**
* A hexadecimal character escape in a regular expression.
@@ -682,22 +772,25 @@ class RegExpParseError extends Error, @regexp_parse_error {
* Holds if `source` may be interpreted as a regular expression.
*/
predicate isInterpretedAsRegExp(DataFlow::Node source) {
// The first argument to an invocation of `RegExp` (with or without `new`).
source = DataFlow::globalVarRef("RegExp").getAnInvocation().getArgument(0)
or
// The argument of a call that coerces the argument to a regular expression.
exists(MethodCallExpr mce, string methodName |
mce.getReceiver().analyze().getAType() = TTString() and
mce.getMethodName() = methodName
|
methodName = "match" and source.asExpr() = mce.getArgument(0) and mce.getNumArgument() = 1
source.analyze().getAType() = TTString() and
(
// The first argument to an invocation of `RegExp` (with or without `new`).
source = DataFlow::globalVarRef("RegExp").getAnInvocation().getArgument(0)
or
methodName = "search" and
source.asExpr() = mce.getArgument(0) and
mce.getNumArgument() = 1 and
// "search" is a common method name, and so we exclude chained accesses
// because `String.prototype.search` returns a number
not exists(PropAccess p | p.getBase() = mce)
// The argument of a call that coerces the argument to a regular expression.
exists(MethodCallExpr mce, string methodName |
mce.getReceiver().analyze().getAType() = TTString() and
mce.getMethodName() = methodName
|
methodName = "match" and source.asExpr() = mce.getArgument(0) and mce.getNumArgument() = 1
or
methodName = "search" and
source.asExpr() = mce.getArgument(0) and
mce.getNumArgument() = 1 and
// "search" is a common method name, and so we exclude chained accesses
// because `String.prototype.search` returns a number
not exists(PropAccess p | p.getBase() = mce)
)
)
}
@@ -761,26 +854,29 @@ abstract class RegExpPatternSource extends DataFlow::Node {
* of this node.
*/
abstract DataFlow::SourceNode getARegExpObject();
/**
* Gets the root term of the regular expression parsed from this pattern.
*/
abstract RegExpTerm getRegExpTerm();
}
/**
* A regular expression literal, viewed as the pattern source for itself.
*/
private class RegExpLiteralPatternSource extends RegExpPatternSource {
string pattern;
RegExpLiteralPatternSource() {
exists(string raw | raw = asExpr().(RegExpLiteral).getRoot().getRawValue() |
// hide the fact that `/` is escaped in the literal
pattern = raw.regexpReplaceAll("\\\\/", "/")
)
}
private class RegExpLiteralPatternSource extends RegExpPatternSource, DataFlow::ValueNode {
override RegExpLiteral astNode;
override DataFlow::Node getAParse() { result = this }
override string getPattern() { result = pattern }
override string getPattern() {
// hide the fact that `/` is escaped in the literal
result = astNode.getRoot().getRawValue().regexpReplaceAll("\\\\/", "/")
}
override DataFlow::SourceNode getARegExpObject() { result = this }
override RegExpTerm getRegExpTerm() { result = astNode.getRoot() }
}
/**
@@ -803,4 +899,6 @@ private class StringRegExpPatternSource extends RegExpPatternSource {
}
override string getPattern() { result = getStringValue() }
override RegExpTerm getRegExpTerm() { result = asExpr().(StringLiteral).asRegExp() }
}

View File

@@ -815,7 +815,7 @@ regexpterm (unique int id: @regexpterm,
int idx: int ref,
varchar(900) tostring: string ref);
@regexpparent = @regexpterm | @regexpliteral;
@regexpparent = @regexpterm | @regexpliteral | @stringliteral;
case @regexpterm.kind of
0 = @regexp_alt
@@ -832,7 +832,7 @@ case @regexpterm.kind of
| 11 = @regexp_range
| 12 = @regexp_dot
| 13 = @regexp_group
| 14 = @regexp_normal_char
| 14 = @regexp_normal_constant
| 15 = @regexp_hex_escape
| 16 = @regexp_unicode_escape
| 17 = @regexp_dec_escape
@@ -854,10 +854,11 @@ regexpParseErrors (unique int id: @regexp_parse_error,
@regexp_quantifier = @regexp_star | @regexp_plus | @regexp_opt | @regexp_range;
@regexp_escape = @regexp_char_escape | @regexp_char_class_escape | @regexp_unicode_property_escape;
@regexp_char_escape = @regexp_hex_escape | @regexp_unicode_escape | @regexp_dec_escape | @regexp_oct_escape | @regexp_ctrl_escape | @regexp_id_escape;
@regexp_constant = @regexp_normal_char | @regexp_char_escape;
@regexp_constant = @regexp_normal_constant | @regexp_char_escape;
@regexp_lookahead = @regexp_positive_lookahead | @regexp_negative_lookahead;
@regexp_lookbehind = @regexp_positive_lookbehind | @regexp_negative_lookbehind;
@regexp_subpattern = @regexp_lookahead | @regexp_lookbehind;
@regexp_anchor = @regexp_dollar | @regexp_caret;
isGreedy (int id: @regexp_quantifier ref);
rangeQuantifierLowerBound (unique int id: @regexp_range ref, int lo: int ref);

View File

@@ -1106,7 +1106,7 @@
<v>1692</v>
</e>
<e>
<k>@regexp_normal_char</k>
<k>@regexp_normal_constant</k>
<v>15489</v>
</e>
<e>

View File

@@ -0,0 +1,29 @@
| tst.js:1:22:1:22 | . | . |
| tst.js:2:23:2:23 | . | . |
| tst.js:3:24:3:24 | . | . |
| tst.js:4:23:4:23 | . | . |
| tst.js:5:24:5:24 | . | . |
| tst.js:6:24:6:24 | . | . |
| tst.js:7:24:7:24 | . | . |
| tst.js:8:24:8:24 | . | . |
| tst.js:10:24:10:24 | . | . |
| tst.js:11:24:11:24 | . | . |
| tst.js:12:25:12:25 | . | . |
| tst.js:13:25:13:25 | . | . |
| tst.js:14:25:14:25 | . | . |
| tst.js:15:25:15:25 | . | . |
| tst.js:17:25:17:25 | . | . |
| tst.js:18:25:18:25 | . | . |
| tst.js:19:22:19:22 | . | . |
| tst.js:20:23:20:23 | . | . |
| tst.js:21:24:21:24 | . | . |
| tst.js:23:26:23:26 | . | . |
| tst.js:24:27:24:27 | . | . |
| tst.js:25:28:25:28 | . | . |
| tst.js:26:29:26:29 | . | . |
| tst.js:27:30:27:30 | . | . |
| tst.js:28:31:28:31 | . | . |
| tst.js:30:27:30:27 | . | . |
| tst.js:31:28:31:28 | . | . |
| tst.js:32:29:32:29 | . | . |
| tst.js:33:30:33:30 | . | . |

View File

@@ -0,0 +1,6 @@
import javascript
from StringLiteral literal, RegExpDot dot, int pos
where dot.getParent*() = literal
and pos = dot.getLocation().getStartColumn() - literal.getLocation().getStartColumn()
select dot, literal.getRawValue().charAt(pos)

View File

@@ -0,0 +1,33 @@
new RegExp('\0 hello . \0 world \0');
new RegExp('\00 hello . \00 world \00');
new RegExp('\000 hello . \000 world \000');
new RegExp('\12 hello . \12 world \12');
new RegExp('\333 hello . \333 world \333');
new RegExp('\444 hello . \444 world \444');
new RegExp('\555 hello . \555 world \555');
new RegExp('\666 hello . \666 world \666');
new RegExp('\777 hello . \777 world \777');
new RegExp('\787 hello . \787 world \787');
new RegExp('\087 hello . \087 world \087');
new RegExp('\3331 hello . \3331 world \3331');
new RegExp('\4441 hello . \4441 world \4441');
new RegExp('\5551 hello . \5551 world \5551');
new RegExp('\6661 hello . \6661 world \6661');
new RegExp('\7771 hello . \7771 world \7771');
new RegExp('\7871 hello . \7871 world \7871');
new RegExp('\0871 hello . \0871 world \0871');
new RegExp('\8 hello . \8 world \8');
new RegExp('\81 hello . \81 world \81');
new RegExp('\811 hello . \811 world \811');
new RegExp('\u{a0} hello . \u{a0} world \u{a0}');
new RegExp('\u{0a0} hello . \u{0a0} world \u{0a0}');
new RegExp('\u{00a0} hello . \u{00a0} world \u{00a0}');
new RegExp('\u{000a0} hello . \u{000a0} world \u{000a0}');
new RegExp('\u{0000a0} hello . \u{0000a0} world \u{0000a0}');
new RegExp('\u{00000a0} hello . \u{00000a0} world \u{00000a0}');
new RegExp('\u{1a0} hello . \u{1a0} world \u{1a0}');
new RegExp('\u{10a0} hello . \u{10a0} world \u{10a0}');
new RegExp('\u{100a0} hello . \u{100a0} world \u{100a0}');
new RegExp('\u{1000a0} hello . \u{1000a0} world \u{1000a0}');

View File

@@ -0,0 +1,2 @@
| tst.js:1:1:1:9 | /[\\u12340\\udf40-\\u12345\\udf45]/ | Split supplementary character in non-unicode literal. |
| tst.js:3:1:3:5 | /\\u12340\\udf40+/ | Split supplementary character in non-unicode literal. |

View File

@@ -0,0 +1,14 @@
import javascript
from RegExpLiteral literal, RegExpConstant wideConstant
where wideConstant.getLiteral() = literal and
not literal.getFlags().matches("%u%") and
wideConstant.getValue().length() > 1 and
(
wideConstant.getParent() instanceof RegExpCharacterClass
or
wideConstant.getParent() instanceof RegExpCharacterRange
or
wideConstant.getParent() instanceof RegExpQuantifier
)
select literal, "Split supplementary character in non-unicode literal."

View File

@@ -0,0 +1,5 @@
/[𒍀-𒍅]/; // NOT OK
/[𒍀-𒍅]/u; // OK
/𒍀+/; // NOT OK
/𒍀+/u; // OK
/(𒍀)+/; // OK

View File

@@ -1,18 +1,18 @@
| regexplib/address.js:51:803:51:811 | [A-Za-z]+ | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'A'. |
| regexplib/address.js:75:803:75:811 | [A-Za-z]+ | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'A'. |
| regexplib/dates.js:66:139:66:139 | Y | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'YJANUAR'. |
| regexplib/dates.js:66:148:66:148 | Y | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'YFEBRUAR'. |
| regexplib/dates.js:66:154:66:154 | H | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'HMARC'. |
| regexplib/dates.js:66:160:66:160 | L | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'LAPRI'. |
| regexplib/dates.js:66:164:66:164 | Y | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'YMA'. |
| regexplib/dates.js:66:169:66:169 | E | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'EJUN'. |
| regexplib/dates.js:66:174:66:174 | Y | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'YJUL'. |
| regexplib/dates.js:66:181:66:181 | T | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'TAUGUS'. |
| regexplib/dates.js:66:191:66:191 | R | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'RSEPTEMBE'. |
| regexplib/dates.js:66:199:66:199 | R | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'ROCTOBE'. |
| regexplib/dates.js:66:208:66:208 | R | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'RNOVEMBE'. |
| regexplib/dates.js:66:217:66:217 | R | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'RDECEMBE'. |
| regexplib/dates.js:66:240:66:240 | T | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'TPRESEN'. |
| regexplib/dates.js:66:133:66:139 | JANUARY | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'JANUARY'. |
| regexplib/dates.js:66:141:66:148 | FEBRUARY | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'FEBRUARY'. |
| regexplib/dates.js:66:150:66:154 | MARCH | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'MARCH'. |
| regexplib/dates.js:66:156:66:160 | APRIL | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'APRIL'. |
| regexplib/dates.js:66:162:66:164 | MAY | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'MAY'. |
| regexplib/dates.js:66:166:66:169 | JUNE | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'JUNE'. |
| regexplib/dates.js:66:171:66:174 | JULY | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'JULY'. |
| regexplib/dates.js:66:176:66:181 | AUGUST | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'AUGUST'. |
| regexplib/dates.js:66:183:66:191 | SEPTEMBER | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'SEPTEMBER'. |
| regexplib/dates.js:66:193:66:199 | OCTOBER | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'OCTOBER'. |
| regexplib/dates.js:66:201:66:208 | NOVEMBER | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'NOVEMBER'. |
| regexplib/dates.js:66:210:66:217 | DECEMBER | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'DECEMBER'. |
| regexplib/dates.js:66:234:66:240 | PRESENT | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'PRESENT'. |
| regexplib/email.js:5:24:5:35 | [a-zA-Z0-9]+ | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of '0'. |
| regexplib/email.js:5:63:5:74 | [a-zA-Z0-9]+ | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of '0'. |
| regexplib/email.js:25:67:25:78 | [a-zA-Z0-9]+ | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of '0'. |
@@ -49,3 +49,4 @@
| tst.js:74:14:74:21 | (b\|a?b)* | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'b'. |
| tst.js:77:14:77:21 | (a\|aa?)* | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'a'. |
| tst.js:83:14:83:20 | (.\|\\n)* | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of '\\n'. |
| tst.js:89:25:89:32 | (a\|aa?)* | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'a'. |

View File

@@ -84,3 +84,9 @@ var bad16 = /(.|\n)*!/s;
// GOOD
var good8 = /([\w.]+)*/;
// NOT GOOD
var bad17 = new RegExp('(a|aa?)*b');
// GOOD - not used as regexp
var good9 = '(a|aa?)*b';

View File

@@ -8,4 +8,6 @@
/[aaa]/;
/[\x0a\x0a]/;
/[\u000a\n]/;
/[\u{ff}]/;
/[\u{ff}]/;
/[\u{12340}-\u{12345}]/u; // OK
new RegExp("[\u{12340}-\u{12345}]", "u"); // OK

View File

@@ -1 +1 @@
| tst.js:1:2:1:3 | [] | Empty character class. |
| tst.js:1:2:1:3 | [] | Empty character class. |

View File

@@ -1,24 +1,25 @@
| tst-IncompleteHostnameRegExp.js:3:2:3:29 | /^http: ... le.com/ | This regular expression has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:3:2:3:29 | /^http: ... le.com/ | here |
| tst-IncompleteHostnameRegExp.js:5:2:5:29 | /^http: ... le.net/ | This regular expression has an unescaped '.' before 'example.net', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:5:2:5:29 | /^http: ... le.net/ | here |
| tst-IncompleteHostnameRegExp.js:6:2:6:43 | /^http: ... b).com/ | This regular expression has an unescaped '.' before '(example-a\|example-b).com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:6:2:6:43 | /^http: ... b).com/ | here |
| tst-IncompleteHostnameRegExp.js:11:13:11:38 | "^http: ... le.com" | This regular expression has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:11:13:11:38 | "^http: ... le.com" | here |
| tst-IncompleteHostnameRegExp.js:12:10:12:35 | "^http: ... le.com" | This regular expression has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:12:10:12:35 | "^http: ... le.com" | here |
| tst-IncompleteHostnameRegExp.js:15:22:15:47 | "^http: ... le.com" | This string, which is used as a regular expression $@, has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:15:13:15:50 | id(id(i ... com"))) | here |
| tst-IncompleteHostnameRegExp.js:17:13:17:31 | `test.example.com$` | This regular expression has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:17:13:17:31 | `test.example.com$` | here |
| tst-IncompleteHostnameRegExp.js:17:14:17:30 | test.example.com$ | This string, which is used as a regular expression $@, has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:17:13:17:31 | `test.example.com$` | here |
| tst-IncompleteHostnameRegExp.js:19:17:19:35 | '^test.example.com' | This string, which is used as a regular expression $@, has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:20:13:20:26 | `${hostname}$` | here |
| tst-IncompleteHostnameRegExp.js:22:27:22:45 | 'test.example.com$' | This string, which is used as a regular expression $@, has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:23:13:23:27 | domain.hostname | here |
| tst-IncompleteHostnameRegExp.js:28:23:28:41 | 'test.example.com$' | This string, which is used as a regular expression $@, has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:26:21:26:35 | domain.hostname | here |
| tst-IncompleteHostnameRegExp.js:30:30:30:48 | 'test.example.com$' | This string, which is used as a regular expression $@, has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:32:21:32:35 | domain.hostname | here |
| tst-IncompleteHostnameRegExp.js:37:2:37:54 | /^(http ... =$\|\\/)/ | This regular expression has an unescaped '.' before ')?example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:37:2:37:54 | /^(http ... =$\|\\/)/ | here |
| tst-IncompleteHostnameRegExp.js:38:2:38:44 | /^(http ... p\\/f\\// | This regular expression has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:38:2:38:44 | /^(http ... p\\/f\\// | here |
| tst-IncompleteHostnameRegExp.js:39:2:39:33 | /^(http ... om\\/)/g | This regular expression has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:39:2:39:33 | /^(http ... om\\/)/g | here |
| tst-IncompleteHostnameRegExp.js:40:2:40:30 | /^https ... le.com/ | This regular expression has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:40:2:40:30 | /^https ... le.com/ | here |
| tst-IncompleteHostnameRegExp.js:43:2:43:33 | /^https ... e.com$/ | This regular expression has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:43:2:43:33 | /^https ... e.com$/ | here |
| tst-IncompleteHostnameRegExp.js:44:9:44:101 | '^proto ... ernal)' | This regular expression has an unescaped '.' before 'example-b.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:44:9:44:101 | '^proto ... ernal)' | here |
| tst-IncompleteHostnameRegExp.js:46:2:46:29 | /^(exam ... e.com)/ | This regular expression has an unescaped '.' before 'dev\|example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:46:2:46:29 | /^(exam ... e.com)/ | here |
| tst-IncompleteHostnameRegExp.js:48:13:48:68 | '^http: ... \\\\.com' | This regular expression has an unescaped '.' before 'example\\.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:48:13:48:68 | '^http: ... \\\\.com' | here |
| tst-IncompleteHostnameRegExp.js:48:41:48:68 | '^https ... \\\\.com' | This string, which is used as a regular expression $@, has an unescaped '.' before 'example\\.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:48:13:48:68 | '^http: ... \\\\.com' | here |
| tst-IncompleteHostnameRegExp.js:53:13:53:36 | 'test.' ... e.com$' | This regular expression has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:53:13:53:36 | 'test.' ... e.com$' | here |
| tst-SemiAnchoredRegExp.js:30:2:30:23 | /^good. ... er.com/ | This regular expression has an unescaped '.' before 'com\|better.com', so it might match more hosts than expected. | tst-SemiAnchoredRegExp.js:30:2:30:23 | /^good. ... er.com/ | here |
| tst-SemiAnchoredRegExp.js:66:13:66:34 | '^good. ... er.com' | This regular expression has an unescaped '.' before 'com\|better.com', so it might match more hosts than expected. | tst-SemiAnchoredRegExp.js:66:13:66:34 | '^good. ... er.com' | here |
| tst-IncompleteHostnameRegExp.js:3:3:3:28 | ^http:\\/\\/test.example.com | This regular expression has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:3:2:3:29 | /^http: ... le.com/ | here |
| tst-IncompleteHostnameRegExp.js:5:3:5:28 | ^http:\\/\\/test.example.net | This regular expression has an unescaped '.' before 'example.net', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:5:2:5:29 | /^http: ... le.net/ | here |
| tst-IncompleteHostnameRegExp.js:6:3:6:42 | ^http:\\/\\/test.(example-a\|example-b).com | This regular expression has an unescaped '.' before '(example-a\|example-b).com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:6:2:6:43 | /^http: ... b).com/ | here |
| tst-IncompleteHostnameRegExp.js:7:3:7:30 | ^http:\\/\\/(.+).example.com\\/ | This regular expression has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:7:2:7:31 | /^http: ... .com\\// | here |
| tst-IncompleteHostnameRegExp.js:7:3:7:30 | ^http:\\/\\/(.+).example.com\\/ | This regular expression has an unrestricted wildcard '.+' which may cause 'example.com' to be matched anywhere in the URL, outside the hostname. | tst-IncompleteHostnameRegExp.js:7:2:7:31 | /^http: ... .com\\// | here |
| tst-IncompleteHostnameRegExp.js:10:3:10:36 | ^http:\\/\\/test.example.com\\/(?:.*) | This regular expression has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:10:2:10:37 | /^http: ... (?:.*)/ | here |
| tst-IncompleteHostnameRegExp.js:11:14:11:37 | ^http://test.example.com | This regular expression has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:11:13:11:38 | "^http: ... le.com" | here |
| tst-IncompleteHostnameRegExp.js:12:11:12:34 | ^http://test.example.com | This regular expression has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:12:10:12:35 | "^http: ... le.com" | here |
| tst-IncompleteHostnameRegExp.js:15:23:15:46 | ^http://test.example.com | This string, which is used as a regular expression $@, has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:15:13:15:50 | id(id(i ... com"))) | here |
| tst-IncompleteHostnameRegExp.js:19:18:19:34 | ^test.example.com | This string, which is used as a regular expression $@, has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:20:13:20:26 | `${hostname}$` | here |
| tst-IncompleteHostnameRegExp.js:22:28:22:44 | test.example.com$ | This string, which is used as a regular expression $@, has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:23:13:23:27 | domain.hostname | here |
| tst-IncompleteHostnameRegExp.js:28:24:28:40 | test.example.com$ | This string, which is used as a regular expression $@, has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:26:21:26:35 | domain.hostname | here |
| tst-IncompleteHostnameRegExp.js:30:31:30:47 | test.example.com$ | This string, which is used as a regular expression $@, has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:32:21:32:35 | domain.hostname | here |
| tst-IncompleteHostnameRegExp.js:37:3:37:53 | ^(https?:)?\\/\\/((service\|www).)?example.com(?=$\|\\/) | This regular expression has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:37:2:37:54 | /^(http ... =$\|\\/)/ | here |
| tst-IncompleteHostnameRegExp.js:38:3:38:43 | ^(http\|https):\\/\\/www.example.com\\/p\\/f\\/ | This regular expression has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:38:2:38:44 | /^(http ... p\\/f\\// | here |
| tst-IncompleteHostnameRegExp.js:39:5:39:30 | http:\\/\\/sub.example.com\\/ | This regular expression has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:39:2:39:33 | /^(http ... om\\/)/g | here |
| tst-IncompleteHostnameRegExp.js:40:3:40:29 | ^https?:\\/\\/api.example.com | This regular expression has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:40:2:40:30 | /^https ... le.com/ | here |
| tst-IncompleteHostnameRegExp.js:41:42:41:70 | ^https?://.+\\.example\\.com/ | This string, which is used as a regular expression $@, has an unrestricted wildcard '.+' which may cause 'example\\.com/' to be matched anywhere in the URL, outside the hostname. | tst-IncompleteHostnameRegExp.js:41:13:41:71 | '^http: ... \\.com/' | here |
| tst-IncompleteHostnameRegExp.js:43:3:43:32 | ^https:\\/\\/[a-z]*.example.com$ | This regular expression has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:43:2:43:33 | /^https ... e.com$/ | here |
| tst-IncompleteHostnameRegExp.js:44:32:44:45 | .+.example.net | This regular expression has an unescaped '.' before 'example.net', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:44:9:44:101 | '^proto ... ernal)' | here |
| tst-IncompleteHostnameRegExp.js:44:47:44:62 | .+.example-a.com | This regular expression has an unescaped '.' before 'example-a.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:44:9:44:101 | '^proto ... ernal)' | here |
| tst-IncompleteHostnameRegExp.js:44:64:44:79 | .+.example-b.com | This regular expression has an unescaped '.' before 'example-b.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:44:9:44:101 | '^proto ... ernal)' | here |
| tst-IncompleteHostnameRegExp.js:48:42:48:68 | ^https?://.+.example\\.com/ | This string, which is used as a regular expression $@, has an unescaped '.' before 'example\\.com/', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:48:13:48:69 | '^http: ... \\.com/' | here |
| tst-IncompleteHostnameRegExp.js:48:42:48:68 | ^https?://.+.example\\.com/ | This string, which is used as a regular expression $@, has an unrestricted wildcard '.+' which may cause 'example\\.com/' to be matched anywhere in the URL, outside the hostname. | tst-IncompleteHostnameRegExp.js:48:13:48:69 | '^http: ... \\.com/' | here |
| tst-IncompleteHostnameRegExp.js:59:5:59:20 | foo.example\\.com | This regular expression has an unescaped '.' before 'example\\.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.js:59:2:59:32 | /^(foo. ... ever)$/ | here |

View File

@@ -1,49 +1,71 @@
| tst-SemiAnchoredRegExp.js:3:2:3:7 | /^a\|b/ | Misleading operator precedence. The subexpression '^a' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:6:2:6:9 | /^a\|b\|c/ | Misleading operator precedence. The subexpression '^a' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:12:2:12:9 | /^a\|(b)/ | Misleading operator precedence. The subexpression '^a' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:14:2:14:11 | /^(a)\|(b)/ | Misleading operator precedence. The subexpression '^(a)' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:17:2:17:7 | /a\|b$/ | Misleading operator precedence. The subexpression 'b$' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:20:2:20:9 | /a\|b\|c$/ | Misleading operator precedence. The subexpression 'c$' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:26:2:26:9 | /(a)\|b$/ | Misleading operator precedence. The subexpression 'b$' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:28:2:28:11 | /(a)\|(b)$/ | Misleading operator precedence. The subexpression '(b)$' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:30:2:30:23 | /^good. ... er.com/ | Misleading operator precedence. The subexpression '^good.com' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:31:2:31:25 | /^good\\ ... r\\.com/ | Misleading operator precedence. The subexpression '^good\\.com' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:39:13:39:18 | "^a\|b" | Misleading operator precedence. The subexpression '^a' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:42:13:42:20 | "^a\|b\|c" | Misleading operator precedence. The subexpression '^a' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:48:13:48:20 | "^a\|(b)" | Misleading operator precedence. The subexpression '^a' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:50:13:50:22 | "^(a)\|(b)" | Misleading operator precedence. The subexpression '^(a)' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:53:13:53:18 | "a\|b$" | Misleading operator precedence. The subexpression 'b$' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:56:13:56:20 | "a\|b\|c$" | Misleading operator precedence. The subexpression 'c$' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:62:13:62:20 | "(a)\|b$" | Misleading operator precedence. The subexpression 'b$' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:64:13:64:22 | "(a)\|(b)$" | Misleading operator precedence. The subexpression '(b)$' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:66:13:66:34 | '^good. ... er.com' | Misleading operator precedence. The subexpression '^good.com' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:67:13:67:36 | '^good\\ ... r\\.com' | Misleading operator precedence. The subexpression '^good.com' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:68:13:68:38 | '^good\\ ... \\\\.com' | Misleading operator precedence. The subexpression '^good\\.com' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:69:13:69:40 | '^good\\ ... \\\\.com' | Misleading operator precedence. The subexpression '^good\\.com' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:79:2:79:27 | /(\\.xxx ... .zzz)$/ | Misleading operator precedence. The subexpression '(\\.zzz)$' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:81:2:81:23 | /\\.xxx\| ... zzz$/ig | Misleading operator precedence. The subexpression '\\.zzz$' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:82:2:82:19 | /\\.xxx\|\\.yyy\|zzz$/ | Misleading operator precedence. The subexpression 'zzz$' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:85:2:85:28 | /^(xxx ... yyy)/i | Misleading operator precedence. The subexpression '^(xxx yyy zzz)' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:87:2:87:24 | /^(xxx: ... (zzz:)/ | Misleading operator precedence. The subexpression '^(xxx:)' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:88:2:88:23 | /^(xxx? ... zzz\\/)/ | Misleading operator precedence. The subexpression '^(xxx?:)' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:89:2:89:16 | /^@media\|@page/ | Misleading operator precedence. The subexpression '^@media' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:91:2:91:21 | /^click\|mouse\|touch/ | Misleading operator precedence. The subexpression '^click' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:92:2:92:43 | /^http: ... r\\.com/ | Misleading operator precedence. The subexpression '^http://good\\.com' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:93:2:93:47 | /^https ... r\\.com/ | Misleading operator precedence. The subexpression '^https?://good\\.com' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:94:2:94:55 | /^mouse ... ragend/ | Misleading operator precedence. The subexpression '^mouse' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:95:2:95:14 | /^xxx:\|yyy:/i | Misleading operator precedence. The subexpression '^xxx:' is anchored, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:96:2:96:18 | /_xxx\|_yyy\|_zzz$/ | Misleading operator precedence. The subexpression '_zzz$' is anchored, but the other parts of this regular expression are not |
| tst-IncompleteHostnameRegExp.js:2:2:2:24 | /^http: ... le.com/ | This hostname pattern may match any domain name, as it is missing a '$' or '/' at the end. |
| tst-IncompleteHostnameRegExp.js:3:2:3:29 | /^http: ... le.com/ | This hostname pattern may match any domain name, as it is missing a '$' or '/' at the end. |
| tst-IncompleteHostnameRegExp.js:5:2:5:29 | /^http: ... le.net/ | This hostname pattern may match any domain name, as it is missing a '$' or '/' at the end. |
| tst-IncompleteHostnameRegExp.js:6:2:6:43 | /^http: ... b).com/ | This hostname pattern may match any domain name, as it is missing a '$' or '/' at the end. |
| tst-IncompleteHostnameRegExp.js:11:13:11:38 | "^http: ... le.com" | This hostname pattern may match any domain name, as it is missing a '$' or '/' at the end. |
| tst-IncompleteHostnameRegExp.js:12:10:12:35 | "^http: ... le.com" | This hostname pattern may match any domain name, as it is missing a '$' or '/' at the end. |
| tst-IncompleteHostnameRegExp.js:15:22:15:47 | "^http: ... le.com" | This hostname pattern may match any domain name, as it is missing a '$' or '/' at the end. |
| tst-IncompleteHostnameRegExp.js:19:17:19:35 | '^test.example.com' | This hostname pattern may match any domain name, as it is missing a '$' or '/' at the end. |
| tst-IncompleteHostnameRegExp.js:40:2:40:30 | /^https ... le.com/ | This hostname pattern may match any domain name, as it is missing a '$' or '/' at the end. |
| tst-IncompleteHostnameRegExp.js:55:13:55:39 | '^http: ... le.com' | This hostname pattern may match any domain name, as it is missing a '$' or '/' at the end. |
| tst-SemiAnchoredRegExp.js:3:2:3:7 | /^a\|b/ | Misleading operator precedence. The subexpression '^a' is anchored at the beginning, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:6:2:6:9 | /^a\|b\|c/ | Misleading operator precedence. The subexpression '^a' is anchored at the beginning, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:12:2:12:9 | /^a\|(b)/ | Misleading operator precedence. The subexpression '^a' is anchored at the beginning, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:14:2:14:11 | /^(a)\|(b)/ | Misleading operator precedence. The subexpression '^(a)' is anchored at the beginning, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:17:2:17:7 | /a\|b$/ | Misleading operator precedence. The subexpression 'b$' is anchored at the end, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:20:2:20:9 | /a\|b\|c$/ | Misleading operator precedence. The subexpression 'c$' is anchored at the end, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:26:2:26:9 | /(a)\|b$/ | Misleading operator precedence. The subexpression 'b$' is anchored at the end, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:28:2:28:11 | /(a)\|(b)$/ | Misleading operator precedence. The subexpression '(b)$' is anchored at the end, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:30:2:30:23 | /^good. ... er.com/ | Misleading operator precedence. The subexpression '^good.com' is anchored at the beginning, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:31:2:31:25 | /^good\\ ... r\\.com/ | Misleading operator precedence. The subexpression '^good\\.com' is anchored at the beginning, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:32:2:32:27 | /^good\\ ... \\\\.com/ | Misleading operator precedence. The subexpression '^good\\\\.com' is anchored at the beginning, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:33:2:33:29 | /^good\\ ... \\\\.com/ | Misleading operator precedence. The subexpression '^good\\\\\\.com' is anchored at the beginning, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:34:2:34:31 | /^good\\ ... \\\\.com/ | Misleading operator precedence. The subexpression '^good\\\\\\\\.com' is anchored at the beginning, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:36:2:36:16 | /^foo\|bar\|baz$/ | Misleading operator precedence. The subexpression '^foo' is anchored at the beginning, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:36:2:36:16 | /^foo\|bar\|baz$/ | Misleading operator precedence. The subexpression 'baz$' is anchored at the end, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:42:13:42:18 | "^a\|b" | Misleading operator precedence. The subexpression '^a' is anchored at the beginning, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:45:13:45:20 | "^a\|b\|c" | Misleading operator precedence. The subexpression '^a' is anchored at the beginning, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:51:13:51:20 | "^a\|(b)" | Misleading operator precedence. The subexpression '^a' is anchored at the beginning, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:53:13:53:22 | "^(a)\|(b)" | Misleading operator precedence. The subexpression '^(a)' is anchored at the beginning, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:56:13:56:18 | "a\|b$" | Misleading operator precedence. The subexpression 'b$' is anchored at the end, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:59:13:59:20 | "a\|b\|c$" | Misleading operator precedence. The subexpression 'c$' is anchored at the end, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:65:13:65:20 | "(a)\|b$" | Misleading operator precedence. The subexpression 'b$' is anchored at the end, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:67:13:67:22 | "(a)\|(b)$" | Misleading operator precedence. The subexpression '(b)$' is anchored at the end, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:69:13:69:34 | '^good. ... er.com' | Misleading operator precedence. The subexpression '^good.com' is anchored at the beginning, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:70:13:70:36 | '^good\\ ... r\\.com' | Misleading operator precedence. The subexpression '^good.com' is anchored at the beginning, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:71:13:71:38 | '^good\\ ... \\\\.com' | Misleading operator precedence. The subexpression '^good\\.com' is anchored at the beginning, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:72:13:72:40 | '^good\\ ... \\\\.com' | Misleading operator precedence. The subexpression '^good\\.com' is anchored at the beginning, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:73:13:73:42 | '^good\\ ... \\\\.com' | Misleading operator precedence. The subexpression '^good\\\\.com' is anchored at the beginning, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:82:2:82:27 | /(\\.xxx ... .zzz)$/ | Misleading operator precedence. The subexpression '(\\.zzz)$' is anchored at the end, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:84:2:84:23 | /\\.xxx\| ... zzz$/ig | Misleading operator precedence. The subexpression '\\.zzz$' is anchored at the end, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:85:2:85:19 | /\\.xxx\|\\.yyy\|zzz$/ | Misleading operator precedence. The subexpression 'zzz$' is anchored at the end, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:87:2:87:28 | /^(xxx ... yyy)/i | Misleading operator precedence. The subexpression '^(xxx yyy zzz)' is anchored at the beginning, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:88:2:88:53 | /^(xxx ... x\|1st/i | Misleading operator precedence. The subexpression '^(xxx yyy zzz)' is anchored at the beginning, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:89:2:89:24 | /^(xxx: ... (zzz:)/ | Misleading operator precedence. The subexpression '^(xxx:)' is anchored at the beginning, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:90:2:90:23 | /^(xxx? ... zzz\\/)/ | Misleading operator precedence. The subexpression '^(xxx?:)' is anchored at the beginning, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:91:2:91:16 | /^@media\|@page/ | Misleading operator precedence. The subexpression '^@media' is anchored at the beginning, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:92:2:92:32 | /^\\s*(x ... :yyy\\// | Misleading operator precedence. The subexpression '^\\s*(xxx?\|yyy\|zzz):' is anchored at the beginning, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:93:2:93:21 | /^click\|mouse\|touch/ | Misleading operator precedence. The subexpression '^click' is anchored at the beginning, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:94:2:94:43 | /^http: ... r\\.com/ | Misleading operator precedence. The subexpression '^http:\\/\\/good\\.com' is anchored at the beginning, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:95:2:95:47 | /^https ... r\\.com/ | Misleading operator precedence. The subexpression '^https?:\\/\\/good\\.com' is anchored at the beginning, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:96:2:96:55 | /^mouse ... ragend/ | Misleading operator precedence. The subexpression '^mouse' is anchored at the beginning, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:97:2:97:14 | /^xxx:\|yyy:/i | Misleading operator precedence. The subexpression '^xxx:' is anchored at the beginning, but the other parts of this regular expression are not |
| tst-SemiAnchoredRegExp.js:98:2:98:18 | /_xxx\|_yyy\|_zzz$/ | Misleading operator precedence. The subexpression '_zzz$' is anchored at the end, but the other parts of this regular expression are not |
| tst-UnanchoredUrlRegExp.js:3:43:3:61 | "https?://good.com" | When this is used as a regular expression on a URL, it may match anywhere, and arbitrary hosts may come before or after it. |
| tst-UnanchoredUrlRegExp.js:4:54:4:72 | "https?://good.com" | When this is used as a regular expression on a URL, it may match anywhere, and arbitrary hosts may come before or after it. |
| tst-UnanchoredUrlRegExp.js:5:43:5:62 | "^https?://good.com" | This hostname pattern may match any domain name, as it is missing a '$' or '/' at the end. |
| tst-UnanchoredUrlRegExp.js:6:43:6:64 | /^https ... od.com/ | This hostname pattern may match any domain name, as it is missing a '$' or '/' at the end. |
| tst-UnanchoredUrlRegExp.js:7:43:7:87 | "(^http ... 2.com)" | This hostname pattern may match any domain name, as it is missing a '$' or '/' at the end. |
| tst-UnanchoredUrlRegExp.js:8:43:8:86 | "(https ... e.com)" | This hostname pattern may match any domain name, as it is missing a '$' or '/' at the end. |
| tst-UnanchoredUrlRegExp.js:10:2:10:22 | /https? ... od.com/ | When this is used as a regular expression on a URL, it may match anywhere, and arbitrary hosts may come before or after it. |
| tst-UnanchoredUrlRegExp.js:11:13:11:31 | "https?://good.com" | When this is used as a regular expression on a URL, it may match anywhere, and arbitrary hosts may come before or after it. |
| tst-UnanchoredUrlRegExp.js:13:44:13:62 | "https?://good.com" | When this is used as a regular expression on a URL, it may match anywhere, and arbitrary hosts may come before or after it. |
| tst-UnanchoredUrlRegExp.js:15:13:15:31 | "https?://good.com" | When this is used as a regular expression on a URL, it may match anywhere, and arbitrary hosts may come before or after it. |
| tst-UnanchoredUrlRegExp.js:19:43:19:62 | "https?://good.com/" | When this is used as a regular expression on a URL, it may match anywhere, and arbitrary hosts may come before or after it. |
| tst-UnanchoredUrlRegExp.js:19:43:19:61 | "https?://good.com" | When this is used as a regular expression on a URL, it may match anywhere, and arbitrary hosts may come before or after it. |
| tst-UnanchoredUrlRegExp.js:20:43:20:66 | "https? ... m:8080" | When this is used as a regular expression on a URL, it may match anywhere, and arbitrary hosts may come before or after it. |
| tst-UnanchoredUrlRegExp.js:23:3:23:21 | "https?://good.com" | When this is used as a regular expression on a URL, it may match anywhere, and arbitrary hosts may come before or after it. |
| tst-UnanchoredUrlRegExp.js:24:3:24:23 | /https? ... od.com/ | When this is used as a regular expression on a URL, it may match anywhere, and arbitrary hosts may come before or after it. |
| tst-UnanchoredUrlRegExp.js:25:14:25:32 | "https?://good.com" | When this is used as a regular expression on a URL, it may match anywhere, and arbitrary hosts may come before or after it. |
| tst-UnanchoredUrlRegExp.js:26:3:26:22 | "^https?://good.com" | This hostname pattern may match any domain name, as it is missing a '$' or '/' at the end. |
| tst-UnanchoredUrlRegExp.js:35:2:35:32 | /https? ... 0-9]+)/ | When this is used as a regular expression on a URL, it may match anywhere, and arbitrary hosts may come before or after it. |
| tst-UnanchoredUrlRegExp.js:49:11:49:51 | /youtub ... -_]+)/i | When this is used as a regular expression on a URL, it may match anywhere, and arbitrary hosts may come before or after it. |
| tst-UnanchoredUrlRegExp.js:77:11:77:32 | /vimeo\\ ... 0-9]+)/ | When this is used as a regular expression on a URL, it may match anywhere, and arbitrary hosts may come before or after it. |

View File

@@ -1,5 +1,5 @@
| tst-IncompleteHostnameRegExp.js:42:13:42:65 | '^http[ ... \\/(.+)' | The escape sequence '\\/' is equivalent to just '/'. |
| tst-SemiAnchoredRegExp.js:107:2:107:45 | /^((\\+\| ... ?\\d\\d)/ | The escape sequence '\\:' is equivalent to just ':'. |
| tst-SemiAnchoredRegExp.js:109:2:109:45 | /^((\\+\| ... ?\\d\\d)/ | The escape sequence '\\:' is equivalent to just ':'. |
| tst-escapes.js:19:8:19:11 | "\\ " | The escape sequence '\\ ' is equivalent to just ' '. |
| tst-escapes.js:20:1:20:54 | /\\a\\b\\c ... x\\y\\z"/ | The escape sequence '\\a' is equivalent to just 'a'. |
| tst-escapes.js:20:1:20:54 | /\\a\\b\\c ... x\\y\\z"/ | The escape sequence '\\e' is equivalent to just 'e'. |

View File

@@ -1,8 +1,8 @@
| tst-IncompleteHostnameRegExp.js:55:26:55:27 | '\\.' is equivalent to just '.', so the sequence may still represent a meta-character | The escape sequence '\\.' is equivalent to just '.', so the sequence may still represent a meta-character when it is used in a $@. | tst-IncompleteHostnameRegExp.js:55:13:55:39 | '^http: ... le.com' | regular expression |
| tst-SemiAnchoredRegExp.js:67:19:67:20 | '\\.' is equivalent to just '.', so the sequence may still represent a meta-character | The escape sequence '\\.' is equivalent to just '.', so the sequence may still represent a meta-character when it is used in a $@. | tst-SemiAnchoredRegExp.js:67:13:67:36 | '^good\\ ... r\\.com' | regular expression |
| tst-SemiAnchoredRegExp.js:67:31:67:32 | '\\.' is equivalent to just '.', so the sequence may still represent a meta-character | The escape sequence '\\.' is equivalent to just '.', so the sequence may still represent a meta-character when it is used in a $@. | tst-SemiAnchoredRegExp.js:67:13:67:36 | '^good\\ ... r\\.com' | regular expression |
| tst-SemiAnchoredRegExp.js:69:21:69:22 | '\\.' is equivalent to just '.', so the sequence may still represent a meta-character | The escape sequence '\\.' is equivalent to just '.', so the sequence may still represent a meta-character when it is used in a $@. | tst-SemiAnchoredRegExp.js:69:13:69:40 | '^good\\ ... \\\\.com' | regular expression |
| tst-SemiAnchoredRegExp.js:69:35:69:36 | '\\.' is equivalent to just '.', so the sequence may still represent a meta-character | The escape sequence '\\.' is equivalent to just '.', so the sequence may still represent a meta-character when it is used in a $@. | tst-SemiAnchoredRegExp.js:69:13:69:40 | '^good\\ ... \\\\.com' | regular expression |
| tst-SemiAnchoredRegExp.js:70:19:70:20 | '\\.' is equivalent to just '.', so the sequence may still represent a meta-character | The escape sequence '\\.' is equivalent to just '.', so the sequence may still represent a meta-character when it is used in a $@. | tst-SemiAnchoredRegExp.js:70:13:70:36 | '^good\\ ... r\\.com' | regular expression |
| tst-SemiAnchoredRegExp.js:70:31:70:32 | '\\.' is equivalent to just '.', so the sequence may still represent a meta-character | The escape sequence '\\.' is equivalent to just '.', so the sequence may still represent a meta-character when it is used in a $@. | tst-SemiAnchoredRegExp.js:70:13:70:36 | '^good\\ ... r\\.com' | regular expression |
| tst-SemiAnchoredRegExp.js:72:21:72:22 | '\\.' is equivalent to just '.', so the sequence may still represent a meta-character | The escape sequence '\\.' is equivalent to just '.', so the sequence may still represent a meta-character when it is used in a $@. | tst-SemiAnchoredRegExp.js:72:13:72:40 | '^good\\ ... \\\\.com' | regular expression |
| tst-SemiAnchoredRegExp.js:72:35:72:36 | '\\.' is equivalent to just '.', so the sequence may still represent a meta-character | The escape sequence '\\.' is equivalent to just '.', so the sequence may still represent a meta-character when it is used in a $@. | tst-SemiAnchoredRegExp.js:72:13:72:40 | '^good\\ ... \\\\.com' | regular expression |
| tst-escapes.js:13:11:13:12 | '\\b' is a backspace, and not a word-boundary assertion | The escape sequence '\\b' is a backspace, and not a word-boundary assertion when it is used in a $@. | tst-escapes.js:13:8:13:61 | "\\a\\b\\c ... \\x\\y\\z" | regular expression |
| tst-escapes.js:13:13:13:14 | '\\c' is equivalent to just 'c', so the sequence is not a character class | The escape sequence '\\c' is equivalent to just 'c', so the sequence is not a character class when it is used in a $@. | tst-escapes.js:13:8:13:61 | "\\a\\b\\c ... \\x\\y\\z" | regular expression |
| tst-escapes.js:13:15:13:16 | '\\d' is equivalent to just 'd', so the sequence is not a character class | The escape sequence '\\d' is equivalent to just 'd', so the sequence is not a character class when it is used in a $@. | tst-escapes.js:13:8:13:61 | "\\a\\b\\c ... \\x\\y\\z" | regular expression |

View File

@@ -4,9 +4,9 @@
/^http:\/\/test\\.example.com/; // OK
/^http:\/\/test.example.net/; // NOT OK
/^http:\/\/test.(example-a|example-b).com/; // NOT OK
/^http:\/\/(.+)\\.example.com/; // NOT OK, but not yet supported with enough precision
/^http:\/\/(.+).example.com\//; // NOT OK
/^http:\/\/(\\.+)\\.example.com/; // OK
/^http:\/\/(?:.+)\\.test\\.example.com/; // NOT OK, but not yet supported with enough precision
/^http:\/\/(?:.+)\\.test\\.example.com\//; // NOT OK
/^http:\/\/test.example.com\/(?:.*)/; // OK
new RegExp("^http://test.example.com"); // NOT OK
s.match("^http://test.example.com"); // NOT OK
@@ -19,7 +19,7 @@
let hostname = '^test.example.com'; // NOT OK
new RegExp(`${hostname}$`);
let domain = { hostname: 'test.example.com$' };
let domain = { hostname: 'test.example.com$' }; // NOT OK
new RegExp(domain.hostname);
function convert1(domain) {
@@ -33,24 +33,28 @@
}
domains.map(d => convert2(d));
/^(.+\.(?:example-a|example-b)\.com)/; // NOT OK, but not yet supported with enough precision
/^(.+\.(?:example-a|example-b)\.com)\//; // NOT OK
/^(https?:)?\/\/((service|www).)?example.com(?=$|\/)/; // NOT OK
/^(http|https):\/\/www.example.com\/p\/f\//; // NOT OK
/^(http:\/\/sub.example.com\/)/g; // NOT OK
/^https?:\/\/api.example.com/; // NOT OK
new RegExp('^http://localhost:8000|' + '^https?://.+\\.example\\.com'); // NOT OK
new RegExp('^http://localhost:8000|' + '^https?://.+\\.example\\.com/'); // NOT OK
new RegExp('^http[s]?:\/\/?sub1\\.sub2\\.example\\.com\/f\/(.+)'); // NOT OK
/^https:\/\/[a-z]*.example.com$/; // NOT OK
RegExp('^protos?://(localhost|.+.example.net|.+.example-a.com|.+.example-b.com|.+.example.internal)'); // NOT OK
/^(example.dev|example.com)/; // OK, but still flagged
/^(example.dev|example.com)/; // OK
new RegExp('^http://localhost:8000|' + '^https?://.+.example\\.com'); // NOT OK
new RegExp('^http://localhost:8000|' + '^https?://.+.example\\.com/'); // NOT OK
var primary = 'example.com$';
new RegExp('test.' + primary); // NOT OK, but not detected
new RegExp('test.' + 'example.com$'); // NOT OK
new RegExp('test.' + 'example.com$'); // NOT OK, but not detected
new RegExp('^http://test\.example.com'); // NOT OK, but flagged by js/useless-regexp-character-escape
/^http:\/\/(..|...)\.example\.com\/index\.html/; // OK, wildcards are intentional
/^http:\/\/.\.example\.com\/index\.html/; // OK, the wildcard is intentional
/^(foo.example\.com|whatever)$/; // kinda OK - one disjunction doesn't even look like a hostname
});

View File

@@ -29,9 +29,12 @@
/^good.com|better.com/; // NOT OK
/^good\.com|better\.com/; // NOT OK
/^good\\.com|better\\.com/;
/^good\\\.com|better\\\.com/;
/^good\\\\.com|better\\\\.com/;
/^good\\.com|better\\.com/; // NOT OK
/^good\\\.com|better\\\.com/; // NOT OK
/^good\\\\.com|better\\\\.com/; // NOT OK
/^foo|bar|baz$/; // NOT OK
/^foo|%/; // OK
});
(function coreString() {
@@ -67,7 +70,7 @@
new RegExp('^good\.com|better\.com'); // NOT OK
new RegExp('^good\\.com|better\\.com'); // NOT OK
new RegExp('^good\\\.com|better\\\.com'); // NOT OK
new RegExp('^good\\\\.com|better\\\\.com');
new RegExp('^good\\\\.com|better\\\\.com'); // NOT OK
});
(function realWorld() {
@@ -77,17 +80,16 @@
* NOT OK: flagged
*/
/(\.xxx)|(\.yyy)|(\.zzz)$/;
/(^left|right|center)\sbottom$/; // not flagged at the moment due to multiple anchors
/(^left|right|center)\sbottom$/; // not flagged at the moment due to interior anchors
/\.xxx|\.yyy|\.zzz$/ig;
/\.xxx|\.yyy|zzz$/;
/^(?:mouse|contextmenu)|click/; // not flagged at the moment due to nested alternatives
/^([A-Z]|xxx[XY]$)/; // not flagged at the moment due to multiple anchors
/^([A-Z]|xxx[XY]$)/; // not flagged at the moment due to interior anchors
/^(xxx yyy zzz)|(xxx yyy)/i;
/^(xxx yyy zzz)|(xxx yyy)|(1st( xxx)? yyy)|xxx|1st/i; // not flagged at the moment due to nested parens
/^(xxx yyy zzz)|(xxx yyy)|(1st( xxx)? yyy)|xxx|1st/i;
/^(xxx:)|(yyy:)|(zzz:)/;
/^(xxx?:)|(yyy:zzz\/)/;
/^@media|@page/;
/^\s*(xxx?|yyy|zzz):|xxx:yyy\//; // not flagged at the moment due to quantifiers
/^\s*(xxx?|yyy|zzz):|xxx:yyy\//;
/^click|mouse|touch/;
/^http:\/\/good\.com|http:\/\/better\.com/;
/^https?:\/\/good\.com|https?:\/\/better\.com/;
@@ -123,4 +125,9 @@
/^9$|27/;
/^\+|\s*/g;
/xxx_yyy=\w+|^$/;
/^(?:mouse|contextmenu)|click/;
});
function replaceTest(x) {
return x.replace(/^a|b/, ''); // OK - possibly replacing too much, but not obviously a problem
}

View File

@@ -2,10 +2,10 @@
"http://evil.com/?http://good.com".match("https?://good.com"); // NOT OK
"http://evil.com/?http://good.com".match(new RegExp("https?://good.com")); // NOT OK
"http://evil.com/?http://good.com".match("^https?://good.com"); // OK
"http://evil.com/?http://good.com".match(/^https?:\/\/good.com/); // OK
"http://evil.com/?http://good.com".match("(^https?://good1.com)|(^https?://good2.com)"); // OK
"http://evil.com/?http://good.com".match("(https?://good.com)|(^https?://goodie.com)"); // NOT OK, but not detected
"http://evil.com/?http://good.com".match("^https?://good.com"); // NOT OK - missing post-anchor
"http://evil.com/?http://good.com".match(/^https?:\/\/good.com/); // NOT OK - missing post-anchor
"http://evil.com/?http://good.com".match("(^https?://good1.com)|(^https?://good2.com)"); // NOT OK - missing post-anchor
"http://evil.com/?http://good.com".match("(https?://good.com)|(^https?://goodie.com)"); // NOT OK - missing post-anchor
/https?:\/\/good.com/.exec("http://evil.com/?http://good.com"); // NOT OK
new RegExp("https?://good.com").exec("http://evil.com/?http://good.com"); // NOT OK
@@ -16,14 +16,14 @@
"something".match("other"); // OK
"something".match("x.commissary"); // OK
"http://evil.com/?http://good.com".match("https?://good.com/"); // NOT OK
"http://evil.com/?http://good.com".match("https?://good.com"); // NOT OK
"http://evil.com/?http://good.com".match("https?://good.com:8080"); // NOT OK
let trustedUrls = [
"https?://good.com", // NOT OK, referenced below
/https?:\/\/good.com/, // NOT OK, referenced below
new RegExp("https?://good.com"), // NOT OK, referenced below
"^https?://good.com"
"^https?://good.com" // NOT OK - missing post-anchor
];
function isTrustedUrl(url) {
for (let trustedUrl of trustedUrls) {
@@ -46,7 +46,7 @@
// missing context of use
const urlPatterns = [
{
regex: /youtube.com\/embed\/([a-z0-9\?&=\-_]+)/i,
regex: /youtube.com\/embed\/([a-z0-9\?&=\-_]+)/i, // OK
type: 'iframe', w: 560, h: 314,
url: '//www.youtube.com/embed/$1',
allowFullscreen: true
@@ -101,6 +101,8 @@
pkg.source.match(/<a:skin.*?\s+xmlns:a="http:\/\/ajax.org\/2005\/aml"/m)
// replace
path.replace(/engine.io/, "$&-client")
path.replace(/engine.io/, "$&-client");
/\.com|\.org/; // OK, has no domain name
/example\.com|whatever/; // OK, the other disjunction doesn't match a hostname
});

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More