Compare commits
	
		
			2 Commits
		
	
	
		
			kcl-63
			...
			achalmers/
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| c3ac4d085e | |||
| f60a06dffc | 
| @ -1,12 +1,15 @@ | ||||
| //! Data types for the AST. | ||||
|  | ||||
| use std::{collections::HashMap, fmt::Write}; | ||||
| use std::{ | ||||
|     collections::HashMap, | ||||
|     fmt::{Formatter, Write}, | ||||
| }; | ||||
|  | ||||
| use anyhow::Result; | ||||
| use anyhow::{anyhow, Result}; | ||||
| use parse_display::{Display, FromStr}; | ||||
| use schemars::JsonSchema; | ||||
| use serde::{Deserialize, Serialize}; | ||||
| use serde_json::Map; | ||||
| use serde_json::{Map, Number as JNumber, Value as JValue}; | ||||
| use tower_lsp::lsp_types::{CompletionItem, CompletionItemKind, DocumentSymbol, Range as LspRange, SymbolKind}; | ||||
|  | ||||
| use crate::{ | ||||
| @ -371,13 +374,13 @@ impl BodyItem { | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl From<BodyItem> for crate::executor::SourceRange { | ||||
| impl From<BodyItem> for SourceRange { | ||||
|     fn from(item: BodyItem) -> Self { | ||||
|         Self([item.start(), item.end()]) | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl From<&BodyItem> for crate::executor::SourceRange { | ||||
| impl From<&BodyItem> for SourceRange { | ||||
|     fn from(item: &BodyItem) -> Self { | ||||
|         Self([item.start(), item.end()]) | ||||
|     } | ||||
| @ -534,13 +537,13 @@ impl Value { | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl From<Value> for crate::executor::SourceRange { | ||||
| impl From<Value> for SourceRange { | ||||
|     fn from(value: Value) -> Self { | ||||
|         Self([value.start(), value.end()]) | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl From<&Value> for crate::executor::SourceRange { | ||||
| impl From<&Value> for SourceRange { | ||||
|     fn from(value: &Value) -> Self { | ||||
|         Self([value.start(), value.end()]) | ||||
|     } | ||||
| @ -558,13 +561,13 @@ pub enum BinaryPart { | ||||
|     MemberExpression(Box<MemberExpression>), | ||||
| } | ||||
|  | ||||
| impl From<BinaryPart> for crate::executor::SourceRange { | ||||
| impl From<BinaryPart> for SourceRange { | ||||
|     fn from(value: BinaryPart) -> Self { | ||||
|         Self([value.start(), value.end()]) | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl From<&BinaryPart> for crate::executor::SourceRange { | ||||
| impl From<&BinaryPart> for SourceRange { | ||||
|     fn from(value: &BinaryPart) -> Self { | ||||
|         Self([value.start(), value.end()]) | ||||
|     } | ||||
| @ -640,7 +643,7 @@ impl BinaryPart { | ||||
|         pipe_info: &mut PipeInfo, | ||||
|         ctx: &ExecutorContext, | ||||
|     ) -> Result<MemoryItem, KclError> { | ||||
|         // We DO NOT set this gloablly because if we did and this was called inside a pipe it would | ||||
|         // We DO NOT set this globally because if we did and this was called inside a pipe it would | ||||
|         // stop the execution of the pipe. | ||||
|         // THIS IS IMPORTANT. | ||||
|         let mut new_pipe_info = pipe_info.clone(); | ||||
| @ -930,7 +933,7 @@ impl CallExpression { | ||||
|                     binary_expression.get_result(memory, pipe_info, ctx).await? | ||||
|                 } | ||||
|                 Value::CallExpression(call_expression) => { | ||||
|                     // We DO NOT set this gloablly because if we did and this was called inside a pipe it would | ||||
|                     // We DO NOT set this globally because if we did and this was called inside a pipe it would | ||||
|                     // stop the execution of the pipe. | ||||
|                     // THIS IS IMPORTANT. | ||||
|                     let mut new_pipe_info = pipe_info.clone(); | ||||
| @ -1312,10 +1315,70 @@ impl VariableDeclarator { | ||||
| pub struct Literal { | ||||
|     pub start: usize, | ||||
|     pub end: usize, | ||||
|     pub value: serde_json::Value, | ||||
|     pub value: LiteralValue, | ||||
|     pub raw: String, | ||||
| } | ||||
|  | ||||
| #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] | ||||
| #[ts(export)] | ||||
| #[serde(tag = "type")] | ||||
| pub enum LiteralValue { | ||||
|     // TODO: Use Cow<str> here so that static strings don't require alloc | ||||
|     String(String), | ||||
|     Number(JNumber), | ||||
| } | ||||
|  | ||||
| impl std::fmt::Display for LiteralValue { | ||||
|     fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { | ||||
|         JValue::from(self.to_owned()).fmt(f) | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl From<LiteralValue> for JValue { | ||||
|     fn from(value: LiteralValue) -> Self { | ||||
|         match value { | ||||
|             LiteralValue::String(x) => JValue::String(x), | ||||
|             LiteralValue::Number(x) => JValue::Number(x), | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl From<&'static str> for LiteralValue { | ||||
|     fn from(value: &'static str) -> Self { | ||||
|         Self::String(value.to_owned()) | ||||
|     } | ||||
| } | ||||
| impl From<String> for LiteralValue { | ||||
|     fn from(value: String) -> Self { | ||||
|         Self::String(value) | ||||
|     } | ||||
| } | ||||
| impl From<JNumber> for LiteralValue { | ||||
|     fn from(value: JNumber) -> Self { | ||||
|         Self::Number(value) | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl From<u64> for LiteralValue { | ||||
|     fn from(value: u64) -> Self { | ||||
|         Self::Number(value.into()) | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl From<i64> for LiteralValue { | ||||
|     fn from(value: i64) -> Self { | ||||
|         Self::Number(value.into()) | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl From<f64> for LiteralValue { | ||||
|     fn from(value: f64) -> Self { | ||||
|         JNumber::from_f64(value) | ||||
|             .map(Self::Number) | ||||
|             .expect("Cannot use NaN or Inf here. TODO stop using json numbers here") | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl_value_meta!(Literal); | ||||
|  | ||||
| impl From<Literal> for Value { | ||||
| @ -1325,7 +1388,7 @@ impl From<Literal> for Value { | ||||
| } | ||||
|  | ||||
| impl Literal { | ||||
|     pub fn new(value: serde_json::Value) -> Self { | ||||
|     pub fn new(value: LiteralValue) -> Self { | ||||
|         Self { | ||||
|             start: 0, | ||||
|             end: 0, | ||||
| @ -1343,7 +1406,7 @@ impl Literal { | ||||
|     } | ||||
|  | ||||
|     fn recast(&self) -> String { | ||||
|         if let serde_json::Value::String(value) = &self.value { | ||||
|         if let JValue::String(value) = &self.value { | ||||
|             let quote = if self.raw.trim().starts_with('"') { '"' } else { '\'' }; | ||||
|             format!("{}{}{}", quote, value, quote) | ||||
|         } else { | ||||
| @ -1355,7 +1418,7 @@ impl Literal { | ||||
| impl From<Literal> for MemoryItem { | ||||
|     fn from(literal: Literal) -> Self { | ||||
|         MemoryItem::UserVal(UserVal { | ||||
|             value: literal.value.clone(), | ||||
|             value: literal.value.into(), | ||||
|             meta: vec![Metadata { | ||||
|                 source_range: literal.into(), | ||||
|             }], | ||||
| @ -1366,7 +1429,7 @@ impl From<Literal> for MemoryItem { | ||||
| impl From<&Box<Literal>> for MemoryItem { | ||||
|     fn from(literal: &Box<Literal>) -> Self { | ||||
|         MemoryItem::UserVal(UserVal { | ||||
|             value: literal.value.clone(), | ||||
|             value: literal.value.into(), | ||||
|             meta: vec![Metadata { | ||||
|                 source_range: literal.into(), | ||||
|             }], | ||||
| @ -1552,7 +1615,7 @@ impl ArrayExpression { | ||||
|                     binary_expression.get_result(memory, pipe_info, ctx).await? | ||||
|                 } | ||||
|                 Value::CallExpression(call_expression) => { | ||||
|                     // We DO NOT set this gloablly because if we did and this was called inside a pipe it would | ||||
|                     // We DO NOT set this globally because if we did and this was called inside a pipe it would | ||||
|                     // stop the execution of the pipe. | ||||
|                     // THIS IS IMPORTANT. | ||||
|                     let mut new_pipe_info = pipe_info.clone(); | ||||
| @ -1703,7 +1766,7 @@ impl ObjectExpression { | ||||
|                     binary_expression.get_result(memory, pipe_info, ctx).await? | ||||
|                 } | ||||
|                 Value::CallExpression(call_expression) => { | ||||
|                     // We DO NOT set this gloablly because if we did and this was called inside a pipe it would | ||||
|                     // We DO NOT set this globally because if we did and this was called inside a pipe it would | ||||
|                     // stop the execution of the pipe. | ||||
|                     // THIS IS IMPORTANT. | ||||
|                     let mut new_pipe_info = pipe_info.clone(); | ||||
| @ -1831,13 +1894,13 @@ impl MemberObject { | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl From<MemberObject> for crate::executor::SourceRange { | ||||
| impl From<MemberObject> for SourceRange { | ||||
|     fn from(obj: MemberObject) -> Self { | ||||
|         Self([obj.start(), obj.end()]) | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl From<&MemberObject> for crate::executor::SourceRange { | ||||
| impl From<&MemberObject> for SourceRange { | ||||
|     fn from(obj: &MemberObject) -> Self { | ||||
|         Self([obj.start(), obj.end()]) | ||||
|     } | ||||
| @ -1867,13 +1930,13 @@ impl LiteralIdentifier { | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl From<LiteralIdentifier> for crate::executor::SourceRange { | ||||
| impl From<LiteralIdentifier> for SourceRange { | ||||
|     fn from(id: LiteralIdentifier) -> Self { | ||||
|         Self([id.start(), id.end()]) | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl From<&LiteralIdentifier> for crate::executor::SourceRange { | ||||
| impl From<&LiteralIdentifier> for SourceRange { | ||||
|     fn from(id: &LiteralIdentifier) -> Self { | ||||
|         Self([id.start(), id.end()]) | ||||
|     } | ||||
| @ -1940,10 +2003,10 @@ impl MemberExpression { | ||||
|  | ||||
|         let array_json = array.get_json_value()?; | ||||
|  | ||||
|         if let serde_json::Value::Array(array) = array_json { | ||||
|         if let JValue::Array(array) = array_json { | ||||
|             if let Some(value) = array.get(index) { | ||||
|                 Ok(MemoryItem::UserVal(UserVal { | ||||
|                     value: value.clone(), | ||||
|                     value: value.into(), | ||||
|                     meta: vec![Metadata { | ||||
|                         source_range: self.into(), | ||||
|                     }], | ||||
| @ -1966,11 +2029,11 @@ impl MemberExpression { | ||||
|         let property_name = match &self.property { | ||||
|             LiteralIdentifier::Identifier(identifier) => identifier.name.to_string(), | ||||
|             LiteralIdentifier::Literal(literal) => { | ||||
|                 let value = literal.value.clone(); | ||||
|                 let value = literal.value.into(); | ||||
|                 // Parse this as a string. | ||||
|                 if let serde_json::Value::String(string) = value { | ||||
|                 if let JValue::String(string) = value { | ||||
|                     string | ||||
|                 } else if let serde_json::Value::Number(_) = &value { | ||||
|                 } else if let JValue::Number(_) = &value { | ||||
|                     // It can also be a number if we are getting a member of an array. | ||||
|                     return self.get_result_array(memory, parse_json_number_as_usize(&value, self.into())?); | ||||
|                 } else { | ||||
| @ -1992,10 +2055,10 @@ impl MemberExpression { | ||||
|  | ||||
|         let object_json = object.get_json_value()?; | ||||
|  | ||||
|         if let serde_json::Value::Object(map) = object_json { | ||||
|         if let JValue::Object(map) = object_json { | ||||
|             if let Some(value) = map.get(&property_name) { | ||||
|                 Ok(MemoryItem::UserVal(UserVal { | ||||
|                     value: value.clone(), | ||||
|                     value: value.into(), | ||||
|                     meta: vec![Metadata { | ||||
|                         source_range: self.into(), | ||||
|                     }], | ||||
| @ -2133,7 +2196,7 @@ impl BinaryExpression { | ||||
|         pipe_info: &mut PipeInfo, | ||||
|         ctx: &ExecutorContext, | ||||
|     ) -> Result<MemoryItem, KclError> { | ||||
|         // We DO NOT set this gloablly because if we did and this was called inside a pipe it would | ||||
|         // We DO NOT set this globally because if we did and this was called inside a pipe it would | ||||
|         // stop the execution of the pipe. | ||||
|         // THIS IS IMPORTANT. | ||||
|         let mut new_pipe_info = pipe_info.clone(); | ||||
| @ -2156,7 +2219,7 @@ impl BinaryExpression { | ||||
|                 parse_json_value_as_string(&left_json_value), | ||||
|                 parse_json_value_as_string(&right_json_value), | ||||
|             ) { | ||||
|                 let value = serde_json::Value::String(format!("{}{}", left, right)); | ||||
|                 let value = JValue::String(format!("{}{}", left, right)).into(); | ||||
|                 return Ok(MemoryItem::UserVal(UserVal { | ||||
|                     value, | ||||
|                     meta: vec![Metadata { | ||||
| @ -2169,7 +2232,7 @@ impl BinaryExpression { | ||||
|         let left = parse_json_number_as_f64(&left_json_value, self.left.clone().into())?; | ||||
|         let right = parse_json_number_as_f64(&right_json_value, self.right.clone().into())?; | ||||
|  | ||||
|         let value: serde_json::Value = match self.operator { | ||||
|         let value: JNumber = match self.operator { | ||||
|             BinaryOperator::Add => (left + right).into(), | ||||
|             BinaryOperator::Sub => (left - right).into(), | ||||
|             BinaryOperator::Mul => (left * right).into(), | ||||
| @ -2178,7 +2241,7 @@ impl BinaryExpression { | ||||
|         }; | ||||
|  | ||||
|         Ok(MemoryItem::UserVal(UserVal { | ||||
|             value, | ||||
|             value: value.into(), | ||||
|             meta: vec![Metadata { | ||||
|                 source_range: self.into(), | ||||
|             }], | ||||
| @ -2192,8 +2255,8 @@ impl BinaryExpression { | ||||
|     } | ||||
| } | ||||
|  | ||||
| pub fn parse_json_number_as_f64(j: &serde_json::Value, source_range: SourceRange) -> Result<f64, KclError> { | ||||
|     if let serde_json::Value::Number(n) = &j { | ||||
| pub fn parse_json_number_as_f64(j: &JValue, source_range: SourceRange) -> Result<f64, KclError> { | ||||
|     if let JValue::Number(n) = &j { | ||||
|         n.as_f64().ok_or_else(|| { | ||||
|             KclError::Syntax(KclErrorDetails { | ||||
|                 source_ranges: vec![source_range], | ||||
| @ -2208,8 +2271,8 @@ pub fn parse_json_number_as_f64(j: &serde_json::Value, source_range: SourceRange | ||||
|     } | ||||
| } | ||||
|  | ||||
| pub fn parse_json_number_as_usize(j: &serde_json::Value, source_range: SourceRange) -> Result<usize, KclError> { | ||||
|     if let serde_json::Value::Number(n) = &j { | ||||
| pub fn parse_json_number_as_usize(j: &JValue, source_range: SourceRange) -> Result<usize, KclError> { | ||||
|     if let JValue::Number(n) = &j { | ||||
|         Ok(n.as_i64().ok_or_else(|| { | ||||
|             KclError::Syntax(KclErrorDetails { | ||||
|                 source_ranges: vec![source_range], | ||||
| @ -2224,8 +2287,8 @@ pub fn parse_json_number_as_usize(j: &serde_json::Value, source_range: SourceRan | ||||
|     } | ||||
| } | ||||
|  | ||||
| pub fn parse_json_value_as_string(j: &serde_json::Value) -> Option<String> { | ||||
|     if let serde_json::Value::String(n) = &j { | ||||
| pub fn parse_json_value_as_string(j: &JValue) -> Option<String> { | ||||
|     if let JValue::String(n) = &j { | ||||
|         Some(n.clone()) | ||||
|     } else { | ||||
|         None | ||||
| @ -2307,7 +2370,7 @@ impl UnaryExpression { | ||||
|         pipe_info: &mut PipeInfo, | ||||
|         ctx: &ExecutorContext, | ||||
|     ) -> Result<MemoryItem, KclError> { | ||||
|         // We DO NOT set this gloablly because if we did and this was called inside a pipe it would | ||||
|         // We DO NOT set this globally because if we did and this was called inside a pipe it would | ||||
|         // stop the execution of the pipe. | ||||
|         // THIS IS IMPORTANT. | ||||
|         let mut new_pipe_info = pipe_info.clone(); | ||||
|  | ||||
| @ -10,7 +10,7 @@ use serde::{Deserialize, Serialize}; | ||||
| use tower_lsp::lsp_types::{Position as LspPosition, Range as LspRange}; | ||||
|  | ||||
| use crate::{ | ||||
|     ast::types::{BodyItem, Function, FunctionExpression, Value}, | ||||
|     ast::types::{BodyItem, Function, FunctionExpression, LiteralValue, Value}, | ||||
|     engine::{EngineConnection, EngineManager}, | ||||
|     errors::{KclError, KclErrorDetails}, | ||||
| }; | ||||
| @ -282,7 +282,7 @@ impl DefaultPlanes { | ||||
| #[ts(export)] | ||||
| #[serde(tag = "type", rename_all = "camelCase")] | ||||
| pub struct UserVal { | ||||
|     pub value: serde_json::Value, | ||||
|     pub value: LiteralValue, | ||||
|     #[serde(rename = "__meta")] | ||||
|     pub meta: Vec<Metadata>, | ||||
| } | ||||
| @ -336,7 +336,7 @@ impl From<MemoryItem> for Vec<SourceRange> { | ||||
| impl MemoryItem { | ||||
|     pub fn get_json_value(&self) -> Result<serde_json::Value, KclError> { | ||||
|         if let MemoryItem::UserVal(user_val) = self { | ||||
|             Ok(user_val.value.clone()) | ||||
|             Ok(user_val.value.into()) | ||||
|         } else { | ||||
|             serde_json::to_value(self).map_err(|err| { | ||||
|                 KclError::Semantic(KclErrorDetails { | ||||
|  | ||||
| @ -575,7 +575,7 @@ impl ReversePolishNotation { | ||||
|             ), | ||||
|             MathExpression::ExtendedLiteral(lit) => ( | ||||
|                 BinaryPart::Literal(Box::new(Literal { | ||||
|                     value: lit.value.clone(), | ||||
|                     value: lit.value.into(), | ||||
|                     start: lit.start, | ||||
|                     end: lit.end, | ||||
|                     raw: lit.raw.clone(), | ||||
| @ -613,7 +613,7 @@ impl ReversePolishNotation { | ||||
|             ), | ||||
|             MathExpression::ExtendedLiteral(lit) => ( | ||||
|                 BinaryPart::Literal(Box::new(Literal { | ||||
|                     value: lit.value.clone(), | ||||
|                     value: lit.value.into(), | ||||
|                     start: lit.start, | ||||
|                     end: lit.end, | ||||
|                     raw: lit.raw.clone(), | ||||
| @ -714,13 +714,13 @@ mod test { | ||||
|                 start: 0, | ||||
|                 end: 5, | ||||
|                 left: BinaryPart::Literal(Box::new(Literal { | ||||
|                     value: serde_json::Value::Number(serde_json::Number::from(1)), | ||||
|                     value: 1.into(), | ||||
|                     raw: "1".to_string(), | ||||
|                     start: 0, | ||||
|                     end: 1, | ||||
|                 })), | ||||
|                 right: BinaryPart::Literal(Box::new(Literal { | ||||
|                     value: serde_json::Value::Number(serde_json::Number::from(2)), | ||||
|                     value: 2.into(), | ||||
|                     raw: "2".to_string(), | ||||
|                     start: 4, | ||||
|                     end: 5, | ||||
| @ -741,13 +741,13 @@ mod test { | ||||
|                 start: 0, | ||||
|                 end: 3, | ||||
|                 left: BinaryPart::Literal(Box::new(Literal { | ||||
|                     value: serde_json::Value::Number(serde_json::Number::from(1)), | ||||
|                     value: 1.into(), | ||||
|                     raw: "1".to_string(), | ||||
|                     start: 0, | ||||
|                     end: 1, | ||||
|                 })), | ||||
|                 right: BinaryPart::Literal(Box::new(Literal { | ||||
|                     value: serde_json::Value::Number(serde_json::Number::from(2)), | ||||
|                     value: 2.into(), | ||||
|                     raw: "2".to_string(), | ||||
|                     start: 2, | ||||
|                     end: 3, | ||||
| @ -768,13 +768,13 @@ mod test { | ||||
|                 start: 0, | ||||
|                 end: 4, | ||||
|                 left: BinaryPart::Literal(Box::new(Literal { | ||||
|                     value: serde_json::Value::Number(serde_json::Number::from(1)), | ||||
|                     value: 1.into(), | ||||
|                     raw: "1".to_string(), | ||||
|                     start: 0, | ||||
|                     end: 1, | ||||
|                 })), | ||||
|                 right: BinaryPart::Literal(Box::new(Literal { | ||||
|                     value: serde_json::Value::Number(serde_json::Number::from(2)), | ||||
|                     value: 2.into(), | ||||
|                     raw: "2".to_string(), | ||||
|                     start: 3, | ||||
|                     end: 4, | ||||
| @ -795,7 +795,7 @@ mod test { | ||||
|                 start: 0, | ||||
|                 end: 9, | ||||
|                 left: BinaryPart::Literal(Box::new(Literal { | ||||
|                     value: serde_json::Value::Number(serde_json::Number::from(1)), | ||||
|                     value: 1.into(), | ||||
|                     raw: "1".to_string(), | ||||
|                     start: 0, | ||||
|                     end: 1, | ||||
| @ -805,13 +805,13 @@ mod test { | ||||
|                     start: 4, | ||||
|                     end: 9, | ||||
|                     left: BinaryPart::Literal(Box::new(Literal { | ||||
|                         value: serde_json::Value::Number(serde_json::Number::from(2)), | ||||
|                         value: 2.into(), | ||||
|                         raw: "2".to_string(), | ||||
|                         start: 4, | ||||
|                         end: 5, | ||||
|                     })), | ||||
|                     right: BinaryPart::Literal(Box::new(Literal { | ||||
|                         value: serde_json::Value::Number(serde_json::Number::from(3)), | ||||
|                         value: 3.into(), | ||||
|                         raw: "3".to_string(), | ||||
|                         start: 8, | ||||
|                         end: 9, | ||||
| @ -833,7 +833,7 @@ mod test { | ||||
|                 start: 0, | ||||
|                 end: 13, | ||||
|                 left: BinaryPart::Literal(Box::new(Literal { | ||||
|                     value: serde_json::Value::Number(serde_json::Number::from(1)), | ||||
|                     value: 1.into(), | ||||
|                     raw: "1".to_string(), | ||||
|                     start: 0, | ||||
|                     end: 1, | ||||
| @ -843,13 +843,13 @@ mod test { | ||||
|                     start: 6, | ||||
|                     end: 11, | ||||
|                     left: BinaryPart::Literal(Box::new(Literal { | ||||
|                         value: serde_json::Value::Number(serde_json::Number::from(2)), | ||||
|                         value: 2.into(), | ||||
|                         raw: "2".to_string(), | ||||
|                         start: 6, | ||||
|                         end: 7, | ||||
|                     })), | ||||
|                     right: BinaryPart::Literal(Box::new(Literal { | ||||
|                         value: serde_json::Value::Number(serde_json::Number::from(3)), | ||||
|                         value: 3.into(), | ||||
|                         raw: "3".to_string(), | ||||
|                         start: 10, | ||||
|                         end: 11, | ||||
| @ -875,7 +875,7 @@ mod test { | ||||
|                     start: 0, | ||||
|                     end: 13, | ||||
|                     left: BinaryPart::Literal(Box::new(Literal { | ||||
|                         value: serde_json::Value::Number(serde_json::Number::from(1)), | ||||
|                         value: 1.into(), | ||||
|                         raw: "1".to_string(), | ||||
|                         start: 0, | ||||
|                         end: 1, | ||||
| @ -885,13 +885,13 @@ mod test { | ||||
|                         start: 6, | ||||
|                         end: 11, | ||||
|                         left: BinaryPart::Literal(Box::new(Literal { | ||||
|                             value: serde_json::Value::Number(serde_json::Number::from(2)), | ||||
|                             value: 2.into(), | ||||
|                             raw: "2".to_string(), | ||||
|                             start: 6, | ||||
|                             end: 7, | ||||
|                         })), | ||||
|                         right: BinaryPart::Literal(Box::new(Literal { | ||||
|                             value: serde_json::Value::Number(serde_json::Number::from(3)), | ||||
|                             value: 3.into(), | ||||
|                             raw: "3".to_string(), | ||||
|                             start: 10, | ||||
|                             end: 11, | ||||
| @ -899,7 +899,7 @@ mod test { | ||||
|                     })), | ||||
|                 })), | ||||
|                 right: BinaryPart::Literal(Box::new(Literal { | ||||
|                     value: serde_json::Value::Number(serde_json::Number::from(4)), | ||||
|                     value: 4.into(), | ||||
|                     raw: "4".to_string(), | ||||
|                     start: 16, | ||||
|                     end: 17, | ||||
| @ -920,7 +920,7 @@ mod test { | ||||
|                 start: 0, | ||||
|                 end: 17, | ||||
|                 left: BinaryPart::Literal(Box::new(Literal { | ||||
|                     value: serde_json::Value::Number(serde_json::Number::from(1)), | ||||
|                     value: 1.into(), | ||||
|                     raw: "1".to_string(), | ||||
|                     start: 0, | ||||
|                     end: 1, | ||||
| @ -934,20 +934,20 @@ mod test { | ||||
|                         start: 6, | ||||
|                         end: 11, | ||||
|                         left: BinaryPart::Literal(Box::new(Literal { | ||||
|                             value: serde_json::Value::Number(serde_json::Number::from(2)), | ||||
|                             value: 2.into(), | ||||
|                             raw: "2".to_string(), | ||||
|                             start: 6, | ||||
|                             end: 7, | ||||
|                         })), | ||||
|                         right: BinaryPart::Literal(Box::new(Literal { | ||||
|                             value: serde_json::Value::Number(serde_json::Number::from(3)), | ||||
|                             value: 3.into(), | ||||
|                             raw: "3".to_string(), | ||||
|                             start: 10, | ||||
|                             end: 11, | ||||
|                         })), | ||||
|                     })), | ||||
|                     right: BinaryPart::Literal(Box::new(Literal { | ||||
|                         value: serde_json::Value::Number(serde_json::Number::from(4)), | ||||
|                         value: 4.into(), | ||||
|                         raw: "4".to_string(), | ||||
|                         start: 16, | ||||
|                         end: 17, | ||||
| @ -968,7 +968,7 @@ mod test { | ||||
|                 start: 0, | ||||
|                 end: 24, | ||||
|                 left: BinaryPart::Literal(Box::new(Literal { | ||||
|                     value: serde_json::Value::Number(serde_json::Number::from(1)), | ||||
|                     value: 1.into(), | ||||
|                     raw: "1".to_string(), | ||||
|                     start: 0, | ||||
|                     end: 1, | ||||
| @ -986,27 +986,27 @@ mod test { | ||||
|                             start: 7, | ||||
|                             end: 12, | ||||
|                             left: BinaryPart::Literal(Box::new(Literal { | ||||
|                                 value: serde_json::Value::Number(serde_json::Number::from(2)), | ||||
|                                 value: 2.into(), | ||||
|                                 raw: "2".to_string(), | ||||
|                                 start: 7, | ||||
|                                 end: 8, | ||||
|                             })), | ||||
|                             right: BinaryPart::Literal(Box::new(Literal { | ||||
|                                 value: serde_json::Value::Number(serde_json::Number::from(3)), | ||||
|                                 value: 3.into(), | ||||
|                                 raw: "3".to_string(), | ||||
|                                 start: 11, | ||||
|                                 end: 12, | ||||
|                             })), | ||||
|                         })), | ||||
|                         right: BinaryPart::Literal(Box::new(Literal { | ||||
|                             value: serde_json::Value::Number(serde_json::Number::from(4)), | ||||
|                             value: 4.into(), | ||||
|                             raw: "4".to_string(), | ||||
|                             start: 17, | ||||
|                             end: 18, | ||||
|                         })), | ||||
|                     })), | ||||
|                     right: BinaryPart::Literal(Box::new(Literal { | ||||
|                         value: serde_json::Value::Number(serde_json::Number::from(5)), | ||||
|                         value: 5.into(), | ||||
|                         raw: "5".to_string(), | ||||
|                         start: 21, | ||||
|                         end: 22, | ||||
| @ -1027,7 +1027,7 @@ mod test { | ||||
|                 start: 0, | ||||
|                 end: 17, | ||||
|                 left: BinaryPart::Literal(Box::new(Literal { | ||||
|                     value: serde_json::Value::Number(serde_json::Number::from(1)), | ||||
|                     value: 1.into(), | ||||
|                     raw: "1".to_string(), | ||||
|                     start: 0, | ||||
|                     end: 1, | ||||
| @ -1037,13 +1037,13 @@ mod test { | ||||
|                     start: 8, | ||||
|                     end: 13, | ||||
|                     left: BinaryPart::Literal(Box::new(Literal { | ||||
|                         value: serde_json::Value::Number(serde_json::Number::from(2)), | ||||
|                         value: 2.into(), | ||||
|                         raw: "2".to_string(), | ||||
|                         start: 8, | ||||
|                         end: 9, | ||||
|                     })), | ||||
|                     right: BinaryPart::Literal(Box::new(Literal { | ||||
|                         value: serde_json::Value::Number(serde_json::Number::from(3)), | ||||
|                         value: 3.into(), | ||||
|                         raw: "3".to_string(), | ||||
|                         start: 12, | ||||
|                         end: 13, | ||||
| @ -1189,13 +1189,13 @@ mod test { | ||||
|                 start: 0, | ||||
|                 end: code.find(")))").unwrap() + 3, | ||||
|                 left: BinaryPart::Literal(Box::new(Literal { | ||||
|                     value: serde_json::Value::Number(serde_json::Number::from(2)), | ||||
|                     value: 2.into(), | ||||
|                     raw: "2".to_string(), | ||||
|                     start: 0, | ||||
|                     end: 1, | ||||
|                 })), | ||||
|                 right: BinaryPart::Literal(Box::new(Literal { | ||||
|                     value: serde_json::Value::Number(serde_json::Number::from(3)), | ||||
|                     value: 3.into(), | ||||
|                     raw: "3".to_string(), | ||||
|                     start: 7, | ||||
|                     end: 8, | ||||
| @ -1243,7 +1243,7 @@ mod test { | ||||
|             start: 0, | ||||
|             end: 9, | ||||
|             left: BinaryPart::Literal(Box::new(Literal { | ||||
|                 value: serde_json::Value::Number(serde_json::Number::from(1)), | ||||
|                 value: 1.into(), | ||||
|                 raw: "1".to_string(), | ||||
|                 start: 0, | ||||
|                 end: 1, | ||||
| @ -1253,13 +1253,13 @@ mod test { | ||||
|                 start: 4, | ||||
|                 end: 9, | ||||
|                 left: BinaryPart::Literal(Box::new(Literal { | ||||
|                     value: serde_json::Value::Number(serde_json::Number::from(2)), | ||||
|                     value: 2.into(), | ||||
|                     raw: "2".to_string(), | ||||
|                     start: 4, | ||||
|                     end: 5, | ||||
|                 })), | ||||
|                 right: BinaryPart::Literal(Box::new(Literal { | ||||
|                     value: serde_json::Value::Number(serde_json::Number::from(3)), | ||||
|                     value: 3.into(), | ||||
|                     raw: "3".to_string(), | ||||
|                     start: 8, | ||||
|                     end: 9, | ||||
|  | ||||
| @ -246,7 +246,7 @@ impl Parser { | ||||
|         Ok(Literal { | ||||
|             start: token.start, | ||||
|             end: token.end, | ||||
|             value, | ||||
|             value: value.into(), | ||||
|             raw: token.value.clone(), | ||||
|         }) | ||||
|     } | ||||
| @ -1833,7 +1833,7 @@ mod tests { | ||||
|     use pretty_assertions::assert_eq; | ||||
|  | ||||
|     use super::*; | ||||
|     use crate::ast::types::BinaryOperator; | ||||
|     use crate::ast::types::{BinaryOperator, LiteralValue}; | ||||
|  | ||||
|     #[test] | ||||
|     fn test_make_identifier() { | ||||
| @ -1986,7 +1986,7 @@ const key = 'c'"#, | ||||
|             Literal { | ||||
|                 start: 4, | ||||
|                 end: 5, | ||||
|                 value: serde_json::Value::Number(5.into()), | ||||
|                 value: LiteralValue::Number(5.into()), | ||||
|                 raw: "5".to_string() | ||||
|             }, | ||||
|             literal | ||||
| @ -1996,7 +1996,7 @@ const key = 'c'"#, | ||||
|             Literal { | ||||
|                 start: 7, | ||||
|                 end: 14, | ||||
|                 value: serde_json::Value::String("hello".to_string()), | ||||
|                 value: "hello".into(), | ||||
|                 raw: "\"hello\"".to_string() | ||||
|             }, | ||||
|             literal | ||||
| @ -2014,13 +2014,13 @@ const key = 'c'"#, | ||||
|             left: BinaryPart::Literal(Box::new(Literal { | ||||
|                 start: 0, | ||||
|                 end: 1, | ||||
|                 value: serde_json::Value::Number(serde_json::Number::from(5)), | ||||
|                 value: 5.into(), | ||||
|                 raw: "5".to_owned(), | ||||
|             })), | ||||
|             right: BinaryPart::Literal(Box::new(Literal { | ||||
|                 start: 4, | ||||
|                 end: 7, | ||||
|                 value: serde_json::Value::String("a".to_owned()), | ||||
|                 value: "a".into(), | ||||
|                 raw: r#""a""#.to_owned(), | ||||
|             })), | ||||
|         }; | ||||
| @ -2690,14 +2690,14 @@ show(mySk1)"#; | ||||
|                     left: BinaryPart::Literal(Box::new(Literal { | ||||
|                         start: 0, | ||||
|                         end: 1, | ||||
|                         value: serde_json::Value::Number(serde_json::Number::from(5)), | ||||
|                         value: 5.into(), | ||||
|                         raw: "5".to_string(), | ||||
|                     })), | ||||
|                     operator: BinaryOperator::Add, | ||||
|                     right: BinaryPart::Literal(Box::new(Literal { | ||||
|                         start: 3, | ||||
|                         end: 4, | ||||
|                         value: serde_json::Value::Number(serde_json::Number::from(6)), | ||||
|                         value: 6.into(), | ||||
|                         raw: "6".to_string(), | ||||
|                     })), | ||||
|                 })), | ||||
|  | ||||
| @ -10,10 +10,10 @@ use winnow::{ | ||||
| use crate::{ | ||||
|     ast::types::{ | ||||
|         ArrayExpression, BinaryExpression, BinaryOperator, BinaryPart, BodyItem, CallExpression, CommentStyle, | ||||
|         ExpressionStatement, FunctionExpression, Identifier, Literal, LiteralIdentifier, MemberExpression, | ||||
|         MemberObject, NonCodeMeta, NonCodeNode, NonCodeValue, ObjectExpression, ObjectProperty, PipeExpression, | ||||
|         PipeSubstitution, Program, ReturnStatement, UnaryExpression, UnaryOperator, Value, VariableDeclaration, | ||||
|         VariableDeclarator, VariableKind, | ||||
|         ExpressionStatement, FunctionExpression, Identifier, Literal, LiteralIdentifier, LiteralValue, | ||||
|         MemberExpression, MemberObject, NonCodeMeta, NonCodeNode, NonCodeValue, ObjectExpression, ObjectProperty, | ||||
|         PipeExpression, PipeSubstitution, Program, ReturnStatement, UnaryExpression, UnaryOperator, Value, | ||||
|         VariableDeclaration, VariableDeclarator, VariableKind, | ||||
|     }, | ||||
|     errors::{KclError, KclErrorDetails}, | ||||
|     executor::SourceRange, | ||||
| @ -25,7 +25,7 @@ use crate::{ | ||||
|  | ||||
| mod error; | ||||
|  | ||||
| type PResult<O, E = error::ContextError> = winnow::prelude::PResult<O, E>; | ||||
| type PResult<O, E = ContextError> = winnow::prelude::PResult<O, E>; | ||||
|  | ||||
| lazy_static::lazy_static! { | ||||
|     static ref STDLIB: StdLib = StdLib::new(); | ||||
| @ -216,7 +216,7 @@ pub fn string_literal(i: TokenSlice) -> PResult<Literal> { | ||||
|         .try_map(|token: Token| match token.token_type { | ||||
|             TokenType::String => { | ||||
|                 let s = token.value[1..token.value.len() - 1].to_string(); | ||||
|                 Ok((JValue::String(s), token)) | ||||
|                 Ok((LiteralValue::String(s), token)) | ||||
|             } | ||||
|             _ => Err(KclError::Syntax(KclErrorDetails { | ||||
|                 source_ranges: token.as_source_ranges(), | ||||
| @ -239,7 +239,7 @@ fn unsigned_number_literal(i: TokenSlice) -> PResult<Literal> { | ||||
|         .try_map(|token: Token| match token.token_type { | ||||
|             TokenType::Number => { | ||||
|                 if let Ok(x) = token.value.parse::<i64>() { | ||||
|                     return Ok((JValue::Number(JNumber::from(x)), token)); | ||||
|                     return Ok((JNumber::from(x), token)); | ||||
|                 } | ||||
|                 let x: f64 = token.value.parse().map_err(|_| { | ||||
|                     KclError::Syntax(KclErrorDetails { | ||||
| @ -249,7 +249,7 @@ fn unsigned_number_literal(i: TokenSlice) -> PResult<Literal> { | ||||
|                 })?; | ||||
|  | ||||
|                 match JNumber::from_f64(x) { | ||||
|                     Some(n) => Ok((JValue::Number(n), token)), | ||||
|                     Some(n) => Ok((n, token)), | ||||
|                     None => Err(KclError::Syntax(KclErrorDetails { | ||||
|                         source_ranges: token.as_source_ranges(), | ||||
|                         message: format!("Invalid float: {}", token.value), | ||||
| @ -266,7 +266,7 @@ fn unsigned_number_literal(i: TokenSlice) -> PResult<Literal> { | ||||
|     Ok(Literal { | ||||
|         start: token.start, | ||||
|         end: token.end, | ||||
|         value, | ||||
|         value: LiteralValue::Number(value), | ||||
|         raw: token.value.clone(), | ||||
|     }) | ||||
| } | ||||
| @ -407,7 +407,7 @@ fn integer_range(i: TokenSlice) -> PResult<Vec<Value>> { | ||||
|             Value::Literal(Box::new(Literal { | ||||
|                 start: token0.start, | ||||
|                 end: token0.end, | ||||
|                 value: JValue::Number(num.into()), | ||||
|                 value: num.into(), | ||||
|                 raw: num.to_string(), | ||||
|             })) | ||||
|         }) | ||||
| @ -1408,7 +1408,7 @@ const mySk1 = startSketchAt([0, 0])"#; | ||||
|         let tokens = crate::token::lexer(r#"const x = y() |> /*hi*/ z(%)"#); | ||||
|         let mut body = program.parse(&tokens).unwrap().body; | ||||
|         let BodyItem::VariableDeclaration(mut item) = body.remove(0) else { | ||||
|             panic!("expected vardec"); | ||||
|             panic!("expected variable declaration"); | ||||
|         }; | ||||
|         let val = item.declarations.remove(0).init; | ||||
|         let Value::PipeExpression(pipe) = val else { | ||||
| @ -1461,7 +1461,7 @@ const mySk1 = startSketchAt([0, 0])"#; | ||||
|                         argument: Value::Literal(Box::new(Literal { | ||||
|                             start: 32, | ||||
|                             end: 33, | ||||
|                             value: JValue::Number(JNumber::from(2)), | ||||
|                             value: 2.into(), | ||||
|                             raw: "2".to_owned(), | ||||
|                         })), | ||||
|                     })], | ||||
| @ -1616,7 +1616,7 @@ const mySk1 = startSketchAt([0, 0])"#; | ||||
|             BinaryPart::Literal(Box::new(Literal { | ||||
|                 start: 9, | ||||
|                 end: 10, | ||||
|                 value: JValue::Number(JNumber::from(3)), | ||||
|                 value: 3.into(), | ||||
|                 raw: "3".to_owned(), | ||||
|             })) | ||||
|         ); | ||||
|  | ||||
| @ -4,14 +4,13 @@ use anyhow::Result; | ||||
| use derive_docs::stdlib; | ||||
| use schemars::JsonSchema; | ||||
|  | ||||
| use super::utils::between; | ||||
| use crate::{ | ||||
|     errors::{KclError, KclErrorDetails}, | ||||
|     executor::{MemoryItem, SketchGroup}, | ||||
|     std::Args, | ||||
| }; | ||||
|  | ||||
| use super::utils::between; | ||||
|  | ||||
| /// Returns the segment end of x. | ||||
| pub async fn segment_end_x(args: Args) -> Result<MemoryItem, KclError> { | ||||
|     let (segment_name, sketch_group) = args.get_segment_name_sketch_group()?; | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	