Compare commits
2 Commits
v0.21.8
...
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