cairo-language-server 2.20.0

The Cairo Language Server
Documentation
use crate::code_actions::{
    quick_fix, quick_fix_with_macros, quick_fix_with_scarb_macros,
    quick_fix_without_visibility_constraints,
};
use crate::support::insta::test_transform;

#[test]
fn single() {
    test_transform!(quick_fix, "
    mod aa {
        pub mod bb {
            fn cc() {}
        }

        pub fn cc() {}
    }

    fn test() {
        c<caret>c()
    }
    ", @r#"
    Title: Import `aa::cc`
    Add new text: "use aa::cc;

    "
    At: Range { start: Position { line: 0, character: 0 }, end: Position { line: 0, character: 0 } }
    Title: Fix All
    Add new text: "use aa::cc;

    "
    At: Range { start: Position { line: 0, character: 0 }, end: Position { line: 0, character: 0 } }
    "#);
}

#[test]
fn multiple() {
    test_transform!(quick_fix, "
    mod aa {
        pub mod bb {
            pub fn cc() {}
        }

        pub fn cc() {}
    }

    fn test() {
        c<caret>c()
    }
    ", @r#"
    Title: Import `aa::cc`
    Add new text: "use aa::cc;

    "
    At: Range { start: Position { line: 0, character: 0 }, end: Position { line: 0, character: 0 } }
    Title: Import `aa::bb::cc`
    Add new text: "use aa::bb::cc;

    "
    At: Range { start: Position { line: 0, character: 0 }, end: Position { line: 0, character: 0 } }
    "#);
}

#[test]
fn ignoring_visibility() {
    test_transform!(quick_fix_without_visibility_constraints, "
    mod aa {
        pub mod bb {
            fn cc() {}
        }

        pub fn cc() {}
    }

    fn test() {
        c<caret>c()
    }
    ", @r#"
    Title: Import `aa::cc`
    Add new text: "use aa::cc;

    "
    At: Range { start: Position { line: 0, character: 0 }, end: Position { line: 0, character: 0 } }
    Title: Import `aa::bb::cc`
    Add new text: "use aa::bb::cc;

    "
    At: Range { start: Position { line: 0, character: 0 }, end: Position { line: 0, character: 0 } }
    "#);
}

#[test]
fn non_existent() {
    test_transform!(quick_fix, "
    mod aa {
        pub mod bb {
            fn cc() {}
        }

        pub fn cc() {}
    }

    fn test() {
        now_way<caret>::this_exists
    }
    ", @"No code actions.");
}

#[test]
fn generic_path() {
    test_transform!(quick_fix, "
    mod aa {
        pub mod bb {
            pub fn cc<T>(a: T) {}
        }

        pub fn cc() {}
    }

    fn test() {
        bb<caret>::cc::<felt252>()
    }
    ", @r#"
    Title: Import `aa::bb`
    Add new text: "use aa::bb;

    "
    At: Range { start: Position { line: 0, character: 0 }, end: Position { line: 0, character: 0 } }
    Title: Fix All
    Add new text: "use aa::bb;

    "
    At: Range { start: Position { line: 0, character: 0 }, end: Position { line: 0, character: 0 } }
    "#);
}

#[test]
fn generic_path_on_generic() {
    test_transform!(quick_fix, "
    mod aa {
        pub mod bb {
            pub fn cc<T>(a: T) {}
        }

        pub fn cc() {}
    }

    fn test() {
        bb::cc::<fel<caret>t252>()
    }
    ", @"No code actions.");
}

#[test]
fn fix_all() {
    test_transform!(quick_fix, "
    mod aa {
        pub mod bb {
            pub fn cc<T>(a: @T) {}
        }

        pub fn dd() {}
    }

    fn test() {
        <sel>
        bb::cc();
        dd();
        </sel>
    }
    ", @r#"
    Title: Import `aa::bb`
    Add new text: "use aa::bb;

    "
    At: Range { start: Position { line: 0, character: 0 }, end: Position { line: 0, character: 0 } }
    Title: Import `aa::dd`
    Add new text: "use aa::dd;

    "
    At: Range { start: Position { line: 0, character: 0 }, end: Position { line: 0, character: 0 } }
    Title: Fix All
    Add new text: "use aa::bb;

    "
    At: Range { start: Position { line: 0, character: 0 }, end: Position { line: 0, character: 0 } }
    Add new text: "use aa::dd;

    "
    At: Range { start: Position { line: 0, character: 0 }, end: Position { line: 0, character: 0 } }
    "#);
}

#[test]
fn in_proc_macro_controlled_code() {
    test_transform!(quick_fix_with_macros, "
    mod aa {
        pub mod bb {
            pub fn cc<T>(a: @T) {}
        }

        pub fn dd() {}
    }

    #[test]
    fn test() {
        b<caret>b::cc();
    }
    ", @r#"
    Title: Import `aa::bb`
    Add new text: "use aa::bb;

    "
    At: Range { start: Position { line: 0, character: 0 }, end: Position { line: 0, character: 0 } }
    Title: Fix All
    Add new text: "use aa::bb;

    "
    At: Range { start: Position { line: 0, character: 0 }, end: Position { line: 0, character: 0 } }
    "#);
}

#[test]
fn in_inline_macro() {
    test_transform!(quick_fix, "
    mod aa {
        pub fn cc() -> u32 { 1 }
    }

    fn test() {
        assert_eq!(c<caret>c(), 1_u32)
    }
    ", @r#"
    Title: Import `aa::cc`
    Add new text: "use aa::cc;

    "
    At: Range { start: Position { line: 0, character: 0 }, end: Position { line: 0, character: 0 } }
    Title: Fix All
    Add new text: "use aa::cc;

    "
    At: Range { start: Position { line: 0, character: 0 }, end: Position { line: 0, character: 0 } }
    Title: Expand macro recursively at caret
    "#);
}

#[test]
fn in_proc_macro_wrapping_assert() {
    test_transform!(quick_fix_with_scarb_macros, "
    mod aa {
        pub fn cc() -> bool { true }
    }

    #[test]
    fn test() {
        simple_inline_macro_v2!(assert!(c<caret>c()))
    }
    ", @r#"
    Title: Import `aa::cc`
    Add new text: "use aa::cc;

    "
    At: Range { start: Position { line: 0, character: 0 }, end: Position { line: 0, character: 0 } }
    Title: Fix All
    Add new text: "use aa::cc;

    "
    At: Range { start: Position { line: 0, character: 0 }, end: Position { line: 0, character: 0 } }
    Title: Expand macro recursively at caret
    "#);
}