1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-10 12:32:20 +02:00

Added a RefType colorization type

This commit is contained in:
Brian Fiete 2020-08-13 06:28:31 -07:00
parent 09e6564b3e
commit 9bbcb8eb5e
9 changed files with 130 additions and 68 deletions

View file

@ -7251,7 +7251,7 @@ BfTypedValue BfExprEvaluator::MatchMethod(BfAstNode* targetSrc, BfMethodBoundExp
}
if (auto identifier = BfNodeDynCastExact<BfIdentifierNode>(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<BfExpression*, 2> argExprs;
BfSizedArray<BfExpression*> 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;
}

View file

@ -6712,11 +6712,14 @@ BfType* BfModule::ResolveTypeResult(BfTypeReference* typeRef, BfType* resolvedTy
while (auto qualifiedTypeRef = BfNodeDynCast<BfQualifiedTypeReference>(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<BfNamedTypeReference>(checkTypeRef))
{
auto checkNameNode = namedTypeRef->mNameNode;
bool setType = false;
if ((mCompiler->mResolvePassData->mSourceClassifier != NULL) && (resolvedTypeRef->IsObject()))
{
if (auto qualifiedNameNode = BfNodeDynCast<BfQualifiedNameNode>(checkNameNode))
{
mCompiler->mResolvePassData->mSourceClassifier->SetElementType(qualifiedNameNode->mRight, BfSourceElementType_RefType);
}
else
{
setType = true;
mCompiler->mResolvePassData->mSourceClassifier->SetElementType(checkNameNode, BfSourceElementType_RefType);
}
}
while (auto qualifiedNameNode = BfNodeDynCast<BfQualifiedNameNode>(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())
{

View file

@ -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<BfQualifiedNameNode>(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)

View file

@ -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);