Changes to User-Defined Attributes syntax
Andrey Zherikov
andrey.zherikov at gmail.com
Tue Nov 19 04:26:17 UTC 2024
## Recap
Current syntax (from [lang
ref](https://dlang.org/spec/attribute.html#uda)):
```
UserDefinedAttribute:
@ ( TemplateArgumentList )
@ TemplateSingleArgument
@ Identifier ( NamedArgumentList[opt] )
@ TemplateInstance
@ TemplateInstance ( NamedArgumentList[opt] )
TemplateSingleArgument:
Identifier
FundamentalType
CharacterLiteral
StringLiteral
InterpolationExpressionSequence
IntegerLiteral
FloatLiteral
true
false
null
this
SpecialKeyword
```
After expanding `TemplateSingleArgument`, we have this:
```
UserDefinedAttribute:
@ ( TemplateArgumentList )
@ CharacterLiteral
@ StringLiteral
@ InterpolationExpressionSequence
@ IntegerLiteral
@ FloatLiteral
@ true
@ false
@ null
@ this
@ SpecialKeyword
@ FundamentalType
@ Identifier
@ Identifier ( NamedArgumentList[opt] )
@ TemplateInstance
@ TemplateInstance ( NamedArgumentList[opt] )
```
## Proposal #1
Replace comma-separated list of expressions
```
@ ( TemplateArgumentList )
```
with single expression
```
@ ( TemplateArgument )
```
Example: instead of `@(A,B,C)`, one should write `@(A) @(B) @(C)`.
I believe this is much clearer because it forces single attribute
per single `@`-expression. This will also reduce cognitive load
on weird things like `@(_=>(2,4),2,4,_=>2,4)`.
## Proposal #2
Replace
```
@ FundamentalType
@ Identifier
@ Identifier ( NamedArgumentList[opt] )
@ TemplateInstance
@ TemplateInstance ( NamedArgumentList[opt] )
```
with parts of
[PostfixExpression](https://dlang.org/spec/grammar.html#PostfixExpression) and [PrimaryExpression](https://dlang.org/spec/grammar.html#PrimaryExpression):
```
UserDefinedAttribute:
...
@ UserDefinedAttributeExpression
UserDefinedAttributeExpression:
FundamentalType
Identifier
. Identifier
TemplateInstance
. TemplateInstance
UserDefinedAttributeExpression . Identifier
UserDefinedAttributeExpression . TemplateInstance
UserDefinedAttributeExpression ( NamedArgumentList[opt] )
```
This will allow writing `!`/`.`-chained expressions without
parentheses:
`@A!B.C(D)` instead of `@(A!B.C(D))` currently.
## Proposal #3
Remove [undocumented
behavior](https://forum.dlang.org/thread/hnjcuvuzytbuvgfdhfkd@forum.dlang.org) from compiler which allows using lambda in UDA without parentheses:
```d
@_ => 2
int a;
```
In this case, one should be forced to use parentheses:
```d
@(_ => 2)
int a;
```
More information about the dip.ideas
mailing list