Skip to content

Commit 4ab5d51

Browse files
Added support for native objects.
Added support for native objects. Added a procedural macro to automatically generate the code for a native object. Added vectors, dynamically sized arrays. Added a double colon operator to call static functions. Removed the arrow operator for member functions, they can be called with the regular dot operator. Added debug, print and to_string functions.
1 parent 202ed79 commit 4ab5d51

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+2189
-378
lines changed

Cargo.lock

+116
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+3-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ authors = ["Aryan Chudasama"]
1111

1212
[dependencies]
1313
clap = "4.3.23"
14-
evilang_lib = {version = "0.1.0", path = "evilang_lib"}
15-
evilang_traits = {version = "0.1.0", path = "evilang_traits"}
14+
either = "1.9.0"
15+
evilang_lib = { version = "0.1.0", path = "evilang_lib" }
16+
evilang_traits = { version = "0.1.0", path = "evilang_traits" }
1617

1718
[[bin]]
1819
name = "evilang_main"

build.rs

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
fn main() {
2+
// println!("cargo:rustc-env=RUSTC_BOOTSTRAP=evilang_lib");
3+
}

evilang_lib/Cargo.toml

+2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ regex = "1.9.1"
1616
static_assertions = "1.1.0"
1717
thiserror = "1.0.43"
1818
evilang_traits = { path = "../evilang_traits", version = "0.1.0" }
19+
maybe-owned = "0.3.4"
20+
itertools = "0.11.0"
1921

2022
[lib]
2123
name = "evilang_lib"

evilang_lib/build.rs

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
fn main() {
2+
// println!("cargo:rustc-env=RUSTC_BOOTSTRAP=1");
3+
}

evilang_lib/src/lib/ast/expression.rs

+12-6
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,25 @@ use crate::ast::operator::Operator;
44
use crate::ast::statement::Statement;
55
use crate::ast::structs::{CallExpression, ClassDeclaration, FunctionDeclaration};
66
use crate::errors::ResultWithError;
7+
use crate::tokenizer::Token;
78
use crate::types::number::NumberT;
89
use crate::types::string::StringT;
910

1011
pub type BoxExpression = Box<Expression>;
1112

1213
pub type IdentifierT = StringT;
13-
pub type DottedIdentifiers = Vec<IdentifierT>;
14+
15+
#[derive(Debug, Clone, PartialEq)]
16+
pub struct DottedIdentifiers {
17+
pub identifiers: Vec<IdentifierT>,
18+
pub delimiters: Vec<Token>,
19+
}
1420

1521
#[derive(Debug, Clone, PartialEq)]
1622
pub enum MemberIndexer {
1723
PropertyName(IdentifierT),
1824
SubscriptExpression(BoxExpression),
19-
MethodNameArrow(IdentifierT),
25+
// MethodNameArrow(IdentifierT),
2026
}
2127

2228
#[derive(Debug, Clone, PartialEq)]
@@ -80,10 +86,10 @@ impl Expression {
8086
return Expression::AssignmentExpression { operator, left, right };
8187
}
8288

83-
#[inline(always)]
84-
pub fn member_method_access(object: BoxExpression, property_name: IdentifierT) -> Expression {
85-
return Expression::MemberAccess { object, member: MemberIndexer::MethodNameArrow(property_name) };
86-
}
89+
// #[inline(always)]
90+
// pub fn member_method_access(object: BoxExpression, property_name: IdentifierT) -> Expression {
91+
// return Expression::MemberAccess { object, member: MemberIndexer::MethodNameArrow(property_name) };
92+
// }
8793

