ink-analyzer 0.9.2

A library for semantic analysis of ink! smart contract code.
Documentation
# ![icon]https://raw.githubusercontent.com/ink-analyzer/ink-analyzer/master/images/iconx32.png "icon" ink! Analyzer

A library for semantic analysis of [ink!](https://use.ink/) smart contract code.

It implements utilities for performing semantic analysis of ink! smart contract code.
It therefore implements the core functionality of ink! analyzer at a high level.

It currently implements an [Analysis](https://github.com/ink-analyzer/ink-analyzer/blob/master/crates/analyzer/src/analysis.rs) entry point that accepts a string representation (`&str`) of ink! smart contract code as input and defines associated methods that compute:

- [diagnostics]https://github.com/ink-analyzer/ink-analyzer/blob/master/crates/analyzer/src/analysis/diagnostics.rs - errors and warnings based on ink! semantic rules.
- [quickfixes]/crates/analyzer/src/analysis/diagnostics.rs - suggested edits/code actions for diagnostic errors and warnings.
- [completions]https://github.com/ink-analyzer/ink-analyzer/blob/master/crates/analyzer/src/analysis/completions.rs - completion suggestions for ink! attribute macros and arguments.
- [code/intent actions]https://github.com/ink-analyzer/ink-analyzer/blob/master/crates/analyzer/src/analysis/actions.rs - contextual assists for adding relevant ink! attribute macros, arguments and entities.
- [hover content]https://github.com/ink-analyzer/ink-analyzer/blob/master/crates/analyzer/src/analysis/hover.rs - descriptive/informational text for ink! attribute macros and arguments.
- [inlay hints]https://github.com/ink-analyzer/ink-analyzer/blob/master/crates/analyzer/src/analysis/inlay_hints.rs - inline type and format information for ink! attribute arguments values
  (e.g. `u32 | _ | @` for ink! message selectors).
- [signature help]https://github.com/ink-analyzer/ink-analyzer/blob/master/crates/analyzer/src/analysis/signature_help.rs - popup information for valid ink! attribute arguments for the current context/cursor position.

## Installation

Run the following Cargo command in your project directory

```shell
cargo add ink-analyzer
```

## Usage

### Example:
Analyzing ink! smart contract code.

```rust
use ink_analyzer::{Analysis, TextSize, TextRange, Version};

fn do_analysis() {
    // Smart contract code.
    let code = r#"
        #[ink::contract]
        mod my_contract {

            #[ink(storage)]
            pub struct MyContract {
                value: bool,
            }

            // --snip--
        }
    "#;

    // Creates analysis snapshot.
    let analysis = Analysis::new(code, Version::V4);

    // Computes diagnostics.
    let diagnostics = analysis.diagnostics();
    dbg!(&diagnostics);

    // Sets the cursor position.
    let position = TextSize::from(9);

    // Computes completions.
    let completions = analysis.completions(position);
    dbg!(&completions);

    // Sets the focus range.
    let range = TextRange::new(position, TextSize::from(25));

    // Computes code/intent actions.
    let actions = analysis.actions(range);
    dbg!(&actions);

    // Gets hover content.
    let hover = analysis.hover(range);
    dbg!(&hover);

    // Computes inlay hints.
    let inlay_hints = analysis.inlay_hints(None);
    dbg!(&inlay_hints);

    // Computes signature help.
    let signature_help = analysis.signature_help(TextSize::from(71));
    dbg!(&signature_help);
}

fn project_code_stubs() {
    // Generates ink! project code stubs/snippets.
    let project = ink_analyzer::new_project(String::from("hello_world"), Version::V5);
    dbg!(&project);
}
```

## Documentation

[https://docs.rs/ink-analyzer/latest/ink_analyzer/](https://docs.rs/ink-analyzer/latest/ink_analyzer/)

Or you can access documentation locally by running the following command from the project root

```shell
cargo doc -p ink-analyzer --open
```

## Testing

You can run unit and integration tests for all the core functionality by running the following command from the project root

```shell
cargo test -p ink-analyzer
```

## License

Licensed under either [MIT](https://github.com/ink-analyzer/ink-analyzer/blob/master/LICENSE-MIT) or [Apache-2.0](https://github.com/ink-analyzer/ink-analyzer/blob/master/LICENSE-APACHE) license at your option.

## Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in the work by you, as defined in the Apache-2.0 license, shall be
dual licensed as above, without any additional terms or conditions.