Compare commits
6 Commits
9718763664
...
2d2ecb5129
Author | SHA1 | Date |
---|---|---|
|
2d2ecb5129 | |
|
af5717b10c | |
|
4f787665c1 | |
|
ba8ffa0d86 | |
|
8223dccc24 | |
|
6179bebbf0 |
|
@ -1,2 +1 @@
|
|||
/target
|
||||
/Cargo.lock
|
||||
|
|
|
@ -11,6 +11,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||
|
||||
### Changed
|
||||
|
||||
- Option to deduplicate source files during serialization when using `SerdeWrapper`
|
||||
|
||||
### Removed
|
||||
|
||||
## [0.1.0] - 2024-10-01
|
||||
|
|
File diff suppressed because it is too large
Load Diff
22
Cargo.toml
22
Cargo.toml
|
@ -18,28 +18,28 @@ license = "MIT OR Apache-2.0"
|
|||
default = ["fs_access", "lua", "shulkerbox", "zip"]
|
||||
fs_access = ["shulkerbox?/fs_access"]
|
||||
lua = ["dep:mlua"]
|
||||
serde = ["dep:serde", "shulkerbox?/serde"]
|
||||
shulkerbox = ["dep:shulkerbox"]
|
||||
serde = ["dep:serde", "dep:flexbuffers", "shulkerbox?/serde"]
|
||||
shulkerbox = ["dep:shulkerbox", "dep:chksum-md5"]
|
||||
zip = ["shulkerbox?/zip"]
|
||||
|
||||
[target.'cfg(target_arch = "wasm32")'.dependencies]
|
||||
path-absolutize = { version = "3.1.1", features = ["use_unix_paths_on_wasm"] }
|
||||
|
||||
[dependencies]
|
||||
chksum-md5 = "0.0.0"
|
||||
colored = "2.1.0"
|
||||
chksum-md5 = { version = "0.1.0", optional = true }
|
||||
colored = "3.0.0"
|
||||
derive_more = { version = "1.0.0", default-features = false, features = ["deref", "deref_mut", "from"] }
|
||||
enum-as-inner = "0.6.0"
|
||||
flexbuffers = "25.2.10"
|
||||
flexbuffers = { version = "25.2.10", optional = true }
|
||||
getset = "0.1.2"
|
||||
itertools = "0.13.0"
|
||||
mlua = { version = "0.10.0", features = ["lua54", "vendored"], optional = true }
|
||||
itertools = "0.14.0"
|
||||
mlua = { version = "0.10.2", features = ["lua54", "vendored"], optional = true }
|
||||
path-absolutize = "3.1.1"
|
||||
pathdiff = "0.2.2"
|
||||
serde = { version = "1.0.214", features = ["derive", "rc"], optional = true }
|
||||
pathdiff = "0.2.3"
|
||||
serde = { version = "1.0.217", features = ["derive", "rc"], optional = true }
|
||||
shulkerbox = { version = "0.1.0", default-features = false, optional = true }
|
||||
strsim = "0.11.1"
|
||||
strum = { version = "0.26.2", features = ["derive"] }
|
||||
strum_macros = "0.26.4"
|
||||
thiserror = "1.0.65"
|
||||
tracing = "0.1.40"
|
||||
thiserror = "2.0.11"
|
||||
tracing = "0.1.41"
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#![warn(missing_docs, clippy::all, clippy::pedantic)]
|
||||
#![allow(clippy::missing_panics_doc, clippy::missing_const_for_fn)]
|
||||
|
||||
#[cfg(feature = "shulkerbox")]
|
||||
pub use shulkerbox;
|
||||
|
||||
pub mod base;
|
||||
|
|
|
@ -13,7 +13,7 @@ use crate::{
|
|||
syntax::syntax_tree::expression::Expression,
|
||||
};
|
||||
|
||||
use super::transpiler::FunctionData;
|
||||
use super::FunctionData;
|
||||
|
||||
/// Errors that can occur during transpilation.
|
||||
#[allow(clippy::module_name_repetitions, missing_docs)]
|
||||
|
@ -44,6 +44,7 @@ pub struct MissingFunctionDeclaration {
|
|||
}
|
||||
|
||||
impl MissingFunctionDeclaration {
|
||||
#[cfg_attr(not(feature = "shulkerbox"), expect(unused))]
|
||||
pub(super) fn from_context(
|
||||
identifier_span: Span,
|
||||
functions: &BTreeMap<(String, String), FunctionData>,
|
||||
|
|
|
@ -59,9 +59,8 @@ mod enabled {
|
|||
err
|
||||
})?;
|
||||
|
||||
self.handle_lua_result(lua_result).map_err(|err| {
|
||||
self.handle_lua_result(lua_result).inspect_err(|err| {
|
||||
handler.receive(err.clone());
|
||||
err
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
@ -1,9 +1,14 @@
|
|||
//! The transpile module is responsible for transpiling the abstract syntax tree into a data pack.
|
||||
|
||||
use std::collections::HashMap;
|
||||
|
||||
use crate::{base::source_file::Span, syntax::syntax_tree::statement::Statement};
|
||||
|
||||
#[doc(hidden)]
|
||||
#[cfg(feature = "shulkerbox")]
|
||||
pub mod conversions;
|
||||
mod error;
|
||||
|
||||
#[doc(inline)]
|
||||
#[allow(clippy::module_name_repetitions)]
|
||||
pub use error::{TranspileError, TranspileResult};
|
||||
|
@ -11,7 +16,18 @@ pub use error::{TranspileError, TranspileResult};
|
|||
pub mod lua;
|
||||
#[cfg(feature = "shulkerbox")]
|
||||
mod transpiler;
|
||||
#[doc(inline)]
|
||||
#[cfg(feature = "shulkerbox")]
|
||||
#[cfg_attr(feature = "shulkerbox", doc(inline))]
|
||||
pub use transpiler::Transpiler;
|
||||
|
||||
#[cfg(feature = "shulkerbox")]
|
||||
mod util;
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub(super) struct FunctionData {
|
||||
pub(super) namespace: String,
|
||||
pub(super) identifier_span: Span,
|
||||
pub(super) statements: Vec<Statement>,
|
||||
pub(super) public: bool,
|
||||
pub(super) annotations: HashMap<String, Option<String>>,
|
||||
}
|
||||
|
|
|
@ -4,7 +4,6 @@ use chksum_md5 as md5;
|
|||
use std::{
|
||||
collections::{BTreeMap, HashMap},
|
||||
iter,
|
||||
sync::RwLock,
|
||||
};
|
||||
|
||||
use shulkerbox::datapack::{self, Command, Datapack, Execute};
|
||||
|
@ -27,25 +26,21 @@ use crate::{
|
|||
transpile::error::{ConflictingFunctionNames, MissingFunctionDeclaration},
|
||||
};
|
||||
|
||||
use super::error::{TranspileError, TranspileResult, UnexpectedExpression};
|
||||
use super::{
|
||||
error::{TranspileError, TranspileResult, UnexpectedExpression},
|
||||
FunctionData,
|
||||
};
|
||||
|
||||
/// A transpiler for `Shulkerscript`.
|
||||
#[derive(Debug)]
|
||||
pub struct Transpiler {
|
||||
datapack: shulkerbox::datapack::Datapack,
|
||||
/// Key: (program identifier, function name)
|
||||
functions: RwLock<BTreeMap<(String, String), FunctionData>>,
|
||||
function_locations: RwLock<HashMap<(String, String), (String, bool)>>,
|
||||
aliases: RwLock<HashMap<(String, String), (String, String)>>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub(super) struct FunctionData {
|
||||
pub(super) namespace: String,
|
||||
pub(super) identifier_span: Span,
|
||||
pub(super) statements: Vec<Statement>,
|
||||
pub(super) public: bool,
|
||||
pub(super) annotations: HashMap<String, Option<String>>,
|
||||
functions: BTreeMap<(String, String), FunctionData>,
|
||||
/// Key: (program identifier, function name), Value: (function location, public)
|
||||
function_locations: HashMap<(String, String), (String, bool)>,
|
||||
/// Key: alias, Value: target
|
||||
aliases: HashMap<(String, String), (String, String)>,
|
||||
}
|
||||
|
||||
impl Transpiler {
|
||||
|
@ -54,9 +49,9 @@ impl Transpiler {
|
|||
pub fn new(pack_format: u8) -> Self {
|
||||
Self {
|
||||
datapack: shulkerbox::datapack::Datapack::new(pack_format),
|
||||
functions: RwLock::new(BTreeMap::new()),
|
||||
function_locations: RwLock::new(HashMap::new()),
|
||||
aliases: RwLock::new(HashMap::new()),
|
||||
functions: BTreeMap::new(),
|
||||
function_locations: HashMap::new(),
|
||||
aliases: HashMap::new(),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -85,7 +80,7 @@ impl Transpiler {
|
|||
let mut always_transpile_functions = Vec::new();
|
||||
|
||||
{
|
||||
let functions = self.functions.read().unwrap();
|
||||
let functions = &mut self.functions;
|
||||
for (_, data) in functions.iter() {
|
||||
let always_transpile_function = data.annotations.contains_key("tick")
|
||||
|| data.annotations.contains_key("load")
|
||||
|
@ -148,7 +143,7 @@ impl Transpiler {
|
|||
})
|
||||
.collect();
|
||||
#[allow(clippy::significant_drop_tightening)]
|
||||
self.functions.write().unwrap().insert(
|
||||
self.functions.insert(
|
||||
(program_identifier, name),
|
||||
FunctionData {
|
||||
namespace: namespace.namespace_name().str_content().to_string(),
|
||||
|
@ -164,7 +159,7 @@ impl Transpiler {
|
|||
let import_identifier =
|
||||
super::util::calculate_import_identifier(&program_identifier, path);
|
||||
|
||||
let mut aliases = self.aliases.write().unwrap();
|
||||
let aliases = &mut self.aliases;
|
||||
|
||||
match import.items() {
|
||||
ImportItems::All(_) => todo!("Importing all items is not yet supported."),
|
||||
|
@ -215,12 +210,9 @@ impl Transpiler {
|
|||
program_identifier.to_string(),
|
||||
identifier_span.str().to_string(),
|
||||
);
|
||||
let alias_query = {
|
||||
let aliases = self.aliases.read().unwrap();
|
||||
aliases.get(&program_query).cloned()
|
||||
};
|
||||
let alias_query = self.aliases.get(&program_query).cloned();
|
||||
let already_transpiled = {
|
||||
let locations = self.function_locations.read().unwrap();
|
||||
let locations = &self.function_locations;
|
||||
locations
|
||||
.get(&program_query)
|
||||
.or_else(|| {
|
||||
|
@ -234,7 +226,7 @@ impl Transpiler {
|
|||
tracing::trace!("Function not transpiled yet, transpiling.");
|
||||
|
||||
let statements = {
|
||||
let functions = self.functions.read().unwrap();
|
||||
let functions = &self.functions;
|
||||
let function_data = functions
|
||||
.get(&program_query)
|
||||
.or_else(|| {
|
||||
|
@ -246,7 +238,7 @@ impl Transpiler {
|
|||
let error = TranspileError::MissingFunctionDeclaration(
|
||||
MissingFunctionDeclaration::from_context(
|
||||
identifier_span.clone(),
|
||||
&functions,
|
||||
functions,
|
||||
),
|
||||
);
|
||||
handler.receive(error.clone());
|
||||
|
@ -256,7 +248,7 @@ impl Transpiler {
|
|||
};
|
||||
let commands = self.transpile_function(&statements, program_identifier, handler)?;
|
||||
|
||||
let functions = self.functions.read().unwrap();
|
||||
let functions = &self.functions;
|
||||
let function_data = functions
|
||||
.get(&program_query)
|
||||
.or_else(|| {
|
||||
|
@ -268,7 +260,7 @@ impl Transpiler {
|
|||
let error = TranspileError::MissingFunctionDeclaration(
|
||||
MissingFunctionDeclaration::from_context(
|
||||
identifier_span.clone(),
|
||||
&functions,
|
||||
functions,
|
||||
),
|
||||
);
|
||||
handler.receive(error.clone());
|
||||
|
@ -314,7 +306,7 @@ impl Transpiler {
|
|||
self.datapack.add_load(&function_location);
|
||||
}
|
||||
|
||||
self.function_locations.write().unwrap().insert(
|
||||
self.function_locations.insert(
|
||||
(
|
||||
program_identifier.to_string(),
|
||||
identifier_span.str().to_string(),
|
||||
|
@ -323,7 +315,7 @@ impl Transpiler {
|
|||
);
|
||||
}
|
||||
|
||||
let locations = self.function_locations.read().unwrap();
|
||||
let locations = &self.function_locations;
|
||||
locations
|
||||
.get(&program_query)
|
||||
.or_else(|| alias_query.and_then(|q| locations.get(&q).filter(|(_, p)| *p)))
|
||||
|
@ -331,7 +323,7 @@ impl Transpiler {
|
|||
let error = TranspileError::MissingFunctionDeclaration(
|
||||
MissingFunctionDeclaration::from_context(
|
||||
identifier_span.clone(),
|
||||
&self.functions.read().unwrap(),
|
||||
&self.functions,
|
||||
),
|
||||
);
|
||||
handler.receive(error.clone());
|
||||
|
|
Loading…
Reference in New Issue