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 {
|
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(¶m.meta, Some(param.ty.clone()));
|
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 {
|
match &function.kind {
|
||||||
|
@ -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),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
},
|
},
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
@ -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(),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user