fix: visibility bug

This commit is contained in:
Shunsuke Shibayama 2023-04-15 13:27:40 +09:00
parent 0d43299cce
commit 62b06022cb
6 changed files with 23 additions and 7 deletions

View file

@ -1,6 +1,7 @@
from _erg_result import is_ok from _erg_result import is_ok
from _erg_range import Range from _erg_range import Range
from collections import namedtuple
def in_operator(elem, y): def in_operator(elem, y):
if type(y) == type: if type(y) == type:
@ -18,6 +19,8 @@ def in_operator(elem, y):
len_check = len(elem) == len(y) len_check = len(elem) == len(y)
return type_check and len_check return type_check and len_check
elif isinstance(y, tuple): elif isinstance(y, tuple):
if not hasattr(elem, "__iter__"):
return False
type_check = all(map(lambda x: in_operator(x[0], x[1]), zip(elem, y))) type_check = all(map(lambda x: in_operator(x[0], x[1]), zip(elem, y)))
len_check = len(elem) == len(y) len_check = len(elem) == len(y)
return type_check and len_check return type_check and len_check

View file

@ -54,7 +54,7 @@ fn demangle(name: &str) -> String {
} }
// TODO: // TODO:
fn replace_non_symbolic(name: String) -> String { fn replace_non_symbolic(name: &str) -> String {
name.replace('\'', "__single_quote__") name.replace('\'', "__single_quote__")
.replace(' ', "__space__") .replace(' ', "__space__")
.replace('+', "__plus__") .replace('+', "__plus__")
@ -789,7 +789,7 @@ impl ScriptGenerator {
return demangle(&py_name); return demangle(&py_name);
} }
let name = ident.inspect().to_string(); let name = ident.inspect().to_string();
let name = replace_non_symbolic(name); let name = replace_non_symbolic(&name);
if ident.vis().is_public() { if ident.vis().is_public() {
name name
} else { } else {
@ -802,7 +802,7 @@ impl ScriptGenerator {
for non_default in params.non_defaults { for non_default in params.non_defaults {
match non_default.raw.pat { match non_default.raw.pat {
ParamPattern::VarName(param) => { ParamPattern::VarName(param) => {
code += &format!("{}__,", param.into_token().content); code += &format!("{}__,", replace_non_symbolic(&param.into_token().content));
} }
ParamPattern::Discard(_) => { ParamPattern::Discard(_) => {
code += &format!("_{},", self.fresh_var_n); code += &format!("_{},", self.fresh_var_n);
@ -815,7 +815,7 @@ impl ScriptGenerator {
let ParamPattern::VarName(param) = default.sig.raw.pat else { todo!() }; let ParamPattern::VarName(param) = default.sig.raw.pat else { todo!() };
code += &format!( code += &format!(
"{}__ = {},", "{}__ = {},",
param.into_token().content, replace_non_symbolic(&param.into_token().content),
self.transpile_expr(default.default_val) self.transpile_expr(default.default_val)
); );
} }

View file

@ -1003,6 +1003,10 @@ impl Desugarer {
let mut attrs = RecordAttrs::new(vec![]); let mut attrs = RecordAttrs::new(vec![]);
let mut tys = vec![]; let mut tys = vec![];
for ParamRecordAttr { lhs, rhs } in rec.elems.iter() { for ParamRecordAttr { lhs, rhs } in rec.elems.iter() {
let lhs = Identifier {
vis: VisModifierSpec::Public(Token::DUMMY),
..lhs.clone()
};
let infer = Token::new(TokenKind::Try, "?", line, 0); let infer = Token::new(TokenKind::Try, "?", line, 0);
let expr = rhs let expr = rhs
.t_spec .t_spec
@ -1193,11 +1197,15 @@ impl Desugarer {
let mut attrs = RecordAttrs::new(vec![]); let mut attrs = RecordAttrs::new(vec![]);
let mut tys = vec![]; let mut tys = vec![];
for ParamRecordAttr { lhs, rhs } in rec.elems.iter_mut() { for ParamRecordAttr { lhs, rhs } in rec.elems.iter_mut() {
let lhs = Identifier {
vis: VisModifierSpec::Public(Token::DUMMY),
..lhs.clone()
};
insertion_idx = self.desugar_nested_param_pattern( insertion_idx = self.desugar_nested_param_pattern(
new_body, new_body,
rhs, rhs,
&buf_name, &buf_name,
BufIndex::Record(lhs), BufIndex::Record(&lhs),
insertion_idx, insertion_idx,
); );
let infer = Token::new(TokenKind::Try, "?", line, 0); let infer = Token::new(TokenKind::Try, "?", line, 0);

View file

@ -13,7 +13,7 @@ if! cond:
a = [1, 2, 3] a = [1, 2, 3]
sum = match a: sum = match a:
[x, y, z] -> x + y + z [x, y, z] -> x + y + z
(x, y, z) -> x + y + z ((x, y, z),) -> x + y + z
{x; y; z} -> x + y + z {x; y; z} -> x + y + z
(i: Int) -> i (i: Int) -> i
_ -> panic "unknown object" _ -> panic "unknown object"

View file

@ -31,3 +31,8 @@ public = { .x = 1; .y = 2 }
_ = unpack public # OK _ = unpack public # OK
_ = unpack private # ERR _ = unpack private # ERR
unpack2 {x; y} = x + y
_ = unpack2 public # OK
_ = unpack2 private # ERR

View file

@ -334,7 +334,7 @@ fn exec_var_args_err() -> Result<(), ()> {
#[test] #[test]
fn exec_visibility() -> Result<(), ()> { fn exec_visibility() -> Result<(), ()> {
expect_failure("tests/should_err/visibility.er", 2, 6) expect_failure("tests/should_err/visibility.er", 2, 7)
} }
#[test] #[test]