Pass SourceMapHandle to SymbolTable
This commit is contained in:
parent
82520aa28d
commit
7495f30e16
@ -3,13 +3,15 @@
|
|||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
|
||||||
|
use crate::source_map::SourceMap;
|
||||||
use crate::symbol_table::SymbolTable;
|
use crate::symbol_table::SymbolTable;
|
||||||
use crate::scope_resolution::ScopeResolver;
|
use crate::scope_resolution::ScopeResolver;
|
||||||
use crate::reduced_ast::reduce;
|
use crate::reduced_ast::reduce;
|
||||||
use crate::eval::State;
|
use crate::eval::State;
|
||||||
|
|
||||||
fn evaluate_all_outputs(input: &str) -> Vec<Result<String, String>> {
|
fn evaluate_all_outputs(input: &str) -> Vec<Result<String, String>> {
|
||||||
let symbol_table = Rc::new(RefCell::new(SymbolTable::new()));
|
let source_map = Rc::new(RefCell::new(SourceMap::new()));
|
||||||
|
let symbol_table = Rc::new(RefCell::new(SymbolTable::new(source_map)));
|
||||||
let mut state = State::new(symbol_table);
|
let mut state = State::new(symbol_table);
|
||||||
let mut ast = crate::util::quick_ast(input);
|
let mut ast = crate::util::quick_ast(input);
|
||||||
state.symbol_table_handle.borrow_mut().add_top_level_symbols(&ast).unwrap();
|
state.symbol_table_handle.borrow_mut().add_top_level_symbols(&ast).unwrap();
|
||||||
|
@ -10,17 +10,19 @@ use schala_repl::{ProgrammingLanguageInterface,
|
|||||||
ComputationRequest, ComputationResponse,
|
ComputationRequest, ComputationResponse,
|
||||||
LangMetaRequest, LangMetaResponse, GlobalOutputStats,
|
LangMetaRequest, LangMetaResponse, GlobalOutputStats,
|
||||||
DebugResponse, DebugAsk};
|
DebugResponse, DebugAsk};
|
||||||
use crate::{ast, reduced_ast, tokenizing, parsing, eval, typechecking, symbol_table};
|
use crate::{ast, reduced_ast, tokenizing, parsing, eval, typechecking, symbol_table, source_map};
|
||||||
|
|
||||||
pub type SymbolTableHandle = Rc<RefCell<symbol_table::SymbolTable>>;
|
pub type SymbolTableHandle = Rc<RefCell<symbol_table::SymbolTable>>;
|
||||||
|
pub type SourceMapHandle = Rc<RefCell<source_map::SourceMap>>;
|
||||||
|
|
||||||
/// All the state necessary to parse and execute a Schala program are stored in this struct.
|
/// All the state necessary to parse and execute a Schala program are stored in this struct.
|
||||||
/// `state` represents the execution state for the AST-walking interpreter, the other fields
|
/// `state` represents the execution state for the AST-walking interpreter, the other fields
|
||||||
/// should be self-explanatory.
|
/// should be self-explanatory.
|
||||||
pub struct Schala {
|
pub struct Schala {
|
||||||
source_reference: SourceReference,
|
source_reference: SourceReference,
|
||||||
|
source_map: SourceMapHandle,
|
||||||
state: eval::State<'static>,
|
state: eval::State<'static>,
|
||||||
symbol_table: Rc<RefCell<symbol_table::SymbolTable>>,
|
symbol_table: SymbolTableHandle,
|
||||||
resolver: crate::scope_resolution::ScopeResolver<'static>,
|
resolver: crate::scope_resolution::ScopeResolver<'static>,
|
||||||
type_context: typechecking::TypeContext<'static>,
|
type_context: typechecking::TypeContext<'static>,
|
||||||
active_parser: Option<parsing::Parser>,
|
active_parser: Option<parsing::Parser>,
|
||||||
@ -37,10 +39,13 @@ impl Schala {
|
|||||||
impl Schala {
|
impl Schala {
|
||||||
/// Creates a new Schala environment *without* any prelude.
|
/// Creates a new Schala environment *without* any prelude.
|
||||||
fn new_blank_env() -> Schala {
|
fn new_blank_env() -> Schala {
|
||||||
let symbols = Rc::new(RefCell::new(symbol_table::SymbolTable::new()));
|
let source_map = Rc::new(RefCell::new(source_map::SourceMap::new()));
|
||||||
|
let symbols = Rc::new(RefCell::new(symbol_table::SymbolTable::new(source_map.clone())));
|
||||||
Schala {
|
Schala {
|
||||||
|
//TODO maybe these can be the same structure
|
||||||
source_reference: SourceReference::new(),
|
source_reference: SourceReference::new(),
|
||||||
symbol_table: symbols.clone(),
|
symbol_table: symbols.clone(),
|
||||||
|
source_map: source_map.clone(),
|
||||||
resolver: crate::scope_resolution::ScopeResolver::new(symbols.clone()),
|
resolver: crate::scope_resolution::ScopeResolver::new(symbols.clone()),
|
||||||
state: eval::State::new(symbols),
|
state: eval::State::new(symbols),
|
||||||
type_context: typechecking::TypeContext::new(),
|
type_context: typechecking::TypeContext::new(),
|
||||||
|
@ -4,6 +4,7 @@ use std::rc::Rc;
|
|||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::fmt::Write;
|
use std::fmt::Write;
|
||||||
|
|
||||||
|
use crate::schala::SourceMapHandle;
|
||||||
use crate::ast;
|
use crate::ast;
|
||||||
use crate::ast::{ItemId, TypeBody, TypeSingletonName, Signature, Statement, StatementKind};
|
use crate::ast::{ItemId, TypeBody, TypeSingletonName, Signature, Statement, StatementKind};
|
||||||
use crate::typechecking::TypeName;
|
use crate::typechecking::TypeName;
|
||||||
@ -63,14 +64,16 @@ impl ScopeSegment {
|
|||||||
|
|
||||||
//cf. p. 150 or so of Language Implementation Patterns
|
//cf. p. 150 or so of Language Implementation Patterns
|
||||||
pub struct SymbolTable {
|
pub struct SymbolTable {
|
||||||
|
source_map_handle: SourceMapHandle,
|
||||||
symbol_path_to_symbol: HashMap<FullyQualifiedSymbolName, Symbol>,
|
symbol_path_to_symbol: HashMap<FullyQualifiedSymbolName, Symbol>,
|
||||||
id_to_fqsn: HashMap<ItemId, FullyQualifiedSymbolName>,
|
id_to_fqsn: HashMap<ItemId, FullyQualifiedSymbolName>,
|
||||||
symbol_trie: SymbolTrie,
|
symbol_trie: SymbolTrie,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SymbolTable {
|
impl SymbolTable {
|
||||||
pub fn new() -> SymbolTable {
|
pub fn new(source_map_handle: SourceMapHandle) -> SymbolTable {
|
||||||
SymbolTable {
|
SymbolTable {
|
||||||
|
source_map_handle,
|
||||||
symbol_path_to_symbol: HashMap::new(),
|
symbol_path_to_symbol: HashMap::new(),
|
||||||
id_to_fqsn: HashMap::new(),
|
id_to_fqsn: HashMap::new(),
|
||||||
symbol_trie: SymbolTrie::new()
|
symbol_trie: SymbolTrie::new()
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
#![cfg(test)]
|
#![cfg(test)]
|
||||||
|
use std::cell::RefCell;
|
||||||
|
use std::rc::Rc;
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::util::quick_ast;
|
use crate::util::quick_ast;
|
||||||
|
use crate::source_map;
|
||||||
|
|
||||||
macro_rules! values_in_table {
|
macro_rules! values_in_table {
|
||||||
($source:literal, $single_value:expr) => {
|
($source:literal, $single_value:expr) => {
|
||||||
@ -9,7 +12,8 @@ macro_rules! values_in_table {
|
|||||||
};
|
};
|
||||||
($source:literal | $( $value:expr ),* ) => {
|
($source:literal | $( $value:expr ),* ) => {
|
||||||
{
|
{
|
||||||
let mut symbol_table = SymbolTable::new();
|
let source_map = Rc::new(RefCell::new(source_map::SourceMap::new()));
|
||||||
|
let mut symbol_table = SymbolTable::new(source_map);
|
||||||
let ast = quick_ast($source);
|
let ast = quick_ast($source);
|
||||||
symbol_table.add_top_level_symbols(&ast).unwrap();
|
symbol_table.add_top_level_symbols(&ast).unwrap();
|
||||||
$(
|
$(
|
||||||
@ -38,7 +42,8 @@ fn no_duplicates() {
|
|||||||
fn b() { 2 }
|
fn b() { 2 }
|
||||||
fn a() { 3 }
|
fn a() { 3 }
|
||||||
"#;
|
"#;
|
||||||
let mut symbol_table = SymbolTable::new();
|
let source_map = Rc::new(RefCell::new(source_map::SourceMap::new()));
|
||||||
|
let mut symbol_table = SymbolTable::new(source_map);
|
||||||
let ast = quick_ast(source);
|
let ast = quick_ast(source);
|
||||||
let output = symbol_table.add_top_level_symbols(&ast).unwrap_err();
|
let output = symbol_table.add_top_level_symbols(&ast).unwrap_err();
|
||||||
println!("OUTPUT: {}", output);
|
println!("OUTPUT: {}", output);
|
||||||
@ -52,7 +57,8 @@ fn no_duplicates_2() {
|
|||||||
let q = 39;
|
let q = 39;
|
||||||
let a = 30;
|
let a = 30;
|
||||||
"#;
|
"#;
|
||||||
let mut symbol_table = SymbolTable::new();
|
let source_map = Rc::new(RefCell::new(source_map::SourceMap::new()));
|
||||||
|
let mut symbol_table = SymbolTable::new(source_map);
|
||||||
let ast = quick_ast(source);
|
let ast = quick_ast(source);
|
||||||
let output = symbol_table.add_top_level_symbols(&ast).unwrap_err();
|
let output = symbol_table.add_top_level_symbols(&ast).unwrap_err();
|
||||||
assert!(output.contains("Duplicate"));
|
assert!(output.contains("Duplicate"));
|
||||||
@ -73,7 +79,8 @@ fn no_duplicates_3() {
|
|||||||
let x = 33
|
let x = 33
|
||||||
}
|
}
|
||||||
"#;
|
"#;
|
||||||
let mut symbol_table = SymbolTable::new();
|
let source_map = Rc::new(RefCell::new(source_map::SourceMap::new()));
|
||||||
|
let mut symbol_table = SymbolTable::new(source_map);
|
||||||
let ast = quick_ast(source);
|
let ast = quick_ast(source);
|
||||||
let output = symbol_table.add_top_level_symbols(&ast).unwrap_err();
|
let output = symbol_table.add_top_level_symbols(&ast).unwrap_err();
|
||||||
assert!(output.contains("Duplicate"))
|
assert!(output.contains("Duplicate"))
|
||||||
@ -89,7 +96,8 @@ fn dont_falsely_detect_duplicates() {
|
|||||||
}
|
}
|
||||||
let q = 39;
|
let q = 39;
|
||||||
"#;
|
"#;
|
||||||
let mut symbol_table = SymbolTable::new();
|
let source_map = Rc::new(RefCell::new(source_map::SourceMap::new()));
|
||||||
|
let mut symbol_table = SymbolTable::new(source_map);
|
||||||
let ast = quick_ast(source);
|
let ast = quick_ast(source);
|
||||||
symbol_table.add_top_level_symbols(&ast).unwrap();
|
symbol_table.add_top_level_symbols(&ast).unwrap();
|
||||||
assert!(symbol_table.lookup_by_fqsn(&fqsn!["a"; tr]).is_some());
|
assert!(symbol_table.lookup_by_fqsn(&fqsn!["a"; tr]).is_some());
|
||||||
@ -105,7 +113,8 @@ fn inner_func(arg) {
|
|||||||
}
|
}
|
||||||
x + inner_func(x)
|
x + inner_func(x)
|
||||||
}"#;
|
}"#;
|
||||||
let mut symbol_table = SymbolTable::new();
|
let source_map = Rc::new(RefCell::new(source_map::SourceMap::new()));
|
||||||
|
let mut symbol_table = SymbolTable::new(source_map);
|
||||||
let ast = quick_ast(source);
|
let ast = quick_ast(source);
|
||||||
symbol_table.add_top_level_symbols(&ast).unwrap();
|
symbol_table.add_top_level_symbols(&ast).unwrap();
|
||||||
assert!(symbol_table.lookup_by_fqsn(&fqsn!("outer_func"; tr)).is_some());
|
assert!(symbol_table.lookup_by_fqsn(&fqsn!("outer_func"; tr)).is_some());
|
||||||
@ -127,7 +136,8 @@ fn second_inner_func() {
|
|||||||
|
|
||||||
inner_func(x)
|
inner_func(x)
|
||||||
}"#;
|
}"#;
|
||||||
let mut symbol_table = SymbolTable::new();
|
let source_map = Rc::new(RefCell::new(source_map::SourceMap::new()));
|
||||||
|
let mut symbol_table = SymbolTable::new(source_map);
|
||||||
let ast = quick_ast(source);
|
let ast = quick_ast(source);
|
||||||
symbol_table.add_top_level_symbols(&ast).unwrap();
|
symbol_table.add_top_level_symbols(&ast).unwrap();
|
||||||
assert!(symbol_table.lookup_by_fqsn(&fqsn!("outer_func"; tr)).is_some());
|
assert!(symbol_table.lookup_by_fqsn(&fqsn!("outer_func"; tr)).is_some());
|
||||||
@ -153,7 +163,8 @@ fn second_inner_func() {
|
|||||||
|
|
||||||
inner_func(x)
|
inner_func(x)
|
||||||
}"#;
|
}"#;
|
||||||
let mut symbol_table = SymbolTable::new();
|
let source_map = Rc::new(RefCell::new(source_map::SourceMap::new()));
|
||||||
|
let mut symbol_table = SymbolTable::new(source_map);
|
||||||
let ast = quick_ast(source);
|
let ast = quick_ast(source);
|
||||||
let output = symbol_table.add_top_level_symbols(&ast).unwrap_err();
|
let output = symbol_table.add_top_level_symbols(&ast).unwrap_err();
|
||||||
assert!(output.contains("Duplicate"))
|
assert!(output.contains("Duplicate"))
|
||||||
|
Loading…
Reference in New Issue
Block a user