Skip to content

Commit

Permalink
docs: no-unused-expressions - class static blocks don't have directiv…
Browse files Browse the repository at this point in the history
…es (#15283)

Refs #15016
  • Loading branch information
mdjermanovic committed Nov 11, 2021
1 parent edd8d24 commit 1055f16
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 10 deletions.
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
}
]
}
]
});

0 comments on commit 1055f16

Please sign in to comment.