Compare commits

...

1 Commits

Author SHA1 Message Date
7a7a83c835 path to node progress 2024-01-25 09:53:14 +11:00
5 changed files with 54 additions and 10 deletions

View File

@ -1864,6 +1864,7 @@ dependencies = [
"dashmap", "dashmap",
"databake", "databake",
"derive-docs 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "derive-docs 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
"either",
"expectorate", "expectorate",
"futures", "futures",
"insta", "insta",

View File

@ -32,6 +32,7 @@ thiserror = "1.0.50"
ts-rs = { version = "7", features = ["uuid-impl"] } ts-rs = { version = "7", features = ["uuid-impl"] }
uuid = { version = "1.6.1", features = ["v4", "js", "serde"] } uuid = { version = "1.6.1", features = ["v4", "js", "serde"] }
winnow = "0.5.18" winnow = "0.5.18"
either = "1.6.1"
[target.'cfg(target_arch = "wasm32")'.dependencies] [target.'cfg(target_arch = "wasm32")'.dependencies]
js-sys = { version = "0.3.65" } js-sys = { version = "0.3.65" }

View File

@ -19,6 +19,7 @@ use crate::{
parser::PIPE_OPERATOR, parser::PIPE_OPERATOR,
std::{kcl_stdlib::KclStdLibFn, FunctionKind}, std::{kcl_stdlib::KclStdLibFn, FunctionKind},
}; };
use crate::executor::PathToNode;
mod literal_value; mod literal_value;
mod none; mod none;
@ -1433,6 +1434,7 @@ impl From<Literal> for MemoryItem {
value: JValue::from(literal.value.clone()), value: JValue::from(literal.value.clone()),
meta: vec![Metadata { meta: vec![Metadata {
source_range: literal.into(), source_range: literal.into(),
path_to_node: vec![],
}], }],
}) })
} }
@ -1444,6 +1446,7 @@ impl From<&Box<Literal>> for MemoryItem {
value: JValue::from(literal.value.clone()), value: JValue::from(literal.value.clone()),
meta: vec![Metadata { meta: vec![Metadata {
source_range: literal.into(), source_range: literal.into(),
path_to_node: vec![],
}], }],
}) })
} }
@ -1641,7 +1644,7 @@ impl ArrayExpression {
Value::UnaryExpression(unary_expression) => unary_expression.get_result(memory, pipe_info, ctx).await?, Value::UnaryExpression(unary_expression) => unary_expression.get_result(memory, pipe_info, ctx).await?,
Value::ObjectExpression(object_expression) => object_expression.execute(memory, pipe_info, ctx).await?, Value::ObjectExpression(object_expression) => object_expression.execute(memory, pipe_info, ctx).await?,
Value::ArrayExpression(array_expression) => array_expression.execute(memory, pipe_info, ctx).await?, Value::ArrayExpression(array_expression) => array_expression.execute(memory, pipe_info, ctx).await?,
Value::PipeExpression(pipe_expression) => pipe_expression.get_result(memory, pipe_info, ctx).await?, Value::PipeExpression(pipe_expression) => pipe_expression.get_result(memory, pipe_info, ctx, vec![]).await?,
Value::PipeSubstitution(pipe_substitution) => { Value::PipeSubstitution(pipe_substitution) => {
return Err(KclError::Semantic(KclErrorDetails { return Err(KclError::Semantic(KclErrorDetails {
message: format!("PipeSubstitution not implemented here: {:?}", pipe_substitution), message: format!("PipeSubstitution not implemented here: {:?}", pipe_substitution),
@ -1665,6 +1668,7 @@ impl ArrayExpression {
value: results.into(), value: results.into(),
meta: vec![Metadata { meta: vec![Metadata {
source_range: self.into(), source_range: self.into(),
path_to_node: vec![],
}], }],
})) }))
} }
@ -1794,7 +1798,7 @@ impl ObjectExpression {
Value::UnaryExpression(unary_expression) => unary_expression.get_result(memory, pipe_info, ctx).await?, Value::UnaryExpression(unary_expression) => unary_expression.get_result(memory, pipe_info, ctx).await?,
Value::ObjectExpression(object_expression) => object_expression.execute(memory, pipe_info, ctx).await?, Value::ObjectExpression(object_expression) => object_expression.execute(memory, pipe_info, ctx).await?,
Value::ArrayExpression(array_expression) => array_expression.execute(memory, pipe_info, ctx).await?, Value::ArrayExpression(array_expression) => array_expression.execute(memory, pipe_info, ctx).await?,
Value::PipeExpression(pipe_expression) => pipe_expression.get_result(memory, pipe_info, ctx).await?, Value::PipeExpression(pipe_expression) => pipe_expression.get_result(memory, pipe_info, ctx, vec![]).await?,
Value::PipeSubstitution(pipe_substitution) => { Value::PipeSubstitution(pipe_substitution) => {
return Err(KclError::Semantic(KclErrorDetails { return Err(KclError::Semantic(KclErrorDetails {
message: format!("PipeSubstitution not implemented here: {:?}", pipe_substitution), message: format!("PipeSubstitution not implemented here: {:?}", pipe_substitution),
@ -1822,6 +1826,7 @@ impl ObjectExpression {
value: object.into(), value: object.into(),
meta: vec![Metadata { meta: vec![Metadata {
source_range: self.into(), source_range: self.into(),
path_to_node: vec![],
}], }],
})) }))
} }
@ -2031,6 +2036,7 @@ impl MemberExpression {
value: value.clone(), value: value.clone(),
meta: vec![Metadata { meta: vec![Metadata {
source_range: self.into(), source_range: self.into(),
path_to_node: vec![],
}], }],
})) }))
} else { } else {
@ -2087,6 +2093,7 @@ impl MemberExpression {
value: value.clone(), value: value.clone(),
meta: vec![Metadata { meta: vec![Metadata {
source_range: self.into(), source_range: self.into(),
path_to_node: vec![],
}], }],
})) }))
} else { } else {
@ -2251,6 +2258,7 @@ impl BinaryExpression {
value, value,
meta: vec![Metadata { meta: vec![Metadata {
source_range: self.into(), source_range: self.into(),
path_to_node: vec![],
}], }],
})); }));
} }
@ -2272,6 +2280,7 @@ impl BinaryExpression {
value, value,
meta: vec![Metadata { meta: vec![Metadata {
source_range: self.into(), source_range: self.into(),
path_to_node: vec![],
}], }],
})) }))
} }
@ -2435,6 +2444,7 @@ impl UnaryExpression {
value: (-(num)).into(), value: (-(num)).into(),
meta: vec![Metadata { meta: vec![Metadata {
source_range: self.into(), source_range: self.into(),
path_to_node: vec![],
}], }],
})) }))
} }
@ -2564,11 +2574,12 @@ impl PipeExpression {
memory: &mut ProgramMemory, memory: &mut ProgramMemory,
pipe_info: &mut PipeInfo, pipe_info: &mut PipeInfo,
ctx: &ExecutorContext, ctx: &ExecutorContext,
path_to_node: PathToNode,
) -> Result<MemoryItem, KclError> { ) -> Result<MemoryItem, KclError> {
// Reset the previous results. // Reset the previous results.
pipe_info.previous_results = vec![]; pipe_info.previous_results = vec![];
pipe_info.index = 0; pipe_info.index = 0;
execute_pipe_body(memory, &self.body, pipe_info, self.into(), ctx).await execute_pipe_body(memory, &self.body, pipe_info, self.into(), ctx, path_to_node).await
} }
/// Rename all identifiers that have the old name to the new given name. /// Rename all identifiers that have the old name to the new given name.
@ -2586,6 +2597,8 @@ async fn execute_pipe_body(
pipe_info: &mut PipeInfo, pipe_info: &mut PipeInfo,
source_range: SourceRange, source_range: SourceRange,
ctx: &ExecutorContext, ctx: &ExecutorContext,
path_to_node: PathToNode,
) -> Result<MemoryItem, KclError> { ) -> Result<MemoryItem, KclError> {
if pipe_info.index == body.len() { if pipe_info.index == body.len() {
pipe_info.is_in_pipe = false; pipe_info.is_in_pipe = false;

View File

@ -11,6 +11,7 @@ use schemars::JsonSchema;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use serde_json::Value as JValue; use serde_json::Value as JValue;
use tower_lsp::lsp_types::{Position as LspPosition, Range as LspRange}; use tower_lsp::lsp_types::{Position as LspPosition, Range as LspRange};
// use either::Either;
use crate::{ use crate::{
ast::types::{BodyItem, FunctionExpression, KclNone, Value}, ast::types::{BodyItem, FunctionExpression, KclNone, Value},
@ -632,6 +633,18 @@ impl From<Point3d> for kittycad::types::Point3D {
} }
} }
/// number or string
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)]
#[ts(export)]
pub enum NumberOrString {
Num(i32), // assuming 'number' is equivalent to a 32-bit integer
Str(String),
}
/// PathToNode
pub type PathToNode = Vec<(NumberOrString, String)>;
/// Metadata. /// Metadata.
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)]
#[ts(export)] #[ts(export)]
@ -639,11 +652,16 @@ impl From<Point3d> for kittycad::types::Point3D {
pub struct Metadata { pub struct Metadata {
/// The source range. /// The source range.
pub source_range: SourceRange, pub source_range: SourceRange,
/// The path to node for this memory Item
pub path_to_node: PathToNode,
} }
impl From<SourceRange> for Metadata { impl From<SourceRange> for Metadata {
fn from(source_range: SourceRange) -> Self { fn from(source_range: SourceRange) -> Self {
Self { source_range } Self {
source_range,
path_to_node: Vec::new()
}
} }
} }
@ -829,12 +847,17 @@ pub async fn execute(
) -> Result<ProgramMemory, KclError> { ) -> Result<ProgramMemory, KclError> {
let mut pipe_info = PipeInfo::default(); let mut pipe_info = PipeInfo::default();
// let path_to_Node: PathToNode = vec![("body".to_string(), "".to_string())];
let path_to_node: PathToNode = vec![(NumberOrString::Str("body".to_string()), "".to_string())];
// Iterate over the body of the program. // Iterate over the body of the program.
for statement in &program.body { for (index, statement) in program.body.iter().enumerate() {
let mut with_body_path_to_node = path_to_node.clone();
with_body_path_to_node.push((NumberOrString::Num(index as i32), "index".to_string()));
match statement { match statement {
BodyItem::ExpressionStatement(expression_statement) => { BodyItem::ExpressionStatement(expression_statement) => {
if let Value::PipeExpression(pipe_expr) = &expression_statement.expression { if let Value::PipeExpression(pipe_expr) = &expression_statement.expression {
pipe_expr.get_result(memory, &mut pipe_info, ctx).await?; pipe_expr.get_result(memory, &mut pipe_info, ctx, with_body_path_to_node).await?;
} else if let Value::CallExpression(call_expr) = &expression_statement.expression { } else if let Value::CallExpression(call_expr) = &expression_statement.expression {
let fn_name = call_expr.callee.name.to_string(); let fn_name = call_expr.callee.name.to_string();
let mut args: Vec<MemoryItem> = Vec::new(); let mut args: Vec<MemoryItem> = Vec::new();
@ -905,10 +928,15 @@ pub async fn execute(
} }
} }
BodyItem::VariableDeclaration(variable_declaration) => { BodyItem::VariableDeclaration(variable_declaration) => {
for declaration in &variable_declaration.declarations {
for (index, declaration) in variable_declaration.declarations.iter().enumerate() {
let var_name = declaration.id.name.to_string(); let var_name = declaration.id.name.to_string();
let source_range: SourceRange = declaration.init.clone().into(); let source_range: SourceRange = declaration.init.clone().into();
let metadata = Metadata { source_range }; let mut with_dec_path_to_node = with_body_path_to_node.clone();
with_dec_path_to_node.push((NumberOrString::Str("declarations".to_string()), "VariableDeclaration".to_string()));
with_dec_path_to_node.push((NumberOrString::Num(index as i32), "index".to_string()));
with_dec_path_to_node.push((NumberOrString::Str("init".to_string()), "".to_string()));
let metadata = Metadata { source_range, path_to_node: with_dec_path_to_node.clone() };
match &declaration.init { match &declaration.init {
Value::None(none) => { Value::None(none) => {
@ -963,7 +991,7 @@ pub async fn execute(
memory.add(&var_name, result, source_range)?; memory.add(&var_name, result, source_range)?;
} }
Value::PipeExpression(pipe_expression) => { Value::PipeExpression(pipe_expression) => {
let result = pipe_expression.get_result(memory, &mut pipe_info, ctx).await?; let result = pipe_expression.get_result(memory, &mut pipe_info, ctx, with_dec_path_to_node).await?;
memory.add(&var_name, result, source_range)?; memory.add(&var_name, result, source_range)?;
} }
Value::PipeSubstitution(pipe_substitution) => { Value::PipeSubstitution(pipe_substitution) => {
@ -1027,7 +1055,7 @@ pub async fn execute(
memory.return_ = Some(ProgramReturn::Value(result)); memory.return_ = Some(ProgramReturn::Value(result));
} }
Value::PipeExpression(pipe_expr) => { Value::PipeExpression(pipe_expr) => {
let result = pipe_expr.get_result(memory, &mut pipe_info, ctx).await?; let result = pipe_expr.get_result(memory, &mut pipe_info, ctx, with_body_path_to_node).await?;
memory.return_ = Some(ProgramReturn::Value(result)); memory.return_ = Some(ProgramReturn::Value(result));
} }
Value::PipeSubstitution(_) => {} Value::PipeSubstitution(_) => {}

View File

@ -190,6 +190,7 @@ impl Args {
value: j, value: j,
meta: vec![Metadata { meta: vec![Metadata {
source_range: self.source_range, source_range: self.source_range,
path_to_node: Vec::new()
}], }],
})) }))
} }