8894
#[inline(always)]
8995
pub fn member_property_access(object: BoxExpression, property_name: IdentifierT) -> Expression {

evilang_lib/src/lib/errors.rs

+46-9
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,9 @@ use std::fmt::{Display, Formatter};
33
use std::io;
44

55
use backtrace::Backtrace;
6+
use maybe_owned::MaybeOwned;
67
use thiserror::Error;
78

8-
use evilang_traits::Clone__SilentlyFail;
9-
109
use crate::ast::expression::{Expression, IdentifierT};
1110
use crate::ast::operator::Operator;
1211
use crate::ast::statement::Statement;
@@ -22,14 +21,34 @@ pub enum Descriptor {
2221
Name(IdentifierT),
2322
Value(PrimitiveValue),
2423
Expression(Expression),
25-
Both { value: PrimitiveValue, expression: Expression },
24+
ExpressionAndValue { value: PrimitiveValue, expression: Expression },
25+
NameAndValue { name: IdentifierT, value: PrimitiveValue },
2626
}
2727

2828
impl Descriptor {
29-
pub fn new_both(value: &PrimitiveValue, expression: &Expression) -> Descriptor {
30-
return Descriptor::Both {
31-
value: value.clone__silently_fail(),
32-
expression: expression.clone(),
29+
pub fn new_both(value: MaybeOwned<PrimitiveValue>, expression: MaybeOwned<Expression>) -> Descriptor {
30+
return Descriptor::ExpressionAndValue {
31+
value: Self::value_to_owned(value),
32+
expression: expression.into_owned(),
33+
};
34+
}
35+
36+
fn value_to_owned(value: MaybeOwned<PrimitiveValue>) -> PrimitiveValue {
37+
match value {
38+
MaybeOwned::Owned(v) => v,
39+
MaybeOwned::Borrowed(v) => v.clone__silently_fail()
40+
}
41+
}
42+
43+
pub fn with_value(self, value: MaybeOwned<PrimitiveValue>) -> Descriptor {
44+
let v = Self::value_to_owned(value);
45+
return match self {
46+
Descriptor::None => Descriptor::Value(v),
47+
Descriptor::Name(name) => Descriptor::NameAndValue { name, value: v },
48+
Descriptor::Value(_) => Descriptor::Value(v),
49+
Descriptor::Expression(expression) => Descriptor::ExpressionAndValue { expression, value: v },
50+
Descriptor::ExpressionAndValue { expression, value: _ } => Descriptor::ExpressionAndValue { expression, value: v },
51+
Descriptor::NameAndValue { name, value: _ } => Descriptor::NameAndValue { name, value: v },
3352
};
3453
}
3554
}
@@ -48,12 +67,18 @@ impl Clone for Descriptor {
4867
Descriptor::Expression(expr) => {
4968
Descriptor::Expression(Clone::clone(expr))
5069
}
51-
Descriptor::Both { value, expression } => {
52-
Descriptor::Both {
70+
Descriptor::ExpressionAndValue { value, expression } => {
71+
Descriptor::ExpressionAndValue {
5372
value: value.clone__silently_fail(),
5473
expression: Clone::clone(expression),
5574
}
5675
}
76+
Descriptor::NameAndValue { name, value } => {
77+
Descriptor::NameAndValue {
78+
name: Clone::clone(name),
79+
value: value.clone__silently_fail(),
80+
}
81+
}
5782
}
5883
}
5984
}
@@ -90,6 +115,14 @@ impl From<Expression> for Descriptor {
90115
pub enum RuntimeError {
91116
#[error("{0}")]
92117
GenericError(StringT),
118+
#[error("Expected {0:#?} to not be null")]
119+
UnexpectedNullValue(Descriptor),
120+
#[error("Expected {0:#?} to be a boolean")]
121+
ExpectedBoolean(Descriptor),
122+
#[error("Expected {0:#?} to be a number")]
123+
ExpectedNumber(Descriptor),
124+
#[error("Expected {0:#?} to be a string")]
125+
ExpectedString(Descriptor),
93126
#[error("Expected {0:#?} to be a function")]
94127
ExpectedFunction(Descriptor),
95128
#[error("Expected {0:#?} to be a class object")]
@@ -98,6 +131,10 @@ pub enum RuntimeError {
98131
ExpectedNamespaceObject(Descriptor),
99132
#[error("Expected {0:#?} to be an object")]
100133
ExpectedObject(Descriptor),
134+
#[error("Expected {0:#?} to be a native struct object")]
135+
ExpectedNativeObject(Descriptor),
136+
#[error("Invalid arguments {0:#?}: {1:#?}")]
137+
InvalidArgumentsToFunction(String, Descriptor),
101138
#[error("Invalid number of arguments {got:?} expected {expected:?} to be function {func:#?}")]
102139
InvalidNumberArgumentsToFunction { got: usize, expected: Option<StringT>, func: Descriptor },
103140
#[error("Expected {0:#?} to be a valid subscript expression")]

0 commit comments

Comments
 (0)