mirror of
https://github.com/fluencelabs/assemblyscript
synced 2025-06-19 01:41:30 +00:00
Update Binaryen to latest; Various fixes
This commit is contained in:
@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user