Add property semantic tokens
This commit is contained in:
parent
1438ba7bd1
commit
8739fe16d1
@ -190,8 +190,13 @@ pub enum SemanticKind {
|
|||||||
Function,
|
Function,
|
||||||
String,
|
String,
|
||||||
Number,
|
Number,
|
||||||
Reference(SymbolId),
|
Property,
|
||||||
Type,
|
Type,
|
||||||
|
Struct,
|
||||||
|
Comment,
|
||||||
|
Operator,
|
||||||
|
Keyword,
|
||||||
|
Reference(SymbolId),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for SemanticKind {
|
impl Default for SemanticKind {
|
||||||
@ -208,6 +213,11 @@ impl SemanticKind {
|
|||||||
SemanticKind::Type => SemanticTokenType::TYPE,
|
SemanticKind::Type => SemanticTokenType::TYPE,
|
||||||
SemanticKind::String => SemanticTokenType::STRING,
|
SemanticKind::String => SemanticTokenType::STRING,
|
||||||
SemanticKind::Number => SemanticTokenType::NUMBER,
|
SemanticKind::Number => SemanticTokenType::NUMBER,
|
||||||
|
SemanticKind::Property => SemanticTokenType::PROPERTY,
|
||||||
|
SemanticKind::Struct => SemanticTokenType::STRUCT,
|
||||||
|
SemanticKind::Comment => SemanticTokenType::COMMENT,
|
||||||
|
SemanticKind::Operator => SemanticTokenType::OPERATOR,
|
||||||
|
SemanticKind::Keyword => SemanticTokenType::KEYWORD,
|
||||||
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),
|
||||||
};
|
};
|
||||||
@ -226,6 +236,11 @@ impl SemanticKind {
|
|||||||
SemanticKind::String => return None,
|
SemanticKind::String => return None,
|
||||||
SemanticKind::Number => return None,
|
SemanticKind::Number => return None,
|
||||||
SemanticKind::Default => return None,
|
SemanticKind::Default => return None,
|
||||||
|
SemanticKind::Property => return None,
|
||||||
|
SemanticKind::Struct => return None,
|
||||||
|
SemanticKind::Comment => return None,
|
||||||
|
SemanticKind::Operator => return None,
|
||||||
|
SemanticKind::Keyword => return None,
|
||||||
SemanticKind::Reference(_) => SEMANTIC_REFERENCE,
|
SemanticKind::Reference(_) => SEMANTIC_REFERENCE,
|
||||||
};
|
};
|
||||||
MODIFIER_LEGEND
|
MODIFIER_LEGEND
|
||||||
@ -495,6 +510,13 @@ pub fn analyze_expr(
|
|||||||
mir::ExprKind::Accessed(expression, _, name, meta) => {
|
mir::ExprKind::Accessed(expression, _, name, meta) => {
|
||||||
analyze_expr(context, source_module, &expression, scope);
|
analyze_expr(context, source_module, &expression, scope);
|
||||||
|
|
||||||
|
let idx = scope
|
||||||
|
.token_idx(&meta, |t| matches!(t, Token::Identifier(_)))
|
||||||
|
.unwrap_or(meta.range.end);
|
||||||
|
dbg!(idx, scope.tokens.get(idx));
|
||||||
|
let symbol = scope.state.new_symbol(idx, SemanticKind::Property);
|
||||||
|
scope.state.set_symbol(idx, symbol);
|
||||||
|
|
||||||
let accessed_type = expression.return_type(&TypeRefs::unknown(), source_module.module_id);
|
let accessed_type = expression.return_type(&TypeRefs::unknown(), source_module.module_id);
|
||||||
|
|
||||||
let mut autocompletes = Vec::new();
|
let mut autocompletes = Vec::new();
|
||||||
@ -542,23 +564,29 @@ pub fn analyze_expr(
|
|||||||
}
|
}
|
||||||
mir::ExprKind::Struct(_, items) => {
|
mir::ExprKind::Struct(_, items) => {
|
||||||
for (_, expr, field_meta) in items {
|
for (_, expr, field_meta) in items {
|
||||||
|
let idx = scope
|
||||||
|
.token_idx(&field_meta, |t| matches!(t, Token::Identifier(_)))
|
||||||
|
.unwrap_or(field_meta.range.end);
|
||||||
|
dbg!(idx, scope.tokens.get(idx));
|
||||||
|
let symbol = scope.state.new_symbol(idx, SemanticKind::Property);
|
||||||
|
scope.state.set_symbol(idx, symbol);
|
||||||
|
|
||||||
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(_))) {
|
||||||
// if let Some(idx) = scope.token_idx(&expr.1, |t| matches!(t, Token::StringLit(_) | Token::CharLit(_))) {
|
dbg!(&idx, scope.tokens.get(idx));
|
||||||
// dbg!(&idx, scope.tokens.get(idx));
|
scope.state.new_symbol(idx, SemanticKind::String);
|
||||||
// scope.state.new_symbol(idx, SemanticKind::String);
|
} else if let Some(idx) = scope.token_idx(&expr.1, |t| {
|
||||||
// } else if let Some(idx) = scope.token_idx(&expr.1, |t| {
|
matches!(
|
||||||
// matches!(
|
t,
|
||||||
// t,
|
Token::DecimalValue(_) | Token::HexadecimalValue(_) | Token::OctalValue(_) | Token::BinaryValue(_)
|
||||||
// Token::DecimalValue(_) | Token::HexadecimalValue(_) | Token::OctalValue(_) | Token::BinaryValue(_)
|
)
|
||||||
// )
|
}) {
|
||||||
// }) {
|
dbg!(&idx, scope.tokens.get(idx));
|
||||||
// dbg!(&idx, scope.tokens.get(idx));
|
scope.state.new_symbol(idx, SemanticKind::Number);
|
||||||
// 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);
|
||||||
|
Loading…
Reference in New Issue
Block a user