Skip to content

Commit 1ab4d11

Browse files
authored
fix(eslint-plugin): recognize native privacy (#5947)
Treat PrivateIdentifier class keys like TypeScript private members so no-new-null does not report private API types. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8ebd5bf2-c44b-42d5-be25-e7936d4b0a14
1 parent d563d6a commit 1ab4d11

3 files changed

Lines changed: 27 additions & 2 deletions

File tree

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"changes": [
3+
{
4+
"packageName": "@rushstack/eslint-plugin",
5+
"comment": "Fix no-new-null false positives for ECMAScript private class members.",
6+
"type": "patch"
7+
}
8+
]
9+
}

eslint/eslint-plugin/src/no-new-null.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ type Options = [];
99

1010
interface IAccessible {
1111
accessibility?: TSESTree.Accessibility;
12+
key?: TSESTree.Node;
1213
}
1314

1415
const noNewNullRule: TSESLint.RuleModule<MessageIds, Options> = {
@@ -37,11 +38,15 @@ const noNewNullRule: TSESLint.RuleModule<MessageIds, Options> = {
3738

3839
create: (context: TSESLint.RuleContext<MessageIds, Options>) => {
3940
/**
40-
* Returns true if the accessibility is not explicitly set to private or protected, e.g. class properties, methods.
41+
* Returns true unless a class member uses protected, TypeScript-private, or ECMAScript-private syntax.
4142
*/
4243
function isPubliclyAccessible(node?: IAccessible): boolean {
4344
const accessibility: TSESTree.Accessibility | undefined = node?.accessibility;
44-
return !(accessibility === 'private' || accessibility === 'protected');
45+
return (
46+
accessibility !== 'private' &&
47+
accessibility !== 'protected' &&
48+
node?.key?.type !== AST_NODE_TYPES.PrivateIdentifier
49+
);
4550
}
4651

4752
/**

eslint/eslint-plugin/src/test/no-new-null.test.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,17 @@ ruleTester.run('no-new-null', noNewNullRule, {
104104
' }',
105105
'}'
106106
].join('\n')
107+
},
108+
{
109+
code: [
110+
'class NativePrivateNulls {',
111+
' #field: string | null;',
112+
' #propertyFunc: (value: string | null) => void;',
113+
' #method(value: string | null): string | null { return value; }',
114+
' get #value(): string | null { return this.#field; }',
115+
' set #value(value: string | null) { this.#field = value; }',
116+
'}'
117+
].join('\n')
107118
}
108119
]
109120
});

0 commit comments

Comments
 (0)