Skip to content

Commit 63e6291

Browse files
redsun82aibaars
authored andcommitted
Rust: expand attribute macros on AssocItem and ExternItem
1 parent 972a3f3 commit 63e6291

File tree

3 files changed

+177
-38
lines changed

3 files changed

+177
-38
lines changed

rust/extractor/src/translate/base.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,16 @@ use ra_ap_syntax::{
2525
#[macro_export]
2626
macro_rules! pre_emit {
2727
(Item, $self:ident, $node:ident) => {
28+
if let Some(label) = $self.prepare_item_expansion($node) {
29+
return Some(label.into());
30+
}
31+
};
32+
(AssocItem, $self:ident, $node:ident) => {
33+
if let Some(label) = $self.prepare_item_expansion(&$node.clone().into()) {
34+
return Some(label.into());
35+
}
36+
};
37+
(ExternItem, $self:ident, $node:ident) => {
2838
if let Some(label) = $self.prepare_item_expansion(&$node.clone().into()) {
2939
return Some(label.into());
3040
}
@@ -60,8 +70,17 @@ macro_rules! post_emit {
6070
$self.extract_canonical_origin_of_enum_variant($node, $label);
6171
};
6272
(Item, $self:ident, $node:ident, $label:ident) => {
73+
$self.emit_item_expansion($node, $label);
74+
};
75+
(AssocItem, $self:ident, $node:ident, $label:ident) => {
6376
$self.emit_item_expansion(&$node.clone().into(), $label);
6477
};
78+
(ExternItem, $self:ident, $node:ident, $label:ident) => {
79+
$self.emit_item_expansion(
80+
&$node.clone().into(),
81+
From::<Label<generated::Item>>::from($label),
82+
);
83+
};
6584
// TODO canonical origin of other items
6685
(PathExpr, $self:ident, $node:ident, $label:ident) => {
6786
$self.extract_path_canonical_destination($node, $label.into());

rust/ql/test/extractor-tests/macro-expansion/PrintAst.expected

Lines changed: 145 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,151 @@ macro_expansion.rs:
406406
# 30| getItem(6): [Impl] impl S { ... }
407407
# 30| getAssocItemList(): [AssocItemList] AssocItemList
408408
# 31| getAssocItem(0): [Function] fn bzz
409+
# 32| getAttributeMacroExpansion(): [MacroItems] MacroItems
410+
# 32| getItem(0): [Function] fn bzz_0
411+
# 32| getParamList(): [ParamList] ParamList
412+
# 32| getBody(): [BlockExpr] { ... }
413+
# 32| getStmtList(): [StmtList] StmtList
414+
# 33| getStatement(0): [ExprStmt] ExprStmt
415+
# 33| getExpr(): [MacroExpr] MacroExpr
416+
# 33| getMacroCall(): [MacroCall] hello!...
417+
# 33| getPath(): [Path] hello
418+
# 33| getSegment(): [PathSegment] hello
419+
# 33| getIdentifier(): [NameRef] hello
420+
# 33| getTokenTree(): [TokenTree] TokenTree
421+
# 31| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr
422+
# 31| getStatement(0): [ExprStmt] ExprStmt
423+
# 31| getExpr(): [MacroExpr] MacroExpr
424+
# 31| getMacroCall(): [MacroCall] println!...
425+
# 31| getPath(): [Path] println
426+
# 31| getSegment(): [PathSegment] println
427+
# 31| getIdentifier(): [NameRef] println
428+
# 31| getTokenTree(): [TokenTree] TokenTree
429+
# 31| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr
430+
# 31| getTailExpr(): [BlockExpr] { ... }
431+
# 31| getStmtList(): [StmtList] StmtList
432+
# 31| getStatement(0): [ExprStmt] ExprStmt
433+
# 31| getExpr(): [CallExpr] ...::_print(...)
434+
# 31| getArgList(): [ArgList] ArgList
435+
# 31| getArg(0): [MacroExpr] MacroExpr
436+
# 31| getMacroCall(): [MacroCall] ...::format_args_nl!...
437+
# 31| getPath(): [Path] ...::format_args_nl
438+
# 31| getQualifier(): [Path] $crate
439+
# 31| getSegment(): [PathSegment] $crate
440+
# 31| getIdentifier(): [NameRef] $crate
441+
# 31| getSegment(): [PathSegment] format_args_nl
442+
# 31| getIdentifier(): [NameRef] format_args_nl
443+
# 31| getTokenTree(): [TokenTree] TokenTree
444+
# 31| getMacroCallExpansion(): [FormatArgsExpr] FormatArgsExpr
445+
# 31| getTemplate(): [StringLiteralExpr] "hello!\n"
446+
# 31| getFunction(): [PathExpr] ...::_print
447+
# 31| getPath(): [Path] ...::_print
448+
# 31| getQualifier(): [Path] ...::io
449+
# 31| getQualifier(): [Path] $crate
450+
# 31| getSegment(): [PathSegment] $crate
451+
# 31| getIdentifier(): [NameRef] $crate
452+
# 31| getSegment(): [PathSegment] io
453+
# 31| getIdentifier(): [NameRef] io
454+
# 31| getSegment(): [PathSegment] _print
455+
# 31| getIdentifier(): [NameRef] _print
456+
# 32| getName(): [Name] bzz_0
457+
# 32| getVisibility(): [Visibility] Visibility
458+
# 32| getItem(1): [Function] fn bzz_1
459+
# 32| getParamList(): [ParamList] ParamList
460+
# 32| getBody(): [BlockExpr] { ... }
461+
# 32| getStmtList(): [StmtList] StmtList
462+
# 33| getStatement(0): [ExprStmt] ExprStmt
463+
# 33| getExpr(): [MacroExpr] MacroExpr
464+
# 33| getMacroCall(): [MacroCall] hello!...
465+
# 33| getPath(): [Path] hello
466+
# 33| getSegment(): [PathSegment] hello
467+
# 33| getIdentifier(): [NameRef] hello
468+
# 33| getTokenTree(): [TokenTree] TokenTree
469+
# 31| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr
470+
# 31| getStatement(0): [ExprStmt] ExprStmt
471+
# 31| getExpr(): [MacroExpr] MacroExpr
472+
# 31| getMacroCall(): [MacroCall] println!...
473+
# 31| getPath(): [Path] println
474+
# 31| getSegment(): [PathSegment] println
475+
# 31| getIdentifier(): [NameRef] println
476+
# 31| getTokenTree(): [TokenTree] TokenTree
477+
# 31| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr
478+
# 31| getTailExpr(): [BlockExpr] { ... }
479+
# 31| getStmtList(): [StmtList] StmtList
480+
# 31| getStatement(0): [ExprStmt] ExprStmt
481+
# 31| getExpr(): [CallExpr] ...::_print(...)
482+
# 31| getArgList(): [ArgList] ArgList
483+
# 31| getArg(0): [MacroExpr] MacroExpr
484+
# 31| getMacroCall(): [MacroCall] ...::format_args_nl!...
485+
# 31| getPath(): [Path] ...::format_args_nl
486+
# 31| getQualifier(): [Path] $crate
487+
# 31| getSegment(): [PathSegment] $crate
488+
# 31| getIdentifier(): [NameRef] $crate
489+
# 31| getSegment(): [PathSegment] format_args_nl
490+
# 31| getIdentifier(): [NameRef] format_args_nl
491+
# 31| getTokenTree(): [TokenTree] TokenTree
492+
# 31| getMacroCallExpansion(): [FormatArgsExpr] FormatArgsExpr
493+
# 31| getTemplate(): [StringLiteralExpr] "hello!\n"
494+
# 31| getFunction(): [PathExpr] ...::_print
495+
# 31| getPath(): [Path] ...::_print
496+
# 31| getQualifier(): [Path] ...::io
497+
# 31| getQualifier(): [Path] $crate
498+
# 31| getSegment(): [PathSegment] $crate
499+
# 31| getIdentifier(): [NameRef] $crate
500+
# 31| getSegment(): [PathSegment] io
501+
# 31| getIdentifier(): [NameRef] io
502+
# 31| getSegment(): [PathSegment] _print
503+
# 31| getIdentifier(): [NameRef] _print
504+
# 32| getName(): [Name] bzz_1
505+
# 32| getVisibility(): [Visibility] Visibility
506+
# 32| getItem(2): [Function] fn bzz_2
507+
# 32| getParamList(): [ParamList] ParamList
508+
# 32| getBody(): [BlockExpr] { ... }
509+
# 32| getStmtList(): [StmtList] StmtList
510+
# 33| getStatement(0): [ExprStmt] ExprStmt
511+
# 33| getExpr(): [MacroExpr] MacroExpr
512+
# 33| getMacroCall(): [MacroCall] hello!...
513+
# 33| getPath(): [Path] hello
514+
# 33| getSegment(): [PathSegment] hello
515+
# 33| getIdentifier(): [NameRef] hello
516+
# 33| getTokenTree(): [TokenTree] TokenTree
517+
# 31| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr
518+
# 31| getStatement(0): [ExprStmt] ExprStmt
519+
# 31| getExpr(): [MacroExpr] MacroExpr
520+
# 31| getMacroCall(): [MacroCall] println!...
521+
# 31| getPath(): [Path] println
522+
# 31| getSegment(): [PathSegment] println
523+
# 31| getIdentifier(): [NameRef] println
524+
# 31| getTokenTree(): [TokenTree] TokenTree
525+
# 31| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr
526+
# 31| getTailExpr(): [BlockExpr] { ... }
527+
# 31| getStmtList(): [StmtList] StmtList
528+
# 31| getStatement(0): [ExprStmt] ExprStmt
529+
# 31| getExpr(): [CallExpr] ...::_print(...)
530+
# 31| getArgList(): [ArgList] ArgList
531+
# 31| getArg(0): [MacroExpr] MacroExpr
532+
# 31| getMacroCall(): [MacroCall] ...::format_args_nl!...
533+
# 31| getPath(): [Path] ...::format_args_nl
534+
# 31| getQualifier(): [Path] $crate
535+
# 31| getSegment(): [PathSegment] $crate
536+
# 31| getIdentifier(): [NameRef] $crate
537+
# 31| getSegment(): [PathSegment] format_args_nl
538+
# 31| getIdentifier(): [NameRef] format_args_nl
539+
# 31| getTokenTree(): [TokenTree] TokenTree
540+
# 31| getMacroCallExpansion(): [FormatArgsExpr] FormatArgsExpr
541+
# 31| getTemplate(): [StringLiteralExpr] "hello!\n"
542+
# 31| getFunction(): [PathExpr] ...::_print
543+
# 31| getPath(): [Path] ...::_print
544+
# 31| getQualifier(): [Path] ...::io
545+
# 31| getQualifier(): [Path] $crate
546+
# 31| getSegment(): [PathSegment] $crate
547+
# 31| getIdentifier(): [NameRef] $crate
548+
# 31| getSegment(): [PathSegment] io
549+
# 31| getIdentifier(): [NameRef] io
550+
# 31| getSegment(): [PathSegment] _print
551+
# 31| getIdentifier(): [NameRef] _print
552+
# 32| getName(): [Name] bzz_2
553+
# 32| getVisibility(): [Visibility] Visibility
409554
# 32| getParamList(): [ParamList] ParamList
410555
# 31| getAttr(0): [Attr] Attr
411556
# 31| getMeta(): [Meta] Meta
@@ -422,41 +567,6 @@ macro_expansion.rs:
422567
# 33| getSegment(): [PathSegment] hello
423568
# 33| getIdentifier(): [NameRef] hello
424569
# 33| getTokenTree(): [TokenTree] TokenTree
425-
# 33| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr
426-
# 33| getStatement(0): [ExprStmt] ExprStmt
427-
# 33| getExpr(): [MacroExpr] MacroExpr
428-
# 33| getMacroCall(): [MacroCall] println!...
429-
# 33| getPath(): [Path] println
430-
# 33| getSegment(): [PathSegment] println
431-
# 33| getIdentifier(): [NameRef] println
432-
# 33| getTokenTree(): [TokenTree] TokenTree
433-
# 33| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr
434-
# 33| getTailExpr(): [BlockExpr] { ... }
435-
# 33| getStmtList(): [StmtList] StmtList
436-
# 33| getStatement(0): [ExprStmt] ExprStmt
437-
# 33| getExpr(): [CallExpr] ...::_print(...)
438-
# 33| getArgList(): [ArgList] ArgList
439-
# 33| getArg(0): [MacroExpr] MacroExpr
440-
# 33| getMacroCall(): [MacroCall] ...::format_args_nl!...
441-
# 33| getPath(): [Path] ...::format_args_nl
442-
# 33| getQualifier(): [Path] $crate
443-
# 33| getSegment(): [PathSegment] $crate
444-
# 33| getIdentifier(): [NameRef] $crate
445-
# 33| getSegment(): [PathSegment] format_args_nl
446-
# 33| getIdentifier(): [NameRef] format_args_nl
447-
# 33| getTokenTree(): [TokenTree] TokenTree
448-
# 33| getMacroCallExpansion(): [FormatArgsExpr] FormatArgsExpr
449-
# 33| getTemplate(): [StringLiteralExpr] "hello!\n"
450-
# 33| getFunction(): [PathExpr] ...::_print
451-
# 33| getPath(): [Path] ...::_print
452-
# 33| getQualifier(): [Path] ...::io
453-
# 33| getQualifier(): [Path] $crate
454-
# 33| getSegment(): [PathSegment] $crate
455-
# 33| getIdentifier(): [NameRef] $crate
456-
# 33| getSegment(): [PathSegment] io
457-
# 33| getIdentifier(): [NameRef] io
458-
# 33| getSegment(): [PathSegment] _print
459-
# 33| getIdentifier(): [NameRef] _print
460570
# 32| getName(): [Name] bzz
461571
# 32| getVisibility(): [Visibility] Visibility
462572
# 30| getSelfTy(): [PathTypeRepr] S

rust/ql/test/extractor-tests/macro-expansion/test.expected

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,23 @@ attribute_macros
1111
| macro_expansion.rs:15:1:16:14 | fn bar_0 | 1 | macro_expansion.rs:16:1:16:14 | fn bar_0_new |
1212
| macro_expansion.rs:15:1:16:14 | fn bar_1 | 0 | macro_expansion.rs:16:1:16:14 | fn bar_1 |
1313
| macro_expansion.rs:15:1:16:14 | fn bar_1 | 1 | macro_expansion.rs:16:1:16:14 | fn bar_1_new |
14+
| macro_expansion.rs:31:5:34:5 | fn bzz | 0 | macro_expansion.rs:32:5:33:17 | fn bzz_0 |
15+
| macro_expansion.rs:31:5:34:5 | fn bzz | 1 | macro_expansion.rs:32:5:33:17 | fn bzz_1 |
16+
| macro_expansion.rs:31:5:34:5 | fn bzz | 2 | macro_expansion.rs:32:5:33:17 | fn bzz_2 |
1417
| macro_expansion.rs:82:1:83:16 | fn foo_ctor | 0 | macro_expansion.rs:83:1:83:15 | ...::ctor_parse!... |
1518
macro_calls
1619
| included/included.rs:2:9:2:39 | concat!... | included/included.rs:2:17:2:38 | "Hello world!" |
1720
| macro_expansion.rs:5:9:5:34 | concat!... | macro_expansion.rs:5:17:5:34 | "Hello world!" |
1821
| macro_expansion.rs:5:9:5:34 | concat!... | macro_expansion.rs:5:17:5:34 | "Hello world!" |
19-
| macro_expansion.rs:33:9:33:16 | ...::format_args_nl!... | macro_expansion.rs:33:9:33:16 | FormatArgsExpr |
20-
| macro_expansion.rs:33:9:33:16 | hello!... | macro_expansion.rs:33:9:33:16 | MacroBlockExpr |
21-
| macro_expansion.rs:33:9:33:16 | println!... | macro_expansion.rs:33:9:33:16 | MacroBlockExpr |
22+
| macro_expansion.rs:31:5:31:16 | ...::format_args_nl!... | macro_expansion.rs:31:5:31:16 | FormatArgsExpr |
23+
| macro_expansion.rs:31:5:31:16 | ...::format_args_nl!... | macro_expansion.rs:31:5:31:16 | FormatArgsExpr |
24+
| macro_expansion.rs:31:5:31:16 | ...::format_args_nl!... | macro_expansion.rs:31:5:31:16 | FormatArgsExpr |
25+
| macro_expansion.rs:31:5:31:16 | println!... | macro_expansion.rs:31:5:31:16 | MacroBlockExpr |
26+
| macro_expansion.rs:31:5:31:16 | println!... | macro_expansion.rs:31:5:31:16 | MacroBlockExpr |
27+
| macro_expansion.rs:31:5:31:16 | println!... | macro_expansion.rs:31:5:31:16 | MacroBlockExpr |
28+
| macro_expansion.rs:33:9:33:15 | hello!... | macro_expansion.rs:31:5:31:16 | MacroBlockExpr |
29+
| macro_expansion.rs:33:9:33:15 | hello!... | macro_expansion.rs:31:5:31:16 | MacroBlockExpr |
30+
| macro_expansion.rs:33:9:33:15 | hello!... | macro_expansion.rs:31:5:31:16 | MacroBlockExpr |
2231
| macro_expansion.rs:44:5:44:13 | def_x!... | macro_expansion.rs:44:5:44:13 | MacroItems |
2332
| macro_expansion.rs:53:9:53:25 | concat!... | macro_expansion.rs:53:17:53:24 | "xy" |
2433
| macro_expansion.rs:55:9:58:5 | my_macro!... | macro_expansion.rs:56:9:57:13 | MacroExpr |
@@ -59,4 +68,5 @@ macro_calls
5968
| macro_expansion.rs:83:4:83:15 | ...::unify_features!... | macro_expansion.rs:83:4:83:15 | MacroItems |
6069
unexpanded_macro_calls
6170
| macro_expansion.rs:5:9:5:35 | concat!... |
71+
| macro_expansion.rs:33:9:33:16 | hello!... |
6272
warnings

0 commit comments

Comments
 (0)