Skip to main content

MatchFinder

Struct MatchFinder 

Source
pub struct MatchFinder<'db> {
    pub(crate) sema: Semantics<'db, RootDatabase>,
    pub(crate) rules: Vec<ResolvedRule<'db>>,
    pub(crate) resolution_scope: ResolutionScope<'db>,
    pub(crate) restrict_ranges: Vec<FileRange>,
}
Expand description

Searches a crate for pattern matches and possibly replaces them with something else.

Fields§

§sema: Semantics<'db, RootDatabase>

Our source of information about the user’s code.

§rules: Vec<ResolvedRule<'db>>§resolution_scope: ResolutionScope<'db>§restrict_ranges: Vec<FileRange>

Implementations§

Source§

impl<'db> MatchFinder<'db>

Source

pub(crate) fn find_matches_for_rule( &self, rule: &ResolvedRule<'db>, usage_cache: &mut UsageCache, matches_out: &mut Vec<Match>, )

Adds all matches for rule to matches_out. Matches may overlap in ways that make replacement impossible, so further processing is required in order to properly nest matches and remove overlapping matches. This is done in the nesting module.

Source

fn find_matches_for_pattern_tree( &self, rule: &ResolvedRule<'db>, pattern: &ResolvedPattern<'db>, usage_cache: &mut UsageCache, matches_out: &mut Vec<Match>, )

Source

fn find_nodes_to_match( &self, resolved_path: &ResolvedPath, file_range: FileRange, ) -> Vec<SyntaxNode>

Source

fn find_usages<'a>( &self, usage_cache: &'a mut UsageCache, definition: Definition, ) -> &'a UsageSearchResult

Source

fn search_scope(&self) -> SearchScope

Returns the scope within which we want to search. We don’t want un unrestricted search scope, since we don’t want to find references in external dependencies.

Source

fn slow_scan(&self, rule: &ResolvedRule<'db>, matches_out: &mut Vec<Match>)

Source

fn search_files_do(&self, callback: impl FnMut(FileId))

Source

fn slow_scan_node( &self, code: &SyntaxNode, rule: &ResolvedRule<'db>, restrict_range: &Option<FileRange>, matches_out: &mut Vec<Match>, )

Source

fn try_add_match( &self, rule: &ResolvedRule<'db>, code: &SyntaxNode, restrict_range: &Option<FileRange>, matches_out: &mut Vec<Match>, )

Source

fn within_range_restrictions(&self, code: &SyntaxNode) -> bool

Returns whether code is within one of our range restrictions if we have any. No range restrictions is considered unrestricted and always returns true.

Source§

impl<'db> MatchFinder<'db>

Source

pub fn in_context( db: &'db RootDatabase, lookup_context: FilePosition, restrict_ranges: Vec<FileRange>, ) -> Result<MatchFinder<'db>, SsrError>

Constructs a new instance where names will be looked up as if they appeared at lookup_context.

Source

pub fn at_first_file( db: &'db RootDatabase, ) -> Result<MatchFinder<'db>, SsrError>

Constructs an instance using the start of the first file in db as the lookup context.

Source

pub fn add_rule(&mut self, rule: SsrRule) -> Result<(), SsrError>

Adds a rule to be applied. The order in which rules are added matters. Earlier rules take precedence. If a node is matched by an earlier rule, then later rules won’t be permitted to match to it.

Source

pub fn edits(&self) -> FxHashMap<FileId, TextEdit>

Finds matches for all added rules and returns edits for all found matches.

Source

pub fn add_search_pattern( &mut self, pattern: SsrPattern, ) -> Result<(), SsrError>

Adds a search pattern. For use if you intend to only call find_matches_in_file. If you intend to do replacement, use add_rule instead.

Source

pub fn matches(&self) -> SsrMatches

Returns matches for all added rules.

Source

pub fn debug_where_text_equal( &self, file_id: EditionedFileId, snippet: &str, ) -> Vec<MatchDebugInfo>

Finds all nodes in file_id whose text is exactly equal to snippet and attempts to match them, while recording reasons why they don’t match. This API is useful for command line-based debugging where providing a range is difficult.

Source

pub(crate) fn output_debug_for_nodes_at_range( &self, node: &SyntaxNode, range: FileRange, restrict_range: &Option<FileRange>, out: &mut Vec<MatchDebugInfo>, )

Auto Trait Implementations§

§

impl<'db> !Freeze for MatchFinder<'db>

§

impl<'db> !RefUnwindSafe for MatchFinder<'db>

§

impl<'db> !Send for MatchFinder<'db>

§

impl<'db> !Sync for MatchFinder<'db>

§

impl<'db> Unpin for MatchFinder<'db>

§

impl<'db> UnsafeUnpin for MatchFinder<'db>

§

impl<'db> !UnwindSafe for MatchFinder<'db>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T, R> CollectAndApply<T, R> for T

§

fn collect_and_apply<I, F>(iter: I, f: F) -> R
where I: Iterator<Item = T>, F: FnOnce(&[T]) -> R,

Equivalent to f(&iter.collect::<Vec<_>>()).

§

type Output = R

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T> IntoBox<dyn Any> for T
where T: Any,

§

fn into_box(self) -> Box<dyn Any>

Convert self into the appropriate boxed form.
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> Lookup<T> for T

§

fn into_owned(self) -> T

§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<I, T, U> Upcast<I, U> for T
where U: UpcastFrom<I, T>,

§

fn upcast(self, interner: I) -> U

§

impl<I, T> UpcastFrom<I, T> for T

§

fn upcast_from(from: T, _tcx: I) -> T

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more