fix: unintended behavior for collections

This commit is contained in:
Shunsuke Shibayama 2023-04-19 18:49:27 +09:00
parent daf01f3cf2
commit 7d7849b493
9 changed files with 66 additions and 17 deletions

View file

@ -2661,13 +2661,27 @@ impl PyCodeGenerator {
self.emit_push_null();
self.emit_load_name_instr(Identifier::public("Str"));
}
other if other.is_array() => {
self.emit_push_null();
self.emit_load_name_instr(Identifier::public("Array"));
}
_ => {
wrapped = false;
}
other => match &other.qual_name()[..] {
"Array" => {
self.emit_push_null();
self.emit_load_name_instr(Identifier::public("Array"));
}
"Dict" => {
self.emit_push_null();
self.emit_load_name_instr(Identifier::public("Dict"));
}
"Set" => {
self.emit_push_null();
self.emit_load_name_instr(Identifier::public("Set"));
}
"Tuple" => {
self.emit_push_null();
self.emit_load_name_instr(Identifier::public("tuple"));
}
_ => {
wrapped = false;
}
},
}
}
match expr {

View file

@ -2160,19 +2160,19 @@ impl Context {
generic_array,
vis.clone(),
Const,
Some(FUNC_LIST),
Some(ARRAY),
);
self.register_builtin_type(arr_t, array_, vis.clone(), Const, Some(FUNC_LIST));
self.register_builtin_type(arr_t, array_, vis.clone(), Const, Some(ARRAY));
self.register_builtin_type(
mono(GENERIC_SET),
generic_set,
vis.clone(),
Const,
Some(FUNC_SET),
Some(SET),
);
self.register_builtin_type(set_t, set_, vis.clone(), Const, Some(FUNC_SET));
self.register_builtin_type(g_dict_t, generic_dict, vis.clone(), Const, Some(FUNC_DICT));
self.register_builtin_type(dict_t, dict_, vis.clone(), Const, Some(FUNC_DICT));
self.register_builtin_type(set_t, set_, vis.clone(), Const, Some(SET));
self.register_builtin_type(g_dict_t, generic_dict, vis.clone(), Const, Some(DICT));
self.register_builtin_type(dict_t, dict_, vis.clone(), Const, Some(DICT));
self.register_builtin_type(mono(BYTES), bytes, vis.clone(), Const, Some(BYTES));
self.register_builtin_type(
mono(GENERIC_TUPLE),

View file

@ -0,0 +1,10 @@
.Set: ClassType
.Set.
copy: |T|(self: .Set(T)) -> .Set(T)
differece: |T|(self: .Set(T), other: .Set(T)) -> .Set(T)
intersection: |T|(self: .Set(T), other: .Set(T)) -> .Set(T)
isdisjoint: |T|(self: .Set(T), other: .Set(T)) -> Bool
issubset: |T|(self: .Set(T), other: .Set(T)) -> Bool
issuperset: |T|(self: .Set(T), other: .Set(T)) -> Bool
symmetric_difference: |T|(self: .Set(T), other: .Set(T)) -> .Set(T)
union: |T|(self: .Set(T), other: .Set(T)) -> .Set(T)

View file

@ -0,0 +1,2 @@
class Dict(dict):
pass

View file

@ -0,0 +1,2 @@
class Set(set):
pass

View file

@ -14,6 +14,8 @@ from _erg_bool import Bool
from _erg_bytes import Bytes
from _erg_str import Str, StrMut
from _erg_array import Array
from _erg_dict import Dict
from _erg_set import Set
from _erg_in_operator import in_operator
from _erg_mutate_operator import mutate_operator