2075: document a couple of assists r=matklad a=matklad



Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
This commit is contained in:
bors[bot] 2019-10-26 14:38:20 +00:00 committed by GitHub
commit 65e3fc8e77
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 122 additions and 54 deletions

View file

@ -8,7 +8,9 @@ use ra_syntax::{
use crate::{Assist, AssistCtx, AssistId};
// Assist: add_derive
//
// Adds a new `#[derive()]` clause to a struct or enum.
//
// ```
// struct Point {
// x: u32,

View file

@ -7,7 +7,9 @@ use ra_syntax::{
use crate::{Assist, AssistCtx, AssistId};
// Assist: add_explicit_type
//
// Specify type for a let binding
//
// ```
// fn main() {
// let x<|> = 92;

View file

@ -9,7 +9,9 @@ use ra_syntax::{
use crate::{Assist, AssistCtx, AssistId};
// Assist: add_impl
//
// Adds a new inherent impl for a type
//
// ```
// struct Ctx<T: Clone> {
// data: T,<|>

View file

@ -13,7 +13,9 @@ enum AddMissingImplMembersMode {
}
// Assist: add_impl_missing_members
//
// Adds scaffold for required impl members
//
// ```
// trait T {
// Type X;

View file

@ -5,11 +5,13 @@ use ra_syntax::SyntaxNode;
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 {}

View file

@ -1,5 +1,3 @@
//! FIXME: write short doc here
use hir::db::HirDatabase;
use ra_syntax::{
ast::{self, NameOwner, VisibilityOwner},
@ -13,6 +11,17 @@ use ra_syntax::{
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);

View file

@ -7,6 +7,30 @@ use ra_syntax::ast::{self, edit::IndentLevel, make, AstNode, NameOwner};
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()?;

View file

@ -141,6 +141,19 @@ fn main() {
)
}
#[test]
fn doctest_change_visibility() {
check(
"change_visibility",
r#####"
fn<|> frobnicate() {}
"#####,
r#####"
pub(crate) fn frobnicate() {}
"#####,
)
}
#[test]
fn doctest_convert_to_guarded_return() {
check(
@ -164,3 +177,29 @@ fn main() {
"#####,
)
}
#[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 => (),
}
}
"#####,
)
}

View file

@ -137,6 +137,18 @@ fn main() {
}
```
## `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.
@ -159,3 +171,28 @@ fn main() {
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 => (),
}
}
```

View file

@ -118,57 +118,6 @@ impl Debug<|> for Foo {
}
```
- 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

View file

@ -51,7 +51,7 @@ fn collect_assists() -> Result<Vec<Assist>> {
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(), "->");