use crate::model::NodeLabel;
#[must_use]
pub fn map_lsp_symbol_kind(kind: lsp_types::SymbolKind) -> Option<NodeLabel> {
use lsp_types::SymbolKind as K;
if kind == K::FUNCTION {
Some(NodeLabel::Function)
} else if kind == K::METHOD {
Some(NodeLabel::Method)
} else if kind == K::CLASS {
Some(NodeLabel::Class)
} else if kind == K::INTERFACE {
Some(NodeLabel::Interface)
} else if kind == K::ENUM {
Some(NodeLabel::Enum)
} else if kind == K::STRUCT {
Some(NodeLabel::Struct)
} else if kind == K::MODULE {
Some(NodeLabel::Module)
} else if kind == K::NAMESPACE {
Some(NodeLabel::Namespace)
} else if kind == K::VARIABLE {
Some(NodeLabel::Variable)
} else if kind == K::CONSTANT {
Some(NodeLabel::Const)
} else if kind == K::PROPERTY {
Some(NodeLabel::Property)
} else if kind == K::FIELD {
Some(NodeLabel::Field)
} else if kind == K::CONSTRUCTOR {
Some(NodeLabel::Constructor)
} else if kind == K::ENUM_MEMBER {
Some(NodeLabel::Variant)
} else if kind == K::EVENT {
Some(NodeLabel::Event)
} else if kind == K::TYPE_PARAMETER {
Some(NodeLabel::Typedef)
} else {
None
}
}
#[cfg(test)]
mod tests {
use super::map_lsp_symbol_kind;
use crate::model::NodeLabel;
use lsp_types::SymbolKind;
#[test]
fn map_function_kind() {
assert_eq!(
map_lsp_symbol_kind(SymbolKind::FUNCTION),
Some(NodeLabel::Function)
);
}
#[test]
fn map_method_kind() {
assert_eq!(
map_lsp_symbol_kind(SymbolKind::METHOD),
Some(NodeLabel::Method)
);
}
#[test]
fn map_class_kind() {
assert_eq!(
map_lsp_symbol_kind(SymbolKind::CLASS),
Some(NodeLabel::Class)
);
}
#[test]
fn map_interface_kind() {
assert_eq!(
map_lsp_symbol_kind(SymbolKind::INTERFACE),
Some(NodeLabel::Interface)
);
}
#[test]
fn map_enum_kind() {
assert_eq!(map_lsp_symbol_kind(SymbolKind::ENUM), Some(NodeLabel::Enum));
}
#[test]
fn map_struct_kind() {
assert_eq!(
map_lsp_symbol_kind(SymbolKind::STRUCT),
Some(NodeLabel::Struct)
);
}
#[test]
fn map_module_kind() {
assert_eq!(
map_lsp_symbol_kind(SymbolKind::MODULE),
Some(NodeLabel::Module)
);
}
#[test]
fn map_variable_kind() {
assert_eq!(
map_lsp_symbol_kind(SymbolKind::VARIABLE),
Some(NodeLabel::Variable)
);
}
#[test]
fn map_constant_kind() {
assert_eq!(
map_lsp_symbol_kind(SymbolKind::CONSTANT),
Some(NodeLabel::Const)
);
}
#[test]
fn map_namespace_kind() {
assert_eq!(
map_lsp_symbol_kind(SymbolKind::NAMESPACE),
Some(NodeLabel::Namespace)
);
}
#[test]
fn map_property_kind() {
assert_eq!(
map_lsp_symbol_kind(SymbolKind::PROPERTY),
Some(NodeLabel::Property)
);
}
#[test]
fn map_field_kind() {
assert_eq!(
map_lsp_symbol_kind(SymbolKind::FIELD),
Some(NodeLabel::Field)
);
}
#[test]
fn map_constructor_kind() {
assert_eq!(
map_lsp_symbol_kind(SymbolKind::CONSTRUCTOR),
Some(NodeLabel::Constructor)
);
}
#[test]
fn map_enum_member_kind() {
assert_eq!(
map_lsp_symbol_kind(SymbolKind::ENUM_MEMBER),
Some(NodeLabel::Variant)
);
}
#[test]
fn map_event_kind() {
assert_eq!(
map_lsp_symbol_kind(SymbolKind::EVENT),
Some(NodeLabel::Event)
);
}
#[test]
fn map_type_parameter_kind() {
assert_eq!(
map_lsp_symbol_kind(SymbolKind::TYPE_PARAMETER),
Some(NodeLabel::Typedef)
);
}
#[test]
fn map_unknown_kind_returns_none() {
assert_eq!(map_lsp_symbol_kind(SymbolKind::STRING), None);
assert_eq!(map_lsp_symbol_kind(SymbolKind::NUMBER), None);
assert_eq!(map_lsp_symbol_kind(SymbolKind::BOOLEAN), None);
assert_eq!(map_lsp_symbol_kind(SymbolKind::ARRAY), None);
assert_eq!(map_lsp_symbol_kind(SymbolKind::OBJECT), None);
assert_eq!(map_lsp_symbol_kind(SymbolKind::KEY), None);
assert_eq!(map_lsp_symbol_kind(SymbolKind::NULL), None);
assert_eq!(map_lsp_symbol_kind(SymbolKind::FILE), None);
assert_eq!(map_lsp_symbol_kind(SymbolKind::PACKAGE), None);
assert_eq!(map_lsp_symbol_kind(SymbolKind::OPERATOR), None);
}
#[test]
fn map_unrecognized_int_returns_none() {
let unknown: SymbolKind = serde_json::from_str("999").expect("deserialize unknown kind");
assert_eq!(map_lsp_symbol_kind(unknown), None);
}
#[test]
fn map_is_deterministic() {
for kind in [
SymbolKind::FUNCTION,
SymbolKind::CLASS,
SymbolKind::STRUCT,
SymbolKind::ENUM,
SymbolKind::INTERFACE,
] {
let first = map_lsp_symbol_kind(kind);
let second = map_lsp_symbol_kind(kind);
assert_eq!(first, second, "mapping must be stable for {kind:?}");
}
}
}