diff options
author | bors[bot] <bors[bot]@users.noreply.github.com> | 2018-12-28 16:17:19 +0000 |
---|---|---|
committer | bors[bot] <bors[bot]@users.noreply.github.com> | 2018-12-28 16:17:19 +0000 |
commit | 7a268b9b9635425176f93d3c893fb5345e84e9ce (patch) | |
tree | 6ea69024cb22d3fc48a3b392a0185163fa452014 /crates/ra_syntax | |
parent | 9d6740a9c9ad2ca47c4885bd994f849e90bbef86 (diff) | |
parent | b911ee542b2f4d1cd62a655f24197856cd9b9097 (diff) |
Merge #350
350: Super simple macro support r=matklad a=matklad
Super simple support for macros, mostly for figuring out how to fit them into the current architecture. Expansion is hard-coded and string based (mid-term, we should try to copy-paste macro-by-example expander from rustc).
Ideally, we should handle
* highlighting inside the macro (done)
* extend selection inside the macro
* completion inside the macro
* indexing structs, produced by the macro
Co-authored-by: Aleksey Kladov <[email protected]>
Diffstat (limited to 'crates/ra_syntax')
-rw-r--r-- | crates/ra_syntax/src/ast/generated.rs | 45 | ||||
-rw-r--r-- | crates/ra_syntax/src/grammar.ron | 1 |
2 files changed, 46 insertions, 0 deletions
diff --git a/crates/ra_syntax/src/ast/generated.rs b/crates/ra_syntax/src/ast/generated.rs index c22e026cf..c5ac90a62 100644 --- a/crates/ra_syntax/src/ast/generated.rs +++ b/crates/ra_syntax/src/ast/generated.rs | |||
@@ -1838,6 +1838,51 @@ impl<R: TreeRoot<RaTypes>> LoopExprNode<R> { | |||
1838 | impl<'a> ast::LoopBodyOwner<'a> for LoopExpr<'a> {} | 1838 | impl<'a> ast::LoopBodyOwner<'a> for LoopExpr<'a> {} |
1839 | impl<'a> LoopExpr<'a> {} | 1839 | impl<'a> LoopExpr<'a> {} |
1840 | 1840 | ||
1841 | // MacroCall | ||
1842 | #[derive(Debug, Clone, Copy,)] | ||
1843 | pub struct MacroCallNode<R: TreeRoot<RaTypes> = OwnedRoot> { | ||
1844 | pub(crate) syntax: SyntaxNode<R>, | ||
1845 | } | ||
1846 | pub type MacroCall<'a> = MacroCallNode<RefRoot<'a>>; | ||
1847 | |||
1848 | impl<R1: TreeRoot<RaTypes>, R2: TreeRoot<RaTypes>> PartialEq<MacroCallNode<R1>> for MacroCallNode<R2> { | ||
1849 | fn eq(&self, other: &MacroCallNode<R1>) -> bool { self.syntax == other.syntax } | ||
1850 | } | ||
1851 | impl<R: TreeRoot<RaTypes>> Eq for MacroCallNode<R> {} | ||
1852 | impl<R: TreeRoot<RaTypes>> Hash for MacroCallNode<R> { | ||
1853 | fn hash<H: Hasher>(&self, state: &mut H) { self.syntax.hash(state) } | ||
1854 | } | ||
1855 | |||
1856 | impl<'a> AstNode<'a> for MacroCall<'a> { | ||
1857 | fn cast(syntax: SyntaxNodeRef<'a>) -> Option<Self> { | ||
1858 | match syntax.kind() { | ||
1859 | MACRO_CALL => Some(MacroCall { syntax }), | ||
1860 | _ => None, | ||
1861 | } | ||
1862 | } | ||
1863 | fn syntax(self) -> SyntaxNodeRef<'a> { self.syntax } | ||
1864 | } | ||
1865 | |||
1866 | impl<R: TreeRoot<RaTypes>> MacroCallNode<R> { | ||
1867 | pub fn borrowed(&self) -> MacroCall { | ||
1868 | MacroCallNode { syntax: self.syntax.borrowed() } | ||
1869 | } | ||
1870 | pub fn owned(&self) -> MacroCallNode { | ||
1871 | MacroCallNode { syntax: self.syntax.owned() } | ||
1872 | } | ||
1873 | } | ||
1874 | |||
1875 | |||
1876 | impl<'a> MacroCall<'a> { | ||
1877 | pub fn token_tree(self) -> Option<TokenTree<'a>> { | ||
1878 | super::child_opt(self) | ||
1879 | } | ||
1880 | |||
1881 | pub fn path(self) -> Option<Path<'a>> { | ||
1882 | super::child_opt(self) | ||
1883 | } | ||
1884 | } | ||
1885 | |||
1841 | // MatchArm | 1886 | // MatchArm |
1842 | #[derive(Debug, Clone, Copy,)] | 1887 | #[derive(Debug, Clone, Copy,)] |
1843 | pub struct MatchArmNode<R: TreeRoot<RaTypes> = OwnedRoot> { | 1888 | pub struct MatchArmNode<R: TreeRoot<RaTypes> = OwnedRoot> { |
diff --git a/crates/ra_syntax/src/grammar.ron b/crates/ra_syntax/src/grammar.ron index 4bcff4e14..aab4839a9 100644 --- a/crates/ra_syntax/src/grammar.ron +++ b/crates/ra_syntax/src/grammar.ron | |||
@@ -484,6 +484,7 @@ Grammar( | |||
484 | 484 | ||
485 | "Name": (), | 485 | "Name": (), |
486 | "NameRef": (), | 486 | "NameRef": (), |
487 | "MacroCall": ( options: [ "TokenTree", "Path" ] ), | ||
487 | "Attr": ( options: [ ["value", "TokenTree"] ] ), | 488 | "Attr": ( options: [ ["value", "TokenTree"] ] ), |
488 | "TokenTree": (), | 489 | "TokenTree": (), |
489 | "TypeParamList": ( | 490 | "TypeParamList": ( |