diff --git a/BeefySysLib/Common.h b/BeefySysLib/Common.h index 9911c067..fa309baa 100644 --- a/BeefySysLib/Common.h +++ b/BeefySysLib/Common.h @@ -77,7 +77,7 @@ struct int128 }; #define BF_MIN(x, y) (((x) < (y)) ? (x) : (y)) -#define BF_MAX(x, y) (((x) > (y)) ? (x ): (y)) +#define BF_MAX(x, y) (((x) > (y)) ? (x) : (y)) #define BF_CLAMP(val, minVal, maxVal) (((val) < (minVal)) ? (minVal) : ((val) > (maxVal)) ? (maxVal) : (val)) #define BF_SWAP(a, b) { auto _a = (a); (a) = (b); (b) = (_a); } diff --git a/IDE/src/IDEUtils.bf b/IDE/src/IDEUtils.bf index 3aef16e8..f0b98928 100644 --- a/IDE/src/IDEUtils.bf +++ b/IDE/src/IDEUtils.bf @@ -432,7 +432,7 @@ namespace IDE inSubtype ? (int32)SourceElementType.TypeRef : (int32)SourceElementType.Namespace ];*/ - uint32 color = SourceEditWidgetContent.sTextColors[(int32)SourceElementType.TypeRef]; + uint32 color = SourceEditWidgetContent.sTextColors[(int32)SourceElementType.Type]; /*if ((c == '+') || (c == '(')) { diff --git a/IDE/src/Settings.bf b/IDE/src/Settings.bf index 72efd065..44de8b9f 100644 --- a/IDE/src/Settings.bf +++ b/IDE/src/Settings.bf @@ -276,10 +276,10 @@ namespace IDE public Color mKeyword = 0xFFE1AE9A; public Color mLiteral = 0XFFC8A0FF; public Color mIdentifier = 0xFFFFFFFF; - public Color mType = 0XFF66D9EF; public Color mComment = 0XFF75715E; public Color mMethod = 0XFFA6E22A; - public Color mTypeRef = 0XFF66D9EF; + public Color mType = 0XFF66D9EF; + public Color mRefType = 0XFF66D9EF; public Color mNamespace = 0xFF7BEEB7; public Color mDisassemblyText = 0xFFB0B0B0; public Color mDisassemblyFileName = 0XFFFF0000; @@ -309,10 +309,15 @@ namespace IDE GetColor("Keyword", ref mKeyword); GetColor("Literal", ref mLiteral); GetColor("Identifier", ref mIdentifier); - GetColor("Type", ref mType); GetColor("Comment", ref mComment); GetColor("Method", ref mMethod); - GetColor("TypeRef", ref mTypeRef); + if (sd.Contains("Type")) + { + GetColor("Type", ref mType); + if (!sd.Contains("RefType")) + mRefType = mType; + } + GetColor("RefType", ref mRefType); GetColor("Namespace", ref mNamespace); GetColor("DisassemblyText", ref mDisassemblyText); GetColor("DisassemblyFileName", ref mDisassemblyFileName); @@ -324,21 +329,21 @@ namespace IDE public void Apply() { - SourceEditWidgetContent.sTextColors[0] = mCode; - SourceEditWidgetContent.sTextColors[1] = mKeyword; - SourceEditWidgetContent.sTextColors[2] = mLiteral; - SourceEditWidgetContent.sTextColors[3] = mIdentifier; - SourceEditWidgetContent.sTextColors[4] = mType; - SourceEditWidgetContent.sTextColors[5] = mComment; - SourceEditWidgetContent.sTextColors[6] = mMethod; - SourceEditWidgetContent.sTextColors[7] = mTypeRef; - SourceEditWidgetContent.sTextColors[8] = mNamespace; - SourceEditWidgetContent.sTextColors[9] = mDisassemblyText; - SourceEditWidgetContent.sTextColors[10] = mDisassemblyFileName; - SourceEditWidgetContent.sTextColors[11] = mError; - SourceEditWidgetContent.sTextColors[12] = mBuildError; - SourceEditWidgetContent.sTextColors[13] = mBuildWarning; - SourceEditWidgetContent.sTextColors[14] = mVisibleWhiteSpace; + SourceEditWidgetContent.sTextColors[(.)SourceElementType.Normal] = mCode; + SourceEditWidgetContent.sTextColors[(.)SourceElementType.Keyword] = mKeyword; + SourceEditWidgetContent.sTextColors[(.)SourceElementType.Literal] = mLiteral; + SourceEditWidgetContent.sTextColors[(.)SourceElementType.Identifier] = mIdentifier; + SourceEditWidgetContent.sTextColors[(.)SourceElementType.Comment] = mComment; + SourceEditWidgetContent.sTextColors[(.)SourceElementType.Method] = mMethod; + SourceEditWidgetContent.sTextColors[(.)SourceElementType.Type] = mType; + SourceEditWidgetContent.sTextColors[(.)SourceElementType.RefType] = mRefType; + SourceEditWidgetContent.sTextColors[(.)SourceElementType.Namespace] = mNamespace; + SourceEditWidgetContent.sTextColors[(.)SourceElementType.Disassembly_Text] = mDisassemblyText; + SourceEditWidgetContent.sTextColors[(.)SourceElementType.Disassembly_FileName] = mDisassemblyFileName; + SourceEditWidgetContent.sTextColors[(.)SourceElementType.Error] = mError; + SourceEditWidgetContent.sTextColors[(.)SourceElementType.BuildError] = mBuildError; + SourceEditWidgetContent.sTextColors[(.)SourceElementType.BuildWarning] = mBuildWarning; + SourceEditWidgetContent.sTextColors[(.)SourceElementType.VisibleWhiteSpace] = mVisibleWhiteSpace; DarkTheme.COLOR_TEXT = mText; DarkTheme.COLOR_WINDOW = mWindow; diff --git a/IDE/src/ui/SourceEditWidgetContent.bf b/IDE/src/ui/SourceEditWidgetContent.bf index 7c6690fe..7a47efec 100644 --- a/IDE/src/ui/SourceEditWidgetContent.bf +++ b/IDE/src/ui/SourceEditWidgetContent.bf @@ -199,10 +199,10 @@ namespace IDE.ui 0xFFE1AE9A, // Keyword 0XFFC8A0FF, // Literal 0xFFFFFFFF, // Identifier - 0XFF66D9EF, // Type - 0XFF75715E, // Comment - 0XFFA6E22A, // Method - 0XFF66D9EF, // TypeRef + 0xFF75715E, // Comment + 0xFFA6E22A, // Method + 0xFF66D9EF, // Type + 0xFF66D9EF, // RefType 0xFF7BEEB7, // Namespace 0xFFB0B0B0, // Disassembly_Text @@ -966,7 +966,7 @@ namespace IDE.ui if (!prevC.IsWhiteSpace) { var prevElementType = (SourceElementType)mData.mText[checkIdx - 1].mDisplayTypeId; - startedWithType = prevElementType == SourceElementType.TypeRef; + startedWithType = (prevElementType == SourceElementType.Type) || (prevElementType == SourceElementType.RefType); checkedStartedWithType = true; } } @@ -974,7 +974,7 @@ namespace IDE.ui if ((elementType == SourceElementType.Comment) || (isWhitespace)) continue; - if ((!checkedStartedWithType) && (elementType != SourceElementType.Namespace) && (elementType != SourceElementType.TypeRef)) + if ((!checkedStartedWithType) && (elementType != SourceElementType.Namespace) && (elementType != SourceElementType.Type) && (elementType != SourceElementType.RefType)) { checkedStartedWithType = true; } diff --git a/IDE/src/ui/SourceViewPanel.bf b/IDE/src/ui/SourceViewPanel.bf index b72bb7d3..8a4276a4 100644 --- a/IDE/src/ui/SourceViewPanel.bf +++ b/IDE/src/ui/SourceViewPanel.bf @@ -27,10 +27,10 @@ namespace IDE.ui Keyword, Literal, Identifier, - Type, Comment, Method, - TypeRef, + Type, + RefType, Namespace, Disassembly_Text, @@ -4273,7 +4273,7 @@ namespace IDE.ui // Autocomplete beat us to it destText[destIdx].mDisplayPassId = (uint8)SourceDisplayId.Cleared; } - else if (charData[srcIdx].mDisplayTypeId == (uint8)SourceDisplayId.SkipResult) + else if (charData[srcIdx].mDisplayPassId == (uint8)SourceDisplayId.SkipResult) { // } diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index d731402b..5e7fbd3d 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -7251,7 +7251,7 @@ BfTypedValue BfExprEvaluator::MatchMethod(BfAstNode* targetSrc, BfMethodBoundExp } if (auto identifier = BfNodeDynCastExact(targetSrc)) - mModule->SetElementType(identifier, BfSourceElementType_TypeRef); + mModule->SetElementType(identifier, BfSourceElementType_Type); if (mModule->mCompiler->mResolvePassData != NULL) mModule->mCompiler->mResolvePassData->HandleTypeReference(targetSrc, resolvedTypeInstance->mTypeDef); @@ -15051,9 +15051,11 @@ BfTypedValue BfExprEvaluator::GetResult(bool clearResult, bool resolveGenericTyp for (int paramIdx = 0; paramIdx < (int)mIndexerValues.size(); paramIdx++) { auto refNode = mIndexerValues[paramIdx].mExpression; + auto wantType = methodInstance.mMethodInstance->GetParamType(paramIdx); + auto argValue = ResolveArgValue(mIndexerValues[paramIdx], wantType); if (refNode == NULL) refNode = mPropSrc; - auto val = mModule->Cast(refNode, mIndexerValues[paramIdx].mTypedValue, methodInstance.mMethodInstance->GetParamType(paramIdx)); + auto val = mModule->Cast(refNode, argValue, wantType); if (!val) failed = true; else @@ -15947,9 +15949,11 @@ void BfExprEvaluator::PerformAssignment(BfAssignmentExpression* assignExpr, bool for (int paramIdx = 0; paramIdx < (int)mIndexerValues.size(); paramIdx++) { auto refNode = mIndexerValues[paramIdx].mExpression; + auto wantType = methodInstance.mMethodInstance->GetParamType(paramIdx); + auto argValue = ResolveArgValue(mIndexerValues[paramIdx], wantType); if (refNode == NULL) refNode = mPropSrc; - auto val = mModule->Cast(refNode, mIndexerValues[paramIdx].mTypedValue, methodInstance.mMethodInstance->GetParamType(paramIdx)); + auto val = mModule->Cast(refNode, argValue, wantType); if (!val) { mPropDef = NULL; @@ -17120,21 +17124,32 @@ void BfExprEvaluator::Visit(BfIndexerExpression* indexerExpr) if (target.mType->IsTypeInstance()) { mIndexerValues.clear(); - for (BfExpression* expr : indexerExpr->mArguments) - { - if (expr == NULL) - return; - auto argVal = mModule->CreateValueFromExpression(expr); - if (!argVal) - { - mModule->AssertErrorState(); - argVal = mModule->GetDefaultTypedValue(mModule->mContext->mBfObjectType); - } - BfResolvedArg resolvedArg; - resolvedArg.mExpression = expr; - resolvedArg.mTypedValue = argVal; - mIndexerValues.push_back(resolvedArg); - } +// for (BfExpression* expr : indexerExpr->mArguments) +// { +// if (expr == NULL) +// return; +// auto argVal = mModule->CreateValueFromExpression(expr); +// if (!argVal) +// { +// mModule->AssertErrorState(); +// argVal = mModule->GetDefaultTypedValue(mModule->mContext->mBfObjectType); +// } +// BfResolvedArg resolvedArg; +// resolvedArg.mExpression = expr; +// resolvedArg.mTypedValue = argVal; +// mIndexerValues.push_back(resolvedArg); +// } + + SizedArray argExprs; + BfSizedArray sizedArgExprs(indexerExpr->mArguments); + BfResolvedArgs argValues(&sizedArgExprs); + ResolveArgValues(argValues, BfResolveArgFlag_DeferParamEval); + //exprEvaluator.MatchMethod(elementExpr, NULL, initValue, false, false, "Add", argValues, NULL); + + mIndexerValues = argValues.mResolvedArgs; + for (auto& val : mIndexerValues) + if (!val.mTypedValue) + val.mTypedValue = mModule->GetDefaultTypedValue(mModule->mContext->mBfObjectType); BfMethodMatcher methodMatcher(indexerExpr->mTarget, mModule, "[]", mIndexerValues, NULL); methodMatcher.mCheckedKind = checkedKind; @@ -17247,7 +17262,7 @@ void BfExprEvaluator::Visit(BfIndexerExpression* indexerExpr) mOrigPropTarget = mPropTarget; if (isInlined) mPropGetMethodFlags = (BfGetMethodInstanceFlags)(mPropGetMethodFlags | BfGetMethodInstanceFlag_ForceInline); - mPropCheckedKind = checkedKind; + mPropCheckedKind = checkedKind; } return; } diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 0fbe09a6..1174e6b0 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -6712,11 +6712,14 @@ BfType* BfModule::ResolveTypeResult(BfTypeReference* typeRef, BfType* resolvedTy while (auto qualifiedTypeRef = BfNodeDynCast(checkTypeRef)) { + if ((mCompiler->mResolvePassData->mSourceClassifier != NULL) && (resolvedTypeRef->IsObject())) + mCompiler->mResolvePassData->mSourceClassifier->SetElementType(qualifiedTypeRef->mRight, BfSourceElementType_RefType); + StringView leftString = qualifiedTypeRef->mLeft->ToStringView(); BfSizedAtomComposite leftComposite; bool isValid = mSystem->ParseAtomComposite(leftString, leftComposite); if (mCompiler->mResolvePassData->mSourceClassifier != NULL) - mCompiler->mResolvePassData->mSourceClassifier->SetElementType(qualifiedTypeRef->mRight, isNamespace ? BfSourceElementType_Namespace : BfSourceElementType_TypeRef); + mCompiler->mResolvePassData->mSourceClassifier->SetHighestElementType(qualifiedTypeRef->mRight, isNamespace ? BfSourceElementType_Namespace : BfSourceElementType_Type); if (resolvedTypeInstance == NULL) { if ((isValid) && (mCompiler->mSystem->ContainsNamespace(leftComposite, mCurTypeInstance->mTypeDef->mProject))) @@ -6740,6 +6743,20 @@ BfType* BfModule::ResolveTypeResult(BfTypeReference* typeRef, BfType* resolvedTy if (auto namedTypeRef = BfNodeDynCast(checkTypeRef)) { auto checkNameNode = namedTypeRef->mNameNode; + bool setType = false; + + if ((mCompiler->mResolvePassData->mSourceClassifier != NULL) && (resolvedTypeRef->IsObject())) + { + if (auto qualifiedNameNode = BfNodeDynCast(checkNameNode)) + { + mCompiler->mResolvePassData->mSourceClassifier->SetElementType(qualifiedNameNode->mRight, BfSourceElementType_RefType); + } + else + { + setType = true; + mCompiler->mResolvePassData->mSourceClassifier->SetElementType(checkNameNode, BfSourceElementType_RefType); + } + } while (auto qualifiedNameNode = BfNodeDynCast(checkNameNode)) { @@ -6747,7 +6764,7 @@ BfType* BfModule::ResolveTypeResult(BfTypeReference* typeRef, BfType* resolvedTy BfSizedAtomComposite leftComposite; bool isValid = mSystem->ParseAtomComposite(leftString, leftComposite); if (mCompiler->mResolvePassData->mSourceClassifier != NULL) - mCompiler->mResolvePassData->mSourceClassifier->SetElementType(qualifiedNameNode->mRight, isNamespace ? BfSourceElementType_Namespace : BfSourceElementType_TypeRef); + mCompiler->mResolvePassData->mSourceClassifier->SetHighestElementType(qualifiedNameNode->mRight, isNamespace ? BfSourceElementType_Namespace : BfSourceElementType_Type); if (resolvedTypeInstance == NULL) { if ((isValid) && (mCompiler->mSystem->ContainsNamespace(leftComposite, mCurTypeInstance->mTypeDef->mProject))) @@ -6757,8 +6774,9 @@ BfType* BfModule::ResolveTypeResult(BfTypeReference* typeRef, BfType* resolvedTy isNamespace = true; checkNameNode = qualifiedNameNode->mLeft; } - if (mCompiler->mResolvePassData->mSourceClassifier != NULL) - mCompiler->mResolvePassData->mSourceClassifier->SetElementType(checkNameNode, isNamespace ? BfSourceElementType_Namespace : BfSourceElementType_TypeRef); + if ((mCompiler->mResolvePassData->mSourceClassifier != NULL) && + ((!setType) || (checkNameNode != namedTypeRef->mNameNode))) + mCompiler->mResolvePassData->mSourceClassifier->SetHighestElementType(checkNameNode, isNamespace ? BfSourceElementType_Namespace : BfSourceElementType_Type); } } @@ -7505,7 +7523,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_TypeRef); + mCompiler->mResolvePassData->mSourceClassifier->SetElementType(identifierNode, BfSourceElementType_Type); if (genericParamResult->IsConstExprValue()) { diff --git a/IDEHelper/Compiler/BfSourceClassifier.cpp b/IDEHelper/Compiler/BfSourceClassifier.cpp index 3da07438..8af1eded 100644 --- a/IDEHelper/Compiler/BfSourceClassifier.cpp +++ b/IDEHelper/Compiler/BfSourceClassifier.cpp @@ -47,16 +47,38 @@ void BfSourceClassifier::SetElementType(BfAstNode* node, BfSourceElementType ele } } -void BfSourceClassifier::SetElementType(int startPos, int endPos, BfSourceElementType elementType) +void BfSourceClassifier::SetHighestElementType(int startPos, int endPos, BfSourceElementType elementType) { if (!mEnabled) return; endPos = BF_MIN(endPos, mParser->mOrigSrcLength); for (int i = startPos; i < endPos; i++) - { + { + auto& charData = mCharData[i]; + charData.mDisplayPassId = mClassifierPassId; + charData.mDisplayTypeId = BF_MAX(charData.mDisplayTypeId, (uint8)elementType); + } +} + +void BfSourceClassifier::SetHighestElementType(BfAstNode* node, BfSourceElementType elementType) +{ + if (node != NULL) + { + SetHighestElementType(node->GetSrcStart(), node->GetSrcEnd(), elementType); + } +} + +void BfSourceClassifier::SetElementType(int startPos, int endPos, BfSourceElementType elementType) +{ + if (!mEnabled) + return; + + endPos = BF_MIN(endPos, mParser->mOrigSrcLength); + for (int i = startPos; i < endPos; i++) + { mCharData[i].mDisplayPassId = mClassifierPassId; - mCharData[i].mDisplayTypeId = (uint8)elementType; + mCharData[i].mDisplayTypeId = (uint8)elementType; } } @@ -283,11 +305,11 @@ void BfSourceClassifier::Visit(BfNamedTypeReference* typeRef) BfIdentifierNode* checkName = typeRef->mNameNode; while (auto qualifiedNameNode = BfNodeDynCast(checkName)) { - SetElementType(qualifiedNameNode->mRight, BfSourceElementType_TypeRef); + SetElementType(qualifiedNameNode->mRight, BfSourceElementType_Type); checkName = qualifiedNameNode->mLeft; } if (checkName != NULL) - SetElementType(checkName, BfSourceElementType_TypeRef); + SetElementType(checkName, BfSourceElementType_Type); } } @@ -305,7 +327,7 @@ void BfSourceClassifier::Visit(BfRefTypeRef* typeRef) Visit((BfAstNode*)typeRef); VisitChild(typeRef->mRefToken); - SetElementType(typeRef->mRefToken, BfSourceElementType_TypeRef); + SetElementType(typeRef->mRefToken, BfSourceElementType_Type); VisitChild(typeRef->mElementType); } @@ -488,7 +510,7 @@ void BfSourceClassifier::Visit(BfMethodDeclaration* methodDeclaration) for (auto& genericParam : methodDeclaration->mGenericParams->mGenericParams) { BfIdentifierNode* typeRef = genericParam; - SetElementType(typeRef, BfSourceElementType_TypeRef); + SetElementType(typeRef, BfSourceElementType_Type); } } @@ -500,7 +522,7 @@ void BfSourceClassifier::Visit(BfMethodDeclaration* methodDeclaration) { BfTypeReference* typeRef = genericConstraint->mTypeRef; if (typeRef != NULL) - SetElementType(typeRef, BfSourceElementType_TypeRef); + SetElementType(typeRef, BfSourceElementType_Type); } } } @@ -569,7 +591,7 @@ void BfSourceClassifier::Handle(BfTypeDeclaration* typeDeclaration) for (auto& genericParam : typeDeclaration->mGenericParams->mGenericParams) { BfIdentifierNode* typeRef = genericParam; - SetElementType(typeRef, BfSourceElementType_TypeRef); + SetElementType(typeRef, BfSourceElementType_Type); } } @@ -581,13 +603,13 @@ void BfSourceClassifier::Handle(BfTypeDeclaration* typeDeclaration) BfTypeReference* typeRef = genericConstraint->mTypeRef; if (typeRef != NULL) - SetElementType(typeRef, BfSourceElementType_TypeRef); + SetElementType(typeRef, BfSourceElementType_Type); } } auto typeRef = typeDeclaration->mNameNode; if (typeRef != NULL) - SetElementType(typeRef, BfSourceElementType_TypeRef); + SetElementType(typeRef, BfSourceElementType_Type); } void BfSourceClassifier::MarkSkipped(int startPos, int endPos) diff --git a/IDEHelper/Compiler/BfSourceClassifier.h b/IDEHelper/Compiler/BfSourceClassifier.h index cdbd7845..56bd77ce 100644 --- a/IDEHelper/Compiler/BfSourceClassifier.h +++ b/IDEHelper/Compiler/BfSourceClassifier.h @@ -12,11 +12,11 @@ enum BfSourceElementType BfSourceElementType_Normal, BfSourceElementType_Keyword, BfSourceElementType_Literal, - BfSourceElementType_Identifier, - BfSourceElementType_Type, + BfSourceElementType_Identifier, BfSourceElementType_Comment, BfSourceElementType_Method, - BfSourceElementType_TypeRef, + BfSourceElementType_Type, + BfSourceElementType_RefType, BfSourceElementType_Namespace }; @@ -73,6 +73,8 @@ public: void ModifyFlags(int startPos, int endPos, uint8 andFlags, uint8 orFlags); void SetElementType(BfAstNode* node, BfSourceElementType elementType); void SetElementType(int startPos, int endPos, BfSourceElementType elementType); + void SetHighestElementType(BfAstNode* node, BfSourceElementType elementType); + void SetHighestElementType(int startPos, int endPos, BfSourceElementType elementType); bool IsInterestedInMember(BfAstNode* node, bool forceSkip = false); bool WantsSkipParentMethod(BfAstNode* node); void Handle(BfTypeDeclaration* typeDeclaration);