mirror of
https://github.com/danbulant/oxc
synced 2026-05-24 12:21:58 +00:00
perf(linter/react): find class node by symbols in get_parent_es6_component (#1657)
This way we can get the class node faster. But I don't know if this is a good way. In `eslint-plugin-react`, they get class node by scope. But oxc cannot do the same way
This commit is contained in:
parent
864176a051
commit
00806384ff
3 changed files with 16 additions and 8 deletions
|
|
@ -121,7 +121,7 @@ impl Rule for NoStringRefs {
|
|||
if matches!(member_expr.object(), Expression::ThisExpression(_))
|
||||
&& member_expr.static_property_name() == Some("refs")
|
||||
&& (get_parent_es5_component(node, ctx).is_some()
|
||||
|| get_parent_es6_component(node, ctx).is_some())
|
||||
|| get_parent_es6_component(ctx).is_some())
|
||||
{
|
||||
ctx.diagnostic(NoStringRefsDiagnostic::ThisRefsDeprecated(member_expr.span()));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ use oxc_ast::{
|
|||
},
|
||||
AstKind,
|
||||
};
|
||||
use oxc_semantic::AstNode;
|
||||
use oxc_semantic::{AstNode, SymbolFlags};
|
||||
|
||||
use crate::LintContext;
|
||||
|
||||
|
|
@ -151,11 +151,15 @@ pub fn get_parent_es5_component<'a, 'b>(
|
|||
})
|
||||
}
|
||||
|
||||
pub fn get_parent_es6_component<'a, 'b>(
|
||||
node: &'b AstNode<'a>,
|
||||
ctx: &'b LintContext<'a>,
|
||||
) -> Option<&'b AstNode<'a>> {
|
||||
ctx.nodes().ancestors(node.id()).skip(1).find_map(|node_id| {
|
||||
is_es6_component(ctx.nodes().get_node(node_id)).then(|| ctx.nodes().get_node(node_id))
|
||||
pub fn get_parent_es6_component<'a, 'b>(ctx: &'b LintContext<'a>) -> Option<&'b AstNode<'a>> {
|
||||
ctx.semantic().symbols().iter_rev().find_map(|symbol| {
|
||||
let flags = ctx.semantic().symbols().get_flag(symbol);
|
||||
if flags.contains(SymbolFlags::Class) {
|
||||
let node = ctx.semantic().symbol_declaration(symbol);
|
||||
if is_es6_component(node) {
|
||||
return Some(node);
|
||||
}
|
||||
}
|
||||
None
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -39,6 +39,10 @@ impl SymbolTable {
|
|||
self.spans.iter_enumerated().map(|(symbol_id, _)| symbol_id)
|
||||
}
|
||||
|
||||
pub fn iter_rev(&self) -> impl Iterator<Item = SymbolId> + '_ {
|
||||
self.spans.iter_enumerated().rev().map(|(symbol_id, _)| symbol_id)
|
||||
}
|
||||
|
||||
pub fn get_symbol_id_from_span(&self, span: &Span) -> Option<SymbolId> {
|
||||
self.spans
|
||||
.iter_enumerated()
|
||||
|
|
|
|||
Loading…
Reference in a new issue