Introduce ActiveParameter
This commit is contained in:
parent
4b8e9d5483
commit
09a4b78775
@ -19,10 +19,24 @@ pub(crate) fn call_info(db: &RootDatabase, position: FilePosition) -> Option<Cal
|
|||||||
call_info_for_token(&sema, token)
|
call_info_for_token(&sema, token)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn call_info_for_token(
|
#[derive(Debug)]
|
||||||
sema: &Semantics<RootDatabase>,
|
pub(crate) struct ActiveParameter {
|
||||||
token: SyntaxToken,
|
/// FIXME: should be `Type` and `Name
|
||||||
) -> Option<CallInfo> {
|
pub(crate) ty: String,
|
||||||
|
pub(crate) name: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ActiveParameter {
|
||||||
|
pub(crate) fn at(db: &RootDatabase, position: FilePosition) -> Option<Self> {
|
||||||
|
call_info(db, position)?.into_active_parameter()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn at_token(sema: &Semantics<RootDatabase>, token: SyntaxToken) -> Option<Self> {
|
||||||
|
call_info_for_token(sema, token)?.into_active_parameter()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn call_info_for_token(sema: &Semantics<RootDatabase>, token: SyntaxToken) -> Option<CallInfo> {
|
||||||
// Find the calling expression and it's NameRef
|
// Find the calling expression and it's NameRef
|
||||||
let calling_node = FnCallNode::with_node(&token.parent())?;
|
let calling_node = FnCallNode::with_node(&token.parent())?;
|
||||||
|
|
||||||
@ -160,6 +174,14 @@ fn arg_list(&self) -> Option<ast::ArgList> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl CallInfo {
|
impl CallInfo {
|
||||||
|
fn into_active_parameter(self) -> Option<ActiveParameter> {
|
||||||
|
let idx = self.active_parameter?;
|
||||||
|
let ty = self.signature.parameter_types.get(idx)?.clone();
|
||||||
|
let name = self.signature.parameter_names.get(idx)?.clone();
|
||||||
|
let res = ActiveParameter { ty, name };
|
||||||
|
Some(res)
|
||||||
|
}
|
||||||
|
|
||||||
fn with_fn(db: &RootDatabase, function: hir::Function) -> Self {
|
fn with_fn(db: &RootDatabase, function: hir::Function) -> Self {
|
||||||
let signature = FunctionSignature::from_hir(db, function);
|
let signature = FunctionSignature::from_hir(db, function);
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
};
|
};
|
||||||
use ra_text_edit::AtomTextEdit;
|
use ra_text_edit::AtomTextEdit;
|
||||||
|
|
||||||
use crate::{completion::CompletionConfig, FilePosition};
|
use crate::{call_info::ActiveParameter, completion::CompletionConfig, FilePosition};
|
||||||
|
|
||||||
/// `CompletionContext` is created early during completion to figure out, where
|
/// `CompletionContext` is created early during completion to figure out, where
|
||||||
/// exactly is the cursor, syntax-wise.
|
/// exactly is the cursor, syntax-wise.
|
||||||
@ -21,7 +21,6 @@ pub(crate) struct CompletionContext<'a> {
|
|||||||
pub(super) db: &'a RootDatabase,
|
pub(super) db: &'a RootDatabase,
|
||||||
pub(super) config: &'a CompletionConfig,
|
pub(super) config: &'a CompletionConfig,
|
||||||
pub(super) offset: TextUnit,
|
pub(super) offset: TextUnit,
|
||||||
pub(super) file_position: FilePosition,
|
|
||||||
/// The token before the cursor, in the original file.
|
/// The token before the cursor, in the original file.
|
||||||
pub(super) original_token: SyntaxToken,
|
pub(super) original_token: SyntaxToken,
|
||||||
/// The token before the cursor, in the macro-expanded file.
|
/// The token before the cursor, in the macro-expanded file.
|
||||||
@ -34,6 +33,8 @@ pub(crate) struct CompletionContext<'a> {
|
|||||||
pub(super) record_pat_syntax: Option<ast::RecordPat>,
|
pub(super) record_pat_syntax: Option<ast::RecordPat>,
|
||||||
pub(super) record_field_syntax: Option<ast::RecordField>,
|
pub(super) record_field_syntax: Option<ast::RecordField>,
|
||||||
pub(super) impl_def: Option<ast::ImplDef>,
|
pub(super) impl_def: Option<ast::ImplDef>,
|
||||||
|
/// FIXME: `ActiveParameter` is string-based, which is very wrong
|
||||||
|
pub(super) active_parameter: Option<ActiveParameter>,
|
||||||
pub(super) is_param: bool,
|
pub(super) is_param: bool,
|
||||||
/// If a name-binding or reference to a const in a pattern.
|
/// If a name-binding or reference to a const in a pattern.
|
||||||
/// Irrefutable patterns (like let) are excluded.
|
/// Irrefutable patterns (like let) are excluded.
|
||||||
@ -90,7 +91,6 @@ pub(super) fn new(
|
|||||||
original_token,
|
original_token,
|
||||||
token,
|
token,
|
||||||
offset: position.offset,
|
offset: position.offset,
|
||||||
file_position: position,
|
|
||||||
krate,
|
krate,
|
||||||
name_ref_syntax: None,
|
name_ref_syntax: None,
|
||||||
function_syntax: None,
|
function_syntax: None,
|
||||||
@ -99,6 +99,7 @@ pub(super) fn new(
|
|||||||
record_pat_syntax: None,
|
record_pat_syntax: None,
|
||||||
record_field_syntax: None,
|
record_field_syntax: None,
|
||||||
impl_def: None,
|
impl_def: None,
|
||||||
|
active_parameter: ActiveParameter::at(db, position),
|
||||||
is_param: false,
|
is_param: false,
|
||||||
is_pat_binding_or_const: false,
|
is_pat_binding_or_const: false,
|
||||||
is_trivial_path: false,
|
is_trivial_path: false,
|
||||||
|
@ -6,7 +6,6 @@
|
|||||||
use test_utils::tested_by;
|
use test_utils::tested_by;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
call_info::call_info,
|
|
||||||
completion::{
|
completion::{
|
||||||
completion_item::Builder, CompletionContext, CompletionItem, CompletionItemKind,
|
completion_item::Builder, CompletionContext, CompletionItem, CompletionItemKind,
|
||||||
CompletionKind, Completions,
|
CompletionKind, Completions,
|
||||||
@ -317,8 +316,8 @@ pub(crate) fn compute_score(
|
|||||||
struct_field.name(ctx.db).to_string(),
|
struct_field.name(ctx.db).to_string(),
|
||||||
struct_field.signature_ty(ctx.db).display(ctx.db).to_string(),
|
struct_field.signature_ty(ctx.db).display(ctx.db).to_string(),
|
||||||
)
|
)
|
||||||
} else if let Some(call_info) = call_info(ctx.db, ctx.file_position) {
|
} else if let Some(active_parameter) = &ctx.active_parameter {
|
||||||
(call_info.active_parameter_name()?, call_info.active_parameter_type()?)
|
(active_parameter.name.clone(), active_parameter.ty.clone())
|
||||||
} else {
|
} else {
|
||||||
return None;
|
return None;
|
||||||
};
|
};
|
||||||
|
@ -129,21 +129,6 @@ pub struct CallInfo {
|
|||||||
pub active_parameter: Option<usize>,
|
pub active_parameter: Option<usize>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CallInfo {
|
|
||||||
pub fn active_parameter_type(&self) -> Option<String> {
|
|
||||||
if let Some(id) = self.active_parameter {
|
|
||||||
return self.signature.parameter_types.get(id).map(|param_ty| param_ty.clone());
|
|
||||||
}
|
|
||||||
None
|
|
||||||
}
|
|
||||||
pub fn active_parameter_name(&self) -> Option<String> {
|
|
||||||
if let Some(id) = self.active_parameter {
|
|
||||||
return self.signature.parameter_names.get(id).map(|param_ty| param_ty.clone());
|
|
||||||
}
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// `AnalysisHost` stores the current state of the world.
|
/// `AnalysisHost` stores the current state of the world.
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct AnalysisHost {
|
pub struct AnalysisHost {
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
};
|
};
|
||||||
use rustc_hash::FxHashMap;
|
use rustc_hash::FxHashMap;
|
||||||
|
|
||||||
use crate::{call_info::call_info_for_token, Analysis, FileId};
|
use crate::{call_info::ActiveParameter, Analysis, FileId};
|
||||||
|
|
||||||
pub(crate) use html::highlight_as_html;
|
pub(crate) use html::highlight_as_html;
|
||||||
pub use tags::{Highlight, HighlightModifier, HighlightModifiers, HighlightTag};
|
pub use tags::{Highlight, HighlightModifier, HighlightModifiers, HighlightTag};
|
||||||
@ -364,10 +364,8 @@ fn highlight_injection(
|
|||||||
literal: ast::RawString,
|
literal: ast::RawString,
|
||||||
expanded: SyntaxToken,
|
expanded: SyntaxToken,
|
||||||
) -> Option<()> {
|
) -> Option<()> {
|
||||||
let call_info = call_info_for_token(&sema, expanded)?;
|
let active_parameter = ActiveParameter::at_token(&sema, expanded)?;
|
||||||
let idx = call_info.active_parameter?;
|
if !active_parameter.name.starts_with("ra_fixture") {
|
||||||
let name = call_info.signature.parameter_names.get(idx)?;
|
|
||||||
if !name.starts_with("ra_fixture") {
|
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
let value = literal.value()?;
|
let value = literal.value()?;
|
||||||
|
Loading…
Reference in New Issue
Block a user