diff --git a/Cargo.lock b/Cargo.lock
index 2a1b6a4..9f13197 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -691,6 +691,12 @@ dependencies = [
"libc",
]
+[[package]]
+name = "lazy_static"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
+
[[package]]
name = "libc"
version = "0.2.153"
@@ -1669,11 +1675,14 @@ dependencies = [
"dashmap",
"filetime",
"fuzzy-matcher",
+ "lazy_static",
"rayon",
"serde",
"serde_json",
"serde_repr",
"shrinkwraprs",
+ "strum",
+ "strum_macros",
"thiserror",
"tokio",
"tower-lsp",
diff --git a/Cargo.toml b/Cargo.toml
index cec5106..1a15c05 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -28,4 +28,5 @@ dyn-clone = "1.0"
rayon = "1.9"
bitmask-enum = "2.2.3"
filetime = "0.2.23"
-smallvec = "1.13"
\ No newline at end of file
+smallvec = "1.13"
+lazy_static = "1.5"
\ No newline at end of file
diff --git a/crates/core/src/ast/annotation.rs b/crates/core/src/ast/annotation.rs
index a1a68d2..9668ff8 100644
--- a/crates/core/src/ast/annotation.rs
+++ b/crates/core/src/ast/annotation.rs
@@ -1,4 +1,4 @@
-use strum_macros::{EnumString, Display, AsRefStr};
+use strum_macros::{AsRefStr, Display, EnumIter, EnumString};
use crate::{tokens::*, AnyNode, DebugRange, NamedSyntaxNode, SyntaxNode};
use super::*;
@@ -7,7 +7,7 @@ mod tags {
pub struct Annotation;
}
-#[derive(Debug, Clone, Copy, PartialEq, Eq, EnumString, Display, AsRefStr)]
+#[derive(Debug, Clone, Copy, PartialEq, Eq, EnumString, Display, AsRefStr, EnumIter)]
pub enum AnnotationKind {
#[strum(serialize="@addMethod")]
AddMethod,
diff --git a/crates/core/src/attribs/functions.rs b/crates/core/src/attribs/functions.rs
index f3ea886..033f5a7 100644
--- a/crates/core/src/attribs/functions.rs
+++ b/crates/core/src/attribs/functions.rs
@@ -1,10 +1,12 @@
use std::fmt::Debug;
use std::str::FromStr;
+use strum_macros::EnumIter;
+
use crate::{tokens::Keyword, AnyNode, DebugRange, NamedSyntaxNode, SyntaxNode};
use super::{AccessModifier, Specifier};
-#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, EnumIter)]
pub enum FunctionFlavour {
Cleanup,
Entry,
diff --git a/crates/core/src/attribs/specifier.rs b/crates/core/src/attribs/specifier.rs
index fbf2ecc..9c3d9d6 100644
--- a/crates/core/src/attribs/specifier.rs
+++ b/crates/core/src/attribs/specifier.rs
@@ -1,8 +1,11 @@
use std::str::FromStr;
+
+use strum_macros::EnumIter;
+
use crate::{tokens::Keyword, AnyNode, DebugRange, NamedSyntaxNode, SyntaxNode};
-#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, EnumIter)]
pub enum Specifier {
Abstract,
Const,
diff --git a/crates/lsp/Cargo.toml b/crates/lsp/Cargo.toml
index 300870d..ee645f3 100644
--- a/crates/lsp/Cargo.toml
+++ b/crates/lsp/Cargo.toml
@@ -20,6 +20,9 @@ rayon.workspace = true
bitmask-enum.workspace = true
shrinkwraprs.workspace = true
filetime.workspace = true
+strum.workspace = true
+strum_macros.workspace = true
+lazy_static.workspace = true
tower-lsp = "0.20.0"
tokio = { version = "1.38", features = ["macros", "rt", "rt-multi-thread", "io-std", "time"] }
fuzzy-matcher = "0.3.7"
\ No newline at end of file
diff --git a/crates/lsp/src/main.rs b/crates/lsp/src/main.rs
index 548d426..0010b12 100644
--- a/crates/lsp/src/main.rs
+++ b/crates/lsp/src/main.rs
@@ -99,6 +99,15 @@ impl LanguageServer for Backend {
async fn hover(&self, params: lsp::HoverParams) -> Result