@@ -704,59 +704,20 @@ impl<'s, P: LintLevelsProvider> LintLevelsBuilder<'s, P> {
704
704
let name = pprust:: path_to_string ( & meta_item. path ) ;
705
705
let lint_result =
706
706
self . store . check_lint_name ( & name, tool_name, self . registered_tools ) ;
707
- match & lint_result {
707
+
708
+ let ( ids, name) = match lint_result {
708
709
CheckLintNameResult :: Ok ( ids) => {
709
- // This checks for instances where the user writes
710
- // `#[expect(unfulfilled_lint_expectations)]` in that case we want to avoid
711
- // overriding the lint level but instead add an expectation that can't be
712
- // fulfilled. The lint message will include an explanation, that the
713
- // `unfulfilled_lint_expectations` lint can't be expected.
714
- if let Level :: Expect ( expect_id) = level {
715
- // The `unfulfilled_lint_expectations` lint is not part of any lint
716
- // groups. Therefore. we only need to check the slice if it contains a
717
- // single lint.
718
- let is_unfulfilled_lint_expectations = match ids {
719
- [ lint] => * lint == LintId :: of ( UNFULFILLED_LINT_EXPECTATIONS ) ,
720
- _ => false ,
721
- } ;
722
- self . provider . push_expectation (
723
- expect_id,
724
- LintExpectation :: new (
725
- reason,
726
- sp,
727
- is_unfulfilled_lint_expectations,
728
- tool_name,
729
- ) ,
730
- ) ;
731
- }
732
- let src = LintLevelSource :: Node {
733
- name : meta_item
734
- . path
735
- . segments
736
- . last ( )
737
- . expect ( "empty lint name" )
738
- . ident
739
- . name ,
740
- span : sp,
741
- reason,
742
- } ;
743
- for & id in * ids {
744
- if self . check_gated_lint ( id, attr. span , false ) {
745
- self . insert_spec ( id, ( level, src) ) ;
746
- }
747
- }
710
+ let name =
711
+ meta_item. path . segments . last ( ) . expect ( "empty lint name" ) . ident . name ;
712
+ ( ids, name)
748
713
}
749
714
750
715
CheckLintNameResult :: Tool ( ids, new_lint_name) => {
751
- let src = match new_lint_name {
716
+ let name = match new_lint_name {
752
717
None => {
753
718
let complete_name =
754
719
& format ! ( "{}::{}" , tool_ident. unwrap( ) . name, name) ;
755
- LintLevelSource :: Node {
756
- name : Symbol :: intern ( complete_name) ,
757
- span : sp,
758
- reason,
759
- }
720
+ Symbol :: intern ( complete_name)
760
721
}
761
722
Some ( new_lint_name) => {
762
723
self . emit_span_lint (
@@ -765,37 +726,24 @@ impl<'s, P: LintLevelsProvider> LintLevelsBuilder<'s, P> {
765
726
DeprecatedLintName {
766
727
name,
767
728
suggestion : sp,
768
- replace : new_lint_name,
729
+ replace : & new_lint_name,
769
730
} ,
770
731
) ;
771
- LintLevelSource :: Node {
772
- name : Symbol :: intern ( new_lint_name) ,
773
- span : sp,
774
- reason,
775
- }
732
+ Symbol :: intern ( & new_lint_name)
776
733
}
777
734
} ;
778
- for & id in * ids {
779
- if self . check_gated_lint ( id, attr. span , false ) {
780
- self . insert_spec ( id, ( level, src) ) ;
781
- }
782
- }
783
- if let Level :: Expect ( expect_id) = level {
784
- self . provider . push_expectation (
785
- expect_id,
786
- LintExpectation :: new ( reason, sp, false , tool_name) ,
787
- ) ;
788
- }
735
+ ( ids, name)
789
736
}
790
737
791
738
CheckLintNameResult :: MissingTool => {
792
739
// If `MissingTool` is returned, then either the lint does not
793
740
// exist in the tool or the code was not compiled with the tool and
794
741
// therefore the lint was never added to the `LintStore`. To detect
795
742
// this is the responsibility of the lint tool.
743
+ continue ;
796
744
}
797
745
798
- & CheckLintNameResult :: NoTool => {
746
+ CheckLintNameResult :: NoTool => {
799
747
sess. dcx ( ) . emit_err ( UnknownToolInScopedLint {
800
748
span : tool_ident. map ( |ident| ident. span ) ,
801
749
tool_name : tool_name. unwrap ( ) ,
@@ -805,58 +753,88 @@ impl<'s, P: LintLevelsProvider> LintLevelsBuilder<'s, P> {
805
753
continue ;
806
754
}
807
755
808
- _ if !self . lint_added_lints => { }
809
-
810
756
CheckLintNameResult :: Renamed ( ref replace) => {
811
- let suggestion =
812
- RenamedLintSuggestion :: WithSpan { suggestion : sp, replace } ;
813
- let name = tool_ident. map ( |tool| format ! ( "{tool}::{name}" ) ) . unwrap_or ( name) ;
814
- let lint = RenamedLint { name : name. as_str ( ) , suggestion } ;
815
- self . emit_span_lint ( RENAMED_AND_REMOVED_LINTS , sp. into ( ) , lint) ;
757
+ if self . lint_added_lints {
758
+ let suggestion =
759
+ RenamedLintSuggestion :: WithSpan { suggestion : sp, replace } ;
760
+ let name =
761
+ tool_ident. map ( |tool| format ! ( "{tool}::{name}" ) ) . unwrap_or ( name) ;
762
+ let lint = RenamedLint { name : name. as_str ( ) , suggestion } ;
763
+ self . emit_span_lint ( RENAMED_AND_REMOVED_LINTS , sp. into ( ) , lint) ;
764
+ }
765
+
766
+ // If this lint was renamed, apply the new lint instead of ignoring the
767
+ // attribute. Ignore any errors or warnings that happen because the new
768
+ // name is inaccurate.
769
+ // NOTE: `new_name` already includes the tool name, so we don't
770
+ // have to add it again.
771
+ let CheckLintNameResult :: Ok ( ids) =
772
+ self . store . check_lint_name ( replace, None , self . registered_tools )
773
+ else {
774
+ panic ! ( "renamed lint does not exist: {replace}" ) ;
775
+ } ;
776
+
777
+ ( ids, Symbol :: intern ( & replace) )
816
778
}
817
779
818
780
CheckLintNameResult :: Removed ( ref reason) => {
819
- let name = tool_ident. map ( |tool| format ! ( "{tool}::{name}" ) ) . unwrap_or ( name) ;
820
- let lint = RemovedLint { name : name. as_str ( ) , reason } ;
821
- self . emit_span_lint ( RENAMED_AND_REMOVED_LINTS , sp. into ( ) , lint) ;
781
+ if self . lint_added_lints {
782
+ let name =
783
+ tool_ident. map ( |tool| format ! ( "{tool}::{name}" ) ) . unwrap_or ( name) ;
784
+ let lint = RemovedLint { name : name. as_str ( ) , reason } ;
785
+ self . emit_span_lint ( RENAMED_AND_REMOVED_LINTS , sp. into ( ) , lint) ;
786
+ }
787
+ continue ;
822
788
}
823
789
824
790
CheckLintNameResult :: NoLint ( suggestion) => {
825
- let name = tool_ident. map ( |tool| format ! ( "{tool}::{name}" ) ) . unwrap_or ( name) ;
826
- let suggestion = suggestion. map ( |( replace, from_rustc) | {
827
- UnknownLintSuggestion :: WithSpan { suggestion : sp, replace, from_rustc }
828
- } ) ;
829
- let lint = UnknownLint { name, suggestion } ;
830
- self . emit_span_lint ( UNKNOWN_LINTS , sp. into ( ) , lint) ;
831
- }
832
- }
833
- // If this lint was renamed, apply the new lint instead of ignoring the attribute.
834
- // This happens outside of the match because the new lint should be applied even if
835
- // we don't warn about the name change.
836
- if let CheckLintNameResult :: Renamed ( new_name) = lint_result {
837
- // Ignore any errors or warnings that happen because the new name is inaccurate
838
- // NOTE: `new_name` already includes the tool name, so we don't have to add it
839
- // again.
840
- let CheckLintNameResult :: Ok ( ids) =
841
- self . store . check_lint_name ( & new_name, None , self . registered_tools )
842
- else {
843
- panic ! ( "renamed lint does not exist: {new_name}" ) ;
844
- } ;
845
-
846
- let src =
847
- LintLevelSource :: Node { name : Symbol :: intern ( & new_name) , span : sp, reason } ;
848
- for & id in ids {
849
- if self . check_gated_lint ( id, attr. span , false ) {
850
- self . insert_spec ( id, ( level, src) ) ;
791
+ if self . lint_added_lints {
792
+ let name =
793
+ tool_ident. map ( |tool| format ! ( "{tool}::{name}" ) ) . unwrap_or ( name) ;
794
+ let suggestion = suggestion. map ( |( replace, from_rustc) | {
795
+ UnknownLintSuggestion :: WithSpan {
796
+ suggestion : sp,
797
+ replace,
798
+ from_rustc,
799
+ }
800
+ } ) ;
801
+ let lint = UnknownLint { name, suggestion } ;
802
+ self . emit_span_lint ( UNKNOWN_LINTS , sp. into ( ) , lint) ;
851
803
}
804
+ continue ;
852
805
}
853
- if let Level :: Expect ( expect_id) = level {
854
- self . provider . push_expectation (
855
- expect_id,
856
- LintExpectation :: new ( reason, sp, false , tool_name) ,
857
- ) ;
806
+ } ;
807
+
808
+ let src = LintLevelSource :: Node { name, span : sp, reason } ;
809
+ for & id in ids {
810
+ if self . check_gated_lint ( id, attr. span , false ) {
811
+ self . insert_spec ( id, ( level, src) ) ;
858
812
}
859
813
}
814
+
815
+ // This checks for instances where the user writes
816
+ // `#[expect(unfulfilled_lint_expectations)]` in that case we want to avoid
817
+ // overriding the lint level but instead add an expectation that can't be
818
+ // fulfilled. The lint message will include an explanation, that the
819
+ // `unfulfilled_lint_expectations` lint can't be expected.
820
+ if let Level :: Expect ( expect_id) = level {
821
+ // The `unfulfilled_lint_expectations` lint is not part of any lint
822
+ // groups. Therefore. we only need to check the slice if it contains a
823
+ // single lint.
824
+ let is_unfulfilled_lint_expectations = match ids {
825
+ [ lint] => * lint == LintId :: of ( UNFULFILLED_LINT_EXPECTATIONS ) ,
826
+ _ => false ,
827
+ } ;
828
+ self . provider . push_expectation (
829
+ expect_id,
830
+ LintExpectation :: new (
831
+ reason,
832
+ sp,
833
+ is_unfulfilled_lint_expectations,
834
+ tool_name,
835
+ ) ,
836
+ ) ;
837
+ }
860
838
}
861
839
}
862
840
0 commit comments