@@ -2736,6 +2736,87 @@ TEST(test_lint_delete, deleting_local_variable_is_a_warning) {
2736
2736
offsets_matcher (&delete_expression, 0 , u8" delete x" ))));
2737
2737
}
2738
2738
2739
+ TEST (test_lint_delete, deleting_local_variable_declared_later_is_a_warning) {
2740
+ const char8 declaration[] = u8" v" ;
2741
+ padded_string delete_expression (u8" delete v" _sv);
2742
+ source_code_span delete_keyword_span (delete_expression.data (),
2743
+ delete_expression.data () + 6 );
2744
+ ASSERT_EQ (delete_keyword_span.string_view (), u8" delete" _sv);
2745
+ source_code_span deleted_variable_span (delete_expression.data () + 7 ,
2746
+ delete_expression.data () + 8 );
2747
+ ASSERT_EQ (deleted_variable_span.string_view (), u8" v" _sv);
2748
+
2749
+ // (() => {
2750
+ // delete v;
2751
+ // let v;
2752
+ // });
2753
+ error_collector v;
2754
+ linter l (&v, &default_globals);
2755
+ l.visit_enter_function_scope ();
2756
+ l.visit_enter_function_scope_body ();
2757
+ l.visit_variable_delete_use (identifier (deleted_variable_span),
2758
+ delete_keyword_span);
2759
+ l.visit_variable_declaration (identifier_of (declaration), variable_kind::_let);
2760
+ l.visit_exit_function_scope ();
2761
+ l.visit_end_of_module ();
2762
+
2763
+ EXPECT_THAT (
2764
+ v.errors ,
2765
+ ElementsAre (ERROR_TYPE_FIELD (
2766
+ error_redundant_delete_statement_on_variable, delete_expression,
2767
+ offsets_matcher (&delete_expression, 0 , u8" delete x" ))));
2768
+ }
2769
+
2770
+ TEST (test_lint_delete, deleting_declared_module_variable_is_a_warning) {
2771
+ const char8 declaration[] = u8" v" ;
2772
+ padded_string delete_expression (u8" delete v" _sv);
2773
+ source_code_span delete_keyword_span (delete_expression.data (),
2774
+ delete_expression.data () + 6 );
2775
+ ASSERT_EQ (delete_keyword_span.string_view (), u8" delete" _sv);
2776
+ source_code_span deleted_variable_span (delete_expression.data () + 7 ,
2777
+ delete_expression.data () + 8 );
2778
+ ASSERT_EQ (deleted_variable_span.string_view (), u8" v" _sv);
2779
+
2780
+ // let v;
2781
+ // delete v;
2782
+ error_collector v;
2783
+ linter l (&v, &default_globals);
2784
+ l.visit_variable_declaration (identifier_of (declaration), variable_kind::_let);
2785
+ l.visit_variable_delete_use (identifier (deleted_variable_span),
2786
+ delete_keyword_span);
2787
+ l.visit_end_of_module ();
2788
+
2789
+ EXPECT_THAT (
2790
+ v.errors ,
2791
+ ElementsAre (ERROR_TYPE_FIELD (
2792
+ error_redundant_delete_statement_on_variable, delete_expression,
2793
+ offsets_matcher (&delete_expression, 0 , u8" delete x" ))));
2794
+ }
2795
+
2796
+ TEST (test_lint_delete, deleting_declared_global_variable_is_a_warning) {
2797
+ padded_string code (u8" delete myGlobalVariable" _sv);
2798
+ source_code_span delete_keyword_span (code.data (), code.data () + 6 );
2799
+ ASSERT_EQ (delete_keyword_span.string_view (), u8" delete" _sv);
2800
+ source_code_span deleted_variable_span (code.data () + 7 , code.data () + 23 );
2801
+ ASSERT_EQ (deleted_variable_span.string_view (), u8" myGlobalVariable" _sv);
2802
+
2803
+ configuration config;
2804
+ config.add_global_variable (global_declared_variable{
2805
+ .name = u8" myGlobalVariable" ,
2806
+ .is_writable = true ,
2807
+ .is_shadowable = true ,
2808
+ });
2809
+
2810
+ // delete myGlobalVariable;
2811
+ error_collector v;
2812
+ linter l (&v, &config.globals ());
2813
+ l.visit_variable_delete_use (identifier (deleted_variable_span),
2814
+ delete_keyword_span);
2815
+ l.visit_end_of_module ();
2816
+
2817
+ EXPECT_THAT (v.errors , IsEmpty ());
2818
+ }
2819
+
2739
2820
TEST (test_lint_typeof, using_undeclared_variable_in_typeof_is_not_an_error) {
2740
2821
const char8 use[] = u8" v" ;
2741
2822
0 commit comments