False positives when detecting unused imports (RabbitMQ codebase)
Describe the bug
I tried to use elp to remove unused imports across RabbitMQ codebase.
However, there are two imports that I need to restore afterwards, for RabbitMQ to start.
To Reproduce**
git clone https://github.com/rabbitmq/rabbitmq-server.git
cd rabbitmq-server
elp lint --diagnostic-filter W0020 --apply-fix --in-place --include-tests
make start-cluster
The imports that are incorrectly removed are here:
-
https://github.com/rabbitmq/rabbitmq-server/blob/main/deps/rabbit/src/rabbit_amqp_util.erl#L9 Here the problem I think is related to the fact that
amqp10_framing.hrlis a generated file.rabbit_amqp_util.erlincludesrabbit_amqp.hrlwhich in turn includesamqp10_common/include/amqp10_framing.hrlbut this file doesn't exist if you start from a fresh repo. If you runmake start-clusterfirst and then run the sameelpcommand,rabbit_amqp_uti.erlis not modified byelp. -
https://github.com/rabbitmq/rabbitmq-server/blob/main/deps/rabbitmq_peer_discovery_consul/src/rabbitmq_peer_discovery_consul_health_check_helper.erl#L18 In this case, the need for the removed include file is "hidden" by a macro -
?CONFIG_MAPPINGexpands to code that uses thepeer_discovery_config_entry_metarecord.
Context
- ELP Version (output of
elp version):elp 1.1.0+build-2024-05-17
Thank you!
@mkuratczyk Thanks for reporting! While we work on a fix, you can prepend the problematic line with something like:
% elp:ignore L1500 W0020 - false positive (see https://github.com/WhatsApp/erlang-language-platform/issues/30)
Which will silent the linter (so you can run it from CLI periodically or in CI)
@alanz L1500 was the old error code for the diagnostic. It looks like we still report both.
L1500 is long gone, make sure you are using a recent version of ELP
ELP generally assumes header files are self-contained - this is violated in the 2nd case you describe since rabbit_peer_discovery_consul.hrl can't be included independently.
The "proper" fix from the view point of ELP and self-contained headers would be to move -include_lib("rabbitmq_peer_discovery_common/include/rabbit_peer_discovery.hrl"). into the header that defines the macro using the records from there, notably rabbit_peer_discovery_consul.hrl. The include_lib can be later removed from modules including rabbit_peer_discovery_consul.hrl.
yeah, that makes sense. we can solve the second case on our side