wat_service 0.8.0

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

pub fn act(
    service: &LanguageService,
    uri: InternUri,
    line_index: &LineIndex,
    root: &SyntaxNode,
    symbol_table: &SymbolTable,
    node: &SyntaxNode,
) -> Option<CodeAction> {
    let parent = node.parent()?;
    let def_symbol = symbol_table.symbols.get(&SymbolKey::new(&parent))?;
    let last_module_field = def_symbol.region.try_to_node(root)?.last_child()?;

    let mut changes = FxHashMap::with_capacity_and_hasher(1, FxBuildHasher);
    changes.insert(
        uri.raw(service),
        vec![
            TextEdit {
                range: helpers::rowan_range_to_lsp_range(line_index, node.text_range()),
                new_text: "".into(),
            },
            TextEdit {
                range: helpers::rowan_range_to_lsp_range(
                    line_index,
                    TextRange::empty(last_module_field.text_range().end()),
                ),
                new_text: format!(
                    "\n  (export {} ({} {}))",
                    node.first_child_by_kind(&|kind| kind == SyntaxKind::NAME)?
                        .text(),
                    def_symbol.kind,
                    def_symbol.idx.render(service),
                ),
            },
        ],
    );
    Some(CodeAction {
        title: "Extract export as a module field".into(),
        kind: Some(CodeActionKind::RefactorExtract),
        edit: Some(WorkspaceEdit {
            changes: Some(changes),
            ..Default::default()
        }),
        ..Default::default()
    })
}