From 28689853d2d559a813b0be7976df239bbb9ae738 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Fri, 31 Dec 2021 06:17:57 -0500 Subject: [PATCH] Support for const expressions for bools & chars --- IDEHelper/Compiler/BfIRBuilder.cpp | 5 +++++ IDEHelper/Compiler/BfIRBuilder.h | 1 + IDEHelper/Compiler/BfModule.cpp | 3 +++ IDEHelper/Compiler/BfModuleTypeUtils.cpp | 21 +++++++++++++++++++-- IDEHelper/Compiler/BfResolvedTypeUtils.cpp | 4 +++- IDEHelper/Compiler/BfSystem.cpp | 12 +++++++++++- 6 files changed, 42 insertions(+), 4 deletions(-) diff --git a/IDEHelper/Compiler/BfIRBuilder.cpp b/IDEHelper/Compiler/BfIRBuilder.cpp index 701a3a75..aa36fe3d 100644 --- a/IDEHelper/Compiler/BfIRBuilder.cpp +++ b/IDEHelper/Compiler/BfIRBuilder.cpp @@ -359,6 +359,11 @@ bool BfIRConstHolder::IsInt(BfTypeCode typeCode) return (typeCode >= BfTypeCode_Int8) && (typeCode <= BfTypeCode_Char32); } +bool BfIRConstHolder::IsChar(BfTypeCode typeCode) +{ + return (typeCode >= BfTypeCode_Char8) && (typeCode <= BfTypeCode_Char32); +} + bool BfIRConstHolder::IsIntable(BfTypeCode typeCode) { return (typeCode >= BfTypeCode_Boolean) && (typeCode <= BfTypeCode_Char32); diff --git a/IDEHelper/Compiler/BfIRBuilder.h b/IDEHelper/Compiler/BfIRBuilder.h index 64c0f55d..45c892b9 100644 --- a/IDEHelper/Compiler/BfIRBuilder.h +++ b/IDEHelper/Compiler/BfIRBuilder.h @@ -907,6 +907,7 @@ public: void FixTypeCode(BfTypeCode& typeCode); int GetSize(BfTypeCode typeCode); static bool IsInt(BfTypeCode typeCode); + static bool IsChar(BfTypeCode typeCode); static bool IsIntable(BfTypeCode typeCode); static bool IsSigned(BfTypeCode typeCode); static bool IsFloat(BfTypeCode typeCode); diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 5645ef32..ad826656 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -7586,6 +7586,8 @@ void BfModule::ResolveGenericParamConstraints(BfGenericParamInstance* genericPar switch (typeCode) { + case BfTypeCode_StringId: + case BfTypeCode_Boolean: case BfTypeCode_Int8: case BfTypeCode_UInt8: case BfTypeCode_Int16: @@ -11970,6 +11972,7 @@ BfVariant BfModule::TypedValueToVariant(BfAstNode* refNode, const BfTypedValue& switch (constant->mTypeCode) { + case BfTypeCode_Boolean: case BfTypeCode_Int8: case BfTypeCode_UInt8: case BfTypeCode_Int16: diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index f45730a2..3cba8926 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -13605,8 +13605,15 @@ StringT<128> BfModule::TypeToString(BfType* resolvedType, BfTypeNameFlags typeNa void BfModule::VariantToString(StringImpl& str, const BfVariant& variant) { switch (variant.mTypeCode) - { - case BfTypeCode_Char8: + { + case BfTypeCode_Boolean: + if (variant.mUInt64 == 0) + str += "false"; + else if (variant.mUInt64 == 1) + str += "true"; + else + str += StrFormat("%lld", variant.mInt64); + break; case BfTypeCode_Int8: case BfTypeCode_UInt8: case BfTypeCode_Int16: @@ -13614,6 +13621,16 @@ void BfModule::VariantToString(StringImpl& str, const BfVariant& variant) case BfTypeCode_Int32: str += StrFormat("%d", variant.mInt32); break; + case BfTypeCode_Char8: + case BfTypeCode_Char16: + case BfTypeCode_Char32: + if ((variant.mUInt32 >= 32) && (variant.mUInt32 <= 0x7E)) + str += StrFormat("'%c'", (char)variant.mUInt32); + else if (variant.mUInt32 <= 0xFF) + str += StrFormat("'\\x%2X'", variant.mUInt32); + else + str += StrFormat("'\\u{%X}'", variant.mUInt32); + break; case BfTypeCode_UInt32: str += StrFormat("%lu", variant.mUInt32); break; diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp index dff9a65e..77f011e7 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp @@ -2787,7 +2787,9 @@ BfVariant BfResolvedTypeSet::EvaluateToVariant(LookupContext* ctx, BfExpression* // Limit the types of constants to prevent duplicate values with different types - we don't want to hash a typeref with an int32 // when the constraint requirement is int64 (but we don't know that at hash time) - if (BfIRConstHolder::IsInt(variant.mTypeCode)) + if (BfIRConstHolder::IsChar(variant.mTypeCode)) + variant.mTypeCode = BfTypeCode_Char32; + else if (BfIRConstHolder::IsInt(variant.mTypeCode)) variant.mTypeCode = BfTypeCode_Int64; else if (variant.mTypeCode == BfTypeCode_Float) { diff --git a/IDEHelper/Compiler/BfSystem.cpp b/IDEHelper/Compiler/BfSystem.cpp index ae37fa6f..347e88a4 100644 --- a/IDEHelper/Compiler/BfSystem.cpp +++ b/IDEHelper/Compiler/BfSystem.cpp @@ -2232,8 +2232,10 @@ bool BfSystem::DoesLiteralFit(BfTypeCode typeCode, int64 value) switch (typeCode) { + case BfTypeCode_Boolean: + return (value >= 0) && (value < 1); case BfTypeCode_Int8: - return (value >= -0x80) && (value < 0x80); + return (value >= -0x80) && (value < 0x80); case BfTypeCode_Int16: return (value >= -0x8000) && (value < 0x8000); case BfTypeCode_Int32: @@ -2242,10 +2244,13 @@ bool BfSystem::DoesLiteralFit(BfTypeCode typeCode, int64 value) return true; case BfTypeCode_UInt8: + case BfTypeCode_Char8: return (value >= 0) && (value < 0x100); case BfTypeCode_UInt16: + case BfTypeCode_Char16: return (value >= 0) && (value < 0x10000); case BfTypeCode_UInt32: + case BfTypeCode_Char32: return (value >= 0) && (value < 0x100000000LL); case BfTypeCode_UInt64: return (value >= 0); @@ -2267,6 +2272,8 @@ bool BfSystem::DoesLiteralFit(BfTypeCode typeCode, uint64 value) switch (typeCode) { + case BfTypeCode_Boolean: + return (value < 1); case BfTypeCode_Int8: return (value < 0x80); case BfTypeCode_Int16: @@ -2277,10 +2284,13 @@ bool BfSystem::DoesLiteralFit(BfTypeCode typeCode, uint64 value) return true; case BfTypeCode_UInt8: + case BfTypeCode_Char8: return (value < 0x100); case BfTypeCode_UInt16: + case BfTypeCode_Char16: return (value < 0x10000); case BfTypeCode_UInt32: + case BfTypeCode_Char32: return (value < 0x100000000LL); case BfTypeCode_UInt64: return true;