Skip to content

Commit

Permalink
Rename PositionSeeker to PositionFilter
Browse files Browse the repository at this point in the history
  • Loading branch information
SpontanCombust committed May 19, 2024
1 parent 7063cb0 commit 7aeb437
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 40 deletions.
4 changes: 2 additions & 2 deletions crates/analysis/src/utils/visitors/mod.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
mod position_seeker;
pub use position_seeker::{PositionSeeker, PositionSeekerPayload};
mod position_filter;
pub use position_filter::{PositionFilter, PositionFilterPayload};

mod sympath_builder;
pub use sympath_builder::{SymbolPathBuilder, SymbolPathBuilderPayload};
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,22 @@ use witcherscript::{ast::*, tokens::*};
/// It is not guaranteed that the `done` flag will be eventually set.
/// This visitor can be used in a visitor chain.
#[derive(Debug, Clone)]
pub struct PositionSeeker {
pub struct PositionFilter {
pos: lsp::Position,
currently_in_range: bool,
payload: Rc<RefCell<PositionSeekerPayload>>
payload: Rc<RefCell<PositionFilterPayload>>
}

#[derive(Debug, Clone, Default)]
pub struct PositionSeekerPayload {
pub struct PositionFilterPayload {
/// Signals that the given node likely directly contains a node,
/// which spans the specified position
pub done: bool
}

impl PositionSeeker {
pub fn new(position: lsp::Position) -> (Self, Rc<RefCell<PositionSeekerPayload>>) {
let payload = Rc::new(RefCell::new(PositionSeekerPayload {
impl PositionFilter {
pub fn new(position: lsp::Position) -> (Self, Rc<RefCell<PositionFilterPayload>>) {
let payload = Rc::new(RefCell::new(PositionFilterPayload {
done: false
}));

Expand All @@ -37,7 +37,7 @@ impl PositionSeeker {
(self_, payload)
}

pub fn new_rc(position: lsp::Position) -> (Rc<RefCell<Self>>, Rc<RefCell<PositionSeekerPayload>>) {
pub fn new_rc(position: lsp::Position) -> (Rc<RefCell<Self>>, Rc<RefCell<PositionFilterPayload>>) {
let (self_, payload) = Self::new(position);
(Rc::new(RefCell::new(self_)), payload)
}
Expand All @@ -49,7 +49,7 @@ impl PositionSeeker {
}
}

impl SyntaxNodeVisitor for PositionSeeker {
impl SyntaxNodeVisitor for PositionFilter {
fn traversal_policy_default(&self) -> bool {
false
}
Expand Down Expand Up @@ -734,7 +734,7 @@ impl SyntaxNodeVisitor for PositionSeeker {
}


impl SyntaxNodeVisitorChainLink for PositionSeeker {
impl SyntaxNodeVisitorChainLink for PositionFilter {
fn pass_onto_next_link(&self) -> bool {
self.currently_in_range
}
Expand Down
36 changes: 18 additions & 18 deletions crates/lsp/src/providers/common.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@ use std::{cell::RefCell, rc::Rc};
use tower_lsp::lsp_types as lsp;
use witcherscript::{ast::*, script_document::ScriptDocument, tokens::*};
use witcherscript_analysis::symbol_analysis::{symbol_path::SymbolPathBuf, unqualified_name_lookup::UnqualifiedNameLookup};
use witcherscript_analysis::utils::{PositionSeekerPayload, SymbolPathBuilderPayload};
use witcherscript_analysis::utils::{PositionFilterPayload, SymbolPathBuilderPayload};


/// A node visitor that can resolve a code identifier/symbol if a specified position points to such.
/// Expects to work after PositionSeeker in visitor chain.
pub(super) struct TextDocumentPositionResolver<'a> {
pos: lsp::Position,
doc: &'a ScriptDocument,
pos_seeker_payload: Rc<RefCell<PositionSeekerPayload>>,
pos_filter_payload: Rc<RefCell<PositionFilterPayload>>,
sympath_builder_payload: Rc<RefCell<SymbolPathBuilderPayload>>,
unl_builder_payload: Rc<RefCell<UnqualifiedNameLookup>>,
pub found_target: Option<PositionTarget>
Expand Down Expand Up @@ -51,14 +51,14 @@ impl<'a> TextDocumentPositionResolver<'a> {
pub fn new_rc(
pos: lsp::Position,
doc: &'a ScriptDocument,
pos_seeker_payload: Rc<RefCell<PositionSeekerPayload>>,
pos_filter_payload: Rc<RefCell<PositionFilterPayload>>,
sympath_builder_payload: Rc<RefCell<SymbolPathBuilderPayload>>,
unl_builder_payload: Rc<RefCell<UnqualifiedNameLookup>>
) -> Rc<RefCell<Self>> {
Rc::new(RefCell::new(Self {
pos,
doc,
pos_seeker_payload,
pos_filter_payload,
sympath_builder_payload,
unl_builder_payload,
found_target: None
Expand Down Expand Up @@ -205,7 +205,7 @@ impl SyntaxNodeVisitor for TextDocumentPositionResolver<'_> {


fn visit_class_decl(&mut self, n: &ClassDeclarationNode) -> ClassDeclarationTraversalPolicy {
if self.pos_seeker_payload.borrow().done {
if self.pos_filter_payload.borrow().done {
let name = n.name();

if name.spans_position(self.pos) {
Expand All @@ -220,7 +220,7 @@ impl SyntaxNodeVisitor for TextDocumentPositionResolver<'_> {
}

fn visit_state_decl(&mut self, n: &StateDeclarationNode) -> StateDeclarationTraversalPolicy {
if self.pos_seeker_payload.borrow().done {
if self.pos_filter_payload.borrow().done {
let name = n.name();
let parent = n.parent();

Expand All @@ -239,7 +239,7 @@ impl SyntaxNodeVisitor for TextDocumentPositionResolver<'_> {
}

fn visit_struct_decl(&mut self, n: &StructDeclarationNode) -> StructDeclarationTraversalPolicy {
if self.pos_seeker_payload.borrow().done {
if self.pos_filter_payload.borrow().done {
let name = n.name();

if name.spans_position(self.pos) {
Expand All @@ -251,7 +251,7 @@ impl SyntaxNodeVisitor for TextDocumentPositionResolver<'_> {
}

fn visit_enum_decl(&mut self, n: &EnumDeclarationNode) -> EnumDeclarationTraversalPolicy {
if self.pos_seeker_payload.borrow().done {
if self.pos_filter_payload.borrow().done {
let name = n.name();

if name.spans_position(self.pos) {
Expand All @@ -264,7 +264,7 @@ impl SyntaxNodeVisitor for TextDocumentPositionResolver<'_> {


fn visit_enum_variant_decl(&mut self, n: &EnumVariantDeclarationNode) {
if self.pos_seeker_payload.borrow().done {
if self.pos_filter_payload.borrow().done {
let name = n.name();

if name.spans_position(self.pos) {
Expand Down Expand Up @@ -297,7 +297,7 @@ impl SyntaxNodeVisitor for TextDocumentPositionResolver<'_> {
}

fn visit_member_default_val(&mut self, n: &MemberDefaultValueNode, _: PropertyTraversalContext) -> MemberDefaultValueTraversalPolicy {
if self.pos_seeker_payload.borrow().done {
if self.pos_filter_payload.borrow().done {
let member = n.member();

if member.spans_position(self.pos) {
Expand All @@ -309,7 +309,7 @@ impl SyntaxNodeVisitor for TextDocumentPositionResolver<'_> {
}

fn visit_member_defaults_block_assignment(&mut self, n: &MemberDefaultsBlockAssignmentNode) -> MemberDefaultValueTraversalPolicy {
if self.pos_seeker_payload.borrow().done {
if self.pos_filter_payload.borrow().done {
let member = n.member();

if member.spans_position(self.pos) {
Expand All @@ -330,7 +330,7 @@ impl SyntaxNodeVisitor for TextDocumentPositionResolver<'_> {


fn visit_global_func_decl(&mut self, n: &GlobalFunctionDeclarationNode) -> GlobalFunctionDeclarationTraversalPolicy {
if self.pos_seeker_payload.borrow().done {
if self.pos_filter_payload.borrow().done {
let name = n.name();

if name.spans_position(self.pos) {
Expand All @@ -345,7 +345,7 @@ impl SyntaxNodeVisitor for TextDocumentPositionResolver<'_> {
}

fn visit_member_func_decl(&mut self, n: &MemberFunctionDeclarationNode, _: PropertyTraversalContext) -> MemberFunctionDeclarationTraversalPolicy {
if self.pos_seeker_payload.borrow().done {
if self.pos_filter_payload.borrow().done {
let name = n.name();

if name.spans_position(self.pos) {
Expand All @@ -360,7 +360,7 @@ impl SyntaxNodeVisitor for TextDocumentPositionResolver<'_> {
}

fn visit_event_decl(&mut self, n: &EventDeclarationNode, _: PropertyTraversalContext) -> EventDeclarationTraversalPolicy {
if self.pos_seeker_payload.borrow().done {
if self.pos_filter_payload.borrow().done {
let name = n.name();

if name.spans_position(self.pos) {
Expand All @@ -387,7 +387,7 @@ impl SyntaxNodeVisitor for TextDocumentPositionResolver<'_> {


fn visit_local_var_decl_stmt(&mut self, n: &VarDeclarationNode, _: StatementTraversalContext) -> VarDeclarationTraversalPolicy {
if self.pos_seeker_payload.borrow().done {
if self.pos_filter_payload.borrow().done {
let var_type = n.var_type();

if var_type.spans_position(self.pos) {
Expand Down Expand Up @@ -427,7 +427,7 @@ impl SyntaxNodeVisitor for TextDocumentPositionResolver<'_> {
}

fn visit_member_field_expr(&mut self, n: &MemberFieldExpressionNode, cx: ExpressionTraversalContext) -> MemberFieldExpressionTraversalPolicy {
if self.pos_seeker_payload.borrow().done {
if self.pos_filter_payload.borrow().done {
let member = n.member();

if member.spans_position(self.pos) {
Expand All @@ -443,7 +443,7 @@ impl SyntaxNodeVisitor for TextDocumentPositionResolver<'_> {
}

fn visit_new_expr(&mut self, n: &NewExpressionNode, _: ExpressionTraversalContext) -> NewExpressionTraversalPolicy {
if self.pos_seeker_payload.borrow().done {
if self.pos_filter_payload.borrow().done {
let class = n.class();

if class.spans_position(self.pos) {
Expand All @@ -455,7 +455,7 @@ impl SyntaxNodeVisitor for TextDocumentPositionResolver<'_> {
}

fn visit_type_cast_expr(&mut self, n: &TypeCastExpressionNode, _: ExpressionTraversalContext) -> TypeCastExpressionTraversalPolicy {
if self.pos_seeker_payload.borrow().done {
if self.pos_filter_payload.borrow().done {
let target_type = n.target_type();

if n.target_type().spans_position(self.pos) {
Expand Down
8 changes: 4 additions & 4 deletions crates/lsp/src/providers/goto.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use witcherscript_analysis::symbol_analysis::symbol_table::{SymbolTable, SymbolL
use witcherscript_analysis::symbol_analysis::symbol_path::SymbolPathBuf;
use witcherscript_analysis::symbol_analysis::symbols::*;
use witcherscript_analysis::symbol_analysis::unqualified_name_lookup::UnqualifiedNameLookupBuilder;
use witcherscript_analysis::utils::{PositionSeeker, SymbolPathBuilder};
use witcherscript_analysis::utils::{PositionFilter, SymbolPathBuilder};
use crate::{providers::common::PositionTargetKind, Backend, ScriptState, messaging::notifications};
use super::common::{PositionTarget, TextDocumentPositionResolver};

Expand Down Expand Up @@ -233,19 +233,19 @@ async fn inspect_symbol_at_position(backend: &Backend, content_path: &AbsPath, d

fn resolve_position<'a, It>(position: lsp::Position, script_state: &'a ScriptState, symtab_marcher: SymbolTableMarcher<It>) -> Option<PositionTarget>
where It: Iterator<Item = &'a SymbolTable> + Clone + 'a {
let (pos_seeker, pos_seeker_payload) = PositionSeeker::new(position);
let (pos_filter, pos_filter_payload) = PositionFilter::new(position);
let (sympath_builder, sympath_builder_payload) = SymbolPathBuilder::new(&script_state.buffer);
let (unl_builder, unl_payload) = UnqualifiedNameLookupBuilder::new(&script_state.buffer, sympath_builder_payload.clone(), symtab_marcher);
let resolver = TextDocumentPositionResolver::new_rc(
position,
&script_state.buffer,
pos_seeker_payload.clone(),
pos_filter_payload.clone(),
sympath_builder_payload.clone(),
unl_payload.clone(),
);

let mut chain = SyntaxNodeVisitorChain::new()
.link(pos_seeker) //FIXME finding local vars doesn't work, because PositionSeeker blocks visits to local var declarations
.link(pos_filter) //FIXME finding local vars doesn't work, because PositionSeeker blocks visits to local var declarations
.link(sympath_builder)
.link(unl_builder)
.link_rc(resolver.clone());
Expand Down
14 changes: 7 additions & 7 deletions crates/lsp/src/providers/selection_range.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use tower_lsp::lsp_types as lsp;
use tower_lsp::jsonrpc::Result;
use abs_path::AbsPath;
use witcherscript::{ast::*, tokens::*};
use witcherscript_analysis::utils::{PositionSeeker, PositionSeekerPayload};
use witcherscript_analysis::utils::{PositionFilter, PositionFilterPayload};
use crate::Backend;


Expand All @@ -12,15 +12,15 @@ pub async fn selection_range(backend: &Backend, params: lsp::SelectionRangeParam
if let Some(script_state) = backend.scripts.get(&doc_path) {
let mut found_ranges = Vec::with_capacity(params.positions.len());

let (pos_seeker, payload) = PositionSeeker::new_rc(lsp::Position::default());
let (pos_filter, payload) = PositionFilter::new_rc(lsp::Position::default());
let resolver = SelectionRangeResolver::new_rc(payload.clone());

for pos in params.positions {
resolver.borrow_mut().reset(pos);
pos_seeker.borrow_mut().reset(pos);
pos_filter.borrow_mut().reset(pos);

let mut chain = SyntaxNodeVisitorChain::new()
.link_rc(pos_seeker.clone())
.link_rc(pos_filter.clone())
.link_rc(resolver.clone());

script_state.script.visit_nodes(&mut chain);
Expand Down Expand Up @@ -59,15 +59,15 @@ pub async fn selection_range(backend: &Backend, params: lsp::SelectionRangeParam
struct SelectionRangeResolver {
pos: lsp::Position,
range_stack: Vec<lsp::Range>,
payload: Rc<RefCell<PositionSeekerPayload>>
payload: Rc<RefCell<PositionFilterPayload>>
}

impl SelectionRangeResolver {
fn new_rc(point_seeker_payload: Rc<RefCell<PositionSeekerPayload>>) -> Rc<RefCell<Self>> {
fn new_rc(pos_filter_payload: Rc<RefCell<PositionFilterPayload>>) -> Rc<RefCell<Self>> {
Rc::new(RefCell::new(Self {
pos: lsp::Position::default(),
range_stack: Vec::new(),
payload: point_seeker_payload
payload: pos_filter_payload
}))
}

Expand Down

0 comments on commit 7aeb437

Please sign in to comment.