Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Several lints do not check against alternative method syntax #94

Open
BD103 opened this issue Sep 19, 2024 · 1 comment
Open

Several lints do not check against alternative method syntax #94

BD103 opened this issue Sep 19, 2024 · 1 comment
Labels
A-Linter Related to the linter and custom lints C-Bug A bug in the program

Comments

@BD103
Copy link
Member

BD103 commented Sep 19, 2024

The following code does not raise any warnings:

#[derive(Event)]
struct MyEvent;

fn main() {
    let mut app = App::new();
    App::init_resource::<Events<MyEvent>>(&mut app);
    App::run(&mut app);
}

This is likely because both lints match against just ExprKind::MethodCall, when they should also be looking for normal function calls.

Not sure if this bug will come up often, so this is probably low-priority.

@BD103 BD103 added A-CI Related to CI and GitHub Actions C-Bug A bug in the program labels Sep 19, 2024
BD103 added a commit that referenced this issue Sep 27, 2024
As per @alice-i-cecile's request! Closes #58.

This adds the `bevy::panicking_query_methods` lint, which searches for
usage of panicking methods like `Query::single()`. It is currently
`Allow`-by-default, so you need to explicitly opt-in to use it. (In the
[project](https://github.com/orgs/TheBevyFlock/projects/3/views/1?sliceBy%5Bvalue%5D=Restriction)
it's under the Restriction category.)

This lint checks both `Query` and `QueryState`. I will write a lint for
resources in another PR. :)

## Testing

Wow, I'm so glad you asked! (You asked how to test this lint, right?)

I used the following example when testing. Paste it into
`bevy_lint/examples/lint_test.rs`, run `cd bevy_lint`, then run `cargo
build && cargo run -- --example lint_test`.

```rust
#![feature(register_tool)]
#![register_tool(bevy)]

#![deny(bevy::panicking_query_methods)]
#![deny(bevy::panicking_world_methods)]

use bevy::prelude::*;

#[derive(Component)]
struct MyComponent;

#[derive(Resource)]
struct MyResource;

fn main() {
    App::new().add_systems(Update, my_system);

    let mut world = World::new();

    let mut query_state = QueryState::<&mut MyComponent>::new(&mut world);
    let _ = query_state.single_mut(&mut world);

    world.insert_resource(MyResource);
    let _ = world.resource::<MyResource>();
}

fn my_system(query: Query<&MyComponent>) {
    let _ = query.many([]);
}
```

The warnings should look like this:

```bash
error: called a `QueryState` method that can panic when a non-panicking alternative exists
  --> bevy_lint/examples/lint_test.rs:21:25
   |
21 |     let _ = query_state.single_mut(&mut world);
   |                         ^^^^^^^^^^^^^^^^^^^^^^
   |
   = help: use `query_state.get_single_mut(&mut world)` and handle the `Option` or `Result`
note: the lint level is defined here
  --> bevy_lint/examples/lint_test.rs:4:9
   |
4  | #![deny(bevy::panicking_query_methods)]
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: called a `World` method that can panic when a non-panicking alternative exists
  --> bevy_lint/examples/lint_test.rs:24:19
   |
24 |     let _ = world.resource::<MyResource>();
   |                   ^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = help: use `world.get_resource::<MyResource>()` and handle the `Option` or `Result`
note: the lint level is defined here
  --> bevy_lint/examples/lint_test.rs:5:9
   |
5  | #![deny(bevy::panicking_world_methods)]
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: called a `Query` method that can panic when a non-panicking alternative exists
  --> bevy_lint/examples/lint_test.rs:28:19
   |
28 |     let _ = query.many([]);
   |                   ^^^^^^^^
   |
   = help: use `query.get_many([])` and handle the `Option` or `Result`
```

Fiddle around with it and try to break it! Good luck, though. Unless you
use #94, this is the most foolproof lint I've written so far! >:D
@BD103
Copy link
Member Author

BD103 commented Oct 8, 2024

This also occurs in panicking_query_methods and panicking_world_methods.

In total, the following lints are affected:

  • main_return_without_appexit
  • insert_event_resource
  • panicking_query_methods
  • panicking_world_methods

@BD103 BD103 changed the title main_return_without_appexit and insert_event_resource do not lint against alternative method syntax Several lints do not check against alternative method syntax Oct 8, 2024
@BD103 BD103 added A-Linter Related to the linter and custom lints and removed A-CI Related to CI and GitHub Actions labels Nov 3, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-Linter Related to the linter and custom lints C-Bug A bug in the program
Projects
None yet
Development

No branches or pull requests

1 participant