diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 3c5a1de8..52a88dbf 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -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)) diff --git a/IDEHelper/Compiler/BfPrinter.cpp b/IDEHelper/Compiler/BfPrinter.cpp index 85a1b68e..90023704 100644 --- a/IDEHelper/Compiler/BfPrinter.cpp +++ b/IDEHelper/Compiler/BfPrinter.cpp @@ -2505,7 +2505,8 @@ void BfPrinter::QueueMethodDeclaration(BfMethodDeclaration* methodDeclaration) ExpectSpace(); QueueVisitChild(operatorDecl->mExplicitToken); ExpectSpace(); - QueueVisitChild(operatorDecl->mOperatorToken); + QueueVisitChild(operatorDecl->mOperatorToken); + ExpectSpace(); QueueVisitChild(operatorDecl->mOpTypeToken); ExpectSpace(); QueueVisitChild(methodDeclaration->mReturnType); diff --git a/IDEHelper/Compiler/BfReducer.cpp b/IDEHelper/Compiler/BfReducer.cpp index d282aa69..7d32654b 100644 --- a/IDEHelper/Compiler/BfReducer.cpp +++ b/IDEHelper/Compiler/BfReducer.cpp @@ -5169,6 +5169,12 @@ BfTypeReference* BfReducer::DoCreateTypeRef(BfAstNode* firstNode, CreateTypeRefF } else if (token == BfToken_LChevron) { + if (auto elementGeneric = BfNodeDynCastExact(typeRef)) + { + // Already a generic + return typeRef; + } + auto genericInstance = mAlloc->Alloc(); BfDeferredSizedArray genericArguments(genericInstance->mGenericArguments, mAlloc); BfDeferredAstSizedArray commas(genericInstance->mCommas, mAlloc); @@ -6846,38 +6852,47 @@ BfAstNode* BfReducer::ReadTypeMember(BfAstNode* node, bool declStarted, int dept auto nextNode = mVisitorPos.GetNext(); if (auto nextToken = BfNodeDynCast(nextNode)) { - operatorDecl->mBinOp = BfTokenToBinaryOp(nextToken->GetToken()); - if (operatorDecl->mBinOp != BfBinaryOp_None) + if ((nextToken->mToken == BfToken_Implicit) || (nextToken->mToken == BfToken_Explicit)) { + operatorDecl->mIsConvOperator = true; MEMBER_SET(operatorDecl, mOpTypeToken, nextToken); mVisitorPos.MoveNext(); } else { - operatorDecl->mUnaryOp = BfTokenToUnaryOp(nextToken->GetToken()); - if (operatorDecl->mUnaryOp != BfUnaryOp_None) + operatorDecl->mBinOp = BfTokenToBinaryOp(nextToken->GetToken()); + if (operatorDecl->mBinOp != BfBinaryOp_None) { MEMBER_SET(operatorDecl, mOpTypeToken, nextToken); mVisitorPos.MoveNext(); } else { - operatorDecl->mAssignOp = BfTokenToAssignmentOp(nextToken->GetToken()); - if (operatorDecl->mAssignOp == BfAssignmentOp_Assign) + operatorDecl->mUnaryOp = BfTokenToUnaryOp(nextToken->GetToken()); + if (operatorDecl->mUnaryOp != BfUnaryOp_None) { - Fail("The assignment operator '=' cannot be overridden", nextToken); + MEMBER_SET(operatorDecl, mOpTypeToken, nextToken); + mVisitorPos.MoveNext(); } + else + { + operatorDecl->mAssignOp = BfTokenToAssignmentOp(nextToken->GetToken()); + if (operatorDecl->mAssignOp == BfAssignmentOp_Assign) + { + Fail("The assignment operator '=' cannot be overridden", nextToken); + } - if (operatorDecl->mAssignOp != BfAssignmentOp_None) - { - MEMBER_SET(operatorDecl, mOpTypeToken, nextToken); - mVisitorPos.MoveNext(); - } - else if (nextToken->GetToken() != BfToken_LParen) - { - Fail("Invalid operator type", nextToken); - MEMBER_SET(operatorDecl, mOpTypeToken, nextToken); - mVisitorPos.MoveNext(); + if (operatorDecl->mAssignOp != BfAssignmentOp_None) + { + MEMBER_SET(operatorDecl, mOpTypeToken, nextToken); + mVisitorPos.MoveNext(); + } + else if (nextToken->GetToken() != BfToken_LParen) + { + Fail("Invalid operator type", nextToken); + MEMBER_SET(operatorDecl, mOpTypeToken, nextToken); + mVisitorPos.MoveNext(); + } } } } diff --git a/IDEHelper/Compiler/BfSystem.h b/IDEHelper/Compiler/BfSystem.h index 27a8db99..2d358ddd 100644 --- a/IDEHelper/Compiler/BfSystem.h +++ b/IDEHelper/Compiler/BfSystem.h @@ -888,13 +888,22 @@ public: class BfOperatorDef : public BfMethodDef { public: - BfOperatorDeclaration* mOperatorDeclaration; + BfOperatorDeclaration* mOperatorDeclaration; public: BfOperatorDef() { 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