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