Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 928a382

Browse files
committed
JS: Add parser for angular expressions
1 parent 5fa3b17 commit 928a382

2 files changed

Lines changed: 59 additions & 15 deletions

File tree

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.semmle.jcorn;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
import com.semmle.js.ast.CallExpression;
7+
import com.semmle.js.ast.Expression;
8+
import com.semmle.js.ast.Position;
9+
import com.semmle.js.ast.SourceLocation;
10+
11+
/**
12+
* Parser for Angular template expressions, based on the JS parser with
13+
* modified handling of the pipe operator.
14+
*/
15+
public class AngularExpressionParser extends Parser {
16+
public AngularExpressionParser(String input, int startPos) {
17+
super(new Options(), input, startPos);
18+
}
19+
20+
@Override
21+
protected Expression buildBinary(
22+
int startPos,
23+
Position startLoc,
24+
Expression left,
25+
Expression right,
26+
String op,
27+
boolean logical) {
28+
// Angular pipe expression: `x|f:a` is desugared to `f(x, a)`
29+
if (op.equals("|")) {
30+
DestructuringErrors refDestructuringErrors = new DestructuringErrors();
31+
List<Expression> arguments = new ArrayList<>();
32+
arguments.add(left);
33+
while (this.type == TokenType.colon) {
34+
this.next();
35+
int argStartPos = this.pos;
36+
Position argStartLocation = this.curPosition();
37+
Expression arg = parseMaybeUnary(refDestructuringErrors, false);
38+
arguments.add(parseExprOp(arg, argStartPos, argStartLocation, TokenType.plusMin.binop, true));
39+
}
40+
SourceLocation loc = new SourceLocation(startLoc);
41+
return this.finishNode(new CallExpression(loc, right, null, arguments, false, false));
42+
}
43+
return super.buildBinary(startPos, startLoc, left, right, op, logical);
44+
}
45+
}

javascript/extractor/src/com/semmle/jcorn/Parser.java

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,21 @@
33
import static com.semmle.jcorn.Whitespace.isNewLine;
44
import static com.semmle.jcorn.Whitespace.lineBreak;
55

6+
import java.io.File;
7+
import java.util.ArrayList;
8+
import java.util.LinkedHashMap;
9+
import java.util.LinkedHashSet;
10+
import java.util.List;
11+
import java.util.Map;
12+
import java.util.Objects;
13+
import java.util.Set;
14+
import java.util.Stack;
15+
import java.util.function.Function;
16+
import java.util.regex.Matcher;
17+
import java.util.regex.Pattern;
18+
619
import com.semmle.jcorn.Identifiers.Dialect;
720
import com.semmle.jcorn.Options.AllowReserved;
8-
import com.semmle.jcorn.TokenType.Properties;
921
import com.semmle.js.ast.ArrayExpression;
1022
import com.semmle.js.ast.ArrayPattern;
1123
import com.semmle.js.ast.ArrowFunctionExpression;
@@ -45,7 +57,6 @@
4557
import com.semmle.js.ast.IPattern;
4658
import com.semmle.js.ast.Identifier;
4759
import com.semmle.js.ast.IfStatement;
48-
import com.semmle.js.ast.FieldDefinition;
4960
import com.semmle.js.ast.ImportDeclaration;
5061
import com.semmle.js.ast.ImportDefaultSpecifier;
5162
import com.semmle.js.ast.ImportNamespaceSpecifier;
@@ -95,18 +106,6 @@
95106
import com.semmle.util.exception.CatastrophicError;
96107
import com.semmle.util.exception.Exceptions;
97108
import com.semmle.util.io.WholeIO;
98-
import java.io.File;
99-
import java.util.ArrayList;
100-
import java.util.LinkedHashMap;
101-
import java.util.LinkedHashSet;
102-
import java.util.List;
103-
import java.util.Map;
104-
import java.util.Objects;
105-
import java.util.Set;
106-
import java.util.Stack;
107-
import java.util.function.Function;
108-
import java.util.regex.Matcher;
109-
import java.util.regex.Pattern;
110109

111110
/**
112111
* Java port of Acorn.
@@ -1462,7 +1461,7 @@ protected Expression parseExprOp(
14621461
return left;
14631462
}
14641463

1465-
private Expression buildBinary(
1464+
protected Expression buildBinary(
14661465
int startPos,
14671466
Position startLoc,
14681467
Expression left,

0 commit comments

Comments
 (0)