Skip to content

Commit 7e5c8dc

Browse files
authored
Merge pull request #3701 from ntrel/d-attr
D: parse user-defined attributes
2 parents fbd8778 + 9f54e5d commit 7e5c8dc

File tree

3 files changed

+22
-6
lines changed

3 files changed

+22
-6
lines changed

Units/parser-d.r/simple.d.d/expected.tags

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ TemplateAlias input.d /^ alias TemplateAlias = a!T;$/;" a file:
1111
UT input.d /^union UT(T){}$/;" u file:
1212
Union input.d /^ union Union$/;" u struct:Struct file:
1313
_bar input.d /^ private AliasInt _bar;$/;" m class:Class file:
14+
attr_anon input.d /^@(obj) T attr_anon;$/;" v
15+
attr_decl input.d /^@attr(i) int attr_decl = 1;$/;" v
1416
bar input.d /^ bar,$/;" e enum:Enum file:
1517
bar input.d /^ public AliasInt bar()$/;" f class:Class
1618
conditional input.d /^ T conditional;$/;" v file:

Units/parser-d.r/simple.d.d/input.d

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,11 @@ int i;
7878
int error;
7979
+/
8080

81+
@attr(i) int attr_decl = 1;
82+
@attr(i) attr_decl_infer = 1; // FIXME
83+
@(obj) T attr_anon;
84+
void attr_post() @attr(obj); // FIXME
85+
8186
static if (is(typeof(__traits(getMember, a, name)) == function))
8287
T conditional;
8388

parsers/c-based.c

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,7 @@ static const keywordDesc KeywordTable [] = {
494494
* FUNCTION PROTOTYPES
495495
*/
496496
static void createTags (const unsigned int nestLevel, statementInfo *const parent);
497+
static void parseAtMarkStyleAnnotation (statementInfo *const st);
497498

498499
/*
499500
* FUNCTION DEFINITIONS
@@ -2122,6 +2123,10 @@ static bool skipPostArgumentStuff (
21222123
break;
21232124
}
21242125
}
2126+
else if (isInputLanguage (Lang_d) && c == '@')
2127+
{
2128+
parseAtMarkStyleAnnotation (st);
2129+
}
21252130
}
21262131
if (! end)
21272132
{
@@ -2213,7 +2218,7 @@ static void processAngleBracket (void)
22132218
}
22142219
}
22152220

2216-
static void parseJavaAnnotation (statementInfo *const st)
2221+
static void parseAtMarkStyleAnnotation (statementInfo *const st)
22172222
{
22182223
/*
22192224
* @Override
@@ -2225,7 +2230,11 @@ static void parseJavaAnnotation (statementInfo *const st)
22252230
tokenInfo *const token = activeToken (st);
22262231

22272232
int c = skipToNonWhite ();
2228-
readIdentifier (token, c);
2233+
if (cppIsident1 (c))
2234+
readIdentifier (token, c);
2235+
else
2236+
cppUngetc (c); // D allows: @ ( ArgumentList )
2237+
22292238
if (token->keyword == KEYWORD_INTERFACE)
22302239
{
22312240
/* Oops. This was actually "@interface" defining a new annotation. */
@@ -2346,9 +2355,9 @@ static int parseParens (statementInfo *const st, parenInfo *const info)
23462355
break;
23472356

23482357
default:
2349-
if (c == '@' && isInputLanguage (Lang_java))
2358+
if (c == '@' && (isInputLanguage (Lang_d) || isInputLanguage (Lang_java)))
23502359
{
2351-
parseJavaAnnotation(st);
2360+
parseAtMarkStyleAnnotation (st);
23522361
}
23532362
else if (cppIsident1 (c))
23542363
{
@@ -2637,9 +2646,9 @@ static void parseGeneralToken (statementInfo *const st, const int c)
26372646
if (c2 != '=')
26382647
cppUngetc (c2);
26392648
}
2640-
else if (c == '@' && isInputLanguage (Lang_java))
2649+
else if (c == '@' && (isInputLanguage (Lang_d) || isInputLanguage (Lang_java)))
26412650
{
2642-
parseJavaAnnotation (st);
2651+
parseAtMarkStyleAnnotation (st);
26432652
}
26442653
else if (c == STRING_SYMBOL) {
26452654
setToken(st, TOKEN_NONE);

0 commit comments

Comments
 (0)