[fine] export, dump source map, lookup fix
This commit is contained in:
parent
a3ae4339cf
commit
a21f18da6e
4 changed files with 65 additions and 16 deletions
|
|
@ -41,17 +41,10 @@ impl ModuleLoader for StandardModuleLoader {
|
||||||
let result = match std::fs::canonicalize(&p) {
|
let result = match std::fs::canonicalize(&p) {
|
||||||
Ok(p) => match p.into_os_string().into_string() {
|
Ok(p) => match p.into_os_string().into_string() {
|
||||||
Ok(s) => s,
|
Ok(s) => s,
|
||||||
Err(_e) => {
|
Err(_e) => name.clone(),
|
||||||
eprintln!("ERROR INTO OS STRING: {}", _e.to_string_lossy());
|
|
||||||
name.clone()
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
Err(_e) => {
|
Err(_e) => name.clone(),
|
||||||
eprintln!("ERROR CANONICAL {}: {_e}", p.display());
|
|
||||||
name.clone()
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
eprintln!("**** {source} {name} => {result}");
|
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -167,6 +167,8 @@ pub enum TreeKind {
|
||||||
WildcardPattern,
|
WildcardPattern,
|
||||||
|
|
||||||
Import,
|
Import,
|
||||||
|
Export,
|
||||||
|
ExportList,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Tree {
|
pub struct Tree {
|
||||||
|
|
@ -576,6 +578,7 @@ fn file(p: &mut CParser) {
|
||||||
match p.peek() {
|
match p.peek() {
|
||||||
TokenKind::Import => import(p),
|
TokenKind::Import => import(p),
|
||||||
TokenKind::Class => class(p),
|
TokenKind::Class => class(p),
|
||||||
|
TokenKind::Export => export(p),
|
||||||
TokenKind::RightBrace => {
|
TokenKind::RightBrace => {
|
||||||
// An error parsing mismatched braces can leave me at an
|
// An error parsing mismatched braces can leave me at an
|
||||||
// un-balanced right brace, which unfortunately will not be
|
// un-balanced right brace, which unfortunately will not be
|
||||||
|
|
@ -636,6 +639,36 @@ fn import(p: &mut CParser) {
|
||||||
p.end(m, TreeKind::Import);
|
p.end(m, TreeKind::Import);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn export(p: &mut CParser) {
|
||||||
|
let m = p.start();
|
||||||
|
|
||||||
|
p.expect_start(TokenKind::Export);
|
||||||
|
match p.peek() {
|
||||||
|
TokenKind::Fun => function(p),
|
||||||
|
TokenKind::Let => statement_let(p),
|
||||||
|
TokenKind::Identifier => export_list(p),
|
||||||
|
TokenKind::Semicolon => (),
|
||||||
|
_ => p.error("expected something to export"),
|
||||||
|
}
|
||||||
|
|
||||||
|
p.end(m, TreeKind::Export);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn export_list(p: &mut CParser) {
|
||||||
|
let m = p.start();
|
||||||
|
|
||||||
|
p.expect_start(TokenKind::Identifier);
|
||||||
|
while p.eat(TokenKind::Comma) {
|
||||||
|
p.expect(
|
||||||
|
TokenKind::Identifier,
|
||||||
|
"expected an identifier to export in this export list",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
p.expect(TokenKind::Semicolon, "expected a ; to end the export list");
|
||||||
|
|
||||||
|
p.end(m, TreeKind::ExportList);
|
||||||
|
}
|
||||||
|
|
||||||
fn class(p: &mut CParser) {
|
fn class(p: &mut CParser) {
|
||||||
let m = p.start();
|
let m = p.start();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -163,7 +163,7 @@ pub enum Type {
|
||||||
Alternate(Box<[Type]>),
|
Alternate(Box<[Type]>),
|
||||||
|
|
||||||
// A module of some kind. What module?
|
// A module of some kind. What module?
|
||||||
Module(ImportRecord),
|
Module(Rc<str>, ImportRecord),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Type {
|
impl Type {
|
||||||
|
|
@ -258,7 +258,7 @@ impl fmt::Display for Type {
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
Module(name) => write!(f, "module {}", name.name),
|
Module(name, _) => write!(f, "module {}", name),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2245,9 +2245,9 @@ impl Semantics {
|
||||||
self.internal_compiler_error(None, "import map not initialized");
|
self.internal_compiler_error(None, "import map not initialized");
|
||||||
};
|
};
|
||||||
|
|
||||||
let name = tok.as_str(&self.source);
|
let name = string_constant_to_string(tok.as_str(&self.source));
|
||||||
match import_map.get(name) {
|
match import_map.get(&name) {
|
||||||
Some(import) => Some(Type::Module(import.clone())),
|
Some(import) => Some(Type::Module(name.into(), import.clone())),
|
||||||
None => {
|
None => {
|
||||||
self.report_error_tree(tree, format!("unable to resolve module import {name}"));
|
self.report_error_tree(tree, format!("unable to resolve module import {name}"));
|
||||||
Some(Type::Error)
|
Some(Type::Error)
|
||||||
|
|
@ -2405,6 +2405,21 @@ impl Semantics {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
match self.import_map.get() {
|
||||||
|
Some(m) => {
|
||||||
|
eprintln!("Import map:");
|
||||||
|
for (k, b) in m.iter() {
|
||||||
|
eprintln!(" {k} => {} ({})", b.name, b.module_id);
|
||||||
|
}
|
||||||
|
eprintln!();
|
||||||
|
}
|
||||||
|
None => {
|
||||||
|
eprintln!("The import map is not set.\n")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if let Some(tr) = tr {
|
if let Some(tr) = tr {
|
||||||
eprintln!("This is about the tree: {:?}", &self.syntax_tree[tr]);
|
eprintln!("This is about the tree: {:?}", &self.syntax_tree[tr]);
|
||||||
eprintln!("The logical parent chain of the tree was:\n");
|
eprintln!("The logical parent chain of the tree was:\n");
|
||||||
|
|
@ -2529,6 +2544,9 @@ pub fn check(s: &Semantics) {
|
||||||
TreeKind::Import => {
|
TreeKind::Import => {
|
||||||
let _ = s.type_of(t);
|
let _ = s.type_of(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TreeKind::Export => {}
|
||||||
|
TreeKind::ExportList => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,7 @@ pub enum TokenKind {
|
||||||
Await,
|
Await,
|
||||||
Class,
|
Class,
|
||||||
Else,
|
Else,
|
||||||
|
Export,
|
||||||
False,
|
False,
|
||||||
For,
|
For,
|
||||||
From,
|
From,
|
||||||
|
|
@ -294,6 +295,9 @@ impl<'a> Tokens<'a> {
|
||||||
if ident == "else" {
|
if ident == "else" {
|
||||||
return TokenKind::Else;
|
return TokenKind::Else;
|
||||||
}
|
}
|
||||||
|
if ident == "export" {
|
||||||
|
return TokenKind::Export;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
'f' => {
|
'f' => {
|
||||||
if ident == "false" {
|
if ident == "false" {
|
||||||
|
|
@ -639,12 +643,13 @@ mod tests {
|
||||||
|
|
||||||
test_tokens!(
|
test_tokens!(
|
||||||
more_more_keywords,
|
more_more_keywords,
|
||||||
"in is match _ as",
|
"in is match _ as export",
|
||||||
(0, In, "in"),
|
(0, In, "in"),
|
||||||
(3, Is, "is"),
|
(3, Is, "is"),
|
||||||
(6, Match, "match"),
|
(6, Match, "match"),
|
||||||
(12, Underscore, "_"),
|
(12, Underscore, "_"),
|
||||||
(14, As, "as")
|
(14, As, "as"),
|
||||||
|
(17, Export, "export")
|
||||||
);
|
);
|
||||||
|
|
||||||
test_tokens!(
|
test_tokens!(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue