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

Added support for attributes on enum case members

This commit is contained in:
Brian Fiete 2020-11-09 06:53:47 -08:00
parent 330eb037e8
commit 6cb13900b0
3 changed files with 56 additions and 10 deletions

View file

@ -347,19 +347,12 @@ namespace System
} }
} }
[AttributeUsage(.Field | .Method | .Property /*2*/)] [AttributeUsage(.Field | .StaticField | .Method | .Property /*2*/)]
public struct NoShowAttribute : Attribute public struct NoShowAttribute : Attribute
{ {
} }
[AttributeUsage(.Field | .Method | .Property /*2*/)]
public struct HideAttribute : Attribute
{
}
[AttributeUsage(.Parameter)] [AttributeUsage(.Parameter)]
public struct HideNameAttribute : Attribute public struct HideNameAttribute : Attribute
{ {

View file

@ -1087,8 +1087,11 @@ void BfDefBuilder::Visit(BfFieldDeclaration* fieldDeclaration)
} }
void BfDefBuilder::Visit(BfEnumCaseDeclaration* enumCaseDeclaration) void BfDefBuilder::Visit(BfEnumCaseDeclaration* enumCaseDeclaration)
{ {
if (!WantsNode(enumCaseDeclaration, enumCaseDeclaration->mCaseToken, 0)) // Using `enumCaseDeclaration->mCaseToken` breaks attribute autocompletion
//if (!WantsNode(enumCaseDeclaration, enumCaseDeclaration->mCaseToken, 0))
if (!WantsNode(enumCaseDeclaration))
{ {
return; return;
} }

View file

@ -5726,6 +5726,18 @@ BfAstNode* BfReducer::ReadTypeMember(BfTokenNode* tokenNode, int depth, BfAstNod
auto memberNode = ReadTypeMember(nextNode, 0, (deferredHeadNode != NULL) ? deferredHeadNode : attributes); auto memberNode = ReadTypeMember(nextNode, 0, (deferredHeadNode != NULL) ? deferredHeadNode : attributes);
if (memberNode == NULL) if (memberNode == NULL)
return NULL; return NULL;
if (auto enumCaseDecl = BfNodeDynCast<BfEnumCaseDeclaration>(memberNode))
{
if (!enumCaseDecl->mEntries.IsEmpty())
{
enumCaseDecl->mSrcStart = attributes->mSrcStart;
enumCaseDecl->mEntries[0]->mAttributes = attributes;
enumCaseDecl->mEntries[0]->mSrcStart = attributes->mSrcStart;
return enumCaseDecl;
}
}
auto member = BfNodeDynCast<BfMemberDeclaration>(memberNode); auto member = BfNodeDynCast<BfMemberDeclaration>(memberNode);
if (member == NULL) if (member == NULL)
{ {
@ -7855,6 +7867,7 @@ BfAstNode* BfReducer::CreateTopLevelObject(BfTokenNode* tokenNode, BfAttributeDi
bool hadIllegal = false; bool hadIllegal = false;
bool inAssignment = false; bool inAssignment = false;
int bracketDepth = 0;
int checkIdx = 0; int checkIdx = 0;
while (true) while (true)
@ -7878,6 +7891,18 @@ BfAstNode* BfReducer::CreateTopLevelObject(BfTokenNode* tokenNode, BfAttributeDi
{ {
inAssignment = true; inAssignment = true;
} }
else if (tokenNode->mToken == BfToken_LBracket)
{
bracketDepth++;
}
else if (tokenNode->mToken == BfToken_RBracket)
{
bracketDepth--;
}
else if (bracketDepth != 0)
{
// Allow
}
else if (tokenNode->mToken == BfToken_Semicolon) else if (tokenNode->mToken == BfToken_Semicolon)
{ {
hadIllegal = true; hadIllegal = true;
@ -7892,6 +7917,10 @@ BfAstNode* BfReducer::CreateTopLevelObject(BfTokenNode* tokenNode, BfAttributeDi
} }
} }
} }
else if (bracketDepth != 0)
{
// Allow
}
else else
{ {
if (!inAssignment) if (!inAssignment)
@ -8438,10 +8467,31 @@ BfAstNode* BfReducer::CreateTopLevelObject(BfTokenNode* tokenNode, BfAttributeDi
if (child == NULL) if (child == NULL)
break; break;
auto fieldDecl = mAlloc->Alloc<BfEnumEntryDeclaration>(); auto fieldDecl = mAlloc->Alloc<BfEnumEntryDeclaration>();
if (auto tokenNode = BfNodeDynCast<BfTokenNode>(child))
{
if (tokenNode->mToken == BfToken_LBracket)
{
BfAttributeDirective* attribute = CreateAttributeDirective(tokenNode);
if (attribute != NULL)
{
mVisitorPos.MoveNext();
child = mVisitorPos.GetCurrent();
fieldDecl->mAttributes = attribute;
if (child == NULL)
break;
}
}
}
mVisitorPos.MoveNext(); mVisitorPos.MoveNext();
mVisitorPos.Write(fieldDecl); mVisitorPos.Write(fieldDecl);
ReplaceNode(child, fieldDecl); ReplaceNode(child, fieldDecl);
if (fieldDecl->mAttributes != NULL)
fieldDecl->mSrcStart = fieldDecl->mAttributes->mSrcStart;
auto valueName = BfNodeDynCast<BfIdentifierNode>(child); auto valueName = BfNodeDynCast<BfIdentifierNode>(child);
if (valueName == NULL) if (valueName == NULL)
{ {