Skip to content

Commit 8e3082f

Browse files
committed
Document AstTransformation
1 parent 2c916bb commit 8e3082f

File tree

1 file changed

+28
-0
lines changed

1 file changed

+28
-0
lines changed

crates/assists/src/ast_transform.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,34 @@ pub fn apply<'a, N: AstNode>(transformer: &dyn AstTransform<'a>, node: N) -> N {
1818
.rewrite_ast(&node)
1919
}
2020

21+
/// `AstTransform` helps with applying bulk transformations to syntax nodes.
22+
///
23+
/// This is mostly useful for IDE code generation. If you paste some existing
24+
/// code into a new context (for example, to add method overrides to an `impl`
25+
/// block), you generally want to appropriately qualify the names, and sometimes
26+
/// you might want to substitute generic parameters as well:
27+
///
28+
/// ```
29+
/// mod x {
30+
/// pub struct A;
31+
/// pub trait T<U> { fn foo(&self, _: U) -> A; }
32+
/// }
33+
///
34+
/// mod y {
35+
/// use x::T;
36+
///
37+
/// impl T<()> for () {
38+
/// // If we invoke **Add Missing Members** here, we want to copy-paste `foo`.
39+
/// // But we want a slightly-modified version of it:
40+
/// fn foo(&self, _: ()) -> x::A {}
41+
/// }
42+
/// }
43+
/// ```
44+
///
45+
/// So, a single `AstTransform` describes such function from `SyntaxNode` to
46+
/// `SyntaxNode`. Note that the API here is a bit too high-order and high-brow.
47+
/// We'd want to somehow express this concept simpler, but so far nobody got to
48+
/// simplifying this!
2149
pub trait AstTransform<'a> {
2250
fn get_substitution(&self, node: &syntax::SyntaxNode) -> Option<syntax::SyntaxNode>;
2351

0 commit comments

Comments
 (0)