Skip to content

Commit

Permalink
Merge pull request #33 from niuez/bugfix
Browse files Browse the repository at this point in the history
Bugfix
  • Loading branch information
niuez authored Aug 30, 2021
2 parents 8bbd314 + ffeecb5 commit 146a0c9
Show file tree
Hide file tree
Showing 18 changed files with 98 additions and 80 deletions.
4 changes: 2 additions & 2 deletions src/block.rs
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,6 @@ pub fn parse_block(s: &str) -> IResult<&str, Block> {

#[test]
fn parse_block_test() {
println!("{:?}", parse_block("let x = 0; let y = 91; let z = 1333; func(x * x, y, z);"));
println!("{:?}", parse_block("let x = 0; let y = 91; let z = 1333; func(x * x, y, z)"));
println!("{:?}", parse_block("let x = 0; let y = 91; let z = 1333; func(x * x, y, z);").ok());
println!("{:?}", parse_block("let x = 0; let y = 91; let z = 1333; func(x * x, y, z)").ok());
}
4 changes: 2 additions & 2 deletions src/cpp_inline.rs
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,6 @@ pub fn parse_cpp_inline(s: &str) -> IResult<&str, CppInline> {

#[test]
fn parse_inline_test() {
println!("{:?}", parse_cpp_inline("$${$ty(Vec<T>)($arg(vec)).push_back($arg(elem))}$$"));
println!("{:?}", parse_cpp_inline("$${ $arg(self).push_back($arg(t)) }$$"));
println!("{:?}", parse_cpp_inline("$${$ty(Vec<T>)($arg(vec)).push_back($arg(elem))}$$").ok());
println!("{:?}", parse_cpp_inline("$${ $arg(self).push_back($arg(t)) }$$").ok());
}
31 changes: 16 additions & 15 deletions src/expression.rs
Original file line number Diff line number Diff line change
Expand Up @@ -539,6 +539,7 @@ impl ParseExpression for ExpBitAnd {
impl ParseOperator for OperatorBitAnd {
fn parse_operator(s: &str) -> IResult<&str, Self> {
let (s, _) = char('&')(s)?;
let (_, _) = none_of("&")(s)?;
Ok((s, OperatorBitAnd()))
}
}
Expand Down Expand Up @@ -908,39 +909,39 @@ pub fn parse_expor(s: &str) -> IResult<&str, Expression> {

#[test]
fn parse_expression_test() {
println!("{:?}", parse_expression("1 + 2 - 3 + 4 - 5"));
println!("{:?}", parse_expression("func(1 + 2, 3 - 4)"));
println!("{:#?}", parse_expression("1 + 2 * 3 - 4 / 5"));
println!("{:#?}", parse_expression("(1 + 2) * (3 - 4) / 5"));
println!("{:?}", parse_expression("1 + 2 - 3 + 4 - 5").ok());
println!("{:?}", parse_expression("func(1 + 2, 3 - 4)").ok());
println!("{:#?}", parse_expression("1 + 2 * 3 - 4 / 5").ok());
println!("{:#?}", parse_expression("(1 + 2) * (3 - 4) / 5").ok());
}

#[test]
fn parse_bit_test() {
println!("{:#?}", parse_expression("1 & 2 | 3 ^ 4"));
println!("{:#?}", parse_expression("1 & 2 | 3 ^ 4").ok());
}
#[test]
fn parse_conditions_test() {
println!("{:?}", parse_expression("1 == 2"));
println!("{:?}", parse_expression("1 != 2"));
println!("{:?}", parse_expression("1 < 2"));
println!("{:?}", parse_expression("1 > 2"));
println!("{:?}", parse_expression("1 <= 2"));
println!("{:?}", parse_expression("1 >= 2"));
println!("{:?}", parse_expression("1 == 2").ok());
println!("{:?}", parse_expression("1 != 2").ok());
println!("{:?}", parse_expression("1 < 2").ok());
println!("{:?}", parse_expression("1 > 2").ok());
println!("{:?}", parse_expression("1 <= 2").ok());
println!("{:?}", parse_expression("1 >= 2").ok());
}

#[test]
fn parse_all_test() {
println!("{:?}", parse_expression("1 + 2 == 3 * 4 || 5 << 6 & 7 >> 8 != 9 | 0 ^ 1 && 2 % 3 < 4 / 5 && 6 > 7 && 8 < 9 || 0 <= 1 && 2 >= 3"));
println!("{:?}", parse_expression("1 + 2 == 3 * 4 || 5 << 6 & 7 >> 8 != 9 | 0 ^ 1 && 2 % 3 < 4 / 5 && 6 > 7 && 8 < 9 || 0 <= 1 && 2 >= 3").ok());
}

#[test]
fn parse_ref_test() {
println!("{:?}", parse_expression("*var"));
println!("{:?}", parse_expression("&var"));
println!("{:?}", parse_expression("*var").ok());
println!("{:?}", parse_expression("&var").ok());
}

#[test]
#[should_panic]
fn parse_conditions_failure_test() {
println!("{:?}", parse_expression("1 == 2 == 3"));
println!("{:?}", parse_expression("1 == 2 == 3").ok());
}
2 changes: 1 addition & 1 deletion src/expression/for_expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -67,5 +67,5 @@ pub fn parse_for_expr(s: &str) -> IResult<&str, Expression> {

#[test]
fn parse_if_expr_test() {
println!("{:?}", parse_if_expr("if a == b { c } else { d }"));
println!("{:?}", parse_if_expr("if a == b { c } else { d }").ok());
}
2 changes: 1 addition & 1 deletion src/expression/if_expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -92,5 +92,5 @@ pub fn parse_if_expr(s: &str) -> IResult<&str, Expression> {

#[test]
fn parse_if_expr_test() {
println!("{:?}", parse_if_expr("if a == b { c } else { d }"));
println!("{:?}", parse_if_expr("if a == b { c } else { d }").ok());
}
12 changes: 6 additions & 6 deletions src/func_definition.rs
Original file line number Diff line number Diff line change
Expand Up @@ -346,17 +346,17 @@ pub fn parse_func_definition(s: &str) -> IResult<&str, FuncDefinition> {

#[test]
fn parse_func_definition_test() {
log::debug!("{:?}", parse_func_definition("fn func(x: i64) -> i64 { let y = x * x; y + x }"));
log::debug!("{:?}", parse_func_definition("fn func2<t>(x: t) -> t { x }"));
log::debug!("{:?}", parse_func_definition("fn func3<x, y, z>(x: x) -> z { x }"));
log::debug!("{:?}", parse_func_definition("fn func(x: i64) -> i64 { let y = x * x; y + x }").ok());
log::debug!("{:?}", parse_func_definition("fn func2<t>(x: t) -> t { x }").ok());
log::debug!("{:?}", parse_func_definition("fn func3<x, y, z>(x: x) -> z { x }").ok());
}
#[test]
fn parse_func_definition2_test() {
log::debug!("{:?}", parse_func_definition("fn func2<t>(x: t) -> t where t: MyTraits{ x }"));
log::debug!("{:?}", parse_func_definition_info("fn nest_out<T>(t: T) -> T#MyTrait::Output#MyTrait::Output where T: MyTrait, T#MyTrait::Output: MyTrait"));
log::debug!("{:?}", parse_func_definition("fn func2<t>(x: t) -> t where t: MyTraits{ x }").ok());
log::debug!("{:?}", parse_func_definition_info("fn nest_out<T>(t: T) -> T#MyTrait::Output#MyTrait::Output where T: MyTrait, T#MyTrait::Output: MyTrait").ok());
}

#[test]
fn parse_func_cppinline_test() {
log::debug!("{:?}", parse_func_definition("fn push_back(self: Self, t: T) -> bool $${ $arg(self).push_back($arg(t)) }$$"));
log::debug!("{:?}", parse_func_definition("fn push_back(self: Self, t: T) -> bool $${ $arg(self).push_back($arg(t)) }$$").ok());
}
8 changes: 4 additions & 4 deletions src/identifier.rs
Original file line number Diff line number Diff line change
Expand Up @@ -95,8 +95,8 @@ pub fn parse_identifier(s: &str) -> IResult<&str, Identifier> {

#[test]
fn parse_identifier_test() {
log::debug!("{:?}", parse_identifier("func"));
log::debug!("{:?}", parse_identifier("if"));
log::debug!("{:?}", parse_identifier("x"));
log::debug!("{:?}", parse_identifier("f_u_n_c91"));
log::debug!("{:?}", parse_identifier("func").ok());
log::debug!("{:?}", parse_identifier("if").ok());
log::debug!("{:?}", parse_identifier("x").ok());
log::debug!("{:?}", parse_identifier("f_u_n_c91").ok());
}
4 changes: 2 additions & 2 deletions src/let_declaration.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,6 @@ pub fn parse_let_declaration(s: &str) -> IResult<&str, LetDeclaration> {

#[test]
fn parse_decl_test() {
log::debug!("{:?}", parse_let_declaration("let x = 1 + 2"));
log::debug!("{:?}", parse_let_declaration("let x: i64 = 1 + 2"));
log::debug!("{:?}", parse_let_declaration("let x = 1 + 2").ok());
log::debug!("{:?}", parse_let_declaration("let x: i64 = 1 + 2").ok());
}
12 changes: 6 additions & 6 deletions src/literal.rs
Original file line number Diff line number Diff line change
Expand Up @@ -122,18 +122,18 @@ pub fn literal_boolean(s: &str) -> IResult<&str, Literal> {

#[test]
fn parse_literal_u64_test() {
log::debug!("{:?}", parse_literal("659"));
log::debug!("{:?}", parse_literal("6_5_9"));
log::debug!("{:?}", parse_literal("659").ok());
log::debug!("{:?}", parse_literal("6_5_9").ok());
}

#[test]
fn parse_literal_i64_test() {
log::debug!("{:?}", parse_literal("659i64"));
log::debug!("{:?}", parse_literal("6_5_9i64"));
log::debug!("{:?}", parse_literal("659i64").ok());
log::debug!("{:?}", parse_literal("6_5_9i64").ok());
}

#[test]
fn parse_literal_boolean_test() {
log::debug!("{:?}", parse_literal("true"));
log::debug!("{:?}", parse_literal("false"));
log::debug!("{:?}", parse_literal("true").ok());
log::debug!("{:?}", parse_literal("false").ok());
}
4 changes: 2 additions & 2 deletions src/statement.rs
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,6 @@ pub fn parse_statement(s: &str) -> IResult<&str, Statement> {

#[test]
fn parse_statement_test() {
log::debug!("{:?}", parse_statement("let x = 1 + 2;"));
log::debug!("{:?}", parse_statement("clamp(x, y, z);"));
log::debug!("{:?}", parse_statement("let x = 1 + 2;").ok());
log::debug!("{:?}", parse_statement("clamp(x, y, z);").ok());
}
51 changes: 34 additions & 17 deletions src/structs/struct_definition.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,11 +77,11 @@ impl StructDefinition {
pub fn transpile_definition(&self, ta: &TypeAnnotation) -> String {
match self.member_def.member {
StructMember::MemberInfo(MemberInfo { .. }) => {
let template = if self.member_def.generics.len() > 0 {
format!("template <{}> ",
self.member_def.generics.iter().map(|gen| format!("class {}", gen.transpile(ta)))
.chain(std::iter::once(format!("class = void"))).collect::<Vec<_>>().join(", ")
)
let generics = self.member_def.generics.iter().map(|gen| format!("class {}", gen.transpile(ta)))
.chain(if self.member_def.where_sec.is_empty() { None } else { Some(format!("class = void"))})
.collect::<Vec<_>>();
let template = if generics.len() > 0 {
format!("template <{}> ", generics.join(", "))
}
else {
format!("")
Expand All @@ -101,31 +101,48 @@ impl StructDefinition {
else {
format!("")
};
let impl_type = format!("{}<{}>", self.member_def.struct_id.transpile(ta),
self.member_def.generics.iter().map(|gen| format!("{}", gen.transpile(ta)))
.chain(std::iter::once(self.member_def.where_sec.transpile(ta))).collect::<Vec<_>>().join(", "));
let generics = self.member_def.generics.iter().map(|gen| format!("{}", gen.transpile(ta)))
.chain(if self.member_def.where_sec.is_empty() {
None
} else {
Some(self.member_def.where_sec.transpile(ta))
}).collect::<Vec<_>>();
let impl_type = if !self.member_def.where_sec.is_empty() {
format!("{}<{}>", self.member_def.struct_id.transpile(ta),generics.join(", "))
}
else {
format!("{}", self.member_def.struct_id.transpile(ta))
};
let self_type_generics = if self.member_def.generics.len() > 0 {
format!("<{}>", self.member_def.generics.iter().map(|gen| format!("{}", gen.transpile(ta))).collect::<Vec<_>>().join(", "))
}
else {
format!("")
};
let self_type = format!("using Self = {}{};", self.member_def.struct_id.transpile(ta), self_type_generics);
let self_type = format!("{}{}", self.member_def.struct_id.transpile(ta), self_type_generics);
let members_str = members_order.iter().map(|mem| members.get_key_value(mem).unwrap()).map(|(mem, ty)| format!("{} {};", ty.transpile(ta), mem.into_string())).collect::<Vec<_>>().join("\n");
let constructor = format!("{}({}):{} {{ }}",
let constructor_member_init =
members_order.iter().map(|mem| members.get_key_value(mem).unwrap())
.map(|(mem, _)| format!("{}({})", mem.into_string(), mem.into_string())).collect::<Vec<_>>().join(", ");
let constructor_member_init = if constructor_member_init.is_empty() {
format!("")
}
else {
format!(":{}", constructor_member_init)
};
let constructor = format!("{}({}){} {{ }}",
self.member_def.struct_id.transpile(ta),
members_order.iter().map(|mem| members.get_key_value(mem).unwrap())
.map(|(mem, ty)| format!("{} {}", ty.transpile(ta), mem.into_string())).collect::<Vec<_>>().join(", "),
members_order.iter().map(|mem| members.get_key_value(mem).unwrap())
.map(|(mem, _)| format!("{}({})", mem.into_string(), mem.into_string())).collect::<Vec<_>>().join(", ")
constructor_member_init
);
let methods = self.impl_self.require_methods.iter().map(|(_, func)| format!("{}", func.transpile(ta, true))).collect::<Vec<_>>().join("\n");
let operators = opes.into_iter().map(|ope| match ope.as_str() {
"Index" => {
format!("typename std::enable_if<Index<Self>::value, const typename Index<Self>::Output&>::type operator[](typename Index<Self>::Arg k) const {{ return *Index<Self>::index(this, k); }}\n")
format!("typename std::enable_if<Index<{0}>::value, const typename Index<{0}>::Output&>::type operator[](typename Index<{0}>::Arg k) const {{ return *Index<{0}>::index(this, k); }}\n", self_type)
}
"IndexMut" => {
format!("typename std::enable_if<IndexMut<Self>::value, typename Index<Self>::Output&>::type operator[](typename Index<Self>::Arg k) {{ return *IndexMut<Self>::index_mut(this, k); }}\n")
format!("typename std::enable_if<IndexMut<{0}>::value, typename Index<{0}>::Output&>::type operator[](typename Index<{0}>::Arg k) {{ return *IndexMut<{0}>::index_mut(this, k); }}\n", self_type)
}
/* bin_ope if binary_operators.contains_key(bin_ope) => {
let method = binary_operators[&bin_ope];
Expand All @@ -134,7 +151,7 @@ impl StructDefinition {
_ => "".to_string(),
}).collect::<Vec<_>>().join("");

format!("{}struct {} {{\n{}\n{}\n{}\n{}{}}} ;\n", template, impl_type, self_type, members_str, constructor, methods, operators)
format!("{}struct {} {{\n{}\n{}\n{}{}}} ;\n", template, impl_type, members_str, constructor, methods, operators)
}
_ => format!(""),
}
Expand Down Expand Up @@ -237,12 +254,12 @@ pub fn parse_struct_definition(s: &str) -> IResult<&str, StructDefinition> {

#[test]
fn parse_struct_definition_test() {
log::debug!("{:?}", parse_struct_definition("struct MyStruct { a: i64, b: u64, }"));
log::debug!("{:?}", parse_struct_definition("struct MyStruct { a: i64, b: u64, }").ok());
}

#[test]
fn parse_struct_definition2_test() {
log::debug!("{:?}", parse_struct_definition("struct MyStruct<S, T> { a: S, b: T }"));
log::debug!("{:?}", parse_struct_definition("struct MyStruct<S, T> { a: S, b: T }").ok());
}

/*#[test]
Expand Down
2 changes: 1 addition & 1 deletion src/structs/struct_instantiation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,6 @@ impl MutCheck for StructInstantiation {

#[test]
fn parse_struct_instantiation_test() {
log::debug!("{:?}", parse_struct_instantiation("MyStruct { a: 1i64 + 2i64, b: val, }"));
log::debug!("{:?}", parse_struct_instantiation("MyStruct { a: 1i64 + 2i64, b: val, }").ok());
}

4 changes: 2 additions & 2 deletions src/subseq.rs
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,6 @@ fn parse_member(s: &str) -> IResult<&str, Subseq> {

#[test]
fn parse_call_test() {
log::debug!("{:?}", parse_call("()"));
log::debug!("{:?}", parse_call("(1, 2, 3)"));
log::debug!("{:?}", parse_call("()").ok());
log::debug!("{:?}", parse_call("(1, 2, 3)").ok());
}
2 changes: 1 addition & 1 deletion src/traits.rs
Original file line number Diff line number Diff line change
Expand Up @@ -168,5 +168,5 @@ pub fn parse_trait_definition(s: &str) -> IResult<&str, TraitDefinition> {

#[test]
fn parse_trait_definition_test() {
log::debug!("{:?}", parse_trait_definition("trait MyTrait { type Output; type Input; }"));
log::debug!("{:?}", parse_trait_definition("trait MyTrait { type Output; type Input; }").ok());
}
2 changes: 1 addition & 1 deletion src/traits/candidate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,7 @@ impl Transpile for ImplDefinition {
let def_str = def.transpile_definition_only(ta, "", true);
format!("{};", def_str)
}).collect::<Vec<_>>().join("\n");
format!("{} {{\nusing Self = {};\n{}\n{}\n}};\n", impl_def, self.impl_ty.transpile(ta), asso_defs, require_methods)
format!("{} {{\n{}\n{}\n}};\n", impl_def, asso_defs, require_methods)
}
Some((func, _)) => {
if let FuncBlock::CppInline(_) = self.require_methods[&TraitMethodIdentifier { id: Identifier::from_str(func) }].block {
Expand Down
16 changes: 8 additions & 8 deletions src/type_spec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -320,14 +320,14 @@ impl Transpile for TypeSpec {

#[test]
fn parse_type_spec_test() {
log::debug!("{:?}", parse_type_spec("i64"));
log::debug!("{:?}", parse_type_spec("i64#MyTrait::Output"));
log::debug!("{:?}", parse_type_spec("Pair<Pair<i64, u64>, bool>"));
log::debug!("{:?}", parse_type_spec("T#MyTrait::Output#MyTrait::Output"));
log::debug!("{:?}", parse_type_spec("(i64)"));
log::debug!("{:?}", parse_type_spec("*i64"));
log::debug!("{:?}", parse_type_spec("*(*i64)"));
log::debug!("{:?}", parse_type_spec("*(T#MyTrait::Output)"));
log::debug!("{:?}", parse_type_spec("i64").ok());
log::debug!("{:?}", parse_type_spec("i64#MyTrait::Output").ok());
log::debug!("{:?}", parse_type_spec("Pair<Pair<i64, u64>, bool>").ok());
log::debug!("{:?}", parse_type_spec("T#MyTrait::Output#MyTrait::Output").ok());
log::debug!("{:?}", parse_type_spec("(i64)").ok());
log::debug!("{:?}", parse_type_spec("*i64").ok());
log::debug!("{:?}", parse_type_spec("*(*i64)").ok());
log::debug!("{:?}", parse_type_spec("*(T#MyTrait::Output)").ok());
// log::debug!("{:?}", parse_type_spec("Pair<Pair<i64, u64>, bool>").unwrap().1.gen_type(&mut equs));
}

14 changes: 7 additions & 7 deletions src/unary_expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -195,17 +195,17 @@ pub fn parse_unary_trait_method(ss: &str) -> IResult<&str, UnaryExpr> {

#[test]
fn parse_unary_expr_test() {
log::debug!("{:?}", parse_unary_expr("func(1, 2, 3)"));
log::debug!("{:?}", parse_unary_expr("add(1, add(2, 3), 4)"));
log::debug!("{:?}", parse_unary_expr("generate_func(91)(1333)"));
log::debug!("{:?}", parse_unary_expr("MyStruct { a: 1i64 + 2i64, b: val, }"));
log::debug!("{:?}", parse_unary_expr("generate_func(31 * 91, 210)(1333 / 5 * 3)"));
log::debug!("{:?}", parse_unary_expr("func(1, 2, 3)").ok());
log::debug!("{:?}", parse_unary_expr("add(1, add(2, 3), 4)").ok());
log::debug!("{:?}", parse_unary_expr("generate_func(91)(1333)").ok());
log::debug!("{:?}", parse_unary_expr("MyStruct { a: 1i64 + 2i64, b: val, }").ok());
log::debug!("{:?}", parse_unary_expr("generate_func(31 * 91, 210)(1333 / 5 * 3)").ok());
}
#[test]
fn parse_parentheses_expr_test() {
log::debug!("{:?}", parse_unary_expr("(1 + 2 + 3)"));
log::debug!("{:?}", parse_unary_expr("(1 + 2 + 3)").ok());
}
#[test]
fn parse_trait_method_test() {
log::debug!("{:?}", parse_unary_expr("i64#MyTrait.out"));
log::debug!("{:?}", parse_unary_expr("i64#MyTrait.out").ok());
}
4 changes: 2 additions & 2 deletions src/unify/where_section.rs
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,6 @@ pub fn parse_where_section(s: &str) -> IResult<&str, WhereSection> {

#[test]
fn parse_where_section_test() {
log::debug!("{:?}", parse_where_section("where T: Add, T#Hoge::Output: Add, T#Hoge::Output=i64"));
log::debug!("{:?}", parse_where_section("where S: Add(Output=T)"));
log::debug!("{:?}", parse_where_section("where T: Add, T#Hoge::Output: Add, T#Hoge::Output=i64").ok());
log::debug!("{:?}", parse_where_section("where S: Add(Output=T)").ok());
}

0 comments on commit 146a0c9

Please sign in to comment.