wat_service 0.10.2

WebAssembly Text Format language service.
Documentation
use crate::{
    binder::{SymbolKey, SymbolTable},
    helpers::{self, LineIndexExt},
    uri::InternUri,
};
use line_index::LineIndex;
use lspt::{CodeAction, CodeActionKind, TextEdit, WorkspaceEdit};
use rustc_hash::{FxBuildHasher, FxHashMap};
use wat_syntax::{SyntaxKind, SyntaxNode, TextRange, ast::support};

pub fn act(
    db: &dyn salsa::Database,
    uri: InternUri,
    line_index: &LineIndex,
    root: &SyntaxNode,
    symbol_table: &SymbolTable,
    node: &SyntaxNode,
) -> Option<CodeAction> {
    let index = helpers::syntax::extract_index_from_export(node)?;
    let def_node = symbol_table.resolved.get(&SymbolKey::new(&index))?.to_node(root)?;

    let mut changes = FxHashMap::with_capacity_and_hasher(1, FxBuildHasher);
    changes.insert(
        uri.raw(db),
        vec![
            TextEdit {
                range: line_index.convert(node.text_range()),
                new_text: "".into(),
            },
            TextEdit {
                range: line_index.convert(TextRange::empty(
                    support::token(&def_node, SyntaxKind::IDENT)
                        .or_else(|| support::token(&def_node, SyntaxKind::KEYWORD))?
                        .text_range()
                        .end(),
                )),
                new_text: format!(" (export {})", node.children_by_kind(SyntaxKind::NAME).next()?),
            },
        ],
    );
    Some(CodeAction {
        title: "Inline export".into(),
        kind: Some(CodeActionKind::RefactorInline),
        edit: Some(WorkspaceEdit {
            changes: Some(changes),
            ..Default::default()
        }),
        ..Default::default()
    })
}