Fix function signature meta for extern functions

This commit is contained in:
Sofia 2025-08-03 18:45:27 +03:00
parent 6a9133baff
commit 018f3e2561
5 changed files with 29 additions and 5 deletions

View File

@ -181,6 +181,7 @@ impl<'a> AnalysisScope<'a> {
pub enum SemanticKind { pub enum SemanticKind {
Default, Default,
Variable, Variable,
Function,
} }
impl Default for SemanticKind { impl Default for SemanticKind {
@ -193,6 +194,7 @@ impl SemanticKind {
pub fn into_token_idx(&self) -> Option<u32> { pub fn into_token_idx(&self) -> Option<u32> {
let token_type = match self { let token_type = match self {
SemanticKind::Variable => SemanticTokenType::VARIABLE, SemanticKind::Variable => SemanticTokenType::VARIABLE,
SemanticKind::Function => SemanticTokenType::FUNCTION,
SemanticKind::Default => return None, SemanticKind::Default => return None,
}; };
TOKEN_LEGEND TOKEN_LEGEND
@ -321,8 +323,23 @@ pub fn analyze_context(context: &mir::Context, module: &mir::Module, error: Opti
} }
for function in &module.functions { 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 { for param in &function.parameters {
scope.state.init_types(&param.meta, Some(param.ty.clone())); scope.state.init_types(&param.meta, Some(param.ty.clone()));
let idx = scope.token_idx(&param.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 { match &function.kind {

View File

@ -63,6 +63,7 @@ impl ast::Module {
.collect(), .collect(),
kind: mir::FunctionDefinitionKind::Extern(false), kind: mir::FunctionDefinitionKind::Extern(false),
source: Some(module_id), source: Some(module_id),
signature_meta: signature.range.as_meta(module_id),
}; };
functions.push(def); functions.push(def);
} }
@ -186,6 +187,7 @@ impl ast::FunctionDefinition {
parameters: params, parameters: params,
kind: mir::FunctionDefinitionKind::Local(block.into_mir(module_id), (range).as_meta(module_id)), kind: mir::FunctionDefinitionKind::Local(block.into_mir(module_id), (range).as_meta(module_id)),
source: Some(module_id), source: Some(module_id),
signature_meta: signature.range.as_meta(module_id),
} }
} }
} }

View File

@ -54,6 +54,7 @@ pub fn form_intrinsics() -> Vec<FunctionDefinition> {
}], }],
kind: FunctionDefinitionKind::Extern(false), kind: FunctionDefinitionKind::Extern(false),
source: None, source: None,
signature_meta: Default::default(),
}); });
intrinsics intrinsics
@ -85,6 +86,7 @@ pub fn get_intrinsic_assoc_func(ty: &TypeKind, name: &str) -> Option<FunctionDef
}], }],
kind: FunctionDefinitionKind::Intrinsic(Box::new(IntrinsicConst(*len))), kind: FunctionDefinitionKind::Intrinsic(Box::new(IntrinsicConst(*len))),
source: None, source: None,
signature_meta: Default::default(),
}); });
} }
_ => {} _ => {}
@ -101,6 +103,7 @@ pub fn get_intrinsic_assoc_func(ty: &TypeKind, name: &str) -> Option<FunctionDef
parameters: Vec::new(), parameters: Vec::new(),
kind: FunctionDefinitionKind::Intrinsic(Box::new(IntrinsicSizeOf(ty.clone()))), kind: FunctionDefinitionKind::Intrinsic(Box::new(IntrinsicSizeOf(ty.clone()))),
source: None, source: None,
signature_meta: Default::default(),
}), }),
"malloc" => Some(FunctionDefinition { "malloc" => Some(FunctionDefinition {
name: "malloc".to_owned(), name: "malloc".to_owned(),
@ -115,6 +118,7 @@ pub fn get_intrinsic_assoc_func(ty: &TypeKind, name: &str) -> Option<FunctionDef
}], }],
kind: FunctionDefinitionKind::Intrinsic(Box::new(IntrinsicMalloc(ty.clone()))), kind: FunctionDefinitionKind::Intrinsic(Box::new(IntrinsicMalloc(ty.clone()))),
source: None, source: None,
signature_meta: Default::default(),
}), }),
"null" => Some(FunctionDefinition { "null" => Some(FunctionDefinition {
name: "null".to_owned(), name: "null".to_owned(),
@ -125,6 +129,7 @@ pub fn get_intrinsic_assoc_func(ty: &TypeKind, name: &str) -> Option<FunctionDef
parameters: Vec::new(), parameters: Vec::new(),
kind: FunctionDefinitionKind::Intrinsic(Box::new(IntrinsicNullPtr(ty.clone()))), kind: FunctionDefinitionKind::Intrinsic(Box::new(IntrinsicNullPtr(ty.clone()))),
source: None, source: None,
signature_meta: Default::default(),
}), }),
_ => None, _ => None,
} }

View File

@ -208,6 +208,7 @@ impl<'map> Pass for LinkerPass<'map> {
if let Some(func) = imported.functions.iter_mut().find(|f| f.name == *import_name) { if let Some(func) = imported.functions.iter_mut().find(|f| f.name == *import_name) {
let func_name = func.name.clone(); let func_name = func.name.clone();
let func_signature = func.signature();
if !func.is_pub { if !func.is_pub {
state.ok::<_, Infallible>( state.ok::<_, Infallible>(
@ -252,6 +253,7 @@ impl<'map> Pass for LinkerPass<'map> {
parameters: param_tys, parameters: param_tys,
kind: super::FunctionDefinitionKind::Extern(true), kind: super::FunctionDefinitionKind::Extern(true),
source: Some(imported.module_id), source: Some(imported.module_id),
signature_meta: func_signature,
}); });
} else if let Some(ty) = imported.typedefs.iter_mut().find(|f| f.name == *import_name) { } 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); let external_key = CustomTypeKey(ty.name.clone(), ty.source_module);
@ -344,6 +346,7 @@ impl<'map> Pass for LinkerPass<'map> {
parameters: param_tys, parameters: param_tys,
kind: super::FunctionDefinitionKind::Extern(true), kind: super::FunctionDefinitionKind::Extern(true),
source: Some(import_id), source: Some(import_id),
signature_meta: func.signature_meta,
}, },
)); ));
} }

View File

@ -305,6 +305,7 @@ pub struct FunctionDefinition {
pub parameters: Vec<FunctionParam>, pub parameters: Vec<FunctionParam>,
pub kind: FunctionDefinitionKind, pub kind: FunctionDefinitionKind,
pub source: Option<SourceModuleId>, pub source: Option<SourceModuleId>,
pub signature_meta: Metadata,
} }
#[derive(Debug, Clone, PartialEq, PartialOrd)] #[derive(Debug, Clone, PartialEq, PartialOrd)]
@ -340,11 +341,7 @@ impl FunctionDefinition {
} }
pub fn signature(&self) -> Metadata { pub fn signature(&self) -> Metadata {
match &self.kind { self.signature_meta
FunctionDefinitionKind::Local(_, metadata) => metadata.clone(),
FunctionDefinitionKind::Extern(_) => Metadata::default(),
FunctionDefinitionKind::Intrinsic(_) => Metadata::default(),
}
} }
} }