Update Binaryen to latest; Various fixes

This commit is contained in:
Daniel Wirtz
2018-10-11 08:49:08 +02:00
committed by GitHub
parent b54a97c0fe
commit f7c734789e
228 changed files with 12372 additions and 14996 deletions

View File

@ -3268,22 +3268,9 @@ export class Parser extends DiagnosticEmitter {
var expr = this.parseExpressionStart(tn);
if (!expr) return null;
expr = this.maybeParseCallExpression(tn, expr); // simple call like on an Identifier
var startPos = expr.range.start;
// CallExpression?
if (nodeIsCallable(expr.kind)) {
let typeArguments: CommonTypeNode[] | null = null;
while (
tn.skip(Token.OPENPAREN)
||
nodeIsGenericCallable(expr.kind) && (typeArguments = this.tryParseTypeArgumentsBeforeArguments(tn)) !== null
) {
let args = this.parseArguments(tn);
if (!args) return null;
expr = Node.createCallExpression(expr, typeArguments, args, tn.range(startPos, tn.pos)); // is again callable
}
}
var token: Token;
var next: Expression | null = null;
var nextPrecedence: Precedence;
@ -3398,28 +3385,15 @@ export class Parser extends DiagnosticEmitter {
// PropertyAccessExpression
if (token == Token.DOT) {
if (next.kind == NodeKind.IDENTIFIER) {
if (next.kind == NodeKind.IDENTIFIER) { // expr '.' Identifier
expr = Node.createPropertyAccessExpression(
expr,
<IdentifierExpression>next,
tn.range(startPos, tn.pos)
);
} else if (next.kind == NodeKind.CALL) { // join
let propertyCall = <CallExpression>next;
if (propertyCall.expression.kind == NodeKind.IDENTIFIER) {
propertyCall.expression = Node.createPropertyAccessExpression(
expr,
<IdentifierExpression>propertyCall.expression,
tn.range(startPos, tn.pos)
);
} else {
this.error(
DiagnosticCode.Identifier_expected,
propertyCall.expression.range
);
return null;
}
expr = propertyCall;
} else if (next.kind == NodeKind.CALL) { // expr '.' CallExpression
expr = this.joinPropertyCall(tn, startPos, expr, <CallExpression>next);
if (!expr) return null;
} else {
this.error(
DiagnosticCode.Identifier_expected,
@ -3435,6 +3409,65 @@ export class Parser extends DiagnosticEmitter {
break;
}
}
expr = this.maybeParseCallExpression(tn, expr); // compound call like on an ElementAccess
}
return expr;
}
private joinPropertyCall(
tn: Tokenizer,
startPos: i32,
expr: Expression,
call: CallExpression
): Expression | null {
var callee = call.expression;
switch (callee.kind) {
case NodeKind.IDENTIFIER: { // join property access and use as call target
call.expression = Node.createPropertyAccessExpression(
expr,
<IdentifierExpression>callee,
tn.range(startPos, tn.pos)
);
break;
}
case NodeKind.CALL: { // join call target und wrap the original call around it
let inner = this.joinPropertyCall(tn, startPos, expr, <CallExpression>callee);
if (!inner) return null;
call.expression = inner;
call.range = tn.range(startPos, tn.pos);
break;
}
default: {
this.error(
DiagnosticCode.Identifier_expected,
call.range
);
return null;
}
}
return call;
}
private maybeParseCallExpression(
tn: Tokenizer,
expr: Expression
): Expression {
if (nodeIsCallable(expr.kind)) {
let typeArguments: CommonTypeNode[] | null = null;
while (
tn.skip(Token.OPENPAREN)
||
nodeIsGenericCallable(expr.kind) && (typeArguments = this.tryParseTypeArgumentsBeforeArguments(tn)) !== null
) {
let args = this.parseArguments(tn);
if (!args) break;
expr = Node.createCallExpression( // is again callable
expr,
typeArguments,
args,
tn.range(expr.range.start, tn.pos)
);
}
}
return expr;
}