From f19b14f45f26e17b252e1f3b074e6d4df8e2b17e Mon Sep 17 00:00:00 2001 From: PuqiAR Date: Mon, 29 Dec 2025 20:34:04 +0800 Subject: [PATCH] =?UTF-8?q?[Impl]=20=E5=A2=9E=E5=8A=A0=20prettyType,?= =?UTF-8?q?=E8=BF=94=E5=9B=9ETypeInfo=E7=9A=84FString,=20StructInstance?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E8=BE=93=E5=87=BA=E7=88=B6=E7=B1=BBTypeInfo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Evaluator/evaluator.cpp | 28 ++++++++++++++-------------- src/Value/Type.hpp | 2 +- src/Value/value.cpp | 8 ++++++++ src/Value/value.hpp | 2 ++ 4 files changed, 25 insertions(+), 15 deletions(-) diff --git a/src/Evaluator/evaluator.cpp b/src/Evaluator/evaluator.cpp index fb8b98c..f25b7bc 100644 --- a/src/Evaluator/evaluator.cpp +++ b/src/Evaluator/evaluator.cpp @@ -107,7 +107,7 @@ namespace Fig u8"TypeError", std::format( "Type `List` indices must be `Int`, got '{}'", - index->getTypeInfo().toString().toBasicString()), + prettyType(index).toBasicString()), ie->index); } List &list = base.get()->as(); @@ -142,7 +142,7 @@ namespace Fig u8"TypeError", std::format( "Type `String` indices must be `Int`, got '{}'", - index->getTypeInfo().toString().toBasicString()), + prettyType(index).toBasicString()), ie->index); } FString &string = base.get()->as(); @@ -390,7 +390,7 @@ namespace Fig throw EvaluatorError( u8"TypeError", std::format("Condition must be boolean, got '{}'", - condVal->getTypeInfo().toString().toBasicString()), + prettyType(condVal).toBasicString()), te->condition); } ValueType::BoolClass cond = condVal->as(); @@ -477,7 +477,7 @@ namespace Fig std::format("In function '{}', default parameter '{}' has type '{}', which does not match the expected type '{}'", fnName.toBasicString(), fnParas.defParas[defParamIndex].first.toBasicString(), - defaultVal->getTypeInfo().toString().toBasicString(), + prettyType(defaultVal).toBasicString(), expectedType.toString().toBasicString()), fnArgs.argv[i]); } @@ -560,7 +560,7 @@ namespace Fig std::format("Function '{}' expects return type '{}', but got type '{}'", fnName.toBasicString(), fnStruct.retType.toString().toBasicString(), - retVal->getTypeInfo().toString().toBasicString()), + prettyType(retVal).toBasicString()), fnStruct.body); } return retVal; @@ -750,7 +750,7 @@ namespace Fig initExpr->structName.toBasicString(), fieldName.toBasicString(), expectedType.toString().toBasicString(), - defaultVal->getTypeInfo().toString().toBasicString()), + prettyType(defaultVal).toBasicString()), initExpr); } @@ -767,7 +767,7 @@ namespace Fig initExpr->structName.toBasicString(), fieldName.toBasicString(), expectedType.toString().toBasicString(), - argVal->getTypeInfo().toString().toBasicString()), + prettyType(argVal).toBasicString()), initExpr); } instanceCtx->def(fieldName, expectedType, field.am, argVal); @@ -806,7 +806,7 @@ namespace Fig initExpr->structName.toBasicString(), fieldName.toBasicString(), expectedType.toString().toBasicString(), - defaultVal->getTypeInfo().toString().toBasicString()), + prettyType(defaultVal).toBasicString()), initExpr); } @@ -823,7 +823,7 @@ namespace Fig initExpr->structName.toBasicString(), fieldName.toBasicString(), field.type.toString().toBasicString(), - argVal->getTypeInfo().toString().toBasicString()), + prettyType(argVal).toBasicString()), initExpr); } instanceCtx->def(fieldName, field.type, field.am, argVal); @@ -926,7 +926,7 @@ namespace Fig "Variable `{}` expects init-value type `{}`, but got '{}'", varDef->name.toBasicString(), declaredTypeName.toBasicString(), - value->getTypeInfo().toString().toBasicString()), + prettyType(value).toBasicString()), varDef->expr); } else if (value == nullptr) @@ -1040,7 +1040,7 @@ namespace Fig u8"TypeError", std::format( "Condition must be boolean, but got '{}'", - condVal->getTypeInfo().toString().toBasicString()), + prettyType(condVal).toBasicString()), ifSt->condition); } if (condVal->as()) @@ -1057,7 +1057,7 @@ namespace Fig u8"TypeError", std::format( "Condition must be boolean, but got '{}'", - condVal->getTypeInfo().toString().toBasicString()), + prettyType(condVal).toBasicString()), ifSt->condition); } if (elifCondVal->as()) @@ -1082,7 +1082,7 @@ namespace Fig u8"TypeError", std::format( "Condition must be boolean, but got '{}'", - condVal->getTypeInfo().toString().toBasicString()), + prettyType(condVal).toBasicString()), whileSt->condition); } if (!condVal->as()) @@ -1128,7 +1128,7 @@ namespace Fig u8"TypeError", std::format( "Condition must be boolean, but got '{}'", - condVal->getTypeInfo().toString().toBasicString()), + prettyType(condVal).toBasicString()), forSt->condition); } if (!condVal->as()) diff --git a/src/Value/Type.hpp b/src/Value/Type.hpp index 879a624..20f83d8 100644 --- a/src/Value/Type.hpp +++ b/src/Value/Type.hpp @@ -43,7 +43,7 @@ namespace Fig return id == other.id; } }; - + class TypeInfoHash { public: diff --git a/src/Value/value.cpp b/src/Value/value.cpp index d656fda..0a27964 100644 --- a/src/Value/value.cpp +++ b/src/Value/value.cpp @@ -69,6 +69,14 @@ namespace Fig } } + FString prettyType(ObjectPtr obj) + { + auto t = obj->getTypeInfo(); + if (t == ValueType::StructInstance) + return obj->as().parentType.toString(); + return t.toString(); + } + const TypeInfo ValueType::Any(FString(u8"Any"), true); // id: 1 const TypeInfo ValueType::Null(FString(u8"Null"), true); // id: 2 const TypeInfo ValueType::Int(FString(u8"Int"), true); // id: 3 diff --git a/src/Value/value.hpp b/src/Value/value.hpp index db1c023..79d0e79 100644 --- a/src/Value/value.hpp +++ b/src/Value/value.hpp @@ -33,6 +33,8 @@ namespace Fig using ObjectPtr = std::shared_ptr; using List = std::vector; + FString prettyType(ObjectPtr obj); + struct ValueKey { ObjectPtr value;