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

Allow method attributes on properties with expression bodies

This commit is contained in:
Brian Fiete 2020-08-29 11:28:11 -07:00
parent 4369e07a55
commit 535045c48a
6 changed files with 39 additions and 19 deletions

View file

@ -4149,7 +4149,10 @@ void BfCompiler::ProcessAutocompleteTempType()
{
if ((propDef->mFieldDeclaration != NULL) && (propDef->mFieldDeclaration->mAttributes != NULL))
{
auto customAttrs = module->GetCustomAttributes(propDef->mFieldDeclaration->mAttributes, BfAttributeTargets_Property);
BfAttributeTargets target = BfAttributeTargets_Property;
if (propDef->IsExpressionBodied())
target = (BfAttributeTargets)(target | BfAttributeTargets_Method);
auto customAttrs = module->GetCustomAttributes(propDef->mFieldDeclaration->mAttributes, target);
delete customAttrs;
}

View file

@ -949,7 +949,10 @@ void BfDefBuilder::Visit(BfPropertyDeclaration* propertyDeclaration)
String methodName;
if (auto propExprBody = BfNodeDynCast<BfPropertyBodyExpression>(propertyDeclaration->mDefinitionBlock))
{
methodName = "get";
ParseAttributes(propertyDeclaration->mAttributes, methodDef);
}
else if ((methodDeclaration != NULL) && (methodDeclaration->mNameNode != NULL))
methodName = methodDeclaration->mNameNode->ToString();
@ -985,7 +988,7 @@ void BfDefBuilder::Visit(BfPropertyDeclaration* propertyDeclaration)
}
else
{
// Parse had an error, leave this block as an unnamed method
// Parse had an error, leave this block as an unnamed method
}
methodDef->mBody = methodDeclaration->mBody;

View file

@ -2884,7 +2884,7 @@ BfError* BfModule::Warn(int warningNum, const StringImpl& warning, BfAstNode* re
if (parser != NULL)
{
int fileLoc = BfFixitFinder::FindLineStartBefore(refNode);
mCompiler->mResolvePassData->mAutoComplete->AddEntry(AutoCompleteEntry("fixit", StrFormat("#unwarn\tunwarn|%s|%d|#unwarn|", parser->mFileName.c_str(), fileLoc).c_str()));
mCompiler->mResolvePassData->mAutoComplete->AddEntry(AutoCompleteEntry("fixit", StrFormat("#unwarn\tunwarn|%s|%d|#unwarn|", parser->mFileName.c_str(), fileLoc).c_str()));
if (warningNum != 0)
{
@ -19512,20 +19512,27 @@ void BfModule::GetMethodCustomAttributes(BfMethodInstance* methodInstance)
SetAndRestoreValue<BfTypeInstance*> prevTypeInstance(mCurTypeInstance, typeInstance);
SetAndRestoreValue<BfMethodInstance*> prevMethodInstance(mCurMethodInstance, methodInstance);
if ((methodDeclaration != NULL) && (methodDeclaration->mAttributes != NULL))
BfAttributeTargets attrTarget = ((methodDef->mMethodType == BfMethodType_Ctor) || (methodDef->mMethodType == BfMethodType_CtorCalcAppend)) ? BfAttributeTargets_Constructor : BfAttributeTargets_Method;
BfAttributeDirective* attributeDirective = NULL;
if (methodDeclaration != NULL)
attributeDirective = methodDeclaration->mAttributes;
else if (propertyMethodDeclaration != NULL)
{
attributeDirective = propertyMethodDeclaration->mAttributes;
if (auto exprBody = BfNodeDynCast<BfPropertyBodyExpression>(propertyMethodDeclaration->mPropertyDeclaration->mDefinitionBlock))
{
attributeDirective = propertyMethodDeclaration->mPropertyDeclaration->mAttributes;
attrTarget = (BfAttributeTargets)(BfAttributeTargets_Property | BfAttributeTargets_Method);
}
}
if (attributeDirective != NULL)
{
if (methodInstance->GetMethodInfoEx()->mMethodCustomAttributes == NULL)
methodInstance->mMethodInfoEx->mMethodCustomAttributes = new BfMethodCustomAttributes();
methodInstance->mMethodInfoEx->mMethodCustomAttributes->mCustomAttributes = GetCustomAttributes(methodDeclaration->mAttributes,
((methodDef->mMethodType == BfMethodType_Ctor) || (methodDef->mMethodType == BfMethodType_CtorCalcAppend)) ? BfAttributeTargets_Constructor : BfAttributeTargets_Method);
methodInstance->mMethodInfoEx->mMethodCustomAttributes->mCustomAttributes = GetCustomAttributes(attributeDirective, attrTarget);
}
else if ((propertyMethodDeclaration != NULL) && (propertyMethodDeclaration->mAttributes != NULL))
{
if (methodInstance->GetMethodInfoEx()->mMethodCustomAttributes == NULL)
methodInstance->mMethodInfoEx->mMethodCustomAttributes = new BfMethodCustomAttributes();
methodInstance->mMethodInfoEx->mMethodCustomAttributes->mCustomAttributes = GetCustomAttributes(propertyMethodDeclaration->mAttributes, BfAttributeTargets_Method);
}
customAttributes = methodInstance->GetCustomAttributes();
if (customAttributes == NULL)
{

View file

@ -2887,15 +2887,13 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy
typeState.mTypeInstance = typeInstance;
SetAndRestoreValue<BfTypeState*> prevTypeState(mContext->mCurTypeState, &typeState);
if (propDef->mFieldDeclaration->mAttributes != NULL)
{
auto customAttrs = GetCustomAttributes(propDef->mFieldDeclaration->mAttributes, BfAttributeTargets_Property);
delete customAttrs;
}
BfAttributeTargets target = BfAttributeTargets_Property;
if (propDef->IsExpressionBodied())
target = (BfAttributeTargets)(target | BfAttributeTargets_Method);
if (propDef->mFieldDeclaration->mAttributes != NULL)
{
auto customAttrs = GetCustomAttributes(propDef->mFieldDeclaration->mAttributes, BfAttributeTargets_Property);
auto customAttrs = GetCustomAttributes(propDef->mFieldDeclaration->mAttributes, target);
delete customAttrs;
}

View file

@ -398,6 +398,14 @@ bool BfPropertyDef::HasExplicitInterface()
return false;
}
bool BfPropertyDef::IsExpressionBodied()
{
auto propertyDeclaration = (BfPropertyDeclaration*)mFieldDeclaration;
if (auto expr = BfNodeDynCast<BfPropertyBodyExpression>(propertyDeclaration->mDefinitionBlock))
return true;
return false;
}
BfAstNode * BfPropertyDef::GetRefNode()
{
BfPropertyDeclaration* propDecl = (BfPropertyDeclaration*)mFieldDeclaration;

View file

@ -580,6 +580,7 @@ public:
bool IsVirtual();
bool HasExplicitInterface();
bool IsExpressionBodied();
BfAstNode* GetRefNode();
};