Fix function signature meta for extern functions
This commit is contained in:
parent
6a9133baff
commit
018f3e2561
@ -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<u32> {
|
||||
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 {
|
||||
|
@ -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),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -54,6 +54,7 @@ pub fn form_intrinsics() -> Vec<FunctionDefinition> {
|
||||
}],
|
||||
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<FunctionDef
|
||||
}],
|
||||
kind: FunctionDefinitionKind::Intrinsic(Box::new(IntrinsicConst(*len))),
|
||||
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(),
|
||||
kind: FunctionDefinitionKind::Intrinsic(Box::new(IntrinsicSizeOf(ty.clone()))),
|
||||
source: None,
|
||||
signature_meta: Default::default(),
|
||||
}),
|
||||
"malloc" => Some(FunctionDefinition {
|
||||
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()))),
|
||||
source: None,
|
||||
signature_meta: Default::default(),
|
||||
}),
|
||||
"null" => Some(FunctionDefinition {
|
||||
name: "null".to_owned(),
|
||||
@ -125,6 +129,7 @@ pub fn get_intrinsic_assoc_func(ty: &TypeKind, name: &str) -> Option<FunctionDef
|
||||
parameters: Vec::new(),
|
||||
kind: FunctionDefinitionKind::Intrinsic(Box::new(IntrinsicNullPtr(ty.clone()))),
|
||||
source: None,
|
||||
signature_meta: Default::default(),
|
||||
}),
|
||||
_ => None,
|
||||
}
|
||||
|
@ -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,
|
||||
},
|
||||
));
|
||||
}
|
||||
|
@ -305,6 +305,7 @@ pub struct FunctionDefinition {
|
||||
pub parameters: Vec<FunctionParam>,
|
||||
pub kind: FunctionDefinitionKind,
|
||||
pub source: Option<SourceModuleId>,
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user