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

Allow generic conversion operators

This commit is contained in:
Brian Fiete 2022-01-17 17:10:37 -05:00
parent c2461c8554
commit bf5c19269b
4 changed files with 45 additions and 21 deletions

View file

@ -12609,8 +12609,7 @@ BfIRValue BfModule::CastToValue(BfAstNode* srcNode, BfTypedValue typedVal, BfTyp
{
if (operatorDef->mOperatorDeclaration->mIsConvOperator)
{
if ((!explicitCast) && (operatorDef->mOperatorDeclaration->mExplicitToken != NULL) &&
(operatorDef->mOperatorDeclaration->mExplicitToken->GetToken() == BfToken_Explicit))
if ((!explicitCast) && (operatorDef->IsExplicit()))
continue;
if (!methodMatcher.IsMemberAccessible(checkType, operatorDef->mDeclaringType))

View file

@ -2506,6 +2506,7 @@ void BfPrinter::QueueMethodDeclaration(BfMethodDeclaration* methodDeclaration)
QueueVisitChild(operatorDecl->mExplicitToken);
ExpectSpace();
QueueVisitChild(operatorDecl->mOperatorToken);
ExpectSpace();
QueueVisitChild(operatorDecl->mOpTypeToken);
ExpectSpace();
QueueVisitChild(methodDeclaration->mReturnType);

View file

@ -5169,6 +5169,12 @@ BfTypeReference* BfReducer::DoCreateTypeRef(BfAstNode* firstNode, CreateTypeRefF
}
else if (token == BfToken_LChevron)
{
if (auto elementGeneric = BfNodeDynCastExact<BfGenericInstanceTypeRef>(typeRef))
{
// Already a generic
return typeRef;
}
auto genericInstance = mAlloc->Alloc<BfGenericInstanceTypeRef>();
BfDeferredSizedArray<BfTypeReference*> genericArguments(genericInstance->mGenericArguments, mAlloc);
BfDeferredAstSizedArray<BfAstNode*> commas(genericInstance->mCommas, mAlloc);
@ -6845,6 +6851,14 @@ BfAstNode* BfReducer::ReadTypeMember(BfAstNode* node, bool declStarted, int dept
bool hadFailedOperator = false;
auto nextNode = mVisitorPos.GetNext();
if (auto nextToken = BfNodeDynCast<BfTokenNode>(nextNode))
{
if ((nextToken->mToken == BfToken_Implicit) || (nextToken->mToken == BfToken_Explicit))
{
operatorDecl->mIsConvOperator = true;
MEMBER_SET(operatorDecl, mOpTypeToken, nextToken);
mVisitorPos.MoveNext();
}
else
{
operatorDecl->mBinOp = BfTokenToBinaryOp(nextToken->GetToken());
if (operatorDecl->mBinOp != BfBinaryOp_None)
@ -6882,6 +6896,7 @@ BfAstNode* BfReducer::ReadTypeMember(BfAstNode* node, bool declStarted, int dept
}
}
}
}
if ((operatorDecl->mOpTypeToken == NULL) && (operatorDecl->mReturnType == NULL) && (!hadFailedOperator))
{

View file

@ -895,6 +895,15 @@ public:
{
mOperatorDeclaration = NULL;
}
bool IsExplicit()
{
if (mOperatorDeclaration->mExplicitToken != NULL)
return mOperatorDeclaration->mExplicitToken->mToken == BfToken_Explicit;
if (mOperatorDeclaration->mOperatorToken != NULL)
return mOperatorDeclaration->mOperatorToken->mToken == BfToken_Explicit;
return false;
}
};
struct BfTypeDefLookupContext