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:
parent
c2461c8554
commit
bf5c19269b
4 changed files with 45 additions and 21 deletions
|
@ -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))
|
||||
|
|
|
@ -2506,6 +2506,7 @@ void BfPrinter::QueueMethodDeclaration(BfMethodDeclaration* methodDeclaration)
|
|||
QueueVisitChild(operatorDecl->mExplicitToken);
|
||||
ExpectSpace();
|
||||
QueueVisitChild(operatorDecl->mOperatorToken);
|
||||
ExpectSpace();
|
||||
QueueVisitChild(operatorDecl->mOpTypeToken);
|
||||
ExpectSpace();
|
||||
QueueVisitChild(methodDeclaration->mReturnType);
|
||||
|
|
|
@ -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))
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue