Skip to content

Commit fe644b9

Browse files
Copilotalexr00
andcommitted
Changes before error encountered
Co-authored-by: alexr00 <38270282+alexr00@users.noreply.github.com>
1 parent 993a274 commit fe644b9

File tree

85 files changed

+856
-725
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

85 files changed

+856
-725
lines changed

.eslintrc.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ module.exports = {
2929
files: ['**/*.ts', '**/*.tsx'],
3030
rules: {
3131
'rulesdir/no-any-except-union-method-signature': 'error',
32-
'rulesdir/no-pr-in-user-strings': 'error'
32+
'rulesdir/no-pr-in-user-strings': 'error',
33+
'rulesdir/private-members-underscore': 'error'
3334
}
3435
}
3536
]

build/eslint-rules/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ module.exports = {
99
'public-methods-well-defined-types': require('./public-methods-well-defined-types'),
1010
'no-any-except-union-method-signature': require('./no-any-except-union-method-signature'),
1111
'no-pr-in-user-strings': require('./no-pr-in-user-strings'),
12+
'private-members-underscore': require('./private-members-underscore'),
1213
};
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
6+
'use strict';
7+
8+
/**
9+
* ESLint rule to enforce that private class members start with underscore (_).
10+
* This rule checks private properties, methods, getters, and setters in TypeScript classes.
11+
*/
12+
13+
module.exports = {
14+
meta: {
15+
type: 'problem',
16+
docs: {
17+
description: 'Enforce that private class members start with underscore (_)',
18+
category: 'TypeScript',
19+
recommended: true,
20+
},
21+
schema: [],
22+
messages: {
23+
privateUnderscore: 'Private member "{{memberName}}" should start with underscore (_).',
24+
},
25+
fixable: 'code',
26+
},
27+
28+
create(context) {
29+
/**
30+
* Check if a member is private
31+
*/
32+
function isPrivateMember(node) {
33+
// Check for explicit private modifier
34+
if (node.accessibility === 'private') {
35+
return true;
36+
}
37+
38+
// Check for private modifier in the modifiers array (for different AST node types)
39+
if (node.modifiers) {
40+
return node.modifiers.some(modifier => modifier.kind === 'private');
41+
}
42+
43+
return false;
44+
}
45+
46+
/**
47+
* Check if a member name starts with underscore
48+
*/
49+
function startsWithUnderscore(name) {
50+
return name && name.startsWith('_');
51+
}
52+
53+
/**
54+
* Get the member name from various node types
55+
*/
56+
function getMemberName(node) {
57+
if (node.key) {
58+
// For method definitions, property definitions
59+
if (node.key.type === 'Identifier') {
60+
return node.key.name;
61+
}
62+
}
63+
return null;
64+
}
65+
66+
/**
67+
* Report and potentially fix a private member naming violation
68+
*/
69+
function reportViolation(node, memberName) {
70+
context.report({
71+
node,
72+
messageId: 'privateUnderscore',
73+
data: {
74+
memberName,
75+
},
76+
fix(fixer) {
77+
// Only provide auto-fix for simple identifier cases
78+
if (node.key && node.key.type === 'Identifier') {
79+
return fixer.replaceText(node.key, `_${memberName}`);
80+
}
81+
return null;
82+
},
83+
});
84+
}
85+
86+
return {
87+
// Handle class property definitions
88+
PropertyDefinition(node) {
89+
if (isPrivateMember(node)) {
90+
const memberName = getMemberName(node);
91+
if (memberName && !startsWithUnderscore(memberName)) {
92+
reportViolation(node, memberName);
93+
}
94+
}
95+
},
96+
97+
// Handle method definitions (including getters/setters)
98+
MethodDefinition(node) {
99+
if (isPrivateMember(node)) {
100+
const memberName = getMemberName(node);
101+
if (memberName && !startsWithUnderscore(memberName)) {
102+
reportViolation(node, memberName);
103+
}
104+
}
105+
},
106+
107+
// Handle constructor parameters with private modifier
108+
TSParameterProperty(node) {
109+
if (isPrivateMember(node)) {
110+
if (node.parameter && node.parameter.type === 'Identifier') {
111+
const memberName = node.parameter.name;
112+
if (memberName && !startsWithUnderscore(memberName)) {
113+
context.report({
114+
node,
115+
messageId: 'privateUnderscore',
116+
data: {
117+
memberName,
118+
},
119+
fix(fixer) {
120+
return fixer.replaceText(node.parameter, `_${memberName}`);
121+
},
122+
});
123+
}
124+
}
125+
}
126+
},
127+
};
128+
},
129+
};

