ruff
9aa43d5f - Separate `red_knot` into CLI and `red_knot_workspace` crates (#12623)

Comment changes are shownComment changes are hidden
Commit
353 days ago
Separate `red_knot` into CLI and `red_knot_workspace` crates (#12623) ## Summary This PR separates the current `red_knot` crate into two crates: 1. `red_knot` - This will be similar to the `ruff` crate, it'll act as the CLI crate 2. `red_knot_workspace` - This includes everything except for the CLI functionality from the existing `red_knot` crate Note that the code related to the file watcher is in `red_knot_workspace` for now but might be required to extract it out in the future. The main motivation for this change is so that we can have a `red_knot server` command. This makes it easier to test the server out without making any changes in the VS Code extension. All we need is to specify the `red_knot` executable path in `ruff.path` extension setting. ## Test Plan - `cargo build` - `cargo clippy --workspace --all-targets --all-features` - `cargo shear --fix`
Author
Parents
  • File
    .pre-commit-config.yaml
  • File
    Cargo.lock
  • File
    Cargo.toml
  • crates
    • red_knot
      • File
        Cargo.toml
      • src
        • File
          main.rs
      • tests
        • File
          file_watching.rs
    • red_knot_workspace
      • File
        Cargo.toml
      • resources/test/corpus
        • File
          00_const.py
        • File
          00_empty.py
        • File
          00_expr_discard.py
        • File
          00_expr_var1.py
        • File
          01_expr_unary.py
        • File
          02_expr_attr.py
        • File
          02_expr_attr_multiline.py
        • File
          02_expr_attr_multiline_assign.py
        • File
          02_expr_bin_bool.py
        • File
          02_expr_binary.py
        • File
          02_expr_bool_op_multiline.py
        • File
          02_expr_bool_op_multiline2.py
        • File
          02_expr_rel.py
        • File
          02_expr_rel_multiple.py
        • File
          02_expr_subscr.py
        • File
          03_dict.py
        • File
          03_dict_ex.py
        • File
          03_dict_literal_large.py
        • File
          03_dict_unpack_huge.py
        • File
          03_list.py
        • File
          03_list_ex.py
        • File
          03_list_large.py
        • File
          03_set.py
        • File
          03_set_multi.py
        • File
          03_slice.py
        • File
          03_slice_ext.py
        • File
          03_tuple.py
        • File
          03_tuple_ex.py
        • File
          04_assign.py
        • File
          04_assign_attr.py
        • File
          04_assign_attr_func.py
        • File
          04_assign_subscr.py
        • File
          04_assign_unpack.py
        • File
          04_assign_unpack_ex.py
        • File
          04_assign_unpack_tuple.py
        • File
          04_aug_assign.py
        • File
          04_aug_assign_attr_multiline.py
        • File
          04_aug_assign_attr_sub.py
        • File
          05_funcall.py
        • File
          05_funcall_1.py
        • File
          05_funcall_2.py
        • File
          05_funcall_in_multiline_tuple.py
        • File
          05_funcall_kw.py
        • File
          05_funcall_kw_many.py
        • File
          05_funcall_kw_pos.py
        • File
          05_funcall_method_multiline.py
        • File
          06_funcall_kwargs.py
        • File
          06_funcall_many_args.py
        • File
          06_funcall_starargs_ex.py
        • File
          06_funcall_varargs.py
        • File
          06_funcall_varargs_kwargs.py
        • File
          06_funcall_varargs_kwargs_mixed.py
        • File
          07_ifexpr.py
        • File
          07_ifexpr_multiline.py
        • File
          07_ifexpr_multiline2.py
        • File
          08_del.py
        • File
          08_del_multi.py
        • File
          09_pass.py
        • File
          10_if.py
        • File
          10_if_chained_compare.py
        • File
          10_if_false.py
        • File
          10_if_true.py
        • File
          11_if_else.py
        • File
          11_if_else_deeply_nested_for.py
        • File
          11_if_else_false.py
        • File
          11_if_else_true.py
        • File
          12_if_elif.py
        • File
          12_if_elif_else.py
        • File
          13_ifelse_complex1.py
        • File
          13_ifelse_many.py
        • File
          15_while.py
        • File
          15_while_break.py
        • File
          15_while_break_in_finally.py
        • File
          15_while_break_non_empty.py
        • File
          15_while_break_non_exit.py
        • File
          15_while_continue.py
        • File
          15_while_false.py
        • File
          15_while_infinite.py
        • File
          15_while_true.py
        • File
          16_for.py
        • File
          16_for_break.py
        • File
          16_for_continue.py
        • File
          16_for_else.py
        • File
          16_for_list_literal.py
        • File
          16_for_nested_ifs.py
        • File
          20_lambda.py
        • File
          20_lambda_const.py
        • File
          20_lambda_default_arg.py
        • File
          20_lambda_ifelse.py
        • File
          21_func1.py
        • File
          21_func1_ret.py
        • File
          21_func_assign.py
        • File
          21_func_assign2.py
        • File
          22_func_arg.py
        • File
          22_func_vararg.py
        • File
          23_func_ret.py
        • File
          23_func_ret_val.py
        • File
          24_func_if_ret.py
        • File
          24_func_ifelse_ret.py
        • File
          24_func_ifnot_ret.py
        • File
          25_func_annotations.py
        • File
          25_func_annotations_nested.py
        • File
          25_func_annotations_scope.py
        • File
          26_func_const_defaults.py
        • File
          27_func_generic.py
        • File
          27_func_generic_bound.py
        • File
          27_func_generic_constraint.py
        • File
          27_func_generic_default.py
        • File
          27_func_generic_paramspec.py
        • File
          27_func_generic_paramspec_default.py
        • File
          27_func_generic_tuple.py
        • File
          27_func_generic_tuple_default.py
        • File
          30_func_enclosed.py
        • File
          30_func_enclosed_many.py
        • File
          31_func_global.py
        • File
          31_func_global_annotated_later.py
        • File
          31_func_nonlocal.py
        • File
          32_func_global_nested.py
        • File
          33_func_with_docstring_optimizable_tuple_and_return.py
        • File
          40_import.py
        • File
          41_from_import.py
        • File
          42_import_from_dot.py
        • File
          50_yield.py
        • File
          51_gen_comp.py
        • File
          51_gen_comp2.py
        • File
          52_gen_comp_if.py
        • File
          53_dict_comp.py
        • File
          53_list_comp.py
        • File
          53_list_comp_method.py
        • File
          53_set_comp.py
        • File
          54_list_comp_func.py
        • File
          54_list_comp_lambda.py
        • File
          54_list_comp_lambda_listcomp.py
        • File
          54_list_comp_recur_func.py
        • File
          55_list_comp_nested.py
        • File
          56_yield_from.py
        • File
          57_await.py
        • File
          58_async_for.py
        • File
          58_async_for_break.py
        • File
          58_async_for_continue.py
        • File
          58_async_for_dict_comp.py
        • File
          58_async_for_else.py
        • File
          58_async_for_gen_comp.py
        • File
          58_async_for_list_comp.py
        • File
          58_async_for_set_comp.py
        • File
          59_async_with.py
        • File
          59_async_with_nested_with.py
        • File
          60_try_except.py
        • File
          60_try_except2.py
        • File
          60_try_except_bare.py
        • File
          60_try_finally.py
        • File
          60_try_finally_codeobj.py
        • File
          60_try_finally_cond.py
        • File
          60_try_finally_for.py
        • File
          60_try_finally_ret.py
        • File
          61_try_except_finally.py
        • File
          62_try_except_as.py
        • File
          62_try_except_break.py
        • File
          62_try_except_cond.py
        • File
          62_try_except_double_nested_inside_if_else.py
        • File
          62_try_except_return.py
        • File
          63_raise.py
        • File
          63_raise_func.py
        • File
          63_raise_x.py
        • File
          63_raise_x_from_y.py
        • File
          64_assert.py
        • File
          67_with.py
        • File
          67_with_as.py
        • File
          67_with_as_func.py
        • File
          67_with_cond_return.py
        • File
          67_with_inside_try_finally_multiple_terminal_elif.py
        • File
          67_with_inside_try_finally_preceding_terminal_except.py
        • File
          67_with_multi_exit.py
        • File
          67_with_return.py
        • File
          68_with2.py
        • File
          69_for_try_except_continue1.py
        • File
          69_for_try_except_continue2.py
        • File
          69_for_try_except_continue3.py
        • File
          70_class.py
        • File
          70_class_base.py
        • File
          70_class_doc_str.py
        • File
          71_class_meth.py
        • File
          71_class_var.py
        • File
          72_class_mix.py
        • File
          73_class_generic.py
        • File
          73_class_generic_bounds.py
        • File
          73_class_generic_constraints.py
        • File
          73_class_generic_defaults.py
        • File
          73_class_generic_paramspec.py
        • File
          73_class_generic_paramspec_default.py
        • File
          73_class_generic_tuple.py
        • File
          73_class_generic_tuple_default.py
        • File
          74_class_kwargs.py
        • File
          74_class_kwargs_2.py
        • File
          74_class_super.py
        • File
          74_class_super_nested.py
        • File
          74_just_super.py
        • File
          75_classderef.py
        • File
          75_classderef_no.py
        • File
          76_class_nonlocal1.py
        • File
          76_class_nonlocal2.py
        • File
          76_class_nonlocal3.py
        • File
          76_class_nonlocal4.py
        • File
          76_class_nonlocal5.py
        • File
          77_class__class__.py
        • File
          77_class__class__nested.py
        • File
          77_class__class__no_class.py
        • File
          77_class__class__nonlocals.py
        • File
          77_class__class__nonlocals_2.py
        • File
          77_class__class__param.py
        • File
          77_class__class__param_lambda.py
        • File
          78_class_body_cond.py
        • File
          78_class_dec.py
        • File
          78_class_dec_member.py
        • File
          78_class_dec_member_func.py
        • File
          79_metaclass.py
        • File
          80_func_kwonlyargs1.py
        • File
          80_func_kwonlyargs2.py
        • File
          80_func_kwonlyargs3.py
        • File
          81_func_kwonlyargs_defaults.py
        • File
          85_match.py
        • File
          85_match_as.py
        • File
          85_match_attr.py
        • File
          85_match_class.py
        • File
          85_match_default.py
        • File
          85_match_guard.py
        • File
          85_match_in_func.py
        • File
          85_match_in_func_with_rest.py
        • File
          85_match_in_func_with_star.py
        • File
          85_match_mapping.py
        • File
          85_match_mapping_subpattern.py
        • File
          85_match_or.py
        • File
          85_match_sequence.py
        • File
          85_match_sequence_wildcard.py
        • File
          85_match_singleton.py
        • File
          89_type_alias.py
        • File
          90_docstring_class.py
        • File
          90_docstring_func.py
        • File
          90_docstring_mod.py
        • File
          91_line_numbers1.py
        • File
          91_line_numbers2.py
        • File
          91_line_numbers2_comp.py
        • File
          91_line_numbers3.py
        • File
          91_line_numbers4.py
        • File
          91_line_numbers_dict.py
        • File
          91_line_numbers_dict_comp.py
        • File
          92_qual_class_in_class.py
        • File
          92_qual_class_in_func.py
        • File
          93_deadcode.py
        • File
          94_strformat.py
        • File
          94_strformat_complex.py
        • File
          94_strformat_conv.py
        • File
          94_strformat_spec.py
        • File
          95_annotation_assign_subscript_no_rhs.py
        • File
          95_annotation_assign_tuple.py
        • File
          95_annotation_class.py
        • File
          95_annotation_class_multiline.py
        • File
          95_annotation_class_no_value.py
        • File
          95_annotation_func.py
        • File
          95_annotation_func_future.py
        • File
          95_annotation_global.py
        • File
          95_annotation_global_simple.py
        • File
          95_annotation_local_attr.py
        • File
          95_annotation_module.py
        • File
          96_debug.py
        • File
          97_global_nonlocal_store.py
        • File
          98_ann_assign_annotation_future_annotations.py
        • File
          98_ann_assign_annotation_wrong_future.py
        • File
          98_ann_assign_simple_annotation.py
        • File
          99_empty_jump_target_insts.py
      • src
        • File
          db.rs
        • db
          • File
            changes.rs
        • File
          lib.rs
        • File
          lint.rs
        • File
          watch.rs
        • watch
          • File
            watcher.rs
          • File
            workspace_watcher.rs
        • File
          workspace.rs
        • workspace
          • File
            files.rs
          • File
            metadata.rs
      • tests
        • File
          check.rs
    • ruff_benchmark
      • File
        Cargo.toml
      • benches
        • File
          red_knot.rs