From 018f3e256115e608f19a32c4dfd4b397996117c5 Mon Sep 17 00:00:00 2001 From: sofia Date: Sun, 3 Aug 2025 18:45:27 +0300 Subject: [PATCH] Fix function signature meta for extern functions --- reid-lsp/src/analysis.rs | 17 +++++++++++++++++ reid/src/ast/process.rs | 2 ++ reid/src/codegen/intrinsics.rs | 5 +++++ reid/src/mir/linker.rs | 3 +++ reid/src/mir/mod.rs | 7 ++----- 5 files changed, 29 insertions(+), 5 deletions(-) diff --git a/reid-lsp/src/analysis.rs b/reid-lsp/src/analysis.rs index 20ad773..5cfd652 100644 --- a/reid-lsp/src/analysis.rs +++ b/reid-lsp/src/analysis.rs @@ -181,6 +181,7 @@ impl<'a> AnalysisScope<'a> { pub enum SemanticKind { Default, Variable, + Function, } impl Default for SemanticKind { @@ -193,6 +194,7 @@ impl SemanticKind { pub fn into_token_idx(&self) -> Option { let token_type = match self { SemanticKind::Variable => SemanticTokenType::VARIABLE, + SemanticKind::Function => SemanticTokenType::FUNCTION, SemanticKind::Default => return None, }; TOKEN_LEGEND @@ -321,8 +323,23 @@ pub fn analyze_context(context: &mir::Context, module: &mir::Module, error: Opti } for function in &module.functions { + scope + .state + .init_types(&function.signature(), Some(function.return_type.clone())); + + dbg!(&function.signature()); + dbg!(&scope.tokens.get(function.signature().range.start)); + let idx = scope.token_idx(&function.signature(), |t| matches!(t, Token::Identifier(_))); + dbg!(idx, scope.tokens.get(idx)); + let symbol = scope.state.new_symbol(idx, SemanticKind::Function); + scope.state.set_symbol(idx, symbol); + for param in &function.parameters { scope.state.init_types(¶m.meta, Some(param.ty.clone())); + let idx = scope.token_idx(¶m.meta, |t| matches!(t, Token::Identifier(_))); + let symbol = scope.state.new_symbol(idx, SemanticKind::Variable); + scope.state.set_symbol(idx, symbol); + scope.variables.insert(param.name.clone(), symbol); } match &function.kind { diff --git a/reid/src/ast/process.rs b/reid/src/ast/process.rs index b5cda2d..156ccf2 100644 --- a/reid/src/ast/process.rs +++ b/reid/src/ast/process.rs @@ -63,6 +63,7 @@ impl ast::Module { .collect(), kind: mir::FunctionDefinitionKind::Extern(false), source: Some(module_id), + signature_meta: signature.range.as_meta(module_id), }; functions.push(def); } @@ -186,6 +187,7 @@ impl ast::FunctionDefinition { parameters: params, kind: mir::FunctionDefinitionKind::Local(block.into_mir(module_id), (range).as_meta(module_id)), source: Some(module_id), + signature_meta: signature.range.as_meta(module_id), } } } diff --git a/reid/src/codegen/intrinsics.rs b/reid/src/codegen/intrinsics.rs index 5886e45..5f70fa8 100644 --- a/reid/src/codegen/intrinsics.rs +++ b/reid/src/codegen/intrinsics.rs @@ -54,6 +54,7 @@ pub fn form_intrinsics() -> Vec { }], kind: FunctionDefinitionKind::Extern(false), source: None, + signature_meta: Default::default(), }); intrinsics @@ -85,6 +86,7 @@ pub fn get_intrinsic_assoc_func(ty: &TypeKind, name: &str) -> Option {} @@ -101,6 +103,7 @@ pub fn get_intrinsic_assoc_func(ty: &TypeKind, name: &str) -> Option Some(FunctionDefinition { name: "malloc".to_owned(), @@ -115,6 +118,7 @@ pub fn get_intrinsic_assoc_func(ty: &TypeKind, name: &str) -> Option Some(FunctionDefinition { name: "null".to_owned(), @@ -125,6 +129,7 @@ pub fn get_intrinsic_assoc_func(ty: &TypeKind, name: &str) -> Option None, } diff --git a/reid/src/mir/linker.rs b/reid/src/mir/linker.rs index 3acb271..747c059 100644 --- a/reid/src/mir/linker.rs +++ b/reid/src/mir/linker.rs @@ -208,6 +208,7 @@ impl<'map> Pass for LinkerPass<'map> { if let Some(func) = imported.functions.iter_mut().find(|f| f.name == *import_name) { let func_name = func.name.clone(); + let func_signature = func.signature(); if !func.is_pub { state.ok::<_, Infallible>( @@ -252,6 +253,7 @@ impl<'map> Pass for LinkerPass<'map> { parameters: param_tys, kind: super::FunctionDefinitionKind::Extern(true), source: Some(imported.module_id), + signature_meta: func_signature, }); } else if let Some(ty) = imported.typedefs.iter_mut().find(|f| f.name == *import_name) { let external_key = CustomTypeKey(ty.name.clone(), ty.source_module); @@ -344,6 +346,7 @@ impl<'map> Pass for LinkerPass<'map> { parameters: param_tys, kind: super::FunctionDefinitionKind::Extern(true), source: Some(import_id), + signature_meta: func.signature_meta, }, )); } diff --git a/reid/src/mir/mod.rs b/reid/src/mir/mod.rs index 0365f17..9072a50 100644 --- a/reid/src/mir/mod.rs +++ b/reid/src/mir/mod.rs @@ -305,6 +305,7 @@ pub struct FunctionDefinition { pub parameters: Vec, pub kind: FunctionDefinitionKind, pub source: Option, + pub signature_meta: Metadata, } #[derive(Debug, Clone, PartialEq, PartialOrd)] @@ -340,11 +341,7 @@ impl FunctionDefinition { } pub fn signature(&self) -> Metadata { - match &self.kind { - FunctionDefinitionKind::Local(_, metadata) => metadata.clone(), - FunctionDefinitionKind::Extern(_) => Metadata::default(), - FunctionDefinitionKind::Intrinsic(_) => Metadata::default(), - } + self.signature_meta } }