Implement block contexts
This commit is contained in:
parent
f2049225fe
commit
b5b317df95
@ -20,6 +20,8 @@ use crate::{
|
|||||||
pub struct Block {
|
pub struct Block {
|
||||||
is_async: bool,
|
is_async: bool,
|
||||||
statements: Vec<Statement>,
|
statements: Vec<Statement>,
|
||||||
|
|
||||||
|
#[serde(skip)]
|
||||||
context: Context,
|
context: Context,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,11 +1,10 @@
|
|||||||
use std::{
|
use std::{
|
||||||
collections::HashMap,
|
cmp::Ordering,
|
||||||
|
collections::BTreeMap,
|
||||||
fmt::{self, Debug, Display, Formatter},
|
fmt::{self, Debug, Display, Formatter},
|
||||||
sync::{Arc, RwLock, RwLockReadGuard},
|
sync::{Arc, RwLock, RwLockReadGuard},
|
||||||
};
|
};
|
||||||
|
|
||||||
use serde::{Deserialize, Serialize};
|
|
||||||
|
|
||||||
use crate::{error::rw_lock_error::RwLockError, Type, Value};
|
use crate::{error::rw_lock_error::RwLockError, Type, Value};
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
@ -23,7 +22,29 @@ impl Eq for ValueData {}
|
|||||||
|
|
||||||
impl PartialEq for ValueData {
|
impl PartialEq for ValueData {
|
||||||
fn eq(&self, other: &Self) -> bool {
|
fn eq(&self, other: &Self) -> bool {
|
||||||
todo!()
|
match (self, other) {
|
||||||
|
(
|
||||||
|
ValueData::Value {
|
||||||
|
inner: left_inner,
|
||||||
|
runtime_uses: left_runtime_uses,
|
||||||
|
},
|
||||||
|
ValueData::Value {
|
||||||
|
inner: right_inner,
|
||||||
|
runtime_uses: right_runtime_uses,
|
||||||
|
},
|
||||||
|
) => {
|
||||||
|
if left_inner != right_inner {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
*left_runtime_uses.read().unwrap() == *right_runtime_uses.read().unwrap()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
(
|
||||||
|
ValueData::ExpectedType { inner: left_inner },
|
||||||
|
ValueData::ExpectedType { inner: right_inner },
|
||||||
|
) => left_inner == right_inner,
|
||||||
|
_ => false,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -34,29 +55,46 @@ impl PartialOrd for ValueData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Ord for ValueData {
|
impl Ord for ValueData {
|
||||||
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
|
fn cmp(&self, other: &Self) -> Ordering {
|
||||||
todo!()
|
use Ordering::*;
|
||||||
|
|
||||||
|
match (self, other) {
|
||||||
|
(
|
||||||
|
ValueData::Value {
|
||||||
|
inner: inner_left, ..
|
||||||
|
},
|
||||||
|
ValueData::Value {
|
||||||
|
inner: inner_right, ..
|
||||||
|
},
|
||||||
|
) => inner_left.cmp(inner_right),
|
||||||
|
(ValueData::Value { .. }, _) => Greater,
|
||||||
|
(
|
||||||
|
ValueData::ExpectedType { inner: inner_left },
|
||||||
|
ValueData::ExpectedType { inner: inner_right },
|
||||||
|
) => inner_left.cmp(inner_right),
|
||||||
|
(ValueData::ExpectedType { .. }, _) => Less,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct Context {
|
pub struct Context {
|
||||||
inner: Arc<RwLock<HashMap<String, ValueData>>>,
|
inner: Arc<RwLock<BTreeMap<String, ValueData>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Context {
|
impl Context {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
Self {
|
Self {
|
||||||
inner: Arc::new(RwLock::new(HashMap::new())),
|
inner: Arc::new(RwLock::new(BTreeMap::new())),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn inner(&self) -> Result<RwLockReadGuard<HashMap<String, ValueData>>, RwLockError> {
|
pub fn inner(&self) -> Result<RwLockReadGuard<BTreeMap<String, ValueData>>, RwLockError> {
|
||||||
Ok(self.inner.read()?)
|
Ok(self.inner.read()?)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn inherit_from(other: &Context) -> Result<Context, RwLockError> {
|
pub fn inherit_from(other: &Context) -> Result<Context, RwLockError> {
|
||||||
let mut new_variables = HashMap::new();
|
let mut new_variables = BTreeMap::new();
|
||||||
|
|
||||||
for (identifier, value_data) in other.inner.read()?.iter() {
|
for (identifier, value_data) in other.inner.read()?.iter() {
|
||||||
new_variables.insert(identifier.clone(), value_data.clone());
|
new_variables.insert(identifier.clone(), value_data.clone());
|
||||||
@ -111,6 +149,12 @@ impl Context {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Default for Context {
|
||||||
|
fn default() -> Self {
|
||||||
|
Context::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Eq for Context {}
|
impl Eq for Context {}
|
||||||
|
|
||||||
impl PartialEq for Context {
|
impl PartialEq for Context {
|
||||||
@ -141,26 +185,11 @@ impl PartialOrd for Context {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Ord for Context {
|
impl Ord for Context {
|
||||||
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
|
fn cmp(&self, other: &Self) -> Ordering {
|
||||||
todo!()
|
let left = self.inner().unwrap();
|
||||||
}
|
let right = other.inner().unwrap();
|
||||||
}
|
|
||||||
|
|
||||||
impl<'de> Deserialize<'de> for Context {
|
left.cmp(&right)
|
||||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
|
||||||
where
|
|
||||||
D: serde::Deserializer<'de>,
|
|
||||||
{
|
|
||||||
todo!()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Serialize for Context {
|
|
||||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
|
||||||
where
|
|
||||||
S: serde::Serializer,
|
|
||||||
{
|
|
||||||
todo!()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -171,7 +200,7 @@ impl Debug for Context {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Display for Context {
|
impl Display for Context {
|
||||||
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, _f: &mut Formatter<'_>) -> fmt::Result {
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user