use crate::{Assist, AssistCtx, AssistId};
// Assist: add_derive
+//
// Adds a new `#[derive()]` clause to a struct or enum.
+//
// ```
// struct Point {
// x: u32,
use crate::{Assist, AssistCtx, AssistId};
// Assist: add_explicit_type
+//
// Specify type for a let binding
+//
// ```
// fn main() {
// let x<|> = 92;
use crate::{Assist, AssistCtx, AssistId};
// Assist: add_impl
+//
// Adds a new inherent impl for a type
+//
// ```
// struct Ctx<T: Clone> {
// data: T,<|>
}
// Assist: add_impl_missing_members
+//
// Adds scaffold for required impl members
+//
// ```
// trait T {
// Type X;
use crate::{Assist, AssistCtx, AssistId};
// Assist: apply_demorgan
+//
// Apply [De Morgan's law](https://en.wikipedia.org/wiki/De_Morgan%27s_laws).
// This transforms expressions of the form `!l || !r` into `!(l && r)`.
// This also works with `&&`. This assist can only be applied with the cursor
// on either `||` or `&&`, with both operands being a negation of some kind.
// This means something of the form `!x` or `x != y`.
+//
// ```
// fn main() {
// if x != 4 ||<|> !y {}
-//! FIXME: write short doc here
-
use hir::db::HirDatabase;
use ra_syntax::{
ast::{self, NameOwner, VisibilityOwner},
use crate::{Assist, AssistCtx, AssistId};
+// Assist: change_visibility
+//
+// Adds or changes existing visibility specifier.
+//
+// ```
+// fn<|> frobnicate() {}
+// ```
+// ->
+// ```
+// pub(crate) fn frobnicate() {}
+// ```
pub(crate) fn change_visibility(ctx: AssistCtx<impl HirDatabase>) -> Option<Assist> {
if let Some(vis) = ctx.node_at_offset::<ast::Visibility>() {
return change_vis(ctx, vis);
use crate::{Assist, AssistCtx, AssistId};
+// Assist: fill_match_arms
+//
+// Adds missing clauses to a `match` expression.
+//
+// ```
+// enum Action { Move { distance: u32 }, Stop }
+//
+// fn handle(action: Action) {
+// match action {
+// <|>
+// }
+// }
+// ```
+// ->
+// ```
+// enum Action { Move { distance: u32 }, Stop }
+//
+// fn handle(action: Action) {
+// match action {
+// Action::Move{ distance } => (),
+// Action::Stop => (),
+// }
+// }
+// ```
pub(crate) fn fill_match_arms(mut ctx: AssistCtx<impl HirDatabase>) -> Option<Assist> {
let match_expr = ctx.node_at_offset::<ast::MatchExpr>()?;
let match_arm_list = match_expr.match_arm_list()?;
)
}
+#[test]
+fn doctest_change_visibility() {
+ check(
+ "change_visibility",
+ r#####"
+fn<|> frobnicate() {}
+"#####,
+ r#####"
+pub(crate) fn frobnicate() {}
+"#####,
+ )
+}
+
#[test]
fn doctest_convert_to_guarded_return() {
check(
"#####,
)
}
+
+#[test]
+fn doctest_fill_match_arms() {
+ check(
+ "fill_match_arms",
+ r#####"
+enum Action { Move { distance: u32 }, Stop }
+
+fn handle(action: Action) {
+ match action {
+ <|>
+ }
+}
+"#####,
+ r#####"
+enum Action { Move { distance: u32 }, Stop }
+
+fn handle(action: Action) {
+ match action {
+ Action::Move{ distance } => (),
+ Action::Stop => (),
+ }
+}
+"#####,
+ )
+}
}
```
+## `change_visibility`
+
+Adds or changes existing visibility specifier.
+
+```rust
+// BEFORE
+fn<|> frobnicate() {}
+
+// AFTER
+pub(crate) fn frobnicate() {}
+```
+
## `convert_to_guarded_return`
Replace a large conditional with a guarded return.
bar();
}
```
+
+## `fill_match_arms`
+
+Adds missing clauses to a `match` expression.
+
+```rust
+// BEFORE
+enum Action { Move { distance: u32 }, Stop }
+
+fn handle(action: Action) {
+ match action {
+ <|>
+ }
+}
+
+// AFTER
+enum Action { Move { distance: u32 }, Stop }
+
+fn handle(action: Action) {
+ match action {
+ Action::Move{ distance } => (),
+ Action::Stop => (),
+ }
+}
+```
}
```
-- Change Visibility
-
-```rust
-// before:
-<|>fn foo() {}
-
-// after:
-<|>pub(crate) fn foo() {}
-
-// after:
-<|>pub fn foo() {}
-```
-
-- Fill match arms
-
-```rust
-// before:
-enum A {
- As,
- Bs,
- Cs(String),
- Ds(String, String),
- Es{x: usize, y: usize}
-}
-
-fn main() {
- let a = A::As;
- match a<|> {}
-}
-
-// after:
-enum A {
- As,
- Bs,
- Cs(String),
- Ds(String, String),
- Es{x: usize, y: usize}
-}
-
-fn main() {
- let a = A::As;
- match <|>a {
- A::As => (),
- A::Bs => (),
- A::Cs(_) => (),
- A::Ds(_, _) => (),
- A::Es{x, y} => (),
- }
-}
-```
-
- Fill struct fields
```rust
id
);
- let doc = take_until(lines.by_ref(), "```");
+ let doc = take_until(lines.by_ref(), "```").trim().to_string();
let before = take_until(lines.by_ref(), "```");
assert_eq!(lines.next().unwrap().as_str(), "->");