From d114ab798ce7dfe8aa645e6783902c6e41389def Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Tue, 28 Jan 2025 15:43:39 -0800 Subject: [PATCH 1/5] fix subdirs (opening kcl-samples from kcl-samples dir) (#5171) * WIP: Add the KCL file path into the executor * reuse the stuff that works with settings.project_directory Signed-off-by: Jess Frazelle * fixes on both sides Signed-off-by: Jess Frazelle * fixes on both sides Signed-off-by: Jess Frazelle * helper method Signed-off-by: Jess Frazelle * fixes Signed-off-by: Jess Frazelle * update kcl-samples tests to not change dirs Signed-off-by: Jess Frazelle * update kcl-samples tests to not change dirs Signed-off-by: Jess Frazelle * fmt Signed-off-by: Jess Frazelle --------- Signed-off-by: Jess Frazelle Co-authored-by: Jonathan Tran --- src/lang/KclSingleton.ts | 1 + src/lang/codeManager.ts | 4 ++ src/lang/kclSamples.test.ts | 29 +++++------ src/lang/langHelpers.ts | 6 ++- src/lang/std/fileSystemManager.ts | 3 ++ src/lang/wasm.ts | 11 ++++ src/lib/testHelpers.ts | 5 +- src/wasm-lib/kcl/src/execution/mod.rs | 50 ++++++++++++++++--- src/wasm-lib/kcl/src/simulation_tests.rs | 2 +- src/wasm-lib/kcl/src/test_server.rs | 42 ++++++++-------- .../tests/import_cycle1/execution_error.snap | 3 +- src/wasm-lib/src/wasm.rs | 12 +++-- 12 files changed, 116 insertions(+), 52 deletions(-) diff --git a/src/lang/KclSingleton.ts b/src/lang/KclSingleton.ts index 07f282b2b..e4e6193be 100644 --- a/src/lang/KclSingleton.ts +++ b/src/lang/KclSingleton.ts @@ -322,6 +322,7 @@ export class KclManager { await this.ensureWasmInit() const { logs, errors, execState, isInterrupted } = await executeAst({ ast, + path: codeManager.currentFilePath || undefined, engineCommandManager: this.engineCommandManager, }) diff --git a/src/lang/codeManager.ts b/src/lang/codeManager.ts index 257df317a..7f240891c 100644 --- a/src/lang/codeManager.ts +++ b/src/lang/codeManager.ts @@ -80,6 +80,10 @@ export default class CodeManager { })) } + get currentFilePath(): string | null { + return this._currentFilePath + } + updateCurrentFilePath(path: string) { this._currentFilePath = path } diff --git a/src/lang/kclSamples.test.ts b/src/lang/kclSamples.test.ts index d08c4fcc8..d3017707c 100644 --- a/src/lang/kclSamples.test.ts +++ b/src/lang/kclSamples.test.ts @@ -52,27 +52,22 @@ afterAll(async () => { } catch (e) {} }) -afterEach(() => { - process.chdir('..') -}) - -// The tests have to be sequential because we need to change directories -// to support `import` working properly. -// @ts-expect-error -describe.sequential('Test KCL Samples from public Github repository', () => { - // @ts-expect-error - describe.sequential('when performing enginelessExecutor', () => { +describe('Test KCL Samples from public Github repository', () => { + describe('when performing enginelessExecutor', () => { manifest.forEach((file: KclSampleFile) => { - // @ts-expect-error - it.sequential( + it( `should execute ${file.title} (${file.file}) successfully`, async () => { - const [dirProject, fileKcl] = - file.pathFromProjectDirectoryToFirstFile.split('/') - process.chdir(dirProject) - const code = await fs.readFile(fileKcl, 'utf-8') + const code = await fs.readFile( + file.pathFromProjectDirectoryToFirstFile, + 'utf-8' + ) const ast = assertParse(code) - await enginelessExecutor(ast, programMemoryInit()) + await enginelessExecutor( + ast, + programMemoryInit(), + file.pathFromProjectDirectoryToFirstFile + ) }, files.length * 1000 ) diff --git a/src/lang/langHelpers.ts b/src/lang/langHelpers.ts index 96f9e91bc..81d6dc71b 100644 --- a/src/lang/langHelpers.ts +++ b/src/lang/langHelpers.ts @@ -46,12 +46,14 @@ export const toolTips: Array = [ export async function executeAst({ ast, + path, engineCommandManager, // If you set programMemoryOverride we assume you mean mock mode. Since that // is the only way to go about it. programMemoryOverride, }: { ast: Node + path?: string engineCommandManager: EngineCommandManager programMemoryOverride?: ProgramMemory isInterrupted?: boolean @@ -63,8 +65,8 @@ export async function executeAst({ }> { try { const execState = await (programMemoryOverride - ? enginelessExecutor(ast, programMemoryOverride) - : executor(ast, engineCommandManager)) + ? enginelessExecutor(ast, programMemoryOverride, path) + : executor(ast, engineCommandManager, path)) await engineCommandManager.waitForAllCommands() diff --git a/src/lang/std/fileSystemManager.ts b/src/lang/std/fileSystemManager.ts index 7918741d1..d2cc01db8 100644 --- a/src/lang/std/fileSystemManager.ts +++ b/src/lang/std/fileSystemManager.ts @@ -31,6 +31,9 @@ class FileSystemManager { } async join(dir: string, path: string): Promise { + if (path.startsWith(dir)) { + path = path.slice(dir.length) + } return Promise.resolve(window.electron.path.join(dir, path)) } diff --git a/src/lang/wasm.ts b/src/lang/wasm.ts index cdb5764de..0b21b4ac9 100644 --- a/src/lang/wasm.ts +++ b/src/lang/wasm.ts @@ -566,9 +566,19 @@ export function sketchFromKclValue( return result } +/** + * Execute a KCL program. + * @param node The AST of the program to execute. + * @param path The full path of the file being executed. Use `null` for + * expressions that don't have a file, like expressions in the command bar. + * @param programMemoryOverride If this is not `null`, this will be used as the + * initial program memory, and the execution will be engineless (AKA mock + * execution). + */ export const executor = async ( node: Node, engineCommandManager: EngineCommandManager, + path?: string, programMemoryOverride: ProgramMemory | Error | null = null ): Promise => { if (programMemoryOverride !== null && err(programMemoryOverride)) @@ -590,6 +600,7 @@ export const executor = async ( } const execOutcome: RustExecOutcome = await execute( JSON.stringify(node), + path, JSON.stringify(programMemoryOverride?.toRaw() || null), JSON.stringify({ settings: jsAppSettings }), engineCommandManager, diff --git a/src/lib/testHelpers.ts b/src/lib/testHelpers.ts index 720bceec2..8f079e808 100644 --- a/src/lib/testHelpers.ts +++ b/src/lib/testHelpers.ts @@ -80,7 +80,8 @@ class MockEngineCommandManager { export async function enginelessExecutor( ast: Node, - pmo: ProgramMemory | Error = ProgramMemory.empty() + pmo: ProgramMemory | Error = ProgramMemory.empty(), + path?: string ): Promise { if (pmo !== null && err(pmo)) return Promise.reject(pmo) @@ -90,7 +91,7 @@ export async function enginelessExecutor( }) as any as EngineCommandManager // eslint-disable-next-line @typescript-eslint/no-floating-promises mockEngineCommandManager.startNewSession() - const execState = await executor(ast, mockEngineCommandManager, pmo) + const execState = await executor(ast, mockEngineCommandManager, path, pmo) await mockEngineCommandManager.waitForAllCommands() return execState } diff --git a/src/wasm-lib/kcl/src/execution/mod.rs b/src/wasm-lib/kcl/src/execution/mod.rs index 6ff5b1926..66db93ba9 100644 --- a/src/wasm-lib/kcl/src/execution/mod.rs +++ b/src/wasm-lib/kcl/src/execution/mod.rs @@ -131,7 +131,7 @@ pub struct ExecOutcome { impl ExecState { pub fn new(exec_settings: &ExecutorSettings) -> Self { ExecState { - global: GlobalState::new(), + global: GlobalState::new(exec_settings), mod_local: ModuleState::new(exec_settings), } } @@ -142,7 +142,7 @@ impl ExecState { // This is for the front end to keep track of the ids. id_generator.next_id = 0; - let mut global = GlobalState::new(); + let mut global = GlobalState::new(exec_settings); global.id_generator = id_generator; *self = ExecState { @@ -204,7 +204,7 @@ impl ExecState { } impl GlobalState { - fn new() -> Self { + fn new(settings: &ExecutorSettings) -> Self { let mut global = GlobalState { id_generator: Default::default(), path_to_source_id: Default::default(), @@ -215,9 +215,8 @@ impl GlobalState { artifact_graph: Default::default(), }; - // TODO(#4434): Use the top-level file's path. - let root_path = PathBuf::new(); let root_id = ModuleId::default(); + let root_path = settings.current_file.clone().unwrap_or_default(); global.module_infos.insert( root_id, ModuleInfo { @@ -1752,6 +1751,9 @@ pub struct ExecutorSettings { /// The directory of the current project. This is used for resolving import /// paths. If None is given, the current working directory is used. pub project_directory: Option, + /// This is the path to the current file being executed. + /// We use this for preventing cyclic imports. + pub current_file: Option, } impl Default for ExecutorSettings { @@ -1763,6 +1765,7 @@ impl Default for ExecutorSettings { show_grid: false, replay: None, project_directory: None, + current_file: None, } } } @@ -1776,6 +1779,7 @@ impl From for ExecutorSettings { show_grid: config.settings.modeling.show_scale_grid, replay: None, project_directory: None, + current_file: None, } } } @@ -1789,6 +1793,7 @@ impl From for ExecutorSet show_grid: config.settings.modeling.show_scale_grid, replay: None, project_directory: None, + current_file: None, } } } @@ -1802,6 +1807,25 @@ impl From for ExecutorSettings { show_grid: modeling.show_scale_grid, replay: None, project_directory: None, + current_file: None, + } + } +} + +impl ExecutorSettings { + /// Add the current file path to the executor settings. + pub fn with_current_file(&mut self, current_file: PathBuf) { + // We want the parent directory of the file. + if current_file.extension() == Some(std::ffi::OsStr::new("kcl")) { + self.current_file = Some(current_file.clone()); + // Get the parent directory. + if let Some(parent) = current_file.parent() { + self.project_directory = Some(parent.to_path_buf()); + } else { + self.project_directory = Some(std::path::PathBuf::from("")); + } + } else { + self.project_directory = Some(current_file.clone()); } } } @@ -2019,6 +2043,7 @@ impl ExecutorContext { show_grid: false, replay: None, project_directory: None, + current_file: None, }, None, engine_addr, @@ -2578,7 +2603,20 @@ impl ExecutorContext { let info = exec_state.global.module_infos[&module_id].clone(); match &info.repr { - ModuleRepr::Root => unreachable!(), + ModuleRepr::Root => Err(KclError::ImportCycle(KclErrorDetails { + message: format!( + "circular import of modules is not allowed: {} -> {}", + exec_state + .mod_local + .import_stack + .iter() + .map(|p| p.as_path().to_string_lossy()) + .collect::>() + .join(" -> "), + info.path.display() + ), + source_ranges: vec![source_range], + })), ModuleRepr::Kcl(program) => { let mut local_state = ModuleState { import_stack: exec_state.mod_local.import_stack.clone(), diff --git a/src/wasm-lib/kcl/src/simulation_tests.rs b/src/wasm-lib/kcl/src/simulation_tests.rs index 6908c35c3..1de0fc41e 100644 --- a/src/wasm-lib/kcl/src/simulation_tests.rs +++ b/src/wasm-lib/kcl/src/simulation_tests.rs @@ -87,7 +87,7 @@ async fn execute(test_name: &str, render_to_png: bool) { let exec_res = crate::test_server::execute_and_snapshot_ast( ast.into(), crate::settings::types::UnitLength::Mm, - Some(Path::new("tests").join(test_name)), + Some(Path::new("tests").join(test_name).join("input.kcl").to_owned()), ) .await; match exec_res { diff --git a/src/wasm-lib/kcl/src/test_server.rs b/src/wasm-lib/kcl/src/test_server.rs index 463552ed3..733933ed0 100644 --- a/src/wasm-lib/kcl/src/test_server.rs +++ b/src/wasm-lib/kcl/src/test_server.rs @@ -21,9 +21,9 @@ pub struct RequestBody { pub async fn execute_and_snapshot( code: &str, units: UnitLength, - project_directory: Option, + current_file: Option, ) -> Result { - let ctx = new_context(units, true, project_directory).await?; + let ctx = new_context(units, true, current_file).await?; let program = Program::parse_no_errs(code).map_err(KclErrorWithOutputs::no_outputs)?; let res = do_execute_and_snapshot(&ctx, program) .await @@ -38,9 +38,9 @@ pub async fn execute_and_snapshot( pub async fn execute_and_snapshot_ast( ast: Program, units: UnitLength, - project_directory: Option, + current_file: Option, ) -> Result<(ExecState, image::DynamicImage), ExecErrorWithState> { - let ctx = new_context(units, true, project_directory).await?; + let ctx = new_context(units, true, current_file).await?; let res = do_execute_and_snapshot(&ctx, ast).await; ctx.close().await; res @@ -49,9 +49,9 @@ pub async fn execute_and_snapshot_ast( pub async fn execute_and_snapshot_no_auth( code: &str, units: UnitLength, - project_directory: Option, + current_file: Option, ) -> Result { - let ctx = new_context(units, false, project_directory).await?; + let ctx = new_context(units, false, current_file).await?; let program = Program::parse_no_errs(code).map_err(KclErrorWithOutputs::no_outputs)?; let res = do_execute_and_snapshot(&ctx, program) .await @@ -88,7 +88,7 @@ async fn do_execute_and_snapshot( pub async fn new_context( units: UnitLength, with_auth: bool, - project_directory: Option, + current_file: Option, ) -> Result { let mut client = new_zoo_client(if with_auth { None } else { Some("bad_token".to_string()) }, None) .map_err(ConnectionError::CouldNotMakeClient)?; @@ -99,18 +99,20 @@ pub async fn new_context( client.set_base_url("https://api.zoo.dev".to_string()); } - let ctx = ExecutorContext::new( - &client, - ExecutorSettings { - units, - highlight_edges: true, - enable_ssao: false, - show_grid: false, - replay: None, - project_directory, - }, - ) - .await - .map_err(ConnectionError::Establishing)?; + let mut settings = ExecutorSettings { + units, + highlight_edges: true, + enable_ssao: false, + show_grid: false, + replay: None, + project_directory: None, + current_file: None, + }; + if let Some(current_file) = current_file { + settings.with_current_file(current_file); + } + let ctx = ExecutorContext::new(&client, settings) + .await + .map_err(ConnectionError::Establishing)?; Ok(ctx) } diff --git a/src/wasm-lib/kcl/tests/import_cycle1/execution_error.snap b/src/wasm-lib/kcl/tests/import_cycle1/execution_error.snap index 4f916af8a..79e1f19cf 100644 --- a/src/wasm-lib/kcl/tests/import_cycle1/execution_error.snap +++ b/src/wasm-lib/kcl/tests/import_cycle1/execution_error.snap @@ -1,12 +1,13 @@ --- source: kcl/src/simulation_tests.rs description: Error from executing import_cycle1.kcl +snapshot_kind: text --- KCL ImportCycle error × import cycle: circular import of modules is not allowed: tests/ │ import_cycle1/import_cycle2.kcl -> tests/import_cycle1/import_cycle3.kcl - │ -> tests/import_cycle1/input.kcl -> tests/import_cycle1/import_cycle2.kcl + │ -> tests/import_cycle1/input.kcl ╭─[1:1] 1 │ import two from "import_cycle2.kcl" · ─────────────────────────────────── diff --git a/src/wasm-lib/src/wasm.rs b/src/wasm-lib/src/wasm.rs index de65f778b..bd4a0cf76 100644 --- a/src/wasm-lib/src/wasm.rs +++ b/src/wasm-lib/src/wasm.rs @@ -58,6 +58,7 @@ pub async fn clear_scene_and_bust_cache( #[wasm_bindgen] pub async fn execute( program_ast_json: &str, + path: Option, program_memory_override_str: &str, settings: &str, engine_manager: kcl_lib::wasm_engine::EngineCommandManager, @@ -73,11 +74,16 @@ pub async fn execute( // You cannot override the memory in non-mock mode. let is_mock = program_memory_override.is_some(); - let settings: kcl_lib::Configuration = serde_json::from_str(settings).map_err(|e| e.to_string())?; + let config: kcl_lib::Configuration = serde_json::from_str(settings).map_err(|e| e.to_string())?; + let mut settings: kcl_lib::ExecutorSettings = config.into(); + if let Some(path) = path { + settings.with_current_file(std::path::PathBuf::from(path)); + } + let ctx = if is_mock { - kcl_lib::ExecutorContext::new_mock(fs_manager, settings.into()).await? + kcl_lib::ExecutorContext::new_mock(fs_manager, settings).await? } else { - kcl_lib::ExecutorContext::new(engine_manager, fs_manager, settings.into()).await? + kcl_lib::ExecutorContext::new(engine_manager, fs_manager, settings).await? }; let mut exec_state = ExecState::new(&ctx.settings); From f321ecdff03b580da6bcc3141124b61b2369f1f7 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Tue, 28 Jan 2025 17:09:27 -0800 Subject: [PATCH 2/5] add more unit names/abreevs (#5173) * add more unit names Signed-off-by: Jess Frazelle * typo Signed-off-by: Jess Frazelle --------- Signed-off-by: Jess Frazelle --- src/wasm-lib/kcl/src/execution/mod.rs | 10 ++++++++++ src/wasm-lib/kcl/src/parsing/token/mod.rs | 14 +++++++------- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/wasm-lib/kcl/src/execution/mod.rs b/src/wasm-lib/kcl/src/execution/mod.rs index 66db93ba9..b6352fdda 100644 --- a/src/wasm-lib/kcl/src/execution/mod.rs +++ b/src/wasm-lib/kcl/src/execution/mod.rs @@ -3498,6 +3498,16 @@ const inInches = 1.0 * inch()"#; assert_eq!(1.0, mem_get_json(exec_state.memory(), "inInches").as_f64().unwrap()); } + #[tokio::test(flavor = "multi_thread")] + async fn test_unit_overriden_in() { + let ast = r#"@settings(defaultLengthUnit = in) +const inMm = 25.4 * mm() +const inInches = 2.0 * inch()"#; + let (_, _, exec_state) = parse_execute(ast).await.unwrap(); + assert_eq!(1.0, mem_get_json(exec_state.memory(), "inMm").as_f64().unwrap().round()); + assert_eq!(2.0, mem_get_json(exec_state.memory(), "inInches").as_f64().unwrap()); + } + #[tokio::test(flavor = "multi_thread")] async fn test_zero_param_fn() { let ast = r#"const sigmaAllow = 35000 // psi diff --git a/src/wasm-lib/kcl/src/parsing/token/mod.rs b/src/wasm-lib/kcl/src/parsing/token/mod.rs index bdbee4548..bd6410911 100644 --- a/src/wasm-lib/kcl/src/parsing/token/mod.rs +++ b/src/wasm-lib/kcl/src/parsing/token/mod.rs @@ -62,14 +62,14 @@ impl FromStr for NumericSuffix { fn from_str(s: &str) -> Result { match s { "_" => Ok(NumericSuffix::Count), - "mm" => Ok(NumericSuffix::Mm), - "cm" => Ok(NumericSuffix::Cm), - "m" => Ok(NumericSuffix::M), + "mm" | "millimeters" => Ok(NumericSuffix::Mm), + "cm" | "centimeters" => Ok(NumericSuffix::Cm), + "m" | "meters" => Ok(NumericSuffix::M), "inch" | "in" => Ok(NumericSuffix::Inch), - "ft" => Ok(NumericSuffix::Ft), - "yd" => Ok(NumericSuffix::Yd), - "deg" => Ok(NumericSuffix::Deg), - "rad" => Ok(NumericSuffix::Rad), + "ft" | "feet" => Ok(NumericSuffix::Ft), + "yd" | "yards" => Ok(NumericSuffix::Yd), + "deg" | "degrees" => Ok(NumericSuffix::Deg), + "rad" | "radians" => Ok(NumericSuffix::Rad), _ => Err(CompilationError::err(SourceRange::default(), "invalid unit of measure")), } } From 4cd427bf917d038930f74e0fac781664ae1281df Mon Sep 17 00:00:00 2001 From: Jonathan Tran Date: Wed, 29 Jan 2025 16:00:00 -0500 Subject: [PATCH 3/5] fix: Remove link from code editor docs (#5170) Remove link from the stdlib import() docs --- docs/kcl/import.md | 2 -- docs/kcl/std.json | 2 +- src/wasm-lib/kcl/src/std/import.rs | 3 --- 3 files changed, 1 insertion(+), 6 deletions(-) diff --git a/docs/kcl/import.md b/docs/kcl/import.md index 1ac55a3a9..8efdcf969 100644 --- a/docs/kcl/import.md +++ b/docs/kcl/import.md @@ -14,8 +14,6 @@ For formats lacking unit data (such as STL, OBJ, or PLY files), the default unit Note: The import command currently only works when using the native Modeling App. -For importing KCL functions using the `import` statement, see the docs on [KCL modules](/docs/kcl/modules). - ```js import(file_path: String, options?: ImportFormat) -> ImportedGeometry ``` diff --git a/docs/kcl/std.json b/docs/kcl/std.json index fb2d644c4..78ab2fb6f 100644 --- a/docs/kcl/std.json +++ b/docs/kcl/std.json @@ -92765,7 +92765,7 @@ { "name": "import", "summary": "Import a CAD file.", - "description": "**DEPRECATED** Prefer to use import statements.\n\nFor formats lacking unit data (such as STL, OBJ, or PLY files), the default unit of measurement is millimeters. Alternatively you may specify the unit by passing your desired measurement unit in the options parameter. When importing a GLTF file, the bin file will be imported as well. Import paths are relative to the current project directory.\n\nNote: The import command currently only works when using the native Modeling App.\n\nFor importing KCL functions using the `import` statement, see the docs on [KCL modules](/docs/kcl/modules).", + "description": "**DEPRECATED** Prefer to use import statements.\n\nFor formats lacking unit data (such as STL, OBJ, or PLY files), the default unit of measurement is millimeters. Alternatively you may specify the unit by passing your desired measurement unit in the options parameter. When importing a GLTF file, the bin file will be imported as well. Import paths are relative to the current project directory.\n\nNote: The import command currently only works when using the native Modeling App.", "tags": [], "keywordArguments": false, "args": [ diff --git a/src/wasm-lib/kcl/src/std/import.rs b/src/wasm-lib/kcl/src/std/import.rs index 7f6d5b0f8..85442e8a3 100644 --- a/src/wasm-lib/kcl/src/std/import.rs +++ b/src/wasm-lib/kcl/src/std/import.rs @@ -118,9 +118,6 @@ pub async fn import(exec_state: &mut ExecState, args: Args) -> Result Date: Wed, 29 Jan 2025 17:20:03 -0500 Subject: [PATCH 4/5] Ignore cloned kcl-samples (#5179) --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index dffca3ff0..4a3841cc7 100644 --- a/.gitignore +++ b/.gitignore @@ -44,7 +44,7 @@ e2e/playwright/temp3.png e2e/playwright/export-snapshots/* !e2e/playwright/export-snapshots/*.png - +/kcl-samples /test-results/ /playwright-report/ /blob-report/ From 1e565379a7775a6dddbd54e3845376d43d0fc145 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Wed, 29 Jan 2025 16:26:49 -0800 Subject: [PATCH 5/5] allow setting units in subfiles/ turn on execution in modules (#5178) * allow setting units in subfiles Signed-off-by: Jess Frazelle * updates Signed-off-by: Jess Frazelle * turn on execution in modules Signed-off-by: Jess Frazelle * updates to tests Signed-off-by: Jess Frazelle * updates Signed-off-by: Jess Frazelle * cleanup bad snaps Signed-off-by: Jess Frazelle * updates Signed-off-by: Jess Frazelle * change some snapshots; Signed-off-by: Jess Frazelle * fix tests Signed-off-by: Jess Frazelle --------- Signed-off-by: Jess Frazelle --- src/wasm-lib/Cargo.lock | 2 +- src/wasm-lib/kcl/Cargo.toml | 2 +- src/wasm-lib/kcl/src/engine/mod.rs | 4 - .../src/execution/artifact/mermaid_tests.rs | 21 +- src/wasm-lib/kcl/src/simulation_tests.rs | 21 + .../artifact_graph_mind_map.snap.md | 26 - .../artifact_graph_mind_map.snap.md | 78 -- .../fillet-and-shell/execution_error.snap | 13 - src/wasm-lib/kcl/tests/import_cycle1/ast.snap | 96 +- .../tests/import_cycle1/execution_error.snap | 7 +- .../kcl/tests/import_cycle1/import_cycle2.kcl | 1 + .../kcl/tests/import_cycle1/import_cycle3.kcl | 1 + .../kcl/tests/import_cycle1/input.kcl | 1 + .../artifact_commands.snap | 833 +++++++++++++++ .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 82 ++ .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 63 ++ .../tests/import_function_not_sketch/ast.snap | 159 +++ .../import_function_not_sketch/input.kcl | 6 + .../my_functions.kcl | 15 + .../tests/import_function_not_sketch/ops.snap | 6 + .../program_memory.snap | 956 ++++++++++++++++++ .../rendered_model.png | Bin 0 -> 97005 bytes .../import_side_effect/artifact_commands.snap | 118 +++ .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 12 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 8 + .../import_side_effect/execution_error.snap | 14 - .../import_side_effect/export_side_effect.kcl | 2 +- .../import_side_effect/program_memory.snap | 112 ++ .../tests/import_whole/execution_error.snap | 13 - .../tests/kittycad_svg/execution_error.snap | 13 - .../artifact_graph_mind_map.snap.md | 26 - .../artifact_graph_mind_map.snap.md | 33 - .../artifact_graph_mind_map.snap.md | 33 - 37 files changed, 2509 insertions(+), 292 deletions(-) delete mode 100644 src/wasm-lib/kcl/tests/fillet-and-shell/execution_error.snap create mode 100644 src/wasm-lib/kcl/tests/import_function_not_sketch/artifact_commands.snap create mode 100644 src/wasm-lib/kcl/tests/import_function_not_sketch/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/import_function_not_sketch/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/import_function_not_sketch/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/import_function_not_sketch/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/import_function_not_sketch/ast.snap create mode 100644 src/wasm-lib/kcl/tests/import_function_not_sketch/input.kcl create mode 100644 src/wasm-lib/kcl/tests/import_function_not_sketch/my_functions.kcl create mode 100644 src/wasm-lib/kcl/tests/import_function_not_sketch/ops.snap create mode 100644 src/wasm-lib/kcl/tests/import_function_not_sketch/program_memory.snap create mode 100644 src/wasm-lib/kcl/tests/import_function_not_sketch/rendered_model.png create mode 100644 src/wasm-lib/kcl/tests/import_side_effect/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/import_side_effect/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/import_side_effect/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/import_side_effect/artifact_graph_mind_map.snap.md delete mode 100644 src/wasm-lib/kcl/tests/import_side_effect/execution_error.snap create mode 100644 src/wasm-lib/kcl/tests/import_side_effect/program_memory.snap delete mode 100644 src/wasm-lib/kcl/tests/import_whole/execution_error.snap delete mode 100644 src/wasm-lib/kcl/tests/kittycad_svg/execution_error.snap diff --git a/src/wasm-lib/Cargo.lock b/src/wasm-lib/Cargo.lock index 718cd0ae9..0baa2689b 100644 --- a/src/wasm-lib/Cargo.lock +++ b/src/wasm-lib/Cargo.lock @@ -1710,7 +1710,7 @@ dependencies = [ [[package]] name = "kcl-lib" -version = "0.2.31" +version = "0.2.32" dependencies = [ "anyhow", "approx 0.5.1", diff --git a/src/wasm-lib/kcl/Cargo.toml b/src/wasm-lib/kcl/Cargo.toml index bbe7ba457..8de7c1bb9 100644 --- a/src/wasm-lib/kcl/Cargo.toml +++ b/src/wasm-lib/kcl/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "kcl-lib" description = "KittyCAD Language implementation and tools" -version = "0.2.31" +version = "0.2.32" edition = "2021" license = "MIT" repository = "https://github.com/KittyCAD/modeling-app" diff --git a/src/wasm-lib/kcl/src/engine/mod.rs b/src/wasm-lib/kcl/src/engine/mod.rs index fb687a163..71e340313 100644 --- a/src/wasm-lib/kcl/src/engine/mod.rs +++ b/src/wasm-lib/kcl/src/engine/mod.rs @@ -197,10 +197,6 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { source_range: SourceRange, cmd: &ModelingCmd, ) -> Result<(), crate::errors::KclError> { - let execution_kind = self.execution_kind(); - if execution_kind.is_isolated() { - return Err(KclError::Semantic(KclErrorDetails { message: "Cannot send modeling commands while importing. Wrap your code in a function if you want to import the file.".to_owned(), source_ranges: vec![source_range] })); - } let req = WebSocketRequest::ModelingCmdReq(ModelingCmdReq { cmd: cmd.clone(), cmd_id: id.into(), diff --git a/src/wasm-lib/kcl/src/execution/artifact/mermaid_tests.rs b/src/wasm-lib/kcl/src/execution/artifact/mermaid_tests.rs index 20eff2adc..608501f89 100644 --- a/src/wasm-lib/kcl/src/execution/artifact/mermaid_tests.rs +++ b/src/wasm-lib/kcl/src/execution/artifact/mermaid_tests.rs @@ -462,12 +462,14 @@ impl ArtifactGraph { output.push_str("mindmap\n"); output.push_str(" root\n"); + let mut ids_seen: fnv::FnvHashSet = Default::default(); + for (_, artifact) in &self.map { // Only the planes are roots. let Artifact::Plane(_) = artifact else { continue; }; - self.mind_map_artifact(&mut output, artifact, " ")?; + self.mind_map_artifact(&mut output, &mut ids_seen, artifact, " ")?; } output.push_str("```\n"); @@ -475,9 +477,16 @@ impl ArtifactGraph { Ok(output) } - fn mind_map_artifact(&self, output: &mut W, artifact: &Artifact, prefix: &str) -> std::fmt::Result { + fn mind_map_artifact( + &self, + output: &mut W, + ids_seen: &mut fnv::FnvHashSet, + artifact: &Artifact, + prefix: &str, + ) -> std::fmt::Result { match artifact { Artifact::Plane(_plane) => { + ids_seen.clear(); writeln!(output, "{prefix}Plane")?; } Artifact::Path(_path) => { @@ -515,11 +524,17 @@ impl ArtifactGraph { } } + if ids_seen.contains(&artifact.id()) { + return Ok(()); + } + + ids_seen.insert(artifact.id()); + for child_id in artifact.child_ids() { let Some(child_artifact) = self.map.get(&child_id) else { continue; }; - self.mind_map_artifact(output, child_artifact, &format!("{} ", prefix))?; + self.mind_map_artifact(output, ids_seen, child_artifact, &format!("{} ", prefix))?; } Ok(()) diff --git a/src/wasm-lib/kcl/src/simulation_tests.rs b/src/wasm-lib/kcl/src/simulation_tests.rs index 1de0fc41e..aab8bc768 100644 --- a/src/wasm-lib/kcl/src/simulation_tests.rs +++ b/src/wasm-lib/kcl/src/simulation_tests.rs @@ -767,6 +767,27 @@ mod import_cycle1 { super::execute(TEST_NAME, false).await } } +mod import_function_not_sketch { + const TEST_NAME: &str = "import_function_not_sketch"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} mod import_constant { const TEST_NAME: &str = "import_constant"; diff --git a/src/wasm-lib/kcl/tests/artifact_graph_example_code1/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/artifact_graph_example_code1/artifact_graph_mind_map.snap.md index 295003054..57c90ed6c 100644 --- a/src/wasm-lib/kcl/tests/artifact_graph_example_code1/artifact_graph_mind_map.snap.md +++ b/src/wasm-lib/kcl/tests/artifact_graph_example_code1/artifact_graph_mind_map.snap.md @@ -50,32 +50,6 @@ mindmap Sweep Extrusion Wall Wall - Path - Segment - Wall - SweepEdge Opposite - SweepEdge Adjacent - Segment - Wall - SweepEdge Opposite - SweepEdge Adjacent - Segment - Wall - SweepEdge Opposite - SweepEdge Adjacent - Segment - Sweep Extrusion - Wall - Wall - Wall - Cap End - SweepEdge Opposite - SweepEdge Adjacent - SweepEdge Opposite - SweepEdge Adjacent - SweepEdge Opposite - SweepEdge Adjacent - Solid2d Wall Wall Cap Start diff --git a/src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/artifact_graph_mind_map.snap.md index a3e852bf9..357f1ad40 100644 --- a/src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/artifact_graph_mind_map.snap.md +++ b/src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/artifact_graph_mind_map.snap.md @@ -72,32 +72,6 @@ mindmap Wall Wall Wall - Path - Segment - Wall - SweepEdge Opposite - SweepEdge Adjacent - Segment - Wall - SweepEdge Opposite - SweepEdge Adjacent - Segment - Wall - SweepEdge Opposite - SweepEdge Adjacent - Segment - Sweep Extrusion - Wall - Wall - Wall - Cap End - SweepEdge Opposite - SweepEdge Adjacent - SweepEdge Opposite - SweepEdge Adjacent - SweepEdge Opposite - SweepEdge Adjacent - Solid2d Cap End SweepEdge Opposite SweepEdge Adjacent @@ -186,32 +160,6 @@ mindmap Wall Wall Wall - Path - Segment - Wall - SweepEdge Opposite - SweepEdge Adjacent - Segment - Wall - SweepEdge Opposite - SweepEdge Adjacent - Segment - Wall - SweepEdge Opposite - SweepEdge Adjacent - Segment - Sweep Extrusion - Wall - Wall - Wall - Cap End - SweepEdge Opposite - SweepEdge Adjacent - SweepEdge Opposite - SweepEdge Adjacent - SweepEdge Opposite - SweepEdge Adjacent - Solid2d Cap End SweepEdge Opposite SweepEdge Adjacent @@ -282,32 +230,6 @@ mindmap Wall Wall Wall - Path - Segment - Wall - SweepEdge Opposite - SweepEdge Adjacent - Segment - Wall - SweepEdge Opposite - SweepEdge Adjacent - Segment - Wall - SweepEdge Opposite - SweepEdge Adjacent - Segment - Sweep Extrusion - Wall - Wall - Wall - Cap End - SweepEdge Opposite - SweepEdge Adjacent - SweepEdge Opposite - SweepEdge Adjacent - SweepEdge Opposite - SweepEdge Adjacent - Solid2d Cap End SweepEdge Opposite SweepEdge Adjacent diff --git a/src/wasm-lib/kcl/tests/fillet-and-shell/execution_error.snap b/src/wasm-lib/kcl/tests/fillet-and-shell/execution_error.snap deleted file mode 100644 index a20130a9a..000000000 --- a/src/wasm-lib/kcl/tests/fillet-and-shell/execution_error.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: kcl/src/simulation_tests.rs -description: Error from executing fillet-and-shell.kcl -snapshot_kind: text ---- -KCL Engine error - - × engine: Modeling command failed: websocket closed early - ╭─[1:1] - 1 │ rpizWidth = 30 - · ▲ - 2 │ rpizLength = 65 - ╰──── diff --git a/src/wasm-lib/kcl/tests/import_cycle1/ast.snap b/src/wasm-lib/kcl/tests/import_cycle1/ast.snap index f98e259f3..8ac2719da 100644 --- a/src/wasm-lib/kcl/tests/import_cycle1/ast.snap +++ b/src/wasm-lib/kcl/tests/import_cycle1/ast.snap @@ -1,12 +1,13 @@ --- source: kcl/src/simulation_tests.rs description: Result of parsing import_cycle1.kcl +snapshot_kind: text --- { "Ok": { "body": [ { - "end": 35, + "end": 69, "path": { "type": "Kcl", "filename": "import_cycle2.kcl" @@ -16,29 +17,29 @@ description: Result of parsing import_cycle1.kcl "items": [ { "alias": null, - "end": 10, + "end": 44, "name": { - "end": 10, + "end": 44, "name": "two", - "start": 7, + "start": 41, "type": "Identifier" }, - "start": 7, + "start": 41, "type": "ImportItem" } ] }, - "start": 0, + "start": 34, "type": "ImportStatement", "type": "ImportStatement" }, { "declaration": { - "end": 75, + "end": 109, "id": { - "end": 50, + "end": 84, "name": "one", - "start": 47, + "start": 81, "type": "Identifier" }, "init": { @@ -46,25 +47,25 @@ description: Result of parsing import_cycle1.kcl "body": [ { "argument": { - "end": 73, + "end": 107, "left": { "arguments": [], "callee": { - "end": 67, + "end": 101, "name": "two", - "start": 64, + "start": 98, "type": "Identifier" }, - "end": 69, - "start": 64, + "end": 103, + "start": 98, "type": "CallExpression", "type": "CallExpression" }, "operator": "-", "right": { - "end": 73, + "end": 107, "raw": "1", - "start": 72, + "start": 106, "type": "Literal", "type": "Literal", "value": { @@ -72,43 +73,43 @@ description: Result of parsing import_cycle1.kcl "suffix": "None" } }, - "start": 64, + "start": 98, "type": "BinaryExpression", "type": "BinaryExpression" }, - "end": 73, - "start": 57, + "end": 107, + "start": 91, "type": "ReturnStatement", "type": "ReturnStatement" } ], - "end": 75, - "start": 53 + "end": 109, + "start": 87 }, - "end": 75, + "end": 109, "params": [], - "start": 50, + "start": 84, "type": "FunctionExpression", "type": "FunctionExpression" }, - "start": 47, + "start": 81, "type": "VariableDeclarator" }, - "end": 75, + "end": 109, "kind": "fn", - "start": 37, + "start": 71, "type": "VariableDeclaration", "type": "VariableDeclaration", "visibility": "export" } ], - "end": 76, + "end": 110, "nonCodeMeta": { "nonCodeNodes": { "0": [ { - "end": 37, - "start": 35, + "end": 71, + "start": 69, "type": "NonCodeNode", "value": { "type": "newLine" @@ -116,7 +117,42 @@ description: Result of parsing import_cycle1.kcl } ] }, - "startNodes": [] + "startNodes": [ + { + "end": 33, + "start": 0, + "type": "NonCodeNode", + "value": { + "type": "annotation", + "name": { + "end": 9, + "name": "settings", + "start": 1, + "type": "Identifier" + }, + "properties": [ + { + "end": 32, + "key": { + "end": 27, + "name": "defaultLengthUnit", + "start": 10, + "type": "Identifier" + }, + "start": 10, + "type": "ObjectProperty", + "value": { + "end": 32, + "name": "in", + "start": 30, + "type": "Identifier", + "type": "Identifier" + } + } + ] + } + } + ] }, "start": 0 } diff --git a/src/wasm-lib/kcl/tests/import_cycle1/execution_error.snap b/src/wasm-lib/kcl/tests/import_cycle1/execution_error.snap index 79e1f19cf..8e3dac8f6 100644 --- a/src/wasm-lib/kcl/tests/import_cycle1/execution_error.snap +++ b/src/wasm-lib/kcl/tests/import_cycle1/execution_error.snap @@ -8,8 +8,9 @@ KCL ImportCycle error × import cycle: circular import of modules is not allowed: tests/ │ import_cycle1/import_cycle2.kcl -> tests/import_cycle1/import_cycle3.kcl │ -> tests/import_cycle1/input.kcl - ╭─[1:1] - 1 │ import two from "import_cycle2.kcl" + ╭─[2:1] + 1 │ @settings(defaultLengthUnit = in) + 2 │ import two from "import_cycle2.kcl" · ─────────────────────────────────── - 2 │ + 3 │ ╰──── diff --git a/src/wasm-lib/kcl/tests/import_cycle1/import_cycle2.kcl b/src/wasm-lib/kcl/tests/import_cycle1/import_cycle2.kcl index 16eb70527..0881fb91f 100644 --- a/src/wasm-lib/kcl/tests/import_cycle1/import_cycle2.kcl +++ b/src/wasm-lib/kcl/tests/import_cycle1/import_cycle2.kcl @@ -1,3 +1,4 @@ +@settings(defaultLengthUnit = mm) import three from "import_cycle3.kcl" export fn two = () => { return three() - 1 } diff --git a/src/wasm-lib/kcl/tests/import_cycle1/import_cycle3.kcl b/src/wasm-lib/kcl/tests/import_cycle1/import_cycle3.kcl index 4c6e484c0..cf4a50cbd 100644 --- a/src/wasm-lib/kcl/tests/import_cycle1/import_cycle3.kcl +++ b/src/wasm-lib/kcl/tests/import_cycle1/import_cycle3.kcl @@ -1,3 +1,4 @@ +@settings(defaultLengthUnit = in) import one from "input.kcl" export fn three = () => { return one() + one() + one() } diff --git a/src/wasm-lib/kcl/tests/import_cycle1/input.kcl b/src/wasm-lib/kcl/tests/import_cycle1/input.kcl index ea561354e..6d1cb3751 100644 --- a/src/wasm-lib/kcl/tests/import_cycle1/input.kcl +++ b/src/wasm-lib/kcl/tests/import_cycle1/input.kcl @@ -1,3 +1,4 @@ +@settings(defaultLengthUnit = in) import two from "import_cycle2.kcl" export fn one() { diff --git a/src/wasm-lib/kcl/tests/import_function_not_sketch/artifact_commands.snap b/src/wasm-lib/kcl/tests/import_function_not_sketch/artifact_commands.snap new file mode 100644 index 000000000..594976b64 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_function_not_sketch/artifact_commands.snap @@ -0,0 +1,833 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact commands import_function_not_sketch.kcl +snapshot_kind: text +--- +[ + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "size": 100.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "plane_set_color", + "plane_id": "[uuid]", + "color": { + "r": 0.7, + "g": 0.28, + "b": 0.28, + "a": 0.4 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 100.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "plane_set_color", + "plane_id": "[uuid]", + "color": { + "r": 0.28, + "g": 0.7, + "b": 0.28, + "a": 0.4 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 100.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "plane_set_color", + "plane_id": "[uuid]", + "color": { + "r": 0.28, + "g": 0.28, + "b": 0.7, + "a": 0.4 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": -1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "size": 100.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 100.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": -1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 100.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "edge_lines_visible", + "hidden": false + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "set_scene_units", + "unit": "mm" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "object_visible", + "object_id": "[uuid]", + "hidden": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "object_visible", + "object_id": "[uuid]", + "hidden": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 33, + 0 + ], + "command": { + "type": "set_scene_units", + "unit": "in" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 52, + 71, + 1 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "size": 60.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 77, + 103, + 1 + ], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 77, + 103, + 1 + ], + "command": { + "type": "start_path" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 77, + 103, + 1 + ], + "command": { + "type": "move_path_pen", + "path": "[uuid]", + "to": { + "x": 4.0, + "y": 12.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 109, + 124, + 1 + ], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 2.0, + "y": 0.0, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 130, + 146, + 1 + ], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 0.0, + "y": -6.0, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 152, + 168, + 1 + ], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 4.0, + "y": -6.0, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 174, + 190, + 1 + ], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 0.0, + "y": -6.0, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 196, + 218, + 1 + ], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": -3.75, + "y": -4.5, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 224, + 242, + 1 + ], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 0.0, + "y": -5.5, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 248, + 264, + 1 + ], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": -2.0, + "y": 0.0, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 270, + 278, + 1 + ], + "command": { + "type": "close_path", + "path_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 270, + 278, + 1 + ], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 284, + 310, + 1 + ], + "command": { + "type": "revolve", + "target": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "axis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "axis_is_2d": true, + "angle": { + "unit": "degrees", + "value": 360.0 + }, + "tolerance": 0.0000001 + } + }, + { + "cmdId": "[uuid]", + "range": [ + 284, + 310, + 1 + ], + "command": { + "type": "object_bring_to_front", + "object_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 284, + 310, + 1 + ], + "command": { + "type": "solid3d_get_extrusion_face_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 284, + 310, + 1 + ], + "command": { + "type": "solid3d_get_opposite_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 284, + 310, + 1 + ], + "command": { + "type": "solid3d_get_next_adjacent_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 284, + 310, + 1 + ], + "command": { + "type": "solid3d_get_opposite_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 284, + 310, + 1 + ], + "command": { + "type": "solid3d_get_next_adjacent_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 284, + 310, + 1 + ], + "command": { + "type": "solid3d_get_opposite_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 284, + 310, + 1 + ], + "command": { + "type": "solid3d_get_next_adjacent_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 284, + 310, + 1 + ], + "command": { + "type": "solid3d_get_opposite_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 284, + 310, + 1 + ], + "command": { + "type": "solid3d_get_next_adjacent_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 284, + 310, + 1 + ], + "command": { + "type": "solid3d_get_opposite_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 284, + 310, + 1 + ], + "command": { + "type": "solid3d_get_next_adjacent_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 284, + 310, + 1 + ], + "command": { + "type": "solid3d_get_opposite_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 284, + 310, + 1 + ], + "command": { + "type": "solid3d_get_next_adjacent_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 284, + 310, + 1 + ], + "command": { + "type": "solid3d_get_opposite_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 284, + 310, + 1 + ], + "command": { + "type": "solid3d_get_next_adjacent_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 284, + 310, + 1 + ], + "command": { + "type": "solid3d_get_opposite_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 284, + 310, + 1 + ], + "command": { + "type": "solid3d_get_next_adjacent_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "set_scene_units", + "unit": "in" + } + } +] diff --git a/src/wasm-lib/kcl/tests/import_function_not_sketch/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/import_function_not_sketch/artifact_graph_flowchart.snap new file mode 100644 index 000000000..b9533e850 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_function_not_sketch/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart import_function_not_sketch.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/import_function_not_sketch/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/import_function_not_sketch/artifact_graph_flowchart.snap.md new file mode 100644 index 000000000..88310b5a4 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_function_not_sketch/artifact_graph_flowchart.snap.md @@ -0,0 +1,82 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[77, 103, 1]"] + 3["Segment
[109, 124, 1]"] + 4["Segment
[130, 146, 1]"] + 5["Segment
[152, 168, 1]"] + 6["Segment
[174, 190, 1]"] + 7["Segment
[196, 218, 1]"] + 8["Segment
[224, 242, 1]"] + 9["Segment
[248, 264, 1]"] + 10["Segment
[270, 278, 1]"] + 11[Solid2d] + end + 1["Plane
[52, 71, 1]"] + 12["Sweep Revolve
[284, 310, 1]"] + 13[Wall] + 14[Wall] + 15[Wall] + 16[Wall] + 17[Wall] + 18[Wall] + 19[Wall] + 20[Wall] + 21["SweepEdge Adjacent"] + 22["SweepEdge Adjacent"] + 23["SweepEdge Adjacent"] + 24["SweepEdge Adjacent"] + 25["SweepEdge Adjacent"] + 26["SweepEdge Adjacent"] + 27["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 --- 7 + 2 --- 8 + 2 --- 9 + 2 --- 10 + 2 ---- 12 + 2 --- 11 + 3 --- 13 + 3 x--> 21 + 4 --- 14 + 4 --- 21 + 5 --- 15 + 5 --- 22 + 6 --- 16 + 6 --- 23 + 7 --- 17 + 7 --- 24 + 8 --- 18 + 8 --- 25 + 9 --- 19 + 9 --- 26 + 10 --- 20 + 10 --- 27 + 12 --- 13 + 12 --- 14 + 12 --- 15 + 12 --- 16 + 12 --- 17 + 12 --- 18 + 12 --- 19 + 12 --- 20 + 12 <--x 3 + 12 --- 21 + 12 <--x 4 + 12 <--x 5 + 12 --- 22 + 12 <--x 6 + 12 --- 23 + 12 <--x 7 + 12 --- 24 + 12 <--x 8 + 12 --- 25 + 12 <--x 9 + 12 --- 26 + 12 <--x 10 + 12 --- 27 +``` diff --git a/src/wasm-lib/kcl/tests/import_function_not_sketch/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/import_function_not_sketch/artifact_graph_mind_map.snap new file mode 100644 index 000000000..aea436af1 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_function_not_sketch/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map import_function_not_sketch.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/import_function_not_sketch/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/import_function_not_sketch/artifact_graph_mind_map.snap.md new file mode 100644 index 000000000..33d146281 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_function_not_sketch/artifact_graph_mind_map.snap.md @@ -0,0 +1,63 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + Segment + SweepEdge Adjacent + Segment + Wall + Segment + SweepEdge Adjacent + Segment + Wall + Segment + SweepEdge Adjacent + Segment + Wall + Segment + SweepEdge Adjacent + Segment + Wall + Segment + SweepEdge Adjacent + Segment + Wall + Segment + SweepEdge Adjacent + Segment + Wall + Segment + SweepEdge Adjacent + Segment + Wall + Segment + SweepEdge Adjacent + Sweep Revolve + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Segment + SweepEdge Adjacent + Segment + Segment + SweepEdge Adjacent + Segment + SweepEdge Adjacent + Segment + SweepEdge Adjacent + Segment + SweepEdge Adjacent + Segment + SweepEdge Adjacent + Segment + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/import_function_not_sketch/ast.snap b/src/wasm-lib/kcl/tests/import_function_not_sketch/ast.snap new file mode 100644 index 000000000..d9cc0b74f --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_function_not_sketch/ast.snap @@ -0,0 +1,159 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing import_function_not_sketch.kcl +snapshot_kind: text +--- +{ + "Ok": { + "body": [ + { + "end": 68, + "path": { + "type": "Kcl", + "filename": "my_functions.kcl" + }, + "selector": { + "type": "List", + "items": [ + { + "alias": null, + "end": 44, + "name": { + "end": 44, + "name": "two", + "start": 41, + "type": "Identifier" + }, + "start": 41, + "type": "ImportItem" + } + ] + }, + "start": 34, + "type": "ImportStatement", + "type": "ImportStatement" + }, + { + "declaration": { + "end": 108, + "id": { + "end": 83, + "name": "one", + "start": 80, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "argument": { + "end": 106, + "left": { + "arguments": [], + "callee": { + "end": 100, + "name": "two", + "start": 97, + "type": "Identifier" + }, + "end": 102, + "start": 97, + "type": "CallExpression", + "type": "CallExpression" + }, + "operator": "-", + "right": { + "end": 106, + "raw": "1", + "start": 105, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } + }, + "start": 97, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "end": 106, + "start": 90, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 108, + "start": 86 + }, + "end": 108, + "params": [], + "start": 83, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 80, + "type": "VariableDeclarator" + }, + "end": 108, + "kind": "fn", + "start": 70, + "type": "VariableDeclaration", + "type": "VariableDeclaration", + "visibility": "export" + } + ], + "end": 109, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 70, + "start": 68, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [ + { + "end": 33, + "start": 0, + "type": "NonCodeNode", + "value": { + "type": "annotation", + "name": { + "end": 9, + "name": "settings", + "start": 1, + "type": "Identifier" + }, + "properties": [ + { + "end": 32, + "key": { + "end": 27, + "name": "defaultLengthUnit", + "start": 10, + "type": "Identifier" + }, + "start": 10, + "type": "ObjectProperty", + "value": { + "end": 32, + "name": "in", + "start": 30, + "type": "Identifier", + "type": "Identifier" + } + } + ] + } + } + ] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/import_function_not_sketch/input.kcl b/src/wasm-lib/kcl/tests/import_function_not_sketch/input.kcl new file mode 100644 index 000000000..7f7396771 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_function_not_sketch/input.kcl @@ -0,0 +1,6 @@ +@settings(defaultLengthUnit = in) +import two from "my_functions.kcl" + +export fn one() { + return two() - 1 +} diff --git a/src/wasm-lib/kcl/tests/import_function_not_sketch/my_functions.kcl b/src/wasm-lib/kcl/tests/import_function_not_sketch/my_functions.kcl new file mode 100644 index 000000000..aa51fc7c1 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_function_not_sketch/my_functions.kcl @@ -0,0 +1,15 @@ +@settings(defaultLengthUnit = mm) + +export part001 = startSketchOn('XY') + |> startProfileAt([4, 12], %) + |> line([2, 0], %) + |> line([0, -6], %) + |> line([4, -6], %) + |> line([0, -6], %) + |> line([-3.75, -4.5], %) + |> line([0, -5.5], %) + |> line([-2, 0], %) + |> close(%) + |> revolve({ axis = 'y' }, %) // default angle is 360 + +export fn two = () => { return 5 } diff --git a/src/wasm-lib/kcl/tests/import_function_not_sketch/ops.snap b/src/wasm-lib/kcl/tests/import_function_not_sketch/ops.snap new file mode 100644 index 000000000..3cf43fb78 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_function_not_sketch/ops.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed import_function_not_sketch.kcl +snapshot_kind: text +--- +[] diff --git a/src/wasm-lib/kcl/tests/import_function_not_sketch/program_memory.snap b/src/wasm-lib/kcl/tests/import_function_not_sketch/program_memory.snap new file mode 100644 index 000000000..ae38cc6a5 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_function_not_sketch/program_memory.snap @@ -0,0 +1,956 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing import_function_not_sketch.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "one": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "argument": { + "end": 106, + "left": { + "arguments": [], + "callee": { + "end": 100, + "name": "two", + "start": 97, + "type": "Identifier" + }, + "end": 102, + "start": 97, + "type": "CallExpression", + "type": "CallExpression" + }, + "operator": "-", + "right": { + "end": 106, + "raw": "1", + "start": 105, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } + }, + "start": 97, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "end": 106, + "start": 90, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 108, + "start": 86 + }, + "end": 108, + "params": [], + "start": 83, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "two": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "argument": { + "end": 368, + "moduleId": 1, + "raw": "5", + "start": 367, + "type": "Literal", + "type": "Literal", + "value": { + "value": 5.0, + "suffix": "None" + } + }, + "end": 368, + "moduleId": 1, + "start": 360, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 370, + "moduleId": 1, + "start": 358 + }, + "end": 370, + "moduleId": 1, + "params": [], + "start": 352, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "part001": { + "type": "Solid", + "value": { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 109, + 124, + 1 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 130, + 146, + 1 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 152, + 168, + 1 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 174, + 190, + 1 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 196, + 218, + 1 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 224, + 242, + 1 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 248, + 264, + 1 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 270, + 278, + 1 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 109, + 124, + 1 + ] + }, + "from": [ + 4.0, + 12.0 + ], + "tag": null, + "to": [ + 6.0, + 12.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 130, + 146, + 1 + ] + }, + "from": [ + 6.0, + 12.0 + ], + "tag": null, + "to": [ + 6.0, + 6.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 152, + 168, + 1 + ] + }, + "from": [ + 6.0, + 6.0 + ], + "tag": null, + "to": [ + 10.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 174, + 190, + 1 + ] + }, + "from": [ + 10.0, + 0.0 + ], + "tag": null, + "to": [ + 10.0, + -6.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 196, + 218, + 1 + ] + }, + "from": [ + 10.0, + -6.0 + ], + "tag": null, + "to": [ + 6.25, + -10.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 224, + 242, + 1 + ] + }, + "from": [ + 6.25, + -10.5 + ], + "tag": null, + "to": [ + 6.25, + -16.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 248, + 264, + 1 + ] + }, + "from": [ + 6.25, + -16.0 + ], + "tag": null, + "to": [ + 4.25, + -16.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 270, + 278, + 1 + ] + }, + "from": [ + 4.25, + -16.0 + ], + "tag": null, + "to": [ + 4.0, + 12.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "units": { + "type": "Mm" + }, + "__meta": [] + }, + "start": { + "from": [ + 4.0, + 12.0 + ], + "to": [ + 4.0, + 12.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 77, + 103, + 1 + ] + } + }, + "units": { + "type": "Mm" + }, + "__meta": [ + { + "sourceRange": [ + 77, + 103, + 1 + ] + } + ] + }, + "height": 0.0, + "startCapId": null, + "endCapId": null, + "units": { + "type": "Mm" + }, + "__meta": [ + { + "sourceRange": [ + 77, + 103, + 1 + ] + } + ] + } + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 352, + 370, + 1 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 83, + 108, + 0 + ] + } + ] + }, + "two": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "argument": { + "end": 368, + "moduleId": 1, + "raw": "5", + "start": 367, + "type": "Literal", + "type": "Literal", + "value": { + "value": 5.0, + "suffix": "None" + } + }, + "end": 368, + "moduleId": 1, + "start": 360, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 370, + "moduleId": 1, + "start": 358 + }, + "end": 370, + "moduleId": 1, + "params": [], + "start": 352, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "part001": { + "type": "Solid", + "value": { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 109, + 124, + 1 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 130, + 146, + 1 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 152, + 168, + 1 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 174, + 190, + 1 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 196, + 218, + 1 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 224, + 242, + 1 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 248, + 264, + 1 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 270, + 278, + 1 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 109, + 124, + 1 + ] + }, + "from": [ + 4.0, + 12.0 + ], + "tag": null, + "to": [ + 6.0, + 12.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 130, + 146, + 1 + ] + }, + "from": [ + 6.0, + 12.0 + ], + "tag": null, + "to": [ + 6.0, + 6.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 152, + 168, + 1 + ] + }, + "from": [ + 6.0, + 6.0 + ], + "tag": null, + "to": [ + 10.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 174, + 190, + 1 + ] + }, + "from": [ + 10.0, + 0.0 + ], + "tag": null, + "to": [ + 10.0, + -6.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 196, + 218, + 1 + ] + }, + "from": [ + 10.0, + -6.0 + ], + "tag": null, + "to": [ + 6.25, + -10.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 224, + 242, + 1 + ] + }, + "from": [ + 6.25, + -10.5 + ], + "tag": null, + "to": [ + 6.25, + -16.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 248, + 264, + 1 + ] + }, + "from": [ + 6.25, + -16.0 + ], + "tag": null, + "to": [ + 4.25, + -16.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 270, + 278, + 1 + ] + }, + "from": [ + 4.25, + -16.0 + ], + "tag": null, + "to": [ + 4.0, + 12.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "units": { + "type": "Mm" + }, + "__meta": [] + }, + "start": { + "from": [ + 4.0, + 12.0 + ], + "to": [ + 4.0, + 12.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 77, + 103, + 1 + ] + } + }, + "units": { + "type": "Mm" + }, + "__meta": [ + { + "sourceRange": [ + 77, + 103, + 1 + ] + } + ] + }, + "height": 0.0, + "startCapId": null, + "endCapId": null, + "units": { + "type": "Mm" + }, + "__meta": [ + { + "sourceRange": [ + 77, + 103, + 1 + ] + } + ] + } + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 352, + 370, + 1 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/import_function_not_sketch/rendered_model.png b/src/wasm-lib/kcl/tests/import_function_not_sketch/rendered_model.png new file mode 100644 index 0000000000000000000000000000000000000000..6e4cd7fb13fa2826da776e23ddd0241e9aa50548 GIT binary patch literal 97005 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 baO$E}U52c_z~g_{Uj46EE&1nPJn(-2rvzO4 literal 0 HcmV?d00001 diff --git a/src/wasm-lib/kcl/tests/import_side_effect/artifact_commands.snap b/src/wasm-lib/kcl/tests/import_side_effect/artifact_commands.snap index 600d93924..17273e52b 100644 --- a/src/wasm-lib/kcl/tests/import_side_effect/artifact_commands.snap +++ b/src/wasm-lib/kcl/tests/import_side_effect/artifact_commands.snap @@ -281,5 +281,123 @@ snapshot_kind: text "object_id": "[uuid]", "hidden": true } + }, + { + "cmdId": "[uuid]", + "range": [ + 81, + 100, + 1 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "size": 60.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 106, + 149, + 1 + ], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 106, + 149, + 1 + ], + "command": { + "type": "start_path" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 106, + 149, + 1 + ], + "command": { + "type": "move_path_pen", + "path": "[uuid]", + "to": { + "x": 10.0, + "y": 0.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 106, + 149, + 1 + ], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "arc", + "center": { + "x": 0.0, + "y": 0.0 + }, + "radius": 10.0, + "start": { + "unit": "degrees", + "value": 0.0 + }, + "end": { + "unit": "degrees", + "value": 360.0 + }, + "relative": false + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 106, + 149, + 1 + ], + "command": { + "type": "close_path", + "path_id": "[uuid]" + } } ] diff --git a/src/wasm-lib/kcl/tests/import_side_effect/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/import_side_effect/artifact_graph_flowchart.snap new file mode 100644 index 000000000..d79822959 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_side_effect/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart import_side_effect.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/import_side_effect/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/import_side_effect/artifact_graph_flowchart.snap.md new file mode 100644 index 000000000..ee682b7d9 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_side_effect/artifact_graph_flowchart.snap.md @@ -0,0 +1,12 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[106, 149, 1]"] + 3["Segment
[106, 149, 1]"] + 4[Solid2d] + end + 1["Plane
[81, 100, 1]"] + 1 --- 2 + 2 --- 3 + 2 --- 4 +``` diff --git a/src/wasm-lib/kcl/tests/import_side_effect/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/import_side_effect/artifact_graph_mind_map.snap new file mode 100644 index 000000000..a89d8eb18 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_side_effect/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map import_side_effect.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/import_side_effect/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/import_side_effect/artifact_graph_mind_map.snap.md new file mode 100644 index 000000000..a57f7c24e --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_side_effect/artifact_graph_mind_map.snap.md @@ -0,0 +1,8 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/import_side_effect/execution_error.snap b/src/wasm-lib/kcl/tests/import_side_effect/execution_error.snap deleted file mode 100644 index 278cc7eac..000000000 --- a/src/wasm-lib/kcl/tests/import_side_effect/execution_error.snap +++ /dev/null @@ -1,14 +0,0 @@ ---- -source: kcl/src/simulation_tests.rs -description: Error from executing import_side_effect.kcl ---- -KCL Semantic error - - × semantic: Error loading imported file. Open it to view more details. - │ tests/import_side_effect/export_side_effect.kcl: Cannot send modeling - │ commands while importing. Wrap your code in a function if you want to - │ import the file. - ╭──── - 1 │ import foo from "export_side_effect.kcl" - · ──────────────────────────────────────── - ╰──── diff --git a/src/wasm-lib/kcl/tests/import_side_effect/export_side_effect.kcl b/src/wasm-lib/kcl/tests/import_side_effect/export_side_effect.kcl index 2a2d6b7d4..1b3319e26 100644 --- a/src/wasm-lib/kcl/tests/import_side_effect/export_side_effect.kcl +++ b/src/wasm-lib/kcl/tests/import_side_effect/export_side_effect.kcl @@ -2,4 +2,4 @@ export fn foo = () => { return 0 } // This interacts with the engine. part001 = startSketchOn('XY') - |> startProfileAt([0, 0], %) + |> circle({ center = [0, 0], radius = 10 }, %) diff --git a/src/wasm-lib/kcl/tests/import_side_effect/program_memory.snap b/src/wasm-lib/kcl/tests/import_side_effect/program_memory.snap new file mode 100644 index 000000000..f4a02cf0e --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_side_effect/program_memory.snap @@ -0,0 +1,112 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing import_side_effect.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "foo": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "argument": { + "end": 32, + "moduleId": 1, + "raw": "0", + "start": 31, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + "end": 32, + "moduleId": 1, + "start": 24, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 34, + "moduleId": 1, + "start": 22 + }, + "end": 34, + "moduleId": 1, + "params": [], + "start": 16, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 16, + 34, + 1 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/import_whole/execution_error.snap b/src/wasm-lib/kcl/tests/import_whole/execution_error.snap deleted file mode 100644 index 28b950223..000000000 --- a/src/wasm-lib/kcl/tests/import_whole/execution_error.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: kcl/src/simulation_tests.rs -description: Error from executing import_whole.kcl -snapshot_kind: text ---- -KCL Engine error - - × engine: Modeling command failed: websocket closed early - ╭─[1:1] - 1 │ import "exported_mod.kcl" as foo - · ▲ - 2 │ - ╰──── diff --git a/src/wasm-lib/kcl/tests/kittycad_svg/execution_error.snap b/src/wasm-lib/kcl/tests/kittycad_svg/execution_error.snap deleted file mode 100644 index b61e7cfb8..000000000 --- a/src/wasm-lib/kcl/tests/kittycad_svg/execution_error.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: kcl/src/simulation_tests.rs -description: Error from executing kittycad_svg.kcl -snapshot_kind: text ---- -KCL Engine error - - × engine: Modeling command failed: websocket closed early - ╭─[1:1] - 1 │ svg = startSketchOn('XY') - · ▲ - 2 │ |> startProfileAt([0, 0], %) - ╰──── diff --git a/src/wasm-lib/kcl/tests/pentagon_fillet_sugar/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/pentagon_fillet_sugar/artifact_graph_mind_map.snap.md index 1c812299e..452b3b8b6 100644 --- a/src/wasm-lib/kcl/tests/pentagon_fillet_sugar/artifact_graph_mind_map.snap.md +++ b/src/wasm-lib/kcl/tests/pentagon_fillet_sugar/artifact_graph_mind_map.snap.md @@ -43,34 +43,8 @@ mindmap SweepEdge Adjacent Sweep Extrusion Wall - Path - Segment - Wall - SweepEdge Opposite - SweepEdge Adjacent - EdgeCut Fillet - Segment - Sweep Extrusion - Wall - Cap End - SweepEdge Opposite - SweepEdge Adjacent - Solid2d Wall Wall - Path - Segment - Wall - SweepEdge Opposite - SweepEdge Adjacent - EdgeCut Fillet - Segment - Sweep Extrusion - Wall - Cap End - SweepEdge Opposite - SweepEdge Adjacent - Solid2d Cap Start Cap End SweepEdge Opposite diff --git a/src/wasm-lib/kcl/tests/sketch_on_face/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/sketch_on_face/artifact_graph_mind_map.snap.md index d5ff3359d..84a9f177f 100644 --- a/src/wasm-lib/kcl/tests/sketch_on_face/artifact_graph_mind_map.snap.md +++ b/src/wasm-lib/kcl/tests/sketch_on_face/artifact_graph_mind_map.snap.md @@ -57,39 +57,6 @@ mindmap Wall Wall Wall - Path - Segment - Wall - SweepEdge Opposite - SweepEdge Adjacent - Segment - Wall - SweepEdge Opposite - SweepEdge Adjacent - Segment - Wall - SweepEdge Opposite - SweepEdge Adjacent - Segment - Wall - SweepEdge Opposite - SweepEdge Adjacent - Sweep Extrusion - Wall - Wall - Wall - Wall - Cap Start - Cap End - SweepEdge Opposite - SweepEdge Adjacent - SweepEdge Opposite - SweepEdge Adjacent - SweepEdge Opposite - SweepEdge Adjacent - SweepEdge Opposite - SweepEdge Adjacent - Solid2d Cap Start Cap End SweepEdge Opposite diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/artifact_graph_mind_map.snap.md index 78e301e20..18775e194 100644 --- a/src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/artifact_graph_mind_map.snap.md +++ b/src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/artifact_graph_mind_map.snap.md @@ -63,39 +63,6 @@ mindmap Sweep Extrusion Wall Wall - Path - Segment - Wall - SweepEdge Opposite - SweepEdge Adjacent - Segment - Wall - SweepEdge Opposite - SweepEdge Adjacent - Segment - Wall - SweepEdge Opposite - SweepEdge Adjacent - Segment - Wall - SweepEdge Opposite - SweepEdge Adjacent - Segment - Sweep Extrusion - Wall - Wall - Wall - Wall - Cap End - SweepEdge Opposite - SweepEdge Adjacent - SweepEdge Opposite - SweepEdge Adjacent - SweepEdge Opposite - SweepEdge Adjacent - SweepEdge Opposite - SweepEdge Adjacent - Solid2d Wall Wall Wall