Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

docs: no-unused-expressions - class static blocks don't have directives #15283

Merged
merged 1 commit into from Nov 11, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
54 changes: 44 additions & 10 deletions docs/rules/no-unused-expressions.md
Expand Up @@ -62,16 +62,6 @@ injectGlobal`body{ color: red; }`

```

Note that one or more string expression statements (with or without semi-colons) will only be considered as unused if they are not in the beginning of a script, module, or function (alone and uninterrupted by other statements). Otherwise, they will be treated as part of a "directive prologue", a section potentially usable by JavaScript engines. This includes "strict mode" directives.

```js
"use strict";
"use asm"
"use stricter";
"use babel"
"any other strings like this in the prologue";
```

Examples of **correct** code for the default `{ "allowShortCircuit": false, "allowTernary": false }` options:

```js
Expand All @@ -96,6 +86,50 @@ delete a.b
void a
```

Note that one or more string expression statements (with or without semi-colons) will only be considered as unused if they are not in the beginning of a script, module, or function (alone and uninterrupted by other statements). Otherwise, they will be treated as part of a "directive prologue", a section potentially usable by JavaScript engines. This includes "strict mode" directives.

Examples of **correct** code for this rule in regard to directives:

```js
/*eslint no-unused-expressions: "error"*/

"use strict";
"use asm"
"use stricter";
"use babel"
"any other strings like this in the directive prologue";
"this is still the directive prologue";

function foo() {
"bar";
}

class Foo {
someMethod() {
"use strict";
}
}
```

Examples of **incorrect** code for this rule in regard to directives:

```js
/*eslint no-unused-expressions: "error"*/

doSomething();
"use strict"; // this isn't in a directive prologue, because there is a non-directive statement before it

function foo() {
"bar" + 1;
}

class Foo {
static {
"use strict"; // class static blocks do not have directive prologues
}
}
```

### allowShortCircuit

Examples of **incorrect** code for the `{ "allowShortCircuit": true }` option:
Expand Down
6 changes: 6 additions & 0 deletions lib/rules/no-unused-expressions.js
Expand Up @@ -115,6 +115,12 @@ module.exports = {
const parent = ancestors[ancestors.length - 1],
grandparent = ancestors[ancestors.length - 2];

/**
* https://tc39.es/ecma262/#directive-prologue
*
* Only `FunctionBody`, `ScriptBody` and `ModuleBody` can have directive prologue.
* Class static blocks do not have directive prologue.
*/
return (parent.type === "Program" || parent.type === "BlockStatement" &&
(/Function/u.test(grandparent.type))) &&
directives(parent).indexOf(node) >= 0;
Expand Down
23 changes: 23 additions & 0 deletions tests/lib/rules/no-unused-expressions.js
Expand Up @@ -190,6 +190,29 @@ ruleTester.run("no-unused-expressions", rule, {
options: [{ enforceForJSX: true }],
parserOptions: { ecmaFeatures: { jsx: true } },
errors: [{ messageId: "unusedExpression", type: "ExpressionStatement" }]
},

// class static blocks do not have directive prologues
{
code: "class C { static { 'use strict'; } }",
parserOptions: { ecmaVersion: 2022 },
errors: [{ messageId: "unusedExpression", type: "ExpressionStatement" }]
},
{
code: "class C { static { \n'foo'\n'bar'\n } }",
parserOptions: { ecmaVersion: 2022 },
errors: [
{
messageId: "unusedExpression",
type: "ExpressionStatement",
line: 2
},
{
messageId: "unusedExpression",
type: "ExpressionStatement",
line: 3
}
]
}
]
});