Skip to content

Commit aa031e9

Browse files
committed
add completions for clippy lint in attributes
Signed-off-by: Benjamin Coenen <[email protected]>
1 parent c003395 commit aa031e9

File tree

8 files changed

+240
-136
lines changed

8 files changed

+240
-136
lines changed

crates/completion/src/complete_attribute.rs

+4-127
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use syntax::{ast, AstNode, SyntaxKind};
99
use crate::{
1010
completion_context::CompletionContext,
1111
completion_item::{CompletionItem, CompletionItemKind, CompletionKind, Completions},
12-
generated_features::FEATURES,
12+
generated_lint_completions::{CLIPPY_LINTS, FEATURES},
1313
};
1414

1515
pub(super) fn complete_attribute(acc: &mut Completions, ctx: &CompletionContext) -> Option<()> {
@@ -23,14 +23,15 @@ pub(super) fn complete_attribute(acc: &mut Completions, ctx: &CompletionContext)
2323
complete_derive(acc, ctx, token_tree)
2424
}
2525
(Some(path), Some(token_tree)) if path.to_string() == "feature" => {
26-
complete_lint(acc, ctx, token_tree, FEATURES)
26+
complete_lint(acc, ctx, token_tree, FEATURES);
2727
}
2828
(Some(path), Some(token_tree))
2929
if ["allow", "warn", "deny", "forbid"]
3030
.iter()
3131
.any(|lint_level| lint_level == &path.to_string()) =>
3232
{
33-
complete_lint(acc, ctx, token_tree, DEFAULT_LINT_COMPLETIONS)
33+
complete_lint(acc, ctx, token_tree.clone(), DEFAULT_LINT_COMPLETIONS);
34+
complete_lint(acc, ctx, token_tree, CLIPPY_LINTS);
3435
}
3536
(_, Some(_token_tree)) => {}
3637
_ => complete_attribute_start(acc, ctx, attribute),
@@ -417,130 +418,6 @@ struct Test {}
417418
);
418419
}
419420

