X-Git-Url: https://gitweb.ps.run/toc/blobdiff_plain/9610ce88f0b753db81014a053bd3c6d79471c90c..refs/heads/main:/src/typeInfo.h diff --git a/src/typeInfo.h b/src/typeInfo.h index 10b4097..7862ef5 100644 --- a/src/typeInfo.h +++ b/src/typeInfo.h @@ -10,8 +10,9 @@ struct TypeInfo #include "find.h" -TypeInfo typeType(const Program & p, Type t) +TypeInfo typeType(std::shared_ptr globalCtx, Type t) { + // used to differentiate basic types from user defined types TypeInfo result; result.isStruct = true; if (t.name == "int" || t.name == "float" || t.name == "double" || @@ -21,10 +22,11 @@ TypeInfo typeType(const Program & p, Type t) result.isStruct = false; } result.type = t; + return result; } -TypeInfo typeExpr(const Program & p, std::shared_ptr globalCtx, Expr e) +TypeInfo typeExpr(std::shared_ptr globalCtx, Expr e) { TypeInfo result; @@ -32,15 +34,17 @@ TypeInfo typeExpr(const Program & p, std::shared_ptr globalCtx, Expr e) { case ExprType::Func: { + // get type info from return type auto f = findFunction(e._func.functionName, e._func.namespacePrefixes, globalCtx); if (!f.has_value()) throw "Unknown function"; - result = typeType(p, std::get<0>(*f).returnType); + result = typeType(globalCtx, std::get<0>(*f).returnType); break; } case ExprType::Method: { - TypeInfo tiCaller = typeExpr(p, globalCtx, *e._method.expr); + // get type info from return type + TypeInfo tiCaller = typeExpr(globalCtx, *e._method.expr); if (!tiCaller.isStruct) throw "Calling method on non-struct"; auto s = findStruct(tiCaller.type.name, tiCaller.type.namespacePrefixes, globalCtx); @@ -49,10 +53,11 @@ TypeInfo typeExpr(const Program & p, std::shared_ptr globalCtx, Expr e) auto m = findStructMethod(e._method.methodName, std::get<0>(*s)); if (!m.has_value()) throw "Unknown method"; - result = typeType(p, m->t.returnType); + result = typeType(globalCtx, m->t.returnType); break; } case ExprType::Lit: + // literal types are defined result.isStruct = false; switch (e._lit.type) { @@ -63,11 +68,13 @@ TypeInfo typeExpr(const Program & p, std::shared_ptr globalCtx, Expr e) } break; case ExprType::Paren: - result = typeExpr(p, globalCtx, *e._paren.expr); + result = typeExpr(globalCtx, *e._paren.expr); break; case ExprType::Dot: { - auto tiCaller = typeExpr(p, globalCtx, *e._dot.expr); + // assume dot access is always member access + // and lookup struct variable + auto tiCaller = typeExpr(globalCtx, *e._dot.expr); if (!tiCaller.isStruct) throw "Accessing member of non-struct"; auto s = findStruct(tiCaller.type.name, tiCaller.type.namespacePrefixes, globalCtx); @@ -76,24 +83,26 @@ TypeInfo typeExpr(const Program & p, std::shared_ptr globalCtx, Expr e) auto sm = findStructMember(e._dot.identifier, std::get<0>(*s)); if (!sm.has_value()) throw "Unknown struct member"; - result = typeType(p, sm->t.type); + result = typeType(globalCtx, sm->t.type); break; } case ExprType::PrefixOp: - result = typeExpr(p, globalCtx, *e._prefixOp.expr); + result = typeExpr(globalCtx, *e._prefixOp.expr); break; case ExprType::PostfixOp: - result = typeExpr(p, globalCtx, *e._postfixOp.expr); + result = typeExpr(globalCtx, *e._postfixOp.expr); break; case ExprType::BinaryOp: - result = typeExpr(p, globalCtx, *e._binaryOp.lexpr); + result = typeExpr(globalCtx, *e._binaryOp.lexpr); break; case ExprType::TernaryOp: - result = typeExpr(p, globalCtx, *e._ternaryOp.rexprTrue); + result = typeExpr(globalCtx, *e._ternaryOp.rexprTrue); break; case ExprType::Bracket: { - TypeInfo ti = typeExpr(p, globalCtx, *e._brackets.lexpr); + // get type of expr and remove array/ptr modifier to get + // type of [] access + TypeInfo ti = typeExpr(globalCtx, *e._brackets.lexpr); if (!ti.type.modifiers.empty()) { result = ti; @@ -106,10 +115,11 @@ TypeInfo typeExpr(const Program & p, std::shared_ptr globalCtx, Expr e) } case ExprType::Identifier: { + // var lookup and return var type auto v = findVariable(e._identifier.identifier, e._identifier.namespacePrefixes, globalCtx); if (!v.has_value()) throw "Unknown variable"; - result = typeType(p, std::get<0>(*v).type); + result = typeType(globalCtx, std::get<0>(*v).type); break; } }