]> gitweb.ps.run Git - toc/blobdiff - src/repr_get.h
structs and functions in ctx
[toc] / src / repr_get.h
index 396c71a01c2c053ac2da5357097ef896b02d1640..7436dde1e553874a206590e8a9d222e681b86379 100644 (file)
@@ -43,6 +43,13 @@ Type getType(TocParser::TypeContext * ctx)
       isStaticArray ? atoi(m->INT_LIT()->toString().c_str()) : -1\r
     );\r
   }\r
+  if (ctx->genericInstantiation() != nullptr)\r
+  {\r
+    for (auto g : ctx->genericInstantiation()->type())\r
+    {\r
+      result.genericInstantiation.push_back(getType(g));\r
+    }\r
+  }\r
   return result;\r
 }\r
 Variable getVariable(TocParser::VarContext * ctx)\r
@@ -77,18 +84,43 @@ Function getFunction(TocParser::FuncContext * ctx, std::shared_ptr<Context> pare
   Function result;\r
   result.name = ctx->funcName()->NAME()->toString();\r
   result.returnType = getType(ctx->type());\r
+  if (ctx->genericDecl() != nullptr)\r
+  {\r
+    for (auto t : ctx->genericDecl()->typeName())\r
+    {\r
+      result.genericTypeNames.push_back(t->getText());\r
+    }\r
+  }\r
+\r
   if (!ctx->parameter()->var().empty())\r
   {\r
     for (auto p : ctx->parameter()->var())\r
       result.parameters.push_back(getVariable(p));\r
   }\r
-  result.body = getBody(ctx->body(), parent);\r
+\r
+  if (ctx->body() != nullptr)\r
+  {\r
+    result.body = getBody(ctx->body(), parent);\r
+    result.defined = true;\r
+  }\r
+  else\r
+  {\r
+    result.defined = false;\r
+  }\r
   return result;\r
 }\r
 Struct getStruct(TocParser::StructDeclContext * ctx, std::shared_ptr<Context> parent)\r
 {\r
   Struct result;\r
   result.name = ctx->structName()->NAME()->toString();\r
+  if (ctx->genericDecl() != nullptr)\r
+  {\r
+    for (auto t : ctx->genericDecl()->typeName())\r
+    {\r
+      result.genericTypeNames.push_back(t->getText());\r
+    }\r
+  }\r
+\r
   for (auto m : ctx->structMember())\r
   {\r
     if (m->structVar() != nullptr)\r
@@ -121,11 +153,11 @@ Namespace getNamespace(TocParser::NamespaceDeclContext * ctx, std::shared_ptr<Co
     }\r
     if (d->funcDecl() != nullptr)\r
     {\r
-      result.functions.push_back(getFunction(d->funcDecl()->func(), result.ctx));\r
+      result.ctx->functions.push_back(getFunction(d->funcDecl()->func(), result.ctx));\r
     }\r
     if (d->structDecl() != nullptr)\r
     {\r
-      result.structs.push_back(getStruct(d->structDecl(), result.ctx));\r
+      result.ctx->structs.push_back(getStruct(d->structDecl(), result.ctx));\r
     }\r
     if (d->namespaceDecl() != nullptr)\r
     {\r
@@ -146,11 +178,11 @@ Program getProgram(TocParser::ProgContext * ctx, std::shared_ptr<Context> parent
     }\r
     if (d->funcDecl() != nullptr)\r
     {\r
-      result.functions.push_back(getFunction(d->funcDecl()->func(), result.ctx));\r
+      result.ctx->functions.push_back(getFunction(d->funcDecl()->func(), result.ctx));\r
     }\r
     if (d->structDecl() != nullptr)\r
     {\r
-      result.structs.push_back(getStruct(d->structDecl(), result.ctx));\r
+      result.ctx->structs.push_back(getStruct(d->structDecl(), result.ctx));\r
     }\r
     if (d->namespaceDecl() != nullptr)\r
     {\r
@@ -191,6 +223,13 @@ Expr getExpr(TocParser::FuncExprContext * ctx)
   for (auto n : ctx->namespaceSpecifier())\r
     result._func.namespacePrefixes.push_back(n->typeName()->getText());\r
   result._func.functionName = ctx->funcName()->NAME()->toString();\r
+  if (ctx->genericInstantiation() != nullptr)\r
+  {\r
+    for (auto g : ctx->genericInstantiation()->type())\r
+    {\r
+      result._func.genericInstantiation.push_back(getType(g));\r
+    }\r
+  }\r
   for (auto e : ctx->expr())\r
     result._func.arguments.push_back(getExpr(e));\r
   return result;\r
@@ -201,6 +240,13 @@ Expr getExpr(TocParser::MethodExprContext * ctx)
   result.type = ExprType::Method;\r
   result._method.expr = std::make_unique<Expr>(getExpr(ctx->expr(0)));\r
   result._method.methodName = ctx->funcName()->NAME()->toString();\r
+  if (ctx->genericInstantiation() != nullptr)\r
+  {\r
+    for (auto g : ctx->genericInstantiation()->type())\r
+    {\r
+      result._method.genericInstantiation.push_back(getType(g));\r
+    }\r
+  }\r
   for (int i = 1; i < ctx->expr().size(); i++)\r
     result._method.arguments.push_back(getExpr(ctx->expr(i)));\r
   return result;\r
@@ -219,10 +265,10 @@ Expr getExpr(TocParser::LitExprContext * ctx)
     result._lit.type = LitType::Decimal;\r
     result._lit._decimal = atof(ctx->literal()->DECIMAL_LIT()->toString().c_str());\r
   }\r
-  else if (ctx->literal()->STRING_LIT() != nullptr)\r
+  else if (ctx->literal()->StringLit() != nullptr)\r
   {\r
     result._lit.type = LitType::String;\r
-    result._lit._string = ctx->literal()->STRING_LIT()->toString();\r
+    result._lit._string = ctx->literal()->StringLit()->toString();\r
   }\r
   else if (ctx->literal()->BOOL_LIT() != nullptr)\r
   {\r
@@ -244,6 +290,7 @@ Expr getExpr(TocParser::DotExprContext * ctx)
   result.type = ExprType::Dot;\r
   result._dot.expr = std::make_unique<Expr>(getExpr(ctx->expr()));\r
   result._dot.identifier = ctx->varName()->getText();\r
+  result._dot.isPointer = ctx->arrow() != nullptr;\r
   return result;\r
 }\r
 Expr getExpr(TocParser::PrefixOpExprContext * ctx)\r