cairo-language-server 2.20.0

The Cairo Language Server
Documentation
use lsp_types::Hover;

use crate::support::insta::{test_transform_plain, test_transform_with_macros};

#[test]
fn const_item_via_declaration() {
    test_transform_plain!(Hover, r#"
    const FO<caret>O: u32 = 42;
    "#, @r#"
    source_context = """
    const FO<caret>O: u32 = 42;
    """
    highlight = """
    const <sel>FOO</sel>: u32 = 42;
    """
    popover = """
    ```cairo
    hello
    ```
    ```cairo
    const FOO: u32 = 42;
    ```
    """
    "#);
}

#[test]
fn const_item_via_declaration_macro() {
    test_transform_with_macros!(Hover, r#"
    #[complex_attribute_macro_v2]
    const FO<caret>O: u32 = 42;
    "#, @r#"
    source_context = """
    const FO<caret>O: u32 = 42;
    """
    highlight = """
    const <sel>FOO</sel>: u32 = 42;
    """
    popover = """
    ```cairo
    hello
    ```
    ```cairo
    const FOO: u32 = 42;
    ```
    """
    "#);
}

#[test]
fn const_item_via_expr() {
    test_transform_plain!(Hover, r#"
    const FOO: u32 = 42;
    fn main() { let _ = FO<caret>O; }
    "#, @r#"
    source_context = """
    fn main() { let _ = FO<caret>O; }
    """
    highlight = """
    fn main() { let _ = <sel>FOO</sel>; }
    """
    popover = """
    ```cairo
    hello
    ```
    ```cairo
    const FOO: u32 = 42;
    ```
    """
    "#);
}

#[test]
fn const_item_via_other_const_expr() {
    test_transform_plain!(Hover, r#"
    const FOO: u32 = 42;
    const BAR: u32 = FO<caret>O * 2;
    "#, @r#"
    source_context = """
    const BAR: u32 = FO<caret>O * 2;
    """
    highlight = """
    const BAR: u32 = <sel>FOO</sel> * 2;
    """
    popover = """
    ```cairo
    hello
    ```
    ```cairo
    const FOO: u32 = 42;
    ```
    """
    "#);
}

#[test]
fn associated_const_via_trait_declaration() {
    test_transform_plain!(Hover, r#"
    trait Shape<T> { const SIDE<caret>S: u32; }
    "#, @r#"
    source_context = """
    trait Shape<T> { const SIDE<caret>S: u32; }
    """
    highlight = """
    trait Shape<T> { const <sel>SIDES</sel>: u32; }
    """
    popover = """
    ```cairo
    hello::Shape
    ```
    ```cairo
    trait Shape<T>
    const SIDES: u32;
    ```
    """
    "#);
}

#[test]
fn associated_const_via_impl_definition() {
    test_transform_plain!(Hover, r#"
    trait Shape<T> { const SIDES: u32; }
    struct Triangle {}
    impl TriangleShape of Shape<Triangle> { const SIDE<caret>S: u32 = 3; }
    "#, @r#"
    source_context = """
    impl TriangleShape of Shape<Triangle> { const SIDE<caret>S: u32 = 3; }
    """
    highlight = """
    impl TriangleShape of Shape<Triangle> { const <sel>SIDES</sel>: u32 = 3; }
    """
    popover = """
    ```cairo
    hello::TriangleShape
    ```
    ```cairo
    impl TriangleShape of Shape<Triangle>;
    const SIDES: u32 = 3;
    ```
    """
    "#);
}

#[test]
fn associated_const_via_expr_use() {
    test_transform_plain!(Hover, r#"
    trait Shape<T> { const SIDES: u32; }
    struct Triangle {}
    impl TriangleShape of Shape<Triangle> { const SIDES: u32 = 3; }
    fn print_shape_info<T, impl ShapeImpl: Shape<T>>() {
        let _ = ShapeImpl::SIDE<caret>S;
    }
    "#, @r#"
    source_context = """
        let _ = ShapeImpl::SIDE<caret>S;
    """
    highlight = """
        let _ = ShapeImpl::<sel>SIDES</sel>;
    """
    popover = """
    ```cairo
    hello::Shape
    ```
    ```cairo
    trait Shape<T>
    const SIDES: u32;
    ```
    """
    "#);
}