abouttreesummaryrefslogcommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main.cpp2
-rw-r--r--src/toc.h49
-rw-r--r--test/test.toc16
3 files changed, 44 insertions, 23 deletions
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<TypeModifier> 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, T2> {
- t1: T1;
+ t1: T1 *;
t2: T1;
m1() : T2 {
@@ -76,6 +76,13 @@ namespace N1 {
}
}
+struct List<T> {
+ 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<int>;
+ l1.get(1);
+
+ var i1: int = generic1<int>(1, 2);
+
return 0;
} \ No newline at end of file