From 7f9e0c4f5be991e3b8cc97044ff38abdac66c6a0 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Sat, 19 Sep 2020 10:02:51 -0700 Subject: [PATCH] Support for 'decltype(val).MemberName' expressions --- IDEHelper/Compiler/BfReducer.cpp | 16 ++++++++++++++-- IDEHelper/Compiler/BfReducer.h | 3 ++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/IDEHelper/Compiler/BfReducer.cpp b/IDEHelper/Compiler/BfReducer.cpp index c66be498..9d3e001c 100644 --- a/IDEHelper/Compiler/BfReducer.cpp +++ b/IDEHelper/Compiler/BfReducer.cpp @@ -2182,6 +2182,14 @@ BfExpression* BfReducer::CreateExpression(BfAstNode* node, CreateExprFlags creat } } } + else if (tokenNode->GetToken() == BfToken_Decltype) + { + auto typeRef = CreateTypeRef(tokenNode, CreateTypeRefFlags_EarlyExit); + if (typeRef != NULL) + { + exprLeft = CreateMemberReferenceExpression(typeRef); + } + } if (exprLeft == NULL) { @@ -4685,6 +4693,9 @@ BfTypeReference* BfReducer::DoCreateTypeRef(BfAstNode* firstNode, CreateTypeRefF isHandled = true; firstNode = delegateTypeRef; + + if ((createTypeRefFlags & CreateTypeRefFlags_EarlyExit) != 0) + return delegateTypeRef; } else if (token == BfToken_Decltype) { @@ -4701,7 +4712,8 @@ BfTypeReference* BfReducer::DoCreateTypeRef(BfAstNode* firstNode, CreateTypeRefF isHandled = true; firstNode = declTypeRef; - //return declTypeRef; + if ((createTypeRefFlags & CreateTypeRefFlags_EarlyExit) != 0) + return declTypeRef; } else if (token == BfToken_LParen) { @@ -4770,7 +4782,7 @@ BfTypeReference* BfReducer::DoCreateTypeRef(BfAstNode* firstNode, CreateTypeRefF { Fail("Expected type", firstNode); return NULL; - } + } } } diff --git a/IDEHelper/Compiler/BfReducer.h b/IDEHelper/Compiler/BfReducer.h index 7b22d10b..cf414a89 100644 --- a/IDEHelper/Compiler/BfReducer.h +++ b/IDEHelper/Compiler/BfReducer.h @@ -46,7 +46,8 @@ public: CreateTypeRefFlags_None, CreateTypeRefFlags_NoParseArrayBrackets = 1, CreateTypeRefFlags_SafeGenericParse = 2, - CreateTypeRefFlags_AllowSingleMemberTuple = 4 + CreateTypeRefFlags_AllowSingleMemberTuple = 4, + CreateTypeRefFlags_EarlyExit = 8 }; struct BfVisitorPos