420-
#[test]
421-
fn empty_lint_completion() {
422-
check(
423-
r#"#[allow(<|>)]"#,
424-
expect![[r#"
425-
at absolute_paths_not_starting_with_crate fully qualified paths that start with a module name instead of `crate`, `self`, or an extern crate name
426-
at ambiguous_associated_items ambiguous associated items
427-
at anonymous_parameters detects anonymous parameters
428-
at arithmetic_overflow arithmetic operation overflows
429-
at array_into_iter detects calling `into_iter` on arrays
430-
at asm_sub_register using only a subset of a register for inline asm inputs
431-
at bare_trait_objects suggest using `dyn Trait` for trait objects
432-
at bindings_with_variant_name detects pattern bindings with the same name as one of the matched variants
433-
at box_pointers use of owned (Box type) heap memory
434-
at cenum_impl_drop_cast a C-like enum implementing Drop is cast
435-
at clashing_extern_declarations detects when an extern fn has been declared with the same name but different types
436-
at coherence_leak_check distinct impls distinguished only by the leak-check code
437-
at conflicting_repr_hints conflicts between `#[repr(..)]` hints that were previously accepted and used in practice
438-
at confusable_idents detects visually confusable pairs between identifiers
439-
at const_err constant evaluation detected erroneous expression
440-
at dead_code detect unused, unexported items
441-
at deprecated detects use of deprecated items
442-
at deprecated_in_future detects use of items that will be deprecated in a future version
443-
at elided_lifetimes_in_paths hidden lifetime parameters in types are deprecated
444-
at ellipsis_inclusive_range_patterns `...` range patterns are deprecated
445-
at explicit_outlives_requirements outlives requirements can be inferred
446-
at exported_private_dependencies public interface leaks type from a private dependency
447-
at ill_formed_attribute_input ill-formed attribute inputs that were previously accepted and used in practice
448-
at illegal_floating_point_literal_pattern floating-point literals cannot be used in patterns
449-
at improper_ctypes proper use of libc types in foreign modules
450-
at improper_ctypes_definitions proper use of libc types in foreign item definitions
451-
at incomplete_features incomplete features that may function improperly in some or all cases
452-
at incomplete_include trailing content in included file
453-
at indirect_structural_match pattern with const indirectly referencing non-structural-match type
454-
at inline_no_sanitize detects incompatible use of `#[inline(always)]` and `#[no_sanitize(...)]`
455-
at intra_doc_link_resolution_failure failures in resolving intra-doc link targets
456-
at invalid_codeblock_attributes codeblock attribute looks a lot like a known one
457-
at invalid_type_param_default type parameter default erroneously allowed in invalid location
458-
at invalid_value an invalid value is being created (such as a NULL reference)
459-
at irrefutable_let_patterns detects irrefutable patterns in if-let and while-let statements
460-
at keyword_idents detects edition keywords being used as an identifier
461-
at late_bound_lifetime_arguments detects generic lifetime arguments in path segments with late bound lifetime parameters
462-
at macro_expanded_macro_exports_accessed_by_absolute_paths macro-expanded `macro_export` macros from the current crate cannot be referred to by absolute paths
463-
at macro_use_extern_crate the `#[macro_use]` attribute is now deprecated in favor of using macros via the module system
464-
at meta_variable_misuse possible meta-variable misuse at macro definition
465-
at missing_copy_implementations detects potentially-forgotten implementations of `Copy`
466-
at missing_crate_level_docs detects crates with no crate-level documentation
467-
at missing_debug_implementations detects missing implementations of Debug
468-
at missing_doc_code_examples detects publicly-exported items without code samples in their documentation
469-
at missing_docs detects missing documentation for public members
470-
at missing_fragment_specifier detects missing fragment specifiers in unused `macro_rules!` patterns
471-
at mixed_script_confusables detects Unicode scripts whose mixed script confusables codepoints are solely used
472-
at mutable_borrow_reservation_conflict reservation of a two-phased borrow conflicts with other shared borrows
473-
at mutable_transmutes mutating transmuted &mut T from &T may cause undefined behavior
474-
at no_mangle_const_items const items will not have their symbols exported
475-
at no_mangle_generic_items generic items must be mangled
476-
at non_ascii_idents detects non-ASCII identifiers
477-
at non_camel_case_types types, variants, traits and type parameters should have camel case names
478-
at non_shorthand_field_patterns using `Struct { x: x }` instead of `Struct { x }` in a pattern
479-
at non_snake_case variables, methods, functions, lifetime parameters and modules should have snake case names
480-
at non_upper_case_globals static constants should have uppercase identifiers
481-
at order_dependent_trait_objects trait-object types were treated as different depending on marker-trait order
482-
at overflowing_literals literal out of range for its type
483-
at overlapping_patterns detects overlapping patterns
484-
at path_statements path statements with no effect
485-
at patterns_in_fns_without_body patterns in functions without body were erroneously allowed
486-
at private_doc_tests detects code samples in docs of private items not documented by rustdoc
487-
at private_in_public detect private items in public interfaces not caught by the old implementation
488-
at proc_macro_derive_resolution_fallback detects proc macro derives using inaccessible names from parent modules
489-
at pub_use_of_private_extern_crate detect public re-exports of private extern crates
490-
at redundant_semicolons detects unnecessary trailing semicolons
491-
at renamed_and_removed_lints lints that have been renamed or removed
492-
at safe_packed_borrows safe borrows of fields of packed structs were erroneously allowed
493-
at single_use_lifetimes detects lifetime parameters that are only used once
494-
at soft_unstable a feature gate that doesn't break dependent crates
495-
at stable_features stable features found in `#[feature]` directive
496-
at trivial_bounds these bounds don't depend on an type parameters
497-
at trivial_casts detects trivial casts which could be removed
498-
at trivial_numeric_casts detects trivial casts of numeric types which could be removed
499-
at type_alias_bounds bounds in type aliases are not enforced
500-
at tyvar_behind_raw_pointer raw pointer to an inference variable
501-
at unaligned_references detects unaligned references to fields of packed structs
502-
at uncommon_codepoints detects uncommon Unicode codepoints in identifiers
503-
at unconditional_panic operation will cause a panic at runtime
504-
at unconditional_recursion functions that cannot return without calling themselves
505-
at unknown_crate_types unknown crate type found in `#[crate_type]` directive
506-
at unknown_lints unrecognized lint attribute
507-
at unnameable_test_items detects an item that cannot be named being marked as `#[test_case]`
508-
at unreachable_code detects unreachable code paths
509-
at unreachable_patterns detects unreachable patterns
510-
at unreachable_pub `pub` items not reachable from crate root
511-
at unsafe_code usage of `unsafe` code
512-
at unsafe_op_in_unsafe_fn unsafe operations in unsafe functions without an explicit unsafe block are deprecated
513-
at unstable_features enabling unstable features (deprecated. do not use)
514-
at unstable_name_collisions detects name collision with an existing but unstable method
515-
at unused_allocation detects unnecessary allocations that can be eliminated
516-
at unused_assignments detect assignments that will never be read
517-
at unused_attributes detects attributes that were not used by the compiler
518-
at unused_braces unnecessary braces around an expression
519-
at unused_comparisons comparisons made useless by limits of the types involved
520-
at unused_crate_dependencies crate dependencies that are never used
521-
at unused_doc_comments detects doc comments that aren't used by rustdoc
522-
at unused_extern_crates extern crates that are never used
523-
at unused_features unused features found in crate-level `#[feature]` directives
524-
at unused_import_braces unnecessary braces around an imported item
525-
at unused_imports imports that are never used
526-
at unused_labels detects labels that are never used
527-
at unused_lifetimes detects lifetime parameters that are never used
528-
at unused_macros detects macros that were not used
529-
at unused_must_use unused result of a type flagged as `#[must_use]`
530-
at unused_mut detect mut variables which don't need to be mutable
531-
at unused_parens `if`, `match`, `while` and `return` do not need parentheses
532-
at unused_qualifications detects unnecessarily qualified names
533-
at unused_results unused result of an expression in a statement
534-
at unused_unsafe unnecessary use of an `unsafe` block
535-
at unused_variables detect variables which are not used in any way
536-
at variant_size_differences detects enums with widely varying variant sizes
537-
at warnings mass-change the level for lints which produce warnings
538-
at where_clauses_object_safety checks the object safety of where clauses
539-
at while_true suggest using `loop { }` instead of `while true { }`
540-
"#]],
541-
)
542-
}
543-
544421
#[test]
545422
fn no_completion_for_incorrect_derive() {
546423
check(

crates/completion/src/generated_features.rs

-4
This file was deleted.

crates/completion/src/generated_lint_completions.rs

+5
Large diffs are not rendered by default.

crates/completion/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ mod completion_item;
55
mod completion_context;
66
mod presentation;
77
mod patterns;
8-
mod generated_features;
8+
mod generated_lint_completions;
99
#[cfg(test)]
1010
mod test_utils;
1111

docs/user/generated_diagnostic.adoc

+105
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
//Generated file, do not edit by hand, see `xtask/src/codegen`
2+
=== break-outside-of-loop
3+
**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_ty/src/diagnostics.rs#L219[diagnostics.rs]
4+
5+
This diagnostic is triggered if `break` keyword is used outside of a loop.
6+
7+
8+
=== incorrect-ident-case
9+
**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_ty/src/diagnostics.rs#L319[diagnostics.rs]
10+
11+
This diagnostic is triggered if item name doesn't follow https://doc.rust-lang.org/1.0.0/style/style/naming/README.html[Rust naming convention].
12+
13+
14+
=== mismatched-arg-count
15+
**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_ty/src/diagnostics.rs#L267[diagnostics.rs]
16+
17+
This diagnostic is triggered if function is invoked with an incorrect amount of arguments.
18+
19+
20+
=== missing-match-arm
21+
**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_ty/src/diagnostics.rs#L162[diagnostics.rs]
22+
23+
This diagnostic is triggered if `match` block is missing one or more match arms.
24+
25+
26+
=== missing-ok-in-tail-expr
27+
**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_ty/src/diagnostics.rs#L187[diagnostics.rs]
28+
29+
This diagnostic is triggered if block that should return `Result` returns a value not wrapped in `Ok`.
30+
31+
Example:
32+
33+
```rust
34+
fn foo() -> Result<u8, ()> {
35+
10
36+
}
37+
```
38+
39+
40+
=== missing-pat-fields
41+
**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_ty/src/diagnostics.rs#L113[diagnostics.rs]
42+
43+
This diagnostic is triggered if pattern lacks some fields that exist in the corresponding structure.
44+
45+
Example:
46+
47+
```rust
48+
struct A { a: u8, b: u8 }
49+
50+
let a = A { a: 10, b: 20 };
51+
52+
if let A { a } = a {
53+
// ...
54+
}
55+
```
56+
57+
58+
=== missing-structure-fields
59+
**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_ty/src/diagnostics.rs#L66[diagnostics.rs]
60+
61+
This diagnostic is triggered if record lacks some fields that exist in the corresponding structure.
62+
63+
Example:
64+
65+
```rust
66+
struct A { a: u8, b: u8 }
67+
68+
let a = A { a: 10 };
69+
```
70+
71+
72+
=== missing-unsafe
73+
**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_ty/src/diagnostics.rs#L243[diagnostics.rs]
74+
75+
This diagnostic is triggered if operation marked as `unsafe` is used outside of `unsafe` function or block.
76+
77+
78+
=== no-such-field
79+
**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_ty/src/diagnostics.rs#L39[diagnostics.rs]
80+
81+
This diagnostic is triggered if created structure does not have field provided in record.
82+
83+
84+
=== unconfigured-code
85+
**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_def/src/diagnostics.rs#L90[diagnostics.rs]
86+
87+
This diagnostic is shown for code with inactive `#[cfg]` attributes.
88+
89+
90+
=== unresolved-extern-crate
91+
**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_def/src/diagnostics.rs#L35[diagnostics.rs]
92+
93+
This diagnostic is triggered if rust-analyzer is unable to discover referred extern crate.
94+
95+
96+
=== unresolved-import
97+
**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_def/src/diagnostics.rs#L59[diagnostics.rs]
98+
99+
This diagnostic is triggered if rust-analyzer is unable to discover imported module.
100+
101+
102+
=== unresolved-module
103+
**Source:** https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/hir_def/src/diagnostics.rs#L10[diagnostics.rs]
104+
105+
This diagnostic is triggered if rust-analyzer is unable to discover referred module.

xtask/src/codegen.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ mod gen_syntax;
99
mod gen_parser_tests;
1010
mod gen_assists_docs;
1111
mod gen_feature_docs;
12-
mod gen_features;
12+
mod gen_lint_completions;
1313
mod gen_diagnostic_docs;
1414

1515
use std::{
@@ -24,7 +24,7 @@ pub use self::{
2424
gen_assists_docs::{generate_assists_docs, generate_assists_tests},
2525
gen_diagnostic_docs::generate_diagnostic_docs,
2626
gen_feature_docs::generate_feature_docs,
27-
gen_features::generate_features,
27+
gen_lint_completions::generate_lint_completions,
2828
gen_parser_tests::generate_parser_tests,
2929
gen_syntax::generate_syntax,
3030
};
@@ -42,7 +42,7 @@ pub struct CodegenCmd {
4242
impl CodegenCmd {
4343
pub fn run(self) -> Result<()> {
4444
if self.features {
45-
generate_features(Mode::Overwrite)?;
45+
generate_lint_completions(Mode::Overwrite)?;
4646
}
4747
generate_syntax(Mode::Overwrite)?;
4848
generate_parser_tests(Mode::Overwrite)?;

0 commit comments

Comments
 (0)