From: Patrick Schönberger Date: Thu, 12 Aug 2021 13:17:22 +0000 (+0200) Subject: fix function and method return types X-Git-Url: https://gitweb.ps.run/toc/commitdiff_plain/9f94b672a5dc32da5ad01742bd4e976315a30d9c fix function and method return types --- diff --git a/src/main.cpp b/src/main.cpp index bd9a2b2..a075a80 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -15,7 +15,7 @@ using namespace antlr4; int main(int argc, const char * argv[]) { - std::ifstream ifs("test/test.toc"); + std::ifstream ifs("test/test2.toc"); // create ANTLR input from filestream ANTLRInputStream input(ifs); diff --git a/src/toc.h b/src/toc.h index 095a72c..254abf2 100644 --- a/src/toc.h +++ b/src/toc.h @@ -93,21 +93,14 @@ std::ostream & operator<< (std::ostream & out, const Type & t) return out; } -std::ostream & operator<< (std::ostream & out, const Variable & v) -{ - out << v.type << " "; +std::string generateModifiers (std::string s, std::vector modifiers) +{ std::stringstream sstr; - std::string s = v.name; - - // lookup variable and change name to reflect containing namespace - auto var = findVariable(v.name, namespaces, globalCtx); - if (var.has_value()) - s = vectorStr(std::get<1>(*var), "_", true) + s; - // nest modifiers, inverted because C defines them + // apply modifiers, inverted because C defines them // the opposite direction - for (auto m = v.type.modifiers.rbegin(); m != v.type.modifiers.rend(); m++) + for (auto m = modifiers.rbegin(); m != modifiers.rend(); m++) { if (m->type == TypeModifierType::Pointer) { @@ -125,7 +118,23 @@ std::ostream & operator<< (std::ostream & out, const Variable & v) s = sstr.str(); } } - out << s; + + return s; +} + +std::ostream & operator<< (std::ostream & out, const Variable & v) +{ + out << v.type << " "; + + std::string s = v.name; + + // lookup variable and change name to reflect containing namespace + auto var = findVariable(v.name, namespaces, globalCtx); + if (var.has_value()) + s = vectorStr(std::get<1>(*var), "_", true) + s; + + // apply modifiers in C fashion + out << generateModifiers(s, v.type.modifiers); return out; } @@ -273,7 +282,7 @@ void tocFunction (std::ostream & out, const Function & f, bool stub) // regular function if (f.genericTypeNames.empty()) { - out << f.returnType << " " << namespacePrefix() << f.name << " (" << vectorStr(f.parameters, ", ") << ")"; + out << f.returnType << " " << generateModifiers(namespacePrefix() + f.name, f.returnType.modifiers) << " (" << vectorStr(f.parameters, ", ") << ")"; if (stub) { @@ -296,7 +305,7 @@ void tocFunction (std::ostream & out, const Function & f, bool stub) currentInstantiation[f.genericTypeNames[i]] = instantiation[i]; } - out << f.returnType << " " << namespacePrefix() << f.name << genericAppendix(instantiation) << " (" << vectorStr(f.parameters, ", ") << ")"; + out << f.returnType << " " << generateModifiers(namespacePrefix() + f.name, f.returnType.modifiers) << genericAppendix(instantiation) << " (" << vectorStr(f.parameters, ", ") << ")"; if (stub) { @@ -336,7 +345,7 @@ void tocStruct (std::ostream & out, const Struct & s, bool stub) } }); out << f.returnType << " " << - namespacePrefix() << s.name << "_" << f.name << + generateModifiers(namespacePrefix() + s.name + "_" + f.name, f.returnType.modifiers) << " (" << vectorStr(f.parameters, ", ") << ");\n"; } return; @@ -369,8 +378,8 @@ void tocStruct (std::ostream & out, const Struct & s, bool stub) } }); out << f.returnType << " " << - namespacePrefix() << s.name << "_" << f.name << - " (" << vectorStr(f.parameters, ", ") << ")\n" << f.body; + generateModifiers(namespacePrefix() + s.name + "_" + f.name, f.returnType.modifiers) << + " (" << vectorStr(f.parameters, ", ") << ")\n" << f.body; } } // generic struct @@ -403,7 +412,7 @@ void tocStruct (std::ostream & out, const Struct & s, bool stub) } }); out << f.returnType << " " << - namespacePrefix() << s.name << genericAppendix(instantiation) << "_" << f.name << + generateModifiers(namespacePrefix() + s.name + genericAppendix(instantiation) + "_" + f.name, f.returnType.modifiers) << " (" << vectorStr(f.parameters, ", ") << ");\n"; } return; @@ -436,8 +445,8 @@ void tocStruct (std::ostream & out, const Struct & s, bool stub) } }); out << f.returnType << " " << - namespacePrefix() << s.name << genericAppendix(instantiation) << "_" << f.name << - " (" << vectorStr(f.parameters, ", ") << ")\n" << f.body; + generateModifiers(namespacePrefix() + s.name + genericAppendix(instantiation) + "_" + f.name, f.returnType.modifiers) << + " (" << vectorStr(f.parameters, ", ") << ")\n" << f.body; } currentInstantiation.clear(); diff --git a/test/test.toc b/test/test.toc index 38dc818..bff757a 100644 --- a/test/test.toc +++ b/test/test.toc @@ -7,13 +7,13 @@ var global1 : int; var global2 : double = 123.45; func globalFunc() : void { - //puts("Hello\n"); + puts("Hello\n"); } // structs and functions can be declared generic // by providing a list of placeholder typenames struct S1 { - t1: T1; + t1: T1 *; t2: T1; m1() : T2 { @@ -76,6 +76,13 @@ namespace N1 { } } +struct List { + array: T *; + get(index: int): T { + return this->array[index]; + } +} + func main(argc : int, argv : char**) : int { var s1 : N1::N2::S1; var s2 : N1::N2::S1; @@ -98,5 +105,10 @@ func main(argc : int, argv : char**) : int { var s: N1::N2::S2; s.abc(); + var l1: List; + l1.get(1); + + var i1: int = generic1(1, 2); + return 0; } \ No newline at end of file