]> gitweb.ps.run Git - toc/commitdiff
fix function and method return types
authorPatrick Schönberger <patrick.schoenberger@posteo.de>
Thu, 12 Aug 2021 13:17:22 +0000 (15:17 +0200)
committerPatrick Schönberger <patrick.schoenberger@posteo.de>
Thu, 12 Aug 2021 13:17:22 +0000 (15:17 +0200)
src/main.cpp
src/toc.h
test/test.toc

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