Change containers mutable

This commit is contained in:
Shunsuke Shibayama 2022-12-26 23:31:43 +09:00
parent c11757c51e
commit 7969c86fa2
3 changed files with 16 additions and 7 deletions

8
Cargo.lock generated
View file

@ -206,7 +206,7 @@ checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797"
[[package]]
name = "els"
version = "0.1.13-nightly.0"
source = "git+https://github.com/erg-lang/erg-language-server?branch=main#071ddf1eae1fc6df505e0fd58521cf49dea6444f"
source = "git+https://github.com/erg-lang/erg-language-server?branch=main#ba96e0d1e86f496600b659c4a3fd70ec215587f3"
dependencies = [
"erg_common",
"erg_compiler",
@ -227,7 +227,7 @@ dependencies = [
[[package]]
name = "erg_common"
version = "0.6.0"
source = "git+https://github.com/erg-lang/erg?branch=main#a1673e83c9a13c4d7b91ad6996c7068a9b68c27b"
source = "git+https://github.com/erg-lang/erg?branch=main#f0ecf59af17df5233fc94d2227c00b9a6926242d"
dependencies = [
"hermit-abi",
"libc",
@ -237,7 +237,7 @@ dependencies = [
[[package]]
name = "erg_compiler"
version = "0.6.0"
source = "git+https://github.com/erg-lang/erg?branch=main#a1673e83c9a13c4d7b91ad6996c7068a9b68c27b"
source = "git+https://github.com/erg-lang/erg?branch=main#f0ecf59af17df5233fc94d2227c00b9a6926242d"
dependencies = [
"erg_common",
"erg_parser",
@ -246,7 +246,7 @@ dependencies = [
[[package]]
name = "erg_parser"
version = "0.6.0"
source = "git+https://github.com/erg-lang/erg?branch=main#a1673e83c9a13c4d7b91ad6996c7068a9b68c27b"
source = "git+https://github.com/erg-lang/erg?branch=main#f0ecf59af17df5233fc94d2227c00b9a6926242d"
dependencies = [
"erg_common",
"unicode-xid 0.2.4",

View file

@ -80,6 +80,7 @@ pylyzer converts Python ASTs to Erg ASTs and passes them to Erg's type checker.
* [x] local scripts resolving
* [ ] local packages resolving
* [ ] compound type checking
* [ ] type assertion
---

View file

@ -355,6 +355,11 @@ impl ASTConverter {
(l_brace, r_brace)
}
fn mutate_expr(expr: Expr) -> Expr {
let mut_op = Token::new(TokenKind::Mutate, "!", expr.ln_begin().unwrap_or(0), expr.col_begin().unwrap_or(0));
Expr::UnaryOp(UnaryOp::new(mut_op, expr))
}
fn convert_expr(&mut self, expr: Located<ExpressionType>) -> Expr {
match expr.node {
ExpressionType::Number { value } => {
@ -477,7 +482,8 @@ impl ASTConverter {
.map(|ex| PosArg::new(self.convert_expr(ex)))
.collect::<Vec<_>>();
let elems = Args::new(elements, vec![], None);
Expr::Array(Array::Normal(NormalArray::new(l_sqbr, r_sqbr, elems)))
let arr = Expr::Array(Array::Normal(NormalArray::new(l_sqbr, r_sqbr, elems)));
Self::mutate_expr(arr)
}
ExpressionType::Set { elements } => {
let (l_brace, r_brace) = Self::gen_enclosure_tokens(TokenKind::LBrace, elements.iter(), expr.location);
@ -485,7 +491,8 @@ impl ASTConverter {
.map(|ex| PosArg::new(self.convert_expr(ex)))
.collect::<Vec<_>>();
let elems = Args::new(elements, vec![], None);
Expr::Set(Set::Normal(NormalSet::new(l_brace, r_brace, elems)))
let set = Expr::Set(Set::Normal(NormalSet::new(l_brace, r_brace, elems)));
Self::mutate_expr(set)
}
ExpressionType::Dict { elements } => {
let (l_brace, r_brace) = Self::gen_enclosure_tokens(TokenKind::LBrace, elements.iter().map(|(_, v)| v), expr.location);
@ -493,7 +500,8 @@ impl ASTConverter {
.map(|(k, v)|
KeyValue::new(k.map(|k| self.convert_expr(k)).unwrap_or(Expr::Dummy(Dummy::empty())), self.convert_expr(v))
).collect::<Vec<_>>();
Expr::Dict(Dict::Normal(NormalDict::new(l_brace, r_brace, kvs)))
let dict = Expr::Dict(Dict::Normal(NormalDict::new(l_brace, r_brace, kvs)));
Self::mutate_expr(dict)
}
ExpressionType::Tuple { elements } => {
let elements = elements.into_iter()