Fix parameter symbols for extern functions
This commit is contained in:
parent
dcc53498e7
commit
48dd17b320
@ -167,7 +167,7 @@ impl<'a> AnalysisScope<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn token_idx<T: Copy>(&self, meta: &Metadata, pred: T) -> usize
|
pub fn token_idx<T: Copy>(&self, meta: &Metadata, pred: T) -> Option<usize>
|
||||||
where
|
where
|
||||||
T: FnOnce(&Token) -> bool,
|
T: FnOnce(&Token) -> bool,
|
||||||
{
|
{
|
||||||
@ -175,11 +175,11 @@ impl<'a> AnalysisScope<'a> {
|
|||||||
if let Some(token) = self.tokens.get(idx) {
|
if let Some(token) = self.tokens.get(idx) {
|
||||||
// dbg!(idx, token);
|
// dbg!(idx, token);
|
||||||
if pred(&token.token) {
|
if pred(&token.token) {
|
||||||
return idx;
|
return Some(idx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return meta.range.end;
|
return None;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -188,6 +188,8 @@ pub enum SemanticKind {
|
|||||||
Default,
|
Default,
|
||||||
Variable,
|
Variable,
|
||||||
Function,
|
Function,
|
||||||
|
String,
|
||||||
|
Number,
|
||||||
Reference(SymbolId),
|
Reference(SymbolId),
|
||||||
Type,
|
Type,
|
||||||
}
|
}
|
||||||
@ -204,6 +206,8 @@ impl SemanticKind {
|
|||||||
SemanticKind::Variable => SemanticTokenType::VARIABLE,
|
SemanticKind::Variable => SemanticTokenType::VARIABLE,
|
||||||
SemanticKind::Function => SemanticTokenType::FUNCTION,
|
SemanticKind::Function => SemanticTokenType::FUNCTION,
|
||||||
SemanticKind::Type => SemanticTokenType::TYPE,
|
SemanticKind::Type => SemanticTokenType::TYPE,
|
||||||
|
SemanticKind::String => SemanticTokenType::STRING,
|
||||||
|
SemanticKind::Number => SemanticTokenType::NUMBER,
|
||||||
SemanticKind::Default => return None,
|
SemanticKind::Default => return None,
|
||||||
SemanticKind::Reference(symbol_id) => return state.get_symbol(*symbol_id).kind.into_token_idx(state),
|
SemanticKind::Reference(symbol_id) => return state.get_symbol(*symbol_id).kind.into_token_idx(state),
|
||||||
};
|
};
|
||||||
@ -219,6 +223,8 @@ impl SemanticKind {
|
|||||||
SemanticKind::Variable => SemanticTokenModifier::DEFINITION,
|
SemanticKind::Variable => SemanticTokenModifier::DEFINITION,
|
||||||
SemanticKind::Function => SemanticTokenModifier::DEFINITION,
|
SemanticKind::Function => SemanticTokenModifier::DEFINITION,
|
||||||
SemanticKind::Type => return None,
|
SemanticKind::Type => return None,
|
||||||
|
SemanticKind::String => return None,
|
||||||
|
SemanticKind::Number => return None,
|
||||||
SemanticKind::Default => return None,
|
SemanticKind::Default => return None,
|
||||||
SemanticKind::Reference(_) => SEMANTIC_REFERENCE,
|
SemanticKind::Reference(_) => SEMANTIC_REFERENCE,
|
||||||
};
|
};
|
||||||
@ -351,17 +357,24 @@ pub fn analyze_context(context: &mir::Context, module: &mir::Module, error: Opti
|
|||||||
.state
|
.state
|
||||||
.init_types(&function.signature(), Some(function.return_type.clone()));
|
.init_types(&function.signature(), Some(function.return_type.clone()));
|
||||||
|
|
||||||
let idx = scope.token_idx(&function.signature(), |t| matches!(t, Token::Identifier(_)));
|
let idx = scope
|
||||||
|
.token_idx(&function.signature(), |t| matches!(t, Token::Identifier(_)))
|
||||||
|
.unwrap_or(function.signature().range.end);
|
||||||
let function_symbol = scope.state.new_symbol(idx, SemanticKind::Function);
|
let function_symbol = scope.state.new_symbol(idx, SemanticKind::Function);
|
||||||
scope.state.set_symbol(idx, function_symbol);
|
scope.state.set_symbol(idx, function_symbol);
|
||||||
scope.functions.insert(function.name.clone(), function_symbol);
|
scope.functions.insert(function.name.clone(), function_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(_)));
|
dbg!(param);
|
||||||
let symbol = scope.state.new_symbol(idx, SemanticKind::Variable);
|
if param.meta.source_module_id == module.module_id {
|
||||||
scope.state.set_symbol(idx, symbol);
|
let idx = scope
|
||||||
scope.variables.insert(param.name.clone(), symbol);
|
.token_idx(¶m.meta, |t| matches!(t, Token::Identifier(_)))
|
||||||
|
.unwrap_or(function.signature().range.end);
|
||||||
|
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 {
|
||||||
@ -396,7 +409,9 @@ pub fn analyze_block(
|
|||||||
.ok()
|
.ok()
|
||||||
.map(|(_, ty)| ty),
|
.map(|(_, ty)| ty),
|
||||||
);
|
);
|
||||||
let idx = scope.token_idx(&named_variable_ref.2, |t| matches!(t, Token::Identifier(_)));
|
let idx = scope
|
||||||
|
.token_idx(&named_variable_ref.2, |t| matches!(t, Token::Identifier(_)))
|
||||||
|
.unwrap_or(named_variable_ref.2.range.end);
|
||||||
let symbol = scope.state.new_symbol(idx, SemanticKind::Variable);
|
let symbol = scope.state.new_symbol(idx, SemanticKind::Variable);
|
||||||
scope.state.set_symbol(idx, symbol);
|
scope.state.set_symbol(idx, symbol);
|
||||||
scope.variables.insert(named_variable_ref.1.clone(), symbol);
|
scope.variables.insert(named_variable_ref.1.clone(), symbol);
|
||||||
@ -440,14 +455,14 @@ pub fn analyze_expr(
|
|||||||
mir::ExprKind::Variable(var_ref) => {
|
mir::ExprKind::Variable(var_ref) => {
|
||||||
scope.state.init_types(&var_ref.2, Some(var_ref.0.clone()));
|
scope.state.init_types(&var_ref.2, Some(var_ref.0.clone()));
|
||||||
|
|
||||||
let idx = scope.token_idx(&var_ref.2, |t| matches!(t, Token::Identifier(_)));
|
let idx = scope
|
||||||
let symbol = if let Some(symbol_id) = scope.variables.get(&var_ref.1) {
|
.token_idx(&var_ref.2, |t| matches!(t, Token::Identifier(_)))
|
||||||
scope.state.new_symbol(idx, SemanticKind::Reference(*symbol_id))
|
.unwrap_or(var_ref.2.range.end);
|
||||||
} else {
|
if let Some(symbol_id) = scope.variables.get(&var_ref.1) {
|
||||||
scope.state.new_symbol(idx, SemanticKind::Variable)
|
let symbol = scope.state.new_symbol(idx, SemanticKind::Reference(*symbol_id));
|
||||||
};
|
scope.state.set_symbol(idx, symbol);
|
||||||
scope.state.set_symbol(idx, symbol);
|
scope.variables.insert(var_ref.1.clone(), symbol);
|
||||||
scope.variables.insert(var_ref.1.clone(), symbol);
|
}
|
||||||
}
|
}
|
||||||
mir::ExprKind::Indexed(value, _, index_expr) => {
|
mir::ExprKind::Indexed(value, _, index_expr) => {
|
||||||
analyze_expr(context, source_module, &value, scope);
|
analyze_expr(context, source_module, &value, scope);
|
||||||
@ -502,11 +517,25 @@ pub fn analyze_expr(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
mir::ExprKind::Struct(_, items) => {
|
mir::ExprKind::Struct(_, items) => {
|
||||||
for (_, expr, _) in items {
|
for (_, expr, field_meta) in items {
|
||||||
analyze_expr(context, source_module, expr, scope);
|
analyze_expr(context, source_module, expr, scope);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mir::ExprKind::Literal(_) => {}
|
mir::ExprKind::Literal(_) => {
|
||||||
|
// dbg!(&expr.1);
|
||||||
|
// if let Some(idx) = scope.token_idx(&expr.1, |t| matches!(t, Token::StringLit(_) | Token::CharLit(_))) {
|
||||||
|
// dbg!(&idx, scope.tokens.get(idx));
|
||||||
|
// scope.state.new_symbol(idx, SemanticKind::String);
|
||||||
|
// } else if let Some(idx) = scope.token_idx(&expr.1, |t| {
|
||||||
|
// matches!(
|
||||||
|
// t,
|
||||||
|
// Token::DecimalValue(_) | Token::HexadecimalValue(_) | Token::OctalValue(_) | Token::BinaryValue(_)
|
||||||
|
// )
|
||||||
|
// }) {
|
||||||
|
// dbg!(&idx, scope.tokens.get(idx));
|
||||||
|
// scope.state.new_symbol(idx, SemanticKind::Number);
|
||||||
|
// }
|
||||||
|
}
|
||||||
mir::ExprKind::BinOp(_, lhs, rhs, _) => {
|
mir::ExprKind::BinOp(_, lhs, rhs, _) => {
|
||||||
analyze_expr(context, source_module, &lhs, scope);
|
analyze_expr(context, source_module, &lhs, scope);
|
||||||
analyze_expr(context, source_module, &rhs, scope);
|
analyze_expr(context, source_module, &rhs, scope);
|
||||||
@ -518,7 +547,9 @@ pub fn analyze_expr(
|
|||||||
analyze_expr(context, source_module, expr, scope);
|
analyze_expr(context, source_module, expr, scope);
|
||||||
}
|
}
|
||||||
|
|
||||||
let idx = scope.token_idx(&meta, |t| matches!(t, Token::Identifier(_)));
|
let idx = scope
|
||||||
|
.token_idx(&meta, |t| matches!(t, Token::Identifier(_)))
|
||||||
|
.unwrap_or(meta.range.end);
|
||||||
let symbol = if let Some(symbol_id) = scope.functions.get(name) {
|
let symbol = if let Some(symbol_id) = scope.functions.get(name) {
|
||||||
scope.state.new_symbol(idx, SemanticKind::Reference(*symbol_id))
|
scope.state.new_symbol(idx, SemanticKind::Reference(*symbol_id))
|
||||||
} else {
|
} else {
|
||||||
|
@ -235,7 +235,6 @@ impl LanguageServer for Backend {
|
|||||||
token_modifiers_bitset: symbol.kind.get_modifier().unwrap_or(0),
|
token_modifiers_bitset: symbol.kind.get_modifier().unwrap_or(0),
|
||||||
};
|
};
|
||||||
semantic_tokens.push(semantic_token);
|
semantic_tokens.push(semantic_token);
|
||||||
dbg!(semantic_token, prev_line, prev_start, token);
|
|
||||||
prev_line = vscode_line;
|
prev_line = vscode_line;
|
||||||
prev_start = vscode_col;
|
prev_start = vscode_col;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user