Skip to content

Commit

Permalink
Parse import as call expression
Browse files Browse the repository at this point in the history
  • Loading branch information
jedel1043 committed May 18, 2023
1 parent 2499ec6 commit 9a6f89b
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 33 deletions.
26 changes: 3 additions & 23 deletions boa_parser/src/parser/expression/left_hand_side/member.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,13 @@ use crate::{
lexer::{token::ContainsEscapeSequence, InputElement, TokenKind},
parser::{
expression::{
left_hand_side::template::TaggedTemplateLiteral, primary::PrimaryExpression,
AssignmentExpression, Expression,
left_hand_side::template::TaggedTemplateLiteral, primary::PrimaryExpression, Expression,
},
AllowAwait, AllowYield, Cursor, OrAbrupt, ParseResult, TokenParser,
},
Error,
};
use ast::{expression::ImportCall, function::PrivateName};
use ast::function::PrivateName;
use boa_ast::{
self as ast,
expression::{
Expand Down Expand Up @@ -74,7 +73,7 @@ where

let token = cursor.peek(0, interner).or_abrupt()?;
let mut lhs = match token.kind() {
TokenKind::Keyword((Keyword::New | Keyword::Super | Keyword::Import, true)) => {
TokenKind::Keyword((Keyword::New | Keyword::Super, true)) => {
return Err(Error::general(
"keyword must not contain escaped characters",
token.span().start(),
Expand Down Expand Up @@ -172,25 +171,6 @@ where
}
}
}
TokenKind::Keyword((Keyword::Import, false)) => {
cursor.advance(interner);
cursor.expect(
TokenKind::Punctuator(Punctuator::OpenParen),
"import call",
interner,
)?;

let arg = AssignmentExpression::new(None, true, self.allow_yield, self.allow_await)
.parse(cursor, interner)?;

cursor.expect(
TokenKind::Punctuator(Punctuator::CloseParen),
"import call",
interner,
)?;

ImportCall::new(arg).into()
}
_ => PrimaryExpression::new(self.name, self.allow_yield, self.allow_await)
.parse(cursor, interner)?,
};
Expand Down
50 changes: 40 additions & 10 deletions boa_parser/src/parser/expression/left_hand_side/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,16 @@ mod template;
use crate::{
lexer::{InputElement, TokenKind},
parser::{
expression::left_hand_side::{
expression::{left_hand_side::{
arguments::Arguments, call::CallExpression, member::MemberExpression,
optional::OptionalExpression,
},
AllowAwait, AllowYield, Cursor, ParseResult, TokenParser,
}, AssignmentExpression},
AllowAwait, AllowYield, Cursor, OrAbrupt, ParseResult, TokenParser,
},
Error,
};
use boa_ast::{
expression::{Identifier, SuperCall},
expression::{Identifier, SuperCall, ImportCall},
Expression, Keyword, Punctuator,
};
use boa_interner::Interner;
Expand Down Expand Up @@ -96,6 +97,7 @@ where
}
Ok(false)
}

let _timer = Profiler::global().start_event("LeftHandSideExpression", "Parsing");

cursor.set_goal(InputElement::TemplateTail);
Expand All @@ -106,15 +108,43 @@ where
Arguments::new(self.allow_yield, self.allow_await).parse(cursor, interner)?;
SuperCall::new(args).into()
} else {
let mut member = MemberExpression::new(self.name, self.allow_yield, self.allow_await)
.parse(cursor, interner)?;
if let Some(tok) = cursor.peek(0, interner)? {
if tok.kind() == &TokenKind::Punctuator(Punctuator::OpenParen) {
member = CallExpression::new(self.allow_yield, self.allow_await, member)
let next = cursor.peek(0, interner).or_abrupt()?;
if let TokenKind::Keyword((Keyword::Import, escaped)) = next.kind() {
if *escaped {
return Err(Error::general(
"keyword `import` must not contain escaped characters",
next.span().start(),
));
}
cursor.advance(interner);
cursor.expect(
TokenKind::Punctuator(Punctuator::OpenParen),
"import call",
interner,
)?;

let arg = AssignmentExpression::new(None, true, self.allow_yield, self.allow_await)
.parse(cursor, interner)?;

cursor.expect(
TokenKind::Punctuator(Punctuator::CloseParen),
"import call",
interner,
)?;

ImportCall::new(arg).into()
} else {
let mut member =
MemberExpression::new(self.name, self.allow_yield, self.allow_await)
.parse(cursor, interner)?;
if let Some(tok) = cursor.peek(0, interner)? {
if tok.kind() == &TokenKind::Punctuator(Punctuator::OpenParen) {
member = CallExpression::new(self.allow_yield, self.allow_await, member)
.parse(cursor, interner)?;
}
}
member
}
member
};

if let Some(tok) = cursor.peek(0, interner)? {
Expand Down

0 comments on commit 9a6f89b

Please sign in to comment.