src/api/api1.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ export class GitApiImpl extends Disposable implements API, IGit {
8080
private _providers = new Map<number, IGit>();
8181

8282
public constructor(
83-
private readonly repositoriesManager: RepositoriesManager) {
83+
private readonly _repositoriesManager) {
8484
super();
8585
}
8686

@@ -228,7 +228,7 @@ export class GitApiImpl extends Disposable implements API, IGit {
228228
}
229229

230230
async getRepositoryDescription(uri: vscode.Uri) {
231-
const folderManagerForRepo = this.repositoriesManager.getManagerForFile(uri);
231+
const folderManagerForRepo = this._repositoriesManager.getManagerForFile(uri);
232232

233233
if (folderManagerForRepo && folderManagerForRepo.gitHubRepositories.length > 0) {
234234
const repositoryMetadata = await folderManagerForRepo.gitHubRepositories[0].getMetadata();

src/common/logger.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class Log extends Disposable {
3232
this._activePerfMarkers.delete(marker);
3333
}
3434

35-
private logString(message: string | Error | Stringish | Object, component?: string): string {
35+
private _logString(message: string | Error | Stringish | Object, component?: string): string {
3636
let logMessage: string;
3737
if (typeof message !== 'string') {
3838
const asString = message as Partial<Stringish>;
@@ -50,23 +50,23 @@ class Log extends Disposable {
5050
}
5151

5252
public trace(message: string | Error | Stringish | Object, component: string) {
53-
this._outputChannel.trace(this.logString(message, component));
53+
this._outputChannel.trace(this._logString(message, component));
5454
}
5555

5656
public debug(message: string | Error | Stringish | Object, component: string) {
57-
this._outputChannel.debug(this.logString(message, component));
57+
this._outputChannel.debug(this._logString(message, component));
5858
}
5959

6060
public appendLine(message: string | Error | Stringish | Object, component: string) {
61-
this._outputChannel.info(this.logString(message, component));
61+
this._outputChannel.info(this._logString(message, component));
6262
}
6363

6464
public warn(message: string | Error | Stringish | Object, component?: string) {
65-
this._outputChannel.warn(this.logString(message, component));
65+
this._outputChannel.warn(this._logString(message, component));
6666
}
6767

6868
public error(message: string | Error | Stringish | Object, component: string) {
69-
this._outputChannel.error(this.logString(message, component));
69+
this._outputChannel.error(this._logString(message, component));
7070
}
7171
}
7272

src/common/protocol.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export enum ProtocolType {
1717
}
1818

1919
export class Protocol {
20-
private static readonly ID = 'Protocol';
20+
private static readonly _ID = 'Protocol';
2121
public type: ProtocolType = ProtocolType.OTHER;
2222
public host: string = '';
2323

@@ -31,14 +31,14 @@ export class Protocol {
3131

3232
public readonly url: vscode.Uri;
3333
constructor(uriString: string) {
34-
if (this.parseSshProtocol(uriString)) {
34+
if (this._parseSshProtocol(uriString)) {
3535
this.url = vscode.Uri.from({ scheme: 'ssh', authority: this.host, path: `/${this.nameWithOwner}` });
3636
return;
3737
}
3838

3939
try {
4040
this.url = vscode.Uri.parse(uriString);
41-
this.type = this.getType(this.url.scheme);
41+
this.type = this._getType(this.url.scheme);
4242

4343
this.host = this.getHostName(this.url.authority);
4444
if (this.host) {
@@ -53,7 +53,7 @@ export class Protocol {
5353
}
5454
}
5555

56-
private getType(scheme: string): ProtocolType {
56+
private _getType(scheme: string): ProtocolType {
5757
switch (scheme) {
5858
case 'file':
5959
return ProtocolType.Local;
@@ -69,7 +69,7 @@ export class Protocol {
6969
}
7070
}
7171

72-
private parseSshProtocol(uriString: string): boolean {
72+
private _parseSshProtocol(uriString: string): boolean {
7373
const sshConfig = resolve(uriString);
7474
if (!sshConfig) {
7575
return false;

src/common/temporaryState.ts

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -10,37 +10,37 @@ let tempState: TemporaryState | undefined;
1010

1111
export class TemporaryState extends vscode.Disposable {
1212
static readonly ID = 'TemporaryState';
13-
private readonly SUBPATH = 'temp';
14-
private readonly disposables: vscode.Disposable[] = [];
15-
private readonly persistInSessionDisposables: vscode.Disposable[] = [];
13+
private readonly _SUBPATH = 'temp';
14+
private readonly _disposables: vscode.Disposable[] = [];
15+
private readonly _persistInSessionDisposables: vscode.Disposable[] = [];
1616

17-
constructor(private readonly _storageUri: vscode.Uri) {
18-
super(() => disposeAll(this.disposables));
17+
constructor(private readonly _storageUri: vscode.Uri) {
18+
super(() => disposeAll(this._disposables));
1919
}
2020

21-
private get path(): vscode.Uri {
22-
return vscode.Uri.joinPath(this._storageUri, this.SUBPATH);
21+
private get _path(): vscode.Uri {
22+
return vscode.Uri.joinPath(this._storageUri, this._SUBPATH);
2323
}
2424

25-
override dispose() {
26-
disposeAll(this.disposables);
27-
disposeAll(this.persistInSessionDisposables);
25+
override dispose() {
26+
disposeAll(this._disposables);
27+
disposeAll(this._persistInSessionDisposables);
2828
}
2929

30-
private addDisposable(disposable: vscode.Disposable, persistInSession: boolean) {
31-
if (persistInSession) {
32-
this.persistInSessionDisposables.push(disposable);
33-
} else {
34-
if (this.disposables.length > 30) {
35-
const oldDisposable = this.disposables.shift();
36-
oldDisposable?.dispose();
37-
}
38-
this.disposables.push(disposable);
39-
}
30+
private _addDisposable(disposable: vscode.Disposable, persistInSession: boolean) {
31+
if (persistInSession) {
32+
this._persistInSessionDisposables.push(disposable);
33+
} else {
34+
if (this._disposables.length > 30) {
35+
const oldDisposable = this._disposables.shift();
36+
oldDisposable?.dispose();
37+
}
38+
this._disposables.push(disposable);
39+
}
4040
}
4141

42-
private async writeState(subpath: string, filename: string, contents: Uint8Array, persistInSession: boolean): Promise<vscode.Uri> {
43-
let filePath: vscode.Uri = this.path;
42+
private async _writeState(subpath: string, filename: string, contents: Uint8Array, persistInSession: boolean): Promise<vscode.Uri> {
43+
let filePath: vscode.Uri = this._path;
4444
const workspace = (vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders.length > 0)
4545
? vscode.workspace.workspaceFolders[0].name : undefined;
4646

@@ -64,12 +64,12 @@ export class TemporaryState extends vscode.Disposable {
6464
}
6565
}
6666
};
67-
this.addDisposable(dispose, persistInSession);
67+
this._addDisposable(dispose, persistInSession);
6868
return file;
6969
}
7070

71-
private async readState(subpath: string, filename: string): Promise<Uint8Array> {
72-
let filePath: vscode.Uri = this.path;
71+
private async _readState(subpath: string, filename: string): Promise<Uint8Array> {
72+
let filePath: vscode.Uri = this._path;
7373
const workspace = (vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders.length > 0)
7474
? vscode.workspace.workspaceFolders[0].name : undefined;
7575

@@ -84,13 +84,13 @@ export class TemporaryState extends vscode.Disposable {
8484
static async init(context: vscode.ExtensionContext): Promise<vscode.Disposable | undefined> {
8585
if (context.globalStorageUri && !tempState) {
8686
tempState = new TemporaryState(context.globalStorageUri);
87-
try {
88-
await vscode.workspace.fs.delete(tempState.path, { recursive: true });
89-
} catch (e) {
90-
Logger.appendLine(`Error in initialization: ${e.message}`, TemporaryState.ID);
91-
}
92-
try {
93-
await vscode.workspace.fs.createDirectory(tempState.path);
87+
try {
88+
await vscode.workspace.fs.delete(tempState._path, { recursive: true });
89+
} catch (e) {
90+
Logger.appendLine(`Error in initialization: ${e.message}`, TemporaryState.ID);
91+
}
92+
try {
93+
await vscode.workspace.fs.createDirectory(tempState._path);
9494
} catch (e) {
9595
Logger.appendLine(`Error in initialization: ${e.message}`, TemporaryState.ID);
9696
}
@@ -104,14 +104,14 @@ export class TemporaryState extends vscode.Disposable {
104104
return;
105105
}
106106

107-
return tempState.writeState(subpath, filename, contents, persistInSession);
107+
return tempState._writeState(subpath, filename, contents, persistInSession);
108108
}
109109

110110
static async read(subpath: string, filename: string): Promise<Uint8Array | undefined> {
111111
if (!tempState) {
112112
return;
113113
}
114114

115-
return tempState.readState(subpath, filename);
115+
return tempState._readState(subpath, filename);
116116
}
117117
}

0 commit comments

Comments
 (0)