Fix merge AST with self-contained AST.

This commit is contained in:
Stephen Chung 2022-05-20 21:49:27 +08:00
parent 8f73796110
commit 46c1d86221
2 changed files with 26 additions and 1 deletions

View File

@ -10,6 +10,7 @@ Bug fixes
* Self-contained `AST` now works properly with `Engine::call_fn`. * Self-contained `AST` now works properly with `Engine::call_fn`.
* Missing `to_int` from `Decimal` is added. * Missing `to_int` from `Decimal` is added.
* Parsing of index expressions is relaxed and many cases no longer result in an index-type error to allow for custom indexers. * Parsing of index expressions is relaxed and many cases no longer result in an index-type error to allow for custom indexers.
* Merging a self-contained `AST` into another `AST` now works properly.
Deprecated API's Deprecated API's
---------------- ----------------

View File

@ -506,7 +506,7 @@ impl AST {
lib lib
}; };
if !other.source.is_empty() { let mut _ast = if !other.source.is_empty() {
Self::new_with_source( Self::new_with_source(
merged, merged,
#[cfg(not(feature = "no_function"))] #[cfg(not(feature = "no_function"))]
@ -519,7 +519,31 @@ impl AST {
#[cfg(not(feature = "no_function"))] #[cfg(not(feature = "no_function"))]
lib, lib,
) )
};
#[cfg(not(feature = "no_module"))]
match (
self.resolver().map_or(0, |r| r.len()),
other.resolver().map_or(0, |r| r.len()),
) {
(0, 0) => (),
(_, 0) => {
_ast.set_resolver(self.resolver().unwrap().clone());
} }
(0, _) => {
_ast.set_resolver(other.resolver().unwrap().clone());
}
(_, _) => {
let mut resolver = (**self.resolver().unwrap()).clone();
let other_resolver = (**other.resolver().unwrap()).clone();
for (k, v) in other_resolver {
resolver.insert(k, crate::func::shared_take_or_clone(v));
}
_ast.set_resolver(resolver);
}
}
_ast
} }
/// Combine one [`AST`] with another. The second [`AST`] is consumed. /// Combine one [`AST`] with another. The second [`AST`] is consumed.
/// ///