From 7a7cc716c6ce6e242de681b918474c15b7f69780 Mon Sep 17 00:00:00 2001 From: Fusion Date: Mon, 22 Mar 2021 11:44:13 +0100 Subject: [PATCH] Add colorization options for primitives, structs, generic params and make typealias match aliased type color. --- IDE/src/Settings.bf | 15 +++++++++ IDE/src/ui/SourceEditWidgetContent.bf | 3 ++ IDE/src/ui/SourceViewPanel.bf | 3 ++ IDEHelper/Compiler/BfCompiler.cpp | 2 ++ IDEHelper/Compiler/BfExprEvaluator.cpp | 2 +- IDEHelper/Compiler/BfModuleTypeUtils.cpp | 39 +++++++++++++++++++---- IDEHelper/Compiler/BfSourceClassifier.cpp | 10 +++--- IDEHelper/Compiler/BfSourceClassifier.h | 3 ++ 8 files changed, 66 insertions(+), 11 deletions(-) diff --git a/IDE/src/Settings.bf b/IDE/src/Settings.bf index e9ab5668..1fb81417 100644 --- a/IDE/src/Settings.bf +++ b/IDE/src/Settings.bf @@ -312,6 +312,9 @@ namespace IDE public Color mComment = 0xFF75715E; public Color mMethod = 0xFFA6E22A; public Color mType = 0xFF66D9EF; + public Color mPrimitiveType = 0xFF66D9EF; + public Color mStruct = 0xFF66D9EF; + public Color mGenericParam = 0xFF66D9EF; public Color mRefType = 0xFF66A0EF; public Color mInterface = 0xFF9A9EEB; public Color mNamespace = 0xFF7BEEB7; @@ -355,13 +358,22 @@ namespace IDE if (sd.Contains("Type")) { GetColor("Type", ref mType); + if (!sd.Contains("PrimitiveType")) + mPrimitiveType = mType; + if (!sd.Contains("Struct")) + mStruct = mType; if (!sd.Contains("RefType")) mRefType = mType; if (!sd.Contains("Interface")) mInterface = mType; + if (!sd.Contains("GenericParam")) + mGenericParam = mType; } + GetColor("PrimitiveType", ref mPrimitiveType); + GetColor("Struct", ref mStruct); GetColor("RefType", ref mRefType); GetColor("Interface", ref mInterface); + GetColor("GenericParam", ref mGenericParam); GetColor("Namespace", ref mNamespace); GetColor("DisassemblyText", ref mDisassemblyText); GetColor("DisassemblyFileName", ref mDisassemblyFileName); @@ -380,6 +392,9 @@ namespace IDE SourceEditWidgetContent.sTextColors[(.)SourceElementType.Comment] = mComment; SourceEditWidgetContent.sTextColors[(.)SourceElementType.Method] = mMethod; SourceEditWidgetContent.sTextColors[(.)SourceElementType.Type] = mType; + SourceEditWidgetContent.sTextColors[(.)SourceElementType.PrimitiveType] = mPrimitiveType; + SourceEditWidgetContent.sTextColors[(.)SourceElementType.Struct] = mStruct; + SourceEditWidgetContent.sTextColors[(.)SourceElementType.GenericParam] = mGenericParam; SourceEditWidgetContent.sTextColors[(.)SourceElementType.RefType] = mRefType; SourceEditWidgetContent.sTextColors[(.)SourceElementType.Interface] = mInterface; SourceEditWidgetContent.sTextColors[(.)SourceElementType.Namespace] = mNamespace; diff --git a/IDE/src/ui/SourceEditWidgetContent.bf b/IDE/src/ui/SourceEditWidgetContent.bf index af07c861..cbef21bb 100644 --- a/IDE/src/ui/SourceEditWidgetContent.bf +++ b/IDE/src/ui/SourceEditWidgetContent.bf @@ -208,6 +208,9 @@ namespace IDE.ui 0xFF75715E, // Comment 0xFFA6E22A, // Method 0xFF66D9EF, // Type + 0xFF66D9EF, // PrimitiveType + 0xFF66D9EF, // Struct + 0xFF66D9EF, // GenericParam 0xFF66A0EF, // RefType 0xFF9A9EEB, // Interface 0xFF7BEEB7, // Namespace diff --git a/IDE/src/ui/SourceViewPanel.bf b/IDE/src/ui/SourceViewPanel.bf index 11de9a8f..22c03e28 100644 --- a/IDE/src/ui/SourceViewPanel.bf +++ b/IDE/src/ui/SourceViewPanel.bf @@ -30,6 +30,9 @@ namespace IDE.ui Comment, Method, Type, + PrimitiveType, + Struct, + GenericParam, RefType, Interface, Namespace, diff --git a/IDEHelper/Compiler/BfCompiler.cpp b/IDEHelper/Compiler/BfCompiler.cpp index fdd610cf..86012be6 100644 --- a/IDEHelper/Compiler/BfCompiler.cpp +++ b/IDEHelper/Compiler/BfCompiler.cpp @@ -4069,6 +4069,8 @@ void BfCompiler::ProcessAutocompleteTempType() elemType = BfSourceElementType_Interface; else if (checkTempType->mTypeCode == BfTypeCode_Object) elemType = BfSourceElementType_RefType; + else if (checkTempType->mTypeCode == BfTypeCode_Struct) + elemType = BfSourceElementType_Struct; mResolvePassData->mSourceClassifier->SetElementType(checkTempType->mTypeDeclaration->mNameNode, elemType); } diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 512edc47..b00fdf65 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -8492,7 +8492,7 @@ BfTypedValue BfExprEvaluator::MatchMethod(BfAstNode* targetSrc, BfMethodBoundExp } if (auto identifier = BfNodeDynCastExact(targetSrc)) - mModule->SetElementType(identifier, BfSourceElementType_Type); + mModule->SetElementType(identifier, resolvedTypeInstance->IsEnum() ? BfSourceElementType_Type : BfSourceElementType_Struct); if (mModule->mCompiler->mResolvePassData != NULL) mModule->mCompiler->mResolvePassData->HandleTypeReference(targetSrc, resolvedTypeInstance->mTypeDef); diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index f97f83a9..01d568e8 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -4772,6 +4772,8 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy elemType = BfSourceElementType_Interface; else if (typeInstance->IsObject()) elemType = BfSourceElementType_RefType; + else if (typeInstance->IsStruct() || (typeInstance->IsTypedPrimitive() && !typeInstance->IsEnum())) + elemType = BfSourceElementType_Struct; mCompiler->mResolvePassData->mSourceClassifier->SetElementType(typeDeclaration->mNameNode, elemType); } } @@ -8072,10 +8074,35 @@ BfType* BfModule::ResolveTypeResult(BfTypeReference* typeRef, BfType* resolvedTy } } + BfSourceElementType elemType = BfSourceElementType_Type; + { + auto typeRef = resolvedTypeRef; + while (typeRef->IsTypeAlias()) + { + typeRef = typeRef->GetUnderlyingType(); + if (typeRef == NULL) + { + typeRef = resolvedTypeRef; + break; + } + } + + if (typeRef->IsInterface()) + elemType = BfSourceElementType_Interface; + else if (typeRef->IsObject()) + elemType = BfSourceElementType_RefType; + else if (typeRef->IsGenericParam()) + elemType = BfSourceElementType_GenericParam; + else if (typeRef->IsPrimitiveType()) + elemType = BfSourceElementType_PrimitiveType; + else if (typeRef->IsStruct() || (typeRef->IsTypedPrimitive() && !typeRef->IsEnum())) + elemType = BfSourceElementType_Struct; + } + while (auto qualifiedTypeRef = BfNodeDynCast(checkTypeRef)) { - if ((mCompiler->mResolvePassData->mSourceClassifier != NULL) && (checkTypeRef == headTypeRef) && (resolvedTypeRef->IsObjectOrInterface())) - mCompiler->mResolvePassData->mSourceClassifier->SetElementType(qualifiedTypeRef->mRight, resolvedTypeRef->IsInterface() ? BfSourceElementType_Interface : BfSourceElementType_RefType); + if ((mCompiler->mResolvePassData->mSourceClassifier != NULL) && (checkTypeRef == headTypeRef) && (elemType != BfSourceElementType_Type)) + mCompiler->mResolvePassData->mSourceClassifier->SetElementType(qualifiedTypeRef->mRight, elemType); StringView leftString = qualifiedTypeRef->mLeft->ToStringView(); BfSizedAtomComposite leftComposite; @@ -8107,16 +8134,16 @@ BfType* BfModule::ResolveTypeResult(BfTypeReference* typeRef, BfType* resolvedTy auto checkNameNode = namedTypeRef->mNameNode; bool setType = false; - if ((mCompiler->mResolvePassData->mSourceClassifier != NULL) && (checkTypeRef == headTypeRef) && (resolvedTypeRef->IsObjectOrInterface())) + if ((mCompiler->mResolvePassData->mSourceClassifier != NULL) && (checkTypeRef == headTypeRef) && (elemType != BfSourceElementType_Type)) { if (auto qualifiedNameNode = BfNodeDynCast(checkNameNode)) { - mCompiler->mResolvePassData->mSourceClassifier->SetElementType(qualifiedNameNode->mRight, resolvedTypeRef->IsInterface() ? BfSourceElementType_Interface : BfSourceElementType_RefType); + mCompiler->mResolvePassData->mSourceClassifier->SetElementType(qualifiedNameNode->mRight, elemType); } else { setType = true; - mCompiler->mResolvePassData->mSourceClassifier->SetElementType(checkNameNode, resolvedTypeRef->IsInterface() ? BfSourceElementType_Interface : BfSourceElementType_RefType); + mCompiler->mResolvePassData->mSourceClassifier->SetElementType(checkNameNode, elemType); } } @@ -8921,7 +8948,7 @@ BfTypedValue BfModule::TryLookupGenericConstVaue(BfIdentifierNode* identifierNod { auto typeRefSource = identifierNode->GetSourceData(); if ((mCompiler->mResolvePassData != NULL) && (mCompiler->mResolvePassData->mSourceClassifier != NULL) && (typeRefSource != NULL) && (typeRefSource == mCompiler->mResolvePassData->mParser->mSourceData)) - mCompiler->mResolvePassData->mSourceClassifier->SetElementType(identifierNode, BfSourceElementType_Type); + mCompiler->mResolvePassData->mSourceClassifier->SetElementType(identifierNode, BfSourceElementType_GenericParam); if (genericParamResult->IsConstExprValue()) { diff --git a/IDEHelper/Compiler/BfSourceClassifier.cpp b/IDEHelper/Compiler/BfSourceClassifier.cpp index fc073b17..0a43776d 100644 --- a/IDEHelper/Compiler/BfSourceClassifier.cpp +++ b/IDEHelper/Compiler/BfSourceClassifier.cpp @@ -55,6 +55,8 @@ void BfSourceClassifier::SetElementType(BfAstNode * node, BfTypeCode typeCode) elemType = BfSourceElementType_Interface; else if (typeCode == BfTypeCode_Object) elemType = BfSourceElementType_RefType; + else if (typeCode == BfTypeCode_Struct) + elemType = BfSourceElementType_Struct; SetElementType(node, elemType); } @@ -558,7 +560,7 @@ void BfSourceClassifier::Visit(BfMethodDeclaration* methodDeclaration) for (auto& genericParam : methodDeclaration->mGenericParams->mGenericParams) { BfIdentifierNode* typeRef = genericParam; - SetElementType(typeRef, BfSourceElementType_Type); + SetElementType(typeRef, BfSourceElementType_GenericParam); } } @@ -570,7 +572,7 @@ void BfSourceClassifier::Visit(BfMethodDeclaration* methodDeclaration) { BfTypeReference* typeRef = genericConstraint->mTypeRef; if (typeRef != NULL) - SetElementType(typeRef, BfSourceElementType_Type); + SetElementType(typeRef, BfSourceElementType_GenericParam); } } } @@ -642,7 +644,7 @@ void BfSourceClassifier::Handle(BfTypeDeclaration* typeDeclaration) for (auto& genericParam : typeDeclaration->mGenericParams->mGenericParams) { BfIdentifierNode* typeRef = genericParam; - SetElementType(typeRef, BfSourceElementType_Type); + SetElementType(typeRef, BfSourceElementType_GenericParam); } } @@ -654,7 +656,7 @@ void BfSourceClassifier::Handle(BfTypeDeclaration* typeDeclaration) BfTypeReference* typeRef = genericConstraint->mTypeRef; if (typeRef != NULL) - SetElementType(typeRef, BfSourceElementType_Type); + SetElementType(typeRef, BfSourceElementType_GenericParam); } } diff --git a/IDEHelper/Compiler/BfSourceClassifier.h b/IDEHelper/Compiler/BfSourceClassifier.h index 022a54c7..ae87e2e9 100644 --- a/IDEHelper/Compiler/BfSourceClassifier.h +++ b/IDEHelper/Compiler/BfSourceClassifier.h @@ -16,6 +16,9 @@ enum BfSourceElementType BfSourceElementType_Comment, BfSourceElementType_Method, BfSourceElementType_Type, + BfSourceElementType_PrimitiveType, + BfSourceElementType_Struct, + BfSourceElementType_GenericParam, BfSourceElementType_RefType, BfSourceElementType_Interface, BfSourceElementType_Namespace