mirror of
https://github.com/danbulant/oxc
synced 2026-05-24 12:21:58 +00:00
feat: add eslint no-setter-return rule (#434)
Co-authored-by: Boshen <boshenc@gmail.com>
This commit is contained in:
parent
b31819d7a1
commit
3656802fd4
6 changed files with 579 additions and 2 deletions
|
|
@ -19,6 +19,7 @@ oxc_macros::declare_all_lint_rules! {
|
|||
no_eval,
|
||||
no_new_symbol,
|
||||
no_self_compare,
|
||||
no_setter_return,
|
||||
no_shadow_restricted_names,
|
||||
no_mixed_operators,
|
||||
no_constant_binary_expression,
|
||||
|
|
|
|||
288
crates/oxc_linter/src/rules/no_setter_return.rs
Normal file
288
crates/oxc_linter/src/rules/no_setter_return.rs
Normal file
|
|
@ -0,0 +1,288 @@
|
|||
use oxc_ast::AstKind;
|
||||
use oxc_diagnostics::{
|
||||
miette::{self, Diagnostic},
|
||||
thiserror::Error,
|
||||
};
|
||||
use oxc_macros::declare_oxc_lint;
|
||||
use oxc_span::Span;
|
||||
|
||||
use crate::{context::LintContext, rule::Rule, AstNode};
|
||||
|
||||
#[derive(Debug, Error, Diagnostic)]
|
||||
#[error("eslint(no-setter-return): Setter cannot return a value")]
|
||||
struct NoSetterReturnDiagnostic(#[label] pub Span);
|
||||
|
||||
#[derive(Debug, Default, Clone)]
|
||||
pub struct NoSetterReturn;
|
||||
|
||||
declare_oxc_lint!(
|
||||
/// ### What it does
|
||||
///
|
||||
/// Setters cannot return values.
|
||||
///
|
||||
/// ### Why is this bad?
|
||||
///
|
||||
/// While returning a value from a setter does not produce an error, the returned value is
|
||||
/// being ignored. Therefore, returning a value from a setter is either unnecessary or a
|
||||
/// possible error, since the returned value cannot be used.
|
||||
///
|
||||
/// ### Example
|
||||
///
|
||||
/// ```javascript
|
||||
/// class URL {
|
||||
/// set origin() {
|
||||
/// return true;
|
||||
/// }
|
||||
/// }
|
||||
/// ```
|
||||
NoSetterReturn,
|
||||
correctness
|
||||
);
|
||||
|
||||
impl Rule for NoSetterReturn {
|
||||
fn run<'a>(&self, node: &AstNode<'a>, ctx: &LintContext<'a>) {
|
||||
if let AstKind::ReturnStatement(stmt) = node.kind()
|
||||
&& stmt.argument.is_some()
|
||||
&& ctx.scopes().get_flags(node.scope_id()).is_set_accessor() {
|
||||
ctx.diagnostic(NoSetterReturnDiagnostic(stmt.span));
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(clippy::too_many_lines)]
|
||||
#[test]
|
||||
fn test() {
|
||||
use crate::tester::Tester;
|
||||
|
||||
let pass = vec {} })", None),
|
||||
("({ set [() => { return 1; }](val) {} })", None),
|
||||
("({ set [() => 1](val) {} })", None),
|
||||
("({ set foo(val = function() { return 1; }) {} })", None),
|
||||
("({ set foo(val = v => 1) {} })", None),
|
||||
("(class { set foo(val) { function foo(val) { return 1; } } })", None),
|
||||
("(class { set foo(val) { var foo = function(val) { return 1; } } })", None),
|
||||
("(class { set foo(val) { var foo = (val) => { return 1; } } })", None),
|
||||
("(class { set foo(val) { var foo = (val) => 1; } })", None),
|
||||
("(class { set [function() { return 1; }](val) {} })", None),
|
||||
("(class { set [() => { return 1; }](val) {} })", None),
|
||||
("(class { set [() => 1](val) {} })", None),
|
||||
("(class { set foo(val = function() { return 1; }) {} })", None),
|
||||
("(class { set foo(val = (v) => 1) {} })", None),
|
||||
("Object.defineProperty(foo, 'bar', { set(val) { return; } })", None),
|
||||
("Reflect.defineProperty(foo, 'bar', { set(val) { if (val) { return; } } })", None),
|
||||
(
|
||||
"Object.defineProperties(foo, { bar: { set(val) { try { return; } catch(e){} } } })",
|
||||
None,
|
||||
),
|
||||
("Object.create(foo, { bar: { set: function(val) { return; } } })", None),
|
||||
("x = { set(val) { return 1; } }", None),
|
||||
("x = { foo: { set(val) { return 1; } } }", None),
|
||||
("Object.defineProperty(foo, 'bar', { value(val) { return 1; } })", None),
|
||||
("Reflect.defineProperty(foo, 'bar', { value: function set(val) { return 1; } })", None),
|
||||
("Object.defineProperties(foo, { bar: { [set](val) { return 1; } } })", None),
|
||||
("Object.create(foo, { bar: { 'set ': function(val) { return 1; } } })", None),
|
||||
("Object.defineProperty(foo, 'bar', { [`set `]: (val) => { return 1; } })", None),
|
||||
("Reflect.defineProperty(foo, 'bar', { Set(val) { return 1; } })", None),
|
||||
("Object.defineProperties(foo, { bar: { value: (val) => 1 } })", None),
|
||||
("Object.create(foo, { set: { value: function(val) { return 1; } } })", None),
|
||||
("Object.defineProperty(foo, 'bar', { baz(val) { return 1; } })", None),
|
||||
("Reflect.defineProperty(foo, 'bar', { get(val) { return 1; } })", None),
|
||||
("Object.create(foo, { set: function(val) { return 1; } })", None),
|
||||
("Object.defineProperty(foo, { set: (val) => 1 })", None),
|
||||
("Object.defineProperty(foo, 'bar', { set(val) { function foo() { return 1; } } })", None),
|
||||
(
|
||||
"Reflect.defineProperty(foo, 'bar', { set(val) { var foo = function() { return 1; } } })",
|
||||
None,
|
||||
),
|
||||
("Object.defineProperties(foo, { bar: { set(val) { () => { return 1 }; } } })", None),
|
||||
("Object.create(foo, { bar: { set: (val) => { (val) => 1; } } })", None),
|
||||
("Object.defineProperty(foo, 'bar', 'baz', { set(val) { return 1; } })", None),
|
||||
("Object.defineProperty(foo, { set(val) { return 1; } }, 'bar')", None),
|
||||
("Object.defineProperty({ set(val) { return 1; } }, foo, 'bar')", None),
|
||||
("Reflect.defineProperty(foo, 'bar', 'baz', { set(val) { return 1; } })", None),
|
||||
("Reflect.defineProperty(foo, { set(val) { return 1; } }, 'bar')", None),
|
||||
("Reflect.defineProperty({ set(val) { return 1; } }, foo, 'bar')", None),
|
||||
("Object.defineProperties(foo, bar, { baz: { set(val) { return 1; } } })", None),
|
||||
("Object.defineProperties({ bar: { set(val) { return 1; } } }, foo)", None),
|
||||
("Object.create(foo, bar, { baz: { set(val) { return 1; } } })", None),
|
||||
("Object.create({ bar: { set(val) { return 1; } } }, foo)", None),
|
||||
("Object.DefineProperty(foo, 'bar', { set(val) { return 1; } })", None),
|
||||
("Reflect.DefineProperty(foo, 'bar', { set(val) { if (val) { return 1; } } })", None),
|
||||
(
|
||||
"Object.DefineProperties(foo, { bar: { set(val) { try { return 1; } catch(e){} } } })",
|
||||
None,
|
||||
),
|
||||
("Object.Create(foo, { bar: { set: function(val) { return 1; } } })", None),
|
||||
("object.defineProperty(foo, 'bar', { set(val) { return 1; } })", None),
|
||||
("reflect.defineProperty(foo, 'bar', { set(val) { if (val) { return 1; } } })", None),
|
||||
(
|
||||
"Reflect.defineProperties(foo, { bar: { set(val) { try { return 1; } catch(e){} } } })",
|
||||
None,
|
||||
),
|
||||
("object.create(foo, { bar: { set: function(val) { return 1; } } })", None),
|
||||
("Reflect.defineProperty(foo, 'bar', { set(val) { if (val) { return 1; } } })", None),
|
||||
(
|
||||
"/* globals Object:off */ Object.defineProperty(foo, 'bar', { set(val) { return 1; } })",
|
||||
None,
|
||||
),
|
||||
(
|
||||
"Object.defineProperties(foo, { bar: { set(val) { try { return 1; } catch(e){} } } })",
|
||||
None,
|
||||
),
|
||||
("let Object; Object.defineProperty(foo, 'bar', { set(val) { return 1; } })", None),
|
||||
(
|
||||
"function f() { Reflect.defineProperty(foo, 'bar', { set(val) { if (val) { return 1; } } }); var Reflect;}",
|
||||
None,
|
||||
),
|
||||
(
|
||||
"function f(Object) { Object.defineProperties(foo, { bar: { set(val) { try { return 1; } catch(e){} } } }) }",
|
||||
None,
|
||||
),
|
||||
(
|
||||
"if (x) { const Object = getObject(); Object.create(foo, { bar: { set: function(val) { return 1; } } }) }",
|
||||
None,
|
||||
),
|
||||
(
|
||||
"x = function Object() { Object.defineProperty(foo, 'bar', { set(val) { return 1; } }) }",
|
||||
None,
|
||||
),
|
||||
];
|
||||
|
||||
let fail = vec { return 1; } })", None),
|
||||
// ("Reflect.defineProperty(foo, 'bar', { 'set'(val) { return 1; } })", None),
|
||||
// ("Object[`defineProperties`](foo, { baz: { ['set'](val) { return 1; } } })", None),
|
||||
// ("Object.create({}, { baz: { [`set`]: (val) => { return 1; } } })", None),
|
||||
// ("Object.defineProperty(foo, 'bar', { set: function Object(val) { return 1; } })", None),
|
||||
// ("Object.defineProperty(foo, 'bar', { set: function(Object) { return 1; } })", None),
|
||||
// ("Object?.defineProperty(foo, 'bar', { set(val) { return 1; } })", None),
|
||||
// ("(Object?.defineProperty)(foo, 'bar', { set(val) { return 1; } })", None),
|
||||
];
|
||||
|
||||
Tester::new(NoSetterReturn::NAME, pass, fail).test_and_snapshot();
|
||||
}
|
||||
257
crates/oxc_linter/src/snapshots/no_setter_return.snap
Normal file
257
crates/oxc_linter/src/snapshots/no_setter_return.snap
Normal file
|
|
@ -0,0 +1,257 @@
|
|||
---
|
||||
source: crates/oxc_linter/src/tester.rs
|
||||
expression: no_setter_return
|
||||
---
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ ({ set a(val){ return val + 1; } })
|
||||
· ───────────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ ({ set a(val) { return 1; } })
|
||||
· ─────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ class A { set a(val) { return 1; } }
|
||||
· ─────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ class A { static set a(val) { return 1; } }
|
||||
· ─────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ (class { set a(val) { return 1; } })
|
||||
· ─────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ ({ set a(val) { return val; } })
|
||||
· ───────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ class A { set a(val) { return undefined; } }
|
||||
· ─────────────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ (class { set a(val) { return null; } })
|
||||
· ────────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ ({ set a(val) { return x + y; } })
|
||||
· ─────────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ class A { set a(val) { return foo(); } }
|
||||
· ─────────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ (class { set a(val) { return this._a; } })
|
||||
· ───────────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ ({ set a(val) { return this.a; } })
|
||||
· ──────────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ ({ set a(val) { if (foo) { return 1; }; } })
|
||||
· ─────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ class A { set a(val) { try { return 1; } catch(e) {} } }
|
||||
· ─────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ (class { set a(val) { while (foo){ if (bar) break; else return 1; } } })
|
||||
· ─────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ ({ set a(val) { return 1; }, set b(val) { return 1; } })
|
||||
· ─────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ ({ set a(val) { return 1; }, set b(val) { return 1; } })
|
||||
· ─────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ class A { set a(val) { return 1; } set b(val) { return 1; } }
|
||||
· ─────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ class A { set a(val) { return 1; } set b(val) { return 1; } }
|
||||
· ─────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ (class { set a(val) { return 1; } static set b(val) { return 1; } })
|
||||
· ─────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ (class { set a(val) { return 1; } static set b(val) { return 1; } })
|
||||
· ─────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ ({ set a(val) { if(val) { return 1; } else { return 2 }; } })
|
||||
· ─────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ ({ set a(val) { if(val) { return 1; } else { return 2 }; } })
|
||||
· ────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ class A { set a(val) { switch(val) { case 1: return x; case 2: return y; default: return z } } }
|
||||
· ─────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ class A { set a(val) { switch(val) { case 1: return x; case 2: return y; default: return z } } }
|
||||
· ─────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ class A { set a(val) { switch(val) { case 1: return x; case 2: return y; default: return z } } }
|
||||
· ────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ (class { static set a(val) { if (val > 0) { this._val = val; return val; } return false; } })
|
||||
· ───────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ (class { static set a(val) { if (val > 0) { this._val = val; return val; } return false; } })
|
||||
· ─────────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ ({ set a(val) { if(val) { return 1; } else { return; }; } })
|
||||
· ─────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ class A { set a(val) { switch(val) { case 1: return x; case 2: return; default: return z } } }
|
||||
· ─────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ class A { set a(val) { switch(val) { case 1: return x; case 2: return; default: return z } } }
|
||||
· ────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ (class { static set a(val) { if (val > 0) { this._val = val; return; } return false; } })
|
||||
· ─────────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ ({ set a(val) { function b(){} return b(); } })
|
||||
· ───────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ class A { set a(val) { return () => {}; } }
|
||||
· ────────────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ (class { set a(val) { function b(){ return 1; } return 2; } })
|
||||
· ─────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ ({ set a(val) { function b(){ return; } return 1; } })
|
||||
· ─────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ class A { set a(val) { var x = function() { return 1; }; return 2; } }
|
||||
· ─────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ (class { set a(val) { var x = () => { return; }; return 2; } })
|
||||
· ─────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ function f(){}; ({ set a(val) { return 1; } });
|
||||
· ─────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ x = function f(){}; class A { set a(val) { return 1; } };
|
||||
· ─────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ x = () => {}; A = class { set a(val) { return 1; } };
|
||||
· ─────────
|
||||
╰────
|
||||
|
||||
× eslint(no-setter-return): Setter cannot return a value
|
||||
╭─[no_setter_return.tsx:1:1]
|
||||
1 │ return; ({ set a(val) { return 1; } }); return 2;
|
||||
· ─────────
|
||||
╰────
|
||||
|
||||
|
||||
|
|
@ -73,7 +73,9 @@ impl Tester {
|
|||
let allocator = Allocator::default();
|
||||
let path = PathBuf::from(name).with_extension("tsx");
|
||||
let source_type = SourceType::from_path(&path).expect("incorrect {path:?}");
|
||||
let ret = Parser::new(&allocator, source_text, source_type).parse();
|
||||
let ret = Parser::new(&allocator, source_text, source_type)
|
||||
.allow_return_outside_function(true)
|
||||
.parse();
|
||||
assert!(ret.errors.is_empty(), "{:?}", &ret.errors);
|
||||
let program = allocator.alloc(ret.program);
|
||||
let semantic_ret = SemanticBuilder::new(source_text, source_type)
|
||||
|
|
|
|||
|
|
@ -78,8 +78,8 @@ fn function_as_var(flags: ScopeFlags, source_type: SourceType) -> bool {
|
|||
|
||||
impl<'a> Binder for Function<'a> {
|
||||
fn bind(&self, builder: &mut SemanticBuilder) {
|
||||
let current_scope_id = builder.current_scope_id;
|
||||
if let Some(ident) = &self.id {
|
||||
let current_scope_id = builder.current_scope_id;
|
||||
let flags = builder.scope.get_flags(current_scope_id);
|
||||
if !flags.is_strict_mode()
|
||||
&& matches!(
|
||||
|
|
@ -116,6 +116,31 @@ impl<'a> Binder for Function<'a> {
|
|||
);
|
||||
}
|
||||
}
|
||||
|
||||
// bind scope flags: Constructor | GetAccessor | SetAccessor
|
||||
debug_assert!(builder.scope.get_flags(current_scope_id).contains(ScopeFlags::Function));
|
||||
if let Some(kind) = builder.nodes.parent_kind(builder.current_node_id) {
|
||||
match kind {
|
||||
AstKind::MethodDefinition(def) => {
|
||||
let flag = builder.scope.get_flags_mut(current_scope_id);
|
||||
*flag |= match def.kind {
|
||||
MethodDefinitionKind::Constructor => ScopeFlags::Constructor,
|
||||
MethodDefinitionKind::Get => ScopeFlags::GetAccessor,
|
||||
MethodDefinitionKind::Set => ScopeFlags::SetAccessor,
|
||||
MethodDefinitionKind::Method => ScopeFlags::empty(),
|
||||
};
|
||||
}
|
||||
AstKind::ObjectProperty(prop) => {
|
||||
let flag = builder.scope.get_flags_mut(current_scope_id);
|
||||
*flag |= match prop.kind {
|
||||
PropertyKind::Get => ScopeFlags::GetAccessor,
|
||||
PropertyKind::Set => ScopeFlags::SetAccessor,
|
||||
PropertyKind::Init => ScopeFlags::empty(),
|
||||
};
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -53,4 +53,8 @@ impl ScopeFlags {
|
|||
pub fn is_class(&self) -> bool {
|
||||
self.intersects(Self::Var)
|
||||
}
|
||||
|
||||
pub fn is_set_accessor(&self) -> bool {
|
||||
self.contains(Self::SetAccessor)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue