]> gitweb.ps.run Git - toc/blobdiff - src/typeInfo.h
structs and functions in ctx
[toc] / src / typeInfo.h
index cbe421ca33fe4108471adc571864ae8222991f1c..89fff2a1800d7ceebaed464a9c6c6cebc6314d0d 100644 (file)
@@ -36,7 +36,7 @@ TypeInfo typeExpr(const Program & p, const std::vector<std::string> & globalName
     namespacePrefixes.insert(namespacePrefixes.end(),\r
       e._func.namespacePrefixes.begin(),\r
       e._func.namespacePrefixes.end());\r
     namespacePrefixes.insert(namespacePrefixes.end(),\r
       e._func.namespacePrefixes.begin(),\r
       e._func.namespacePrefixes.end());\r
-    auto f = findFunction(p, e._func.functionName, namespacePrefixes);\r
+    auto f = findFunction(e._func.functionName, e._func.namespacePrefixes, globalCtx);\r
     if (!f.has_value())\r
       throw "Unknown function";\r
     result = typeType(p, f.value().returnType);\r
     if (!f.has_value())\r
       throw "Unknown function";\r
     result = typeType(p, f.value().returnType);\r
@@ -45,7 +45,12 @@ TypeInfo typeExpr(const Program & p, const std::vector<std::string> & globalName
   case ExprType::Method:\r
   {\r
     TypeInfo tiCaller = typeExpr(p, globalNamespace, globalCtx, *e._method.expr);\r
   case ExprType::Method:\r
   {\r
     TypeInfo tiCaller = typeExpr(p, globalNamespace, globalCtx, *e._method.expr);\r
-    auto m = findStructMethod(p, e._method.methodName, tiCaller);\r
+    if (!tiCaller.isStruct)\r
+      throw "Calling method on non-struct";\r
+    auto s = findStruct(tiCaller.type.name, tiCaller.type.namespacePrefixes, globalCtx);\r
+    if (!s.has_value())\r
+      throw "Calling method on unknown struct";\r
+    auto m = findStructMethod(e._method.methodName, s.value());\r
     if (!m.has_value())\r
       throw "Unknown method";\r
     result = typeType(p, m.value().t.returnType);\r
     if (!m.has_value())\r
       throw "Unknown method";\r
     result = typeType(p, m.value().t.returnType);\r
@@ -66,8 +71,13 @@ TypeInfo typeExpr(const Program & p, const std::vector<std::string> & globalName
     break;\r
   case ExprType::Dot:\r
   {\r
     break;\r
   case ExprType::Dot:\r
   {\r
-    auto sm = findStructMember(p,\r
-        typeExpr(p, globalNamespace, globalCtx, *e._dot.expr), e._dot.identifier);\r
+    auto tiCaller = typeExpr(p, globalNamespace, globalCtx, *e._dot.expr);\r
+    if (!tiCaller.isStruct)\r
+      throw "Accessing member of non-struct";\r
+    auto s = findStruct(tiCaller.type.name, tiCaller.type.namespacePrefixes, globalCtx);\r
+    if (!s.has_value())\r
+      throw "Calling method on unknown struct";\r
+    auto sm = findStructMember(e._dot.identifier, s.value());\r
     if (!sm.has_value())\r
       throw "Unknown struct member";\r
     result = typeType(p, sm.value().t.type);\r
     if (!sm.has_value())\r
       throw "Unknown struct member";\r
     result = typeType(p, sm.value().t.type);\r
@@ -104,7 +114,7 @@ TypeInfo typeExpr(const Program & p, const std::vector<std::string> & globalName
     namespacePrefixes.insert(namespacePrefixes.end(),\r
       e._identifier.namespacePrefixes.begin(),\r
       e._identifier.namespacePrefixes.end());\r
     namespacePrefixes.insert(namespacePrefixes.end(),\r
       e._identifier.namespacePrefixes.begin(),\r
       e._identifier.namespacePrefixes.end());\r
-    auto v = findVariable(p, e._identifier.identifier, globalCtx);\r
+    auto v = findVariable(e._identifier.identifier, namespacePrefixes, globalCtx);\r
     if (!v.has_value())\r
       throw "Unknown variable";\r
     result = typeType(p, v.value().type);\r
     if (!v.has_value())\r
       throw "Unknown variable";\r
     result = typeType(p, v.value().type);\r