Revert "Fix so that tag declarators can be used as parameters (#4692)" (#4788)

This reverts commit e27840219b.
This commit is contained in:
Jonathan Tran
2024-12-13 16:39:40 -05:00
committed by GitHub
parent e787495ad0
commit fe5f574a77
10 changed files with 94 additions and 1646 deletions

View File

@ -353,7 +353,6 @@ impl Node<CallExpressionKw> {
// Build a hashmap from argument labels to the final evaluated values.
let mut fn_args = HashMap::with_capacity(self.arguments.len());
let mut tag_declarator_args = Vec::new();
for arg_expr in &self.arguments {
let source_range = SourceRange::from(arg_expr.arg.clone());
let metadata = Metadata { source_range };
@ -361,12 +360,8 @@ impl Node<CallExpressionKw> {
.execute_expr(&arg_expr.arg, exec_state, &metadata, StatementKind::Expression)
.await?;
fn_args.insert(arg_expr.label.name.clone(), Arg::new(value, source_range));
if let Expr::TagDeclarator(td) = &arg_expr.arg {
tag_declarator_args.push((td.inner.clone(), source_range));
}
}
let fn_args = fn_args; // remove mutability
let tag_declarator_args = tag_declarator_args; // remove mutability
// Evaluate the unlabeled first param, if any exists.
let unlabeled = if let Some(ref arg_expr) = self.unlabeled {
@ -392,7 +387,7 @@ impl Node<CallExpressionKw> {
FunctionKind::Core(func) => {
// Attempt to call the function.
let mut result = func.std_lib_fn()(exec_state, args).await?;
update_memory_for_tags_of_geometry(&mut result, &tag_declarator_args, exec_state)?;
update_memory_for_tags_of_geometry(&mut result, exec_state)?;
Ok(result)
}
FunctionKind::UserDefined => {
@ -440,7 +435,6 @@ impl Node<CallExpression> {
let fn_name = &self.callee.name;
let mut fn_args: Vec<Arg> = Vec::with_capacity(self.arguments.len());
let mut tag_declarator_args = Vec::new();
for arg_expr in &self.arguments {
let metadata = Metadata {
@ -450,19 +444,15 @@ impl Node<CallExpression> {
.execute_expr(arg_expr, exec_state, &metadata, StatementKind::Expression)
.await?;
let arg = Arg::new(value, SourceRange::from(arg_expr));
if let Expr::TagDeclarator(td) = arg_expr {
tag_declarator_args.push((td.inner.clone(), arg.source_range));
}
fn_args.push(arg);
}
let tag_declarator_args = tag_declarator_args; // remove mutability
match ctx.stdlib.get_either(fn_name) {
FunctionKind::Core(func) => {
// Attempt to call the function.
let args = crate::std::Args::new(fn_args, self.into(), ctx.clone());
let mut result = func.std_lib_fn()(exec_state, args).await?;
update_memory_for_tags_of_geometry(&mut result, &tag_declarator_args, exec_state)?;
update_memory_for_tags_of_geometry(&mut result, exec_state)?;
Ok(result)
}
FunctionKind::UserDefined => {
@ -501,24 +491,7 @@ impl Node<CallExpression> {
}
}
/// `tag_declarator_args` should only contain tag declarator literals, which
/// will be defined as local variables. Non-literals that evaluate to tag
/// declarators should not be defined.
fn update_memory_for_tags_of_geometry(
result: &mut KclValue,
tag_declarator_args: &[(TagDeclarator, SourceRange)],
exec_state: &mut ExecState,
) -> Result<(), KclError> {
// Define all the tags in the memory.
for (tag_declarator, arg_sr) in tag_declarator_args {
let tag = TagIdentifier {
value: tag_declarator.name.clone(),
info: None,
meta: vec![Metadata { source_range: *arg_sr }],
};
exec_state.memory.add_tag(&tag.value, tag.clone(), *arg_sr)?;
}
fn update_memory_for_tags_of_geometry(result: &mut KclValue, exec_state: &mut ExecState) -> Result<(), KclError> {
// If the return result is a sketch or solid, we want to update the
// memory for the tags of the group.
// TODO: This could probably be done in a better way, but as of now this was my only idea
@ -526,7 +499,7 @@ fn update_memory_for_tags_of_geometry(
match result {
KclValue::Sketch { value: ref mut sketch } => {
for (_, tag) in sketch.tags.iter() {
exec_state.memory.update_tag_if_defined(&tag.value, tag.clone());
exec_state.memory.update_tag(&tag.value, tag.clone())?;
}
}
KclValue::Solid(ref mut solid) => {
@ -564,7 +537,7 @@ fn update_memory_for_tags_of_geometry(
info.sketch = solid.id;
t.info = Some(info);
exec_state.memory.update_tag_if_defined(&tag.name, t.clone());
exec_state.memory.update_tag(&tag.name, t.clone())?;
// update the sketch tags.
solid.sketch.tags.insert(tag.name.clone(), t);
@ -585,6 +558,22 @@ fn update_memory_for_tags_of_geometry(
Ok(())
}
impl Node<TagDeclarator> {
pub async fn execute(&self, exec_state: &mut ExecState) -> Result<KclValue, KclError> {
let memory_item = KclValue::TagIdentifier(Box::new(TagIdentifier {
value: self.name.clone(),
info: None,
meta: vec![Metadata {
source_range: self.into(),
}],
}));
exec_state.memory.add(&self.name, memory_item.clone(), self.into())?;
Ok(self.into())
}
}
impl Node<ArrayExpression> {
#[async_recursion]
pub async fn execute(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result<KclValue, KclError> {

View File

@ -124,16 +124,10 @@ impl ProgramMemory {
Ok(())
}
pub fn add_tag(&mut self, tag: &str, value: TagIdentifier, source_range: SourceRange) -> Result<(), KclError> {
self.add(tag, KclValue::TagIdentifier(Box::new(value)), source_range)
}
pub fn update_tag_if_defined(&mut self, tag: &str, value: TagIdentifier) {
if !self.environments[self.current_env.index()].contains_key(tag) {
// Do nothing if the tag isn't defined.
return;
}
pub fn update_tag(&mut self, tag: &str, value: TagIdentifier) -> Result<(), KclError> {
self.environments[self.current_env.index()].insert(tag.to_string(), KclValue::TagIdentifier(Box::new(value)));
Ok(())
}
/// Get a value from the program memory.
@ -850,7 +844,7 @@ impl GetTangentialInfoFromPathsResult {
impl Sketch {
pub(crate) fn add_tag(&mut self, tag: NodeRef<'_, TagDeclarator>, current_path: &Path) {
let mut tag_identifier = TagIdentifier::from(tag);
let mut tag_identifier: TagIdentifier = tag.into();
let base = current_path.get_base();
tag_identifier.info = Some(TagEngineInfo {
id: base.geo_meta.id,
@ -2136,7 +2130,7 @@ impl ExecutorContext {
let item = match init {
Expr::None(none) => KclValue::from(none),
Expr::Literal(literal) => KclValue::from(literal),
Expr::TagDeclarator(tag) => KclValue::from(tag),
Expr::TagDeclarator(tag) => tag.execute(exec_state).await?,
Expr::Identifier(identifier) => {
let value = exec_state.memory.get(&identifier.name, identifier.into())?;
value.clone()
@ -3054,10 +3048,8 @@ let notTagDeclarator = !myTagDeclarator";
);
let code9 = "
sk = startSketchOn('XY')
|> startProfileAt([0, 0], %)
|> line([5, 0], %, $myTag)
notTagIdentifier = !myTag";
let myTagDeclarator = $myTag
let notTagIdentifier = !myTag";
let tag_identifier_err = parse_execute(code9).await.unwrap_err().downcast::<KclError>().unwrap();
// These are currently printed out as JSON objects, so we don't want to
// check the full error.

View File

@ -1502,48 +1502,6 @@ mod kw_fn {
super::execute(TEST_NAME, true).await
}
}
mod tag_can_be_proxied_through_parameter {
const TEST_NAME: &str = "tag_can_be_proxied_through_parameter";
/// 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, false).await
}
}
mod tag_proxied_through_function_does_not_define_var {
const TEST_NAME: &str = "tag_proxied_through_function_does_not_define_var";
/// 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, false).await
}
}
mod kw_fn_too_few_args {
const TEST_NAME: &str = "kw_fn_too_few_args";

View File

@ -87,6 +87,72 @@ snapshot_kind: text
}
]
},
"arc_tag": {
"type": "TagIdentifier",
"type": "TagIdentifier",
"value": "arc_tag",
"info": {
"type": "TagEngineInfo",
"id": "[uuid]",
"sketch": "[uuid]",
"path": {
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
527,
549,
0
]
},
"ccw": true,
"center": [
200.0,
100.0
],
"from": [
280.0,
100.0
],
"radius": 80.0,
"tag": {
"end": 548,
"start": 540,
"type": "TagDeclarator",
"value": "arc_tag"
},
"to": [
280.0,
99.99999999999999
],
"type": "Arc"
},
"surface": {
"faceId": "[uuid]",
"id": "[uuid]",
"sourceRange": [
527,
549,
0
],
"tag": {
"end": 548,
"start": 540,
"type": "TagDeclarator",
"value": "arc_tag"
},
"type": "extrudeArc"
}
},
"__meta": [
{
"sourceRange": [
540,
548,
0
]
}
]
},
"b": {
"type": "TagIdentifier",
"type": "TagIdentifier",

View File

@ -1,586 +0,0 @@
---
source: kcl/src/simulation_tests.rs
description: Result of parsing tag_can_be_proxied_through_parameter.kcl
snapshot_kind: text
---
{
"Ok": {
"body": [
{
"declaration": {
"end": 118,
"id": {
"end": 47,
"name": "myCircle",
"start": 39,
"type": "Identifier"
},
"init": {
"body": {
"body": [
{
"argument": {
"arguments": [
{
"end": 106,
"properties": [
{
"end": 87,
"key": {
"end": 83,
"name": "radius",
"start": 77,
"type": "Identifier"
},
"start": 77,
"type": "ObjectProperty",
"value": {
"end": 87,
"raw": "4",
"start": 86,
"type": "Literal",
"type": "Literal",
"value": 4.0
}
},
{
"end": 104,
"key": {
"end": 95,
"name": "center",
"start": 89,
"type": "Identifier"
},
"start": 89,
"type": "ObjectProperty",
"value": {
"elements": [
{
"end": 100,
"raw": "0",
"start": 99,
"type": "Literal",
"type": "Literal",
"value": 0.0
},
{
"end": 103,
"raw": "0",
"start": 102,
"type": "Literal",
"type": "Literal",
"value": 0.0
}
],
"end": 104,
"start": 98,
"type": "ArrayExpression",
"type": "ArrayExpression"
}
}
],
"start": 75,
"type": "ObjectExpression",
"type": "ObjectExpression"
},
{
"end": 110,
"name": "sk",
"start": 108,
"type": "Identifier",
"type": "Identifier"
},
{
"end": 115,
"name": "tag",
"start": 112,
"type": "Identifier",
"type": "Identifier"
}
],
"callee": {
"end": 74,
"name": "circle",
"start": 68,
"type": "Identifier"
},
"end": 116,
"start": 68,
"type": "CallExpression",
"type": "CallExpression"
},
"end": 116,
"start": 61,
"type": "ReturnStatement",
"type": "ReturnStatement"
}
],
"end": 118,
"start": 57
},
"end": 118,
"params": [
{
"type": "Parameter",
"identifier": {
"end": 50,
"name": "sk",
"start": 48,
"type": "Identifier"
}
},
{
"type": "Parameter",
"identifier": {
"end": 55,
"name": "tag",
"start": 52,
"type": "Identifier"
}
}
],
"start": 47,
"type": "FunctionExpression",
"type": "FunctionExpression"
},
"start": 39,
"type": "VariableDeclarator"
},
"end": 118,
"kind": "fn",
"start": 36,
"type": "VariableDeclaration",
"type": "VariableDeclaration"
},
{
"declaration": {
"end": 223,
"id": {
"end": 122,
"name": "c1",
"start": 120,
"type": "Identifier"
},
"init": {
"body": [
{
"arguments": [
{
"end": 143,
"raw": "'XY'",
"start": 139,
"type": "Literal",
"type": "Literal",
"value": "XY"
}
],
"callee": {
"end": 138,
"name": "startSketchOn",
"start": 125,
"type": "Identifier"
},
"end": 144,
"start": 125,
"type": "CallExpression",
"type": "CallExpression"
},
{
"arguments": [
{
"elements": [
{
"end": 167,
"raw": "0",
"start": 166,
"type": "Literal",
"type": "Literal",
"value": 0.0
},
{
"end": 170,
"raw": "0",
"start": 169,
"type": "Literal",
"type": "Literal",
"value": 0.0
}
],
"end": 171,
"start": 165,
"type": "ArrayExpression",
"type": "ArrayExpression"
},
{
"end": 174,
"start": 173,
"type": "PipeSubstitution",
"type": "PipeSubstitution"
}
],
"callee": {
"end": 164,
"name": "startProfileAt",
"start": 150,
"type": "Identifier"
},
"end": 175,
"start": 150,
"type": "CallExpression",
"type": "CallExpression"
},
{
"arguments": [
{
"end": 191,
"start": 190,
"type": "PipeSubstitution",
"type": "PipeSubstitution"
},
{
"end": 198,
"start": 193,
"type": "TagDeclarator",
"type": "TagDeclarator",
"value": "mine"
}
],
"callee": {
"end": 189,
"name": "myCircle",
"start": 181,
"type": "Identifier"
},
"end": 199,
"start": 181,
"type": "CallExpression",
"type": "CallExpression"
}
],
"end": 223,
"nonCodeMeta": {
"nonCodeNodes": {
"2": [
{
"end": 223,
"start": 199,
"type": "NonCodeNode",
"value": {
"type": "blockComment",
"value": "The tag can be used.",
"style": "line"
}
}
]
},
"startNodes": []
},
"start": 125,
"type": "PipeExpression",
"type": "PipeExpression"
},
"start": 120,
"type": "VariableDeclarator"
},
"end": 223,
"kind": "const",
"start": 120,
"type": "VariableDeclaration",
"type": "VariableDeclaration"
},
{
"declaration": {
"end": 257,
"id": {
"end": 228,
"name": "ang1",
"start": 224,
"type": "Identifier"
},
"init": {
"arguments": [
{
"computed": false,
"end": 256,
"object": {
"computed": false,
"end": 251,
"object": {
"end": 246,
"name": "c1",
"start": 244,
"type": "Identifier",
"type": "Identifier"
},
"property": {
"end": 251,
"name": "tags",
"start": 247,
"type": "Identifier",
"type": "Identifier"
},
"start": 244,
"type": "MemberExpression",
"type": "MemberExpression"
},
"property": {
"end": 256,
"name": "mine",
"start": 252,
"type": "Identifier",
"type": "Identifier"
},
"start": 244,
"type": "MemberExpression",
"type": "MemberExpression"
}
],
"callee": {
"end": 243,
"name": "tangentToEnd",
"start": 231,
"type": "Identifier"
},
"end": 257,
"start": 231,
"type": "CallExpression",
"type": "CallExpression"
},
"start": 224,
"type": "VariableDeclarator"
},
"end": 257,
"kind": "const",
"start": 224,
"type": "VariableDeclaration",
"type": "VariableDeclaration"
},
{
"declaration": {
"end": 384,
"id": {
"end": 307,
"name": "c2",
"start": 305,
"type": "Identifier"
},
"init": {
"body": [
{
"arguments": [
{
"end": 328,
"raw": "'XY'",
"start": 324,
"type": "Literal",
"type": "Literal",
"value": "XY"
}
],
"callee": {
"end": 323,
"name": "startSketchOn",
"start": 310,
"type": "Identifier"
},
"end": 329,
"start": 310,
"type": "CallExpression",
"type": "CallExpression"
},
{
"arguments": [
{
"elements": [
{
"end": 352,
"raw": "0",
"start": 351,
"type": "Literal",
"type": "Literal",
"value": 0.0
},
{
"end": 355,
"raw": "0",
"start": 354,
"type": "Literal",
"type": "Literal",
"value": 0.0
}
],
"end": 356,
"start": 350,
"type": "ArrayExpression",
"type": "ArrayExpression"
},
{
"end": 359,
"start": 358,
"type": "PipeSubstitution",
"type": "PipeSubstitution"
}
],
"callee": {
"end": 349,
"name": "startProfileAt",
"start": 335,
"type": "Identifier"
},
"end": 360,
"start": 335,
"type": "CallExpression",
"type": "CallExpression"
},
{
"arguments": [
{
"end": 376,
"start": 375,
"type": "PipeSubstitution",
"type": "PipeSubstitution"
},
{
"end": 383,
"start": 378,
"type": "TagDeclarator",
"type": "TagDeclarator",
"value": "mine"
}
],
"callee": {
"end": 374,
"name": "myCircle",
"start": 366,
"type": "Identifier"
},
"end": 384,
"start": 366,
"type": "CallExpression",
"type": "CallExpression"
}
],
"end": 384,
"start": 310,
"type": "PipeExpression",
"type": "PipeExpression"
},
"start": 305,
"type": "VariableDeclarator"
},
"end": 384,
"kind": "const",
"start": 305,
"type": "VariableDeclaration",
"type": "VariableDeclaration"
},
{
"declaration": {
"end": 418,
"id": {
"end": 389,
"name": "ang2",
"start": 385,
"type": "Identifier"
},
"init": {
"arguments": [
{
"computed": false,
"end": 417,
"object": {
"computed": false,
"end": 412,
"object": {
"end": 407,
"name": "c2",
"start": 405,
"type": "Identifier",
"type": "Identifier"
},
"property": {
"end": 412,
"name": "tags",
"start": 408,
"type": "Identifier",
"type": "Identifier"
},
"start": 405,
"type": "MemberExpression",
"type": "MemberExpression"
},
"property": {
"end": 417,
"name": "mine",
"start": 413,
"type": "Identifier",
"type": "Identifier"
},
"start": 405,
"type": "MemberExpression",
"type": "MemberExpression"
}
],
"callee": {
"end": 404,
"name": "tangentToEnd",
"start": 392,
"type": "Identifier"
},
"end": 418,
"start": 392,
"type": "CallExpression",
"type": "CallExpression"
},
"start": 385,
"type": "VariableDeclarator"
},
"end": 418,
"kind": "const",
"start": 385,
"type": "VariableDeclaration",
"type": "VariableDeclaration"
}
],
"end": 419,
"nonCodeMeta": {
"nonCodeNodes": {
"0": [
{
"end": 120,
"start": 118,
"type": "NonCodeNode",
"value": {
"type": "newLine"
}
}
],
"2": [
{
"end": 304,
"start": 257,
"type": "NonCodeNode",
"value": {
"type": "newLineBlockComment",
"value": "The same tag declarator can be used again.",
"style": "line"
}
}
]
},
"startNodes": [
{
"end": 35,
"start": 0,
"type": "NonCodeNode",
"value": {
"type": "blockComment",
"value": "A function with a tag parameter.",
"style": "line"
}
}
]
},
"start": 0
}
}

View File

@ -1,16 +0,0 @@
// A function with a tag parameter.
fn myCircle(sk, tag) {
return circle({ radius = 4, center = [0, 0] }, sk, tag)
}
c1 = startSketchOn('XY')
|> startProfileAt([0, 0], %)
|> myCircle(%, $mine)
// The tag can be used.
ang1 = tangentToEnd(c1.tags.mine)
// The same tag declarator can be used again.
c2 = startSketchOn('XY')
|> startProfileAt([0, 0], %)
|> myCircle(%, $mine)
ang2 = tangentToEnd(c2.tags.mine)

View File

@ -1,524 +0,0 @@
---
source: kcl/src/simulation_tests.rs
description: Program memory after executing tag_can_be_proxied_through_parameter.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": []
},
"ang1": {
"type": "Number",
"value": 90.0,
"__meta": [
{
"sourceRange": [
231,
257,
0
]
}
]
},
"ang2": {
"type": "Number",
"value": 90.0,
"__meta": [
{
"sourceRange": [
392,
418,
0
]
}
]
},
"c1": {
"type": "Sketch",
"value": {
"type": "Sketch",
"id": "[uuid]",
"paths": [
{
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
68,
116,
0
]
},
"ccw": true,
"center": [
0.0,
0.0
],
"from": [
4.0,
0.0
],
"radius": 4.0,
"tag": {
"end": 198,
"start": 193,
"type": "TagDeclarator",
"value": "mine"
},
"to": [
4.0,
0.0
],
"type": "Circle"
}
],
"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
},
"__meta": []
},
"start": {
"from": [
4.0,
0.0
],
"to": [
4.0,
0.0
],
"tag": null,
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
68,
116,
0
]
}
},
"tags": {
"mine": {
"type": "TagIdentifier",
"value": "mine",
"info": {
"type": "TagEngineInfo",
"id": "[uuid]",
"sketch": "[uuid]",
"path": {
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
68,
116,
0
]
},
"ccw": true,
"center": [
0.0,
0.0
],
"from": [
4.0,
0.0
],
"radius": 4.0,
"tag": {
"end": 198,
"start": 193,
"type": "TagDeclarator",
"value": "mine"
},
"to": [
4.0,
0.0
],
"type": "Circle"
},
"surface": null
},
"__meta": [
{
"sourceRange": [
193,
198,
0
]
}
]
}
},
"__meta": [
{
"sourceRange": [
68,
116,
0
]
}
]
}
},
"c2": {
"type": "Sketch",
"value": {
"type": "Sketch",
"id": "[uuid]",
"paths": [
{
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
68,
116,
0
]
},
"ccw": true,
"center": [
0.0,
0.0
],
"from": [
4.0,
0.0
],
"radius": 4.0,
"tag": {
"end": 383,
"start": 378,
"type": "TagDeclarator",
"value": "mine"
},
"to": [
4.0,
0.0
],
"type": "Circle"
}
],
"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
},
"__meta": []
},
"start": {
"from": [
4.0,
0.0
],
"to": [
4.0,
0.0
],
"tag": null,
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
68,
116,
0
]
}
},
"tags": {
"mine": {
"type": "TagIdentifier",
"value": "mine",
"info": {
"type": "TagEngineInfo",
"id": "[uuid]",
"sketch": "[uuid]",
"path": {
"__geoMeta": {
"id": "[uuid]",
"sourceRange": [
68,
116,
0
]
},
"ccw": true,
"center": [
0.0,
0.0
],
"from": [
4.0,
0.0
],
"radius": 4.0,
"tag": {
"end": 383,
"start": 378,
"type": "TagDeclarator",
"value": "mine"
},
"to": [
4.0,
0.0
],
"type": "Circle"
},
"surface": null
},
"__meta": [
{
"sourceRange": [
378,
383,
0
]
}
]
}
},
"__meta": [
{
"sourceRange": [
68,
116,
0
]
}
]
}
},
"myCircle": {
"type": "Function",
"expression": {
"body": {
"body": [
{
"argument": {
"arguments": [
{
"end": 106,
"properties": [
{
"end": 87,
"key": {
"end": 83,
"name": "radius",
"start": 77,
"type": "Identifier"
},
"start": 77,
"type": "ObjectProperty",
"value": {
"end": 87,
"raw": "4",
"start": 86,
"type": "Literal",
"type": "Literal",
"value": 4.0
}
},
{
"end": 104,
"key": {
"end": 95,
"name": "center",
"start": 89,
"type": "Identifier"
},
"start": 89,
"type": "ObjectProperty",
"value": {
"elements": [
{
"end": 100,
"raw": "0",
"start": 99,
"type": "Literal",
"type": "Literal",
"value": 0.0
},
{
"end": 103,
"raw": "0",
"start": 102,
"type": "Literal",
"type": "Literal",
"value": 0.0
}
],
"end": 104,
"start": 98,
"type": "ArrayExpression",
"type": "ArrayExpression"
}
}
],
"start": 75,
"type": "ObjectExpression",
"type": "ObjectExpression"
},
{
"end": 110,
"name": "sk",
"start": 108,
"type": "Identifier",
"type": "Identifier"
},
{
"end": 115,
"name": "tag",
"start": 112,
"type": "Identifier",
"type": "Identifier"
}
],
"callee": {
"end": 74,
"name": "circle",
"start": 68,
"type": "Identifier"
},
"end": 116,
"start": 68,
"type": "CallExpression",
"type": "CallExpression"
},
"end": 116,
"start": 61,
"type": "ReturnStatement",
"type": "ReturnStatement"
}
],
"end": 118,
"start": 57
},
"end": 118,
"params": [
{
"type": "Parameter",
"identifier": {
"end": 50,
"name": "sk",
"start": 48,
"type": "Identifier"
}
},
{
"type": "Parameter",
"identifier": {
"end": 55,
"name": "tag",
"start": 52,
"type": "Identifier"
}
}
],
"start": 47,
"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": [
47,
118,
0
]
}
]
}
},
"parent": null
}
],
"currentEnv": 0,
"return": null
}

View File

@ -1,400 +0,0 @@
---
source: kcl/src/simulation_tests.rs
description: Result of parsing tag_proxied_through_function_does_not_define_var.kcl
snapshot_kind: text
---
{
"Ok": {
"body": [
{
"declaration": {
"end": 193,
"id": {
"end": 47,
"name": "myCircle",
"start": 39,
"type": "Identifier"
},
"init": {
"body": {
"body": [
{
"declaration": {
"end": 113,
"id": {
"end": 62,
"name": "c",
"start": 61,
"type": "Identifier"
},
"init": {
"arguments": [
{
"end": 103,
"properties": [
{
"end": 84,
"key": {
"end": 80,
"name": "radius",
"start": 74,
"type": "Identifier"
},
"start": 74,
"type": "ObjectProperty",
"value": {
"end": 84,
"raw": "4",
"start": 83,
"type": "Literal",
"type": "Literal",
"value": 4.0
}
},
{
"end": 101,
"key": {
"end": 92,
"name": "center",
"start": 86,
"type": "Identifier"
},
"start": 86,
"type": "ObjectProperty",
"value": {
"elements": [
{
"end": 97,
"raw": "0",
"start": 96,
"type": "Literal",
"type": "Literal",
"value": 0.0
},
{
"end": 100,
"raw": "0",
"start": 99,
"type": "Literal",
"type": "Literal",
"value": 0.0
}
],
"end": 101,
"start": 95,
"type": "ArrayExpression",
"type": "ArrayExpression"
}
}
],
"start": 72,
"type": "ObjectExpression",
"type": "ObjectExpression"
},
{
"end": 107,
"name": "sk",
"start": 105,
"type": "Identifier",
"type": "Identifier"
},
{
"end": 112,
"name": "tag",
"start": 109,
"type": "Identifier",
"type": "Identifier"
}
],
"callee": {
"end": 71,
"name": "circle",
"start": 65,
"type": "Identifier"
},
"end": 113,
"start": 65,
"type": "CallExpression",
"type": "CallExpression"
},
"start": 61,
"type": "VariableDeclarator"
},
"end": 113,
"kind": "const",
"start": 61,
"type": "VariableDeclaration",
"type": "VariableDeclaration"
},
{
"declaration": {
"end": 173,
"id": {
"end": 152,
"name": "ang",
"start": 149,
"type": "Identifier"
},
"init": {
"arguments": [
{
"end": 172,
"name": "mine",
"start": 168,
"type": "Identifier",
"type": "Identifier"
}
],
"callee": {
"end": 167,
"name": "tangentToEnd",
"start": 155,
"type": "Identifier"
},
"end": 173,
"start": 155,
"type": "CallExpression",
"type": "CallExpression"
},
"start": 149,
"type": "VariableDeclarator"
},
"end": 173,
"kind": "const",
"start": 149,
"type": "VariableDeclaration",
"type": "VariableDeclaration"
},
{
"argument": {
"elements": [
{
"end": 185,
"name": "c",
"start": 184,
"type": "Identifier",
"type": "Identifier"
},
{
"end": 190,
"name": "ang",
"start": 187,
"type": "Identifier",
"type": "Identifier"
}
],
"end": 191,
"start": 183,
"type": "ArrayExpression",
"type": "ArrayExpression"
},
"end": 191,
"start": 176,
"type": "ReturnStatement",
"type": "ReturnStatement"
}
],
"end": 193,
"nonCodeMeta": {
"nonCodeNodes": {
"0": [
{
"end": 146,
"start": 115,
"type": "NonCodeNode",
"value": {
"type": "blockComment",
"value": "This should not be allowed.",
"style": "line"
}
}
]
},
"startNodes": []
},
"start": 57
},
"end": 193,
"params": [
{
"type": "Parameter",
"identifier": {
"end": 50,
"name": "sk",
"start": 48,
"type": "Identifier"
}
},
{
"type": "Parameter",
"identifier": {
"end": 55,
"name": "tag",
"start": 52,
"type": "Identifier"
}
}
],
"start": 47,
"type": "FunctionExpression",
"type": "FunctionExpression"
},
"start": 39,
"type": "VariableDeclarator"
},
"end": 193,
"kind": "fn",
"start": 36,
"type": "VariableDeclaration",
"type": "VariableDeclaration"
},
{
"declaration": {
"end": 274,
"id": {
"end": 197,
"name": "c1",
"start": 195,
"type": "Identifier"
},
"init": {
"body": [
{
"arguments": [
{
"end": 218,
"raw": "'XY'",
"start": 214,
"type": "Literal",
"type": "Literal",
"value": "XY"
}
],
"callee": {
"end": 213,
"name": "startSketchOn",
"start": 200,
"type": "Identifier"
},
"end": 219,
"start": 200,
"type": "CallExpression",
"type": "CallExpression"
},
{
"arguments": [
{
"elements": [
{
"end": 242,
"raw": "0",
"start": 241,
"type": "Literal",
"type": "Literal",
"value": 0.0
},
{
"end": 245,
"raw": "0",
"start": 244,
"type": "Literal",
"type": "Literal",
"value": 0.0
}
],
"end": 246,
"start": 240,
"type": "ArrayExpression",
"type": "ArrayExpression"
},
{
"end": 249,
"start": 248,
"type": "PipeSubstitution",
"type": "PipeSubstitution"
}
],
"callee": {
"end": 239,
"name": "startProfileAt",
"start": 225,
"type": "Identifier"
},
"end": 250,
"start": 225,
"type": "CallExpression",
"type": "CallExpression"
},
{
"arguments": [
{
"end": 266,
"start": 265,
"type": "PipeSubstitution",
"type": "PipeSubstitution"
},
{
"end": 273,
"start": 268,
"type": "TagDeclarator",
"type": "TagDeclarator",
"value": "mine"
}
],
"callee": {
"end": 264,
"name": "myCircle",
"start": 256,
"type": "Identifier"
},
"end": 274,
"start": 256,
"type": "CallExpression",
"type": "CallExpression"
}
],
"end": 274,
"start": 200,
"type": "PipeExpression",
"type": "PipeExpression"
},
"start": 195,
"type": "VariableDeclarator"
},
"end": 274,
"kind": "const",
"start": 195,
"type": "VariableDeclaration",
"type": "VariableDeclaration"
}
],
"end": 275,
"nonCodeMeta": {
"nonCodeNodes": {
"0": [
{
"end": 195,
"start": 193,
"type": "NonCodeNode",
"value": {
"type": "newLine"
}
}
]
},
"startNodes": [
{
"end": 35,
"start": 0,
"type": "NonCodeNode",
"value": {
"type": "blockComment",
"value": "A function with a tag parameter.",
"style": "line"
}
}
]
},
"start": 0
}
}

View File

@ -1,20 +0,0 @@
---
source: kcl/src/simulation_tests.rs
description: Error from executing tag_proxied_through_function_does_not_define_var.kcl
snapshot_kind: text
---
KCL UndefinedValue error
× undefined value: memory item key `mine` is not defined
╭─[5:22]
4 │ // This should not be allowed.
5 │ ang = tangentToEnd(mine)
· ────
6 │ return [c, ang]
7 │ }
8 │
9 │ c1 = startSketchOn('XY')
10 │ |> startProfileAt([0, 0], %)
11 │ |> myCircle(%, $mine)
· ──────────────────
╰────

View File

@ -1,11 +0,0 @@
// A function with a tag parameter.
fn myCircle(sk, tag) {
c = circle({ radius = 4, center = [0, 0] }, sk, tag)
// This should not be allowed.
ang = tangentToEnd(mine)
return [c, ang]
}
c1 = startSketchOn('XY')
|> startProfileAt([0, 0], %)
|> myCircle(%, $mine)