Skip to content

Commit ab359b4

Browse files
author
Arvid Paeglit
committed
Merge branch 'master' into big-repo-opt
2 parents a73c954 + 45a162e commit ab359b4

18 files changed

Lines changed: 203 additions & 99 deletions

images/deepcode-logo.svg

Lines changed: 0 additions & 7 deletions
This file was deleted.

images/deepcode-vscode-icon.svg

Lines changed: 5 additions & 0 deletions
Loading

package.json

Lines changed: 30 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,12 @@
4646
{
4747
"title": "DeepCode",
4848
"properties": {
49+
"deepcode.advancedMode": {
50+
"type": "boolean",
51+
"default": false,
52+
"description": "Toggle advanced tools for expert users",
53+
"scope": "application"
54+
},
4955
"deepcode.url": {
5056
"type": "string",
5157
"default": "",
@@ -77,6 +83,13 @@
7783
"default": true,
7884
"markdownDescription": "Allow extension's telemetry to be sent to `#deepcode.url#`",
7985
"scope": "application"
86+
},
87+
"deepcode.yesWelcomeNotification": {
88+
"//": "Name starts with y to put it at the end, as configs are sorted alphbetically",
89+
"type": "boolean",
90+
"default": true,
91+
"markdownDescription": "Show welcome notification after installation and restart",
92+
"scope": "application"
8093
}
8194
}
8295
}
@@ -86,41 +99,20 @@
8699
{
87100
"id": "deepcode",
88101
"title": "DeepCode",
89-
"icon": "images/deepcode-logo.svg"
102+
"icon": "images/deepcode-vscode-icon.svg"
90103
}
91104
]
92105
},
93106
"views": {
94107
"deepcode": [
95-
{
96-
"id": "deepcode.views.error",
97-
"name": "DeepCode Extension",
98-
"when": "deepcode:error"
99-
},
100-
{
101-
"id": "deepcode.views.welcome",
102-
"name": "DeepCode Extension",
103-
"when": "!deepcode:error && !deepcode:loggedIn"
104-
},
105-
{
106-
"id": "deepcode.views.tc",
107-
"name": "DeepCode Extension",
108-
"when": "!deepcode:error && deepcode:loggedIn && !deepcode:uploadApproved"
109-
},
110-
{
111-
"id": "deepcode.views.empty",
112-
"name": "DeepCode Extension",
113-
"when": "!deepcode:error && deepcode:loggedIn && deepcode:uploadApproved && !deepcode:workspaceFound"
114-
},
115108
{
116109
"id": "deepcode.views.analysis",
117-
"name": "DeepCode Analysis",
118-
"when": "!deepcode:error && deepcode:loggedIn && deepcode:uploadApproved && deepcode:workspaceFound"
110+
"name": "DeepCode Analysis"
119111
},
120112
{
121113
"id": "deepcode.views.actions",
122114
"name": "Actions",
123-
"when": "!deepcode:error && deepcode:loggedIn && deepcode:uploadApproved && deepcode:workspaceFound"
115+
"when": "deepcode:advanced && !deepcode:error && deepcode:loggedIn && deepcode:uploadApproved && deepcode:workspaceFound"
124116
},
125117
{
126118
"id": "deepcode.views.support",
@@ -130,30 +122,34 @@
130122
},
131123
"viewsWelcome": [
132124
{
133-
"view": "deepcode.views.error",
125+
"view": "deepcode.views.analysis",
134126
"contents": "DeepCode is temporarily unavailable\nWe are automatically retrying to connect...",
135127
"when": "deepcode:error == 'transient'"
136128
},
137129
{
138-
"view": "deepcode.views.error",
130+
"view": "deepcode.views.analysis",
139131
"contents": "DeepCode has encountered a problem. Please restart the extension: \n[Restart](command:deepcode.start 'Restart DeepCode')\nIf the error persists, please check your [settings](command:deepcode.settings) and [contact us](https://www.deepcode.ai/feedback?select=2?utm_source=vsc)!",
140-
"when": "deepcode:error != 'transient'"
132+
"when": "deepcode:error == 'blocking'"
141133
},
142134
{
143-
"view": "deepcode.views.welcome",
144-
"contents": "Welcome to DeepCode for Visual Studio Code. 👋\nLet's start by connecting VS Code with DeepCode:\n[Connect VS Code with DeepCode](command:deepcode.login 'Connect with DeepCode')\n👉 DeepCode's mission is to finds bugs, fast. Connect with DeepCode to start your first analysis!"
135+
"view": "deepcode.views.analysis",
136+
"contents": "Welcome to DeepCode for Visual Studio Code. 👋\nLet's start by connecting VS Code with DeepCode:\n[Connect VS Code with DeepCode](command:deepcode.login 'Connect with DeepCode')\n👉 DeepCode's mission is to finds bugs, fast. Connect with DeepCode to start your first analysis!",
137+
"when": "!deepcode:error && !deepcode:loggedIn"
145138
},
146139
{
147-
"view": "deepcode.views.tc",
148-
"contents": "Thanks for connecting with DeepCode. ✅\n 👉 You are almost set 🤗. DeepCode is analysing the code remotely on DeepCode's servers (our [terms](https://www.deepcode.ai/tc?utm_source=vsc)). Let's confirm you know this and start the analysis.\n[Accept and start analysing](command:deepcode.approve 'Upload code to DeepCode')\nYou can always change it in the [configuration panel](command:deepcode.settings)."
140+
"view": "deepcode.views.analysis",
141+
"contents": "Thanks for connecting with DeepCode. ✅\n 👉 You are almost set 🤗. DeepCode is analysing the code remotely on DeepCode's servers (our [terms](https://www.deepcode.ai/tc?utm_source=vsc)). Let's confirm you know this and start the analysis.\n[Accept and start analysing](command:deepcode.approve 'Upload code to DeepCode')\nYou can always change it in the [configuration panel](command:deepcode.settings).",
142+
"when": "!deepcode:error && deepcode:loggedIn && !deepcode:uploadApproved"
149143
},
150144
{
151-
"view": "deepcode.views.empty",
152-
"contents": "Open a workspace or a folder in Visual Studio Code to start the analysis."
145+
"view": "deepcode.views.analysis",
146+
"contents": "Open a workspace or a folder in Visual Studio Code to start the analysis.",
147+
"when": "!deepcode:error && deepcode:loggedIn && deepcode:uploadApproved && !deepcode:workspaceFound"
153148
},
154149
{
155150
"view": "deepcode.views.analysis",
156-
"contents": "DeepCode analyzed your code and found no issue! 🎉"
151+
"contents": "DeepCode analyzed your code and found no issue! 🎉",
152+
"when": "!deepcode:error && deepcode:loggedIn && deepcode:uploadApproved && deepcode:workspaceFound"
157153
},
158154
{
159155
"view": "deepcode.views.actions",

src/deepcode/DeepCodeExtension.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@ import {
1414
DEEPCODE_OPEN_BROWSER,
1515
DEEPCODE_OPEN_LOCAL,
1616
} from "./constants/commands";
17-
import { openDeepcodeSettingsCommand, createDCIgnoreCommand } from "./utils/vscodeCommandsUtils";
17+
import {
18+
openDeepcodeSettingsCommand,
19+
createDCIgnoreCommand,
20+
} from "./utils/vscodeCommandsUtils";
1821
import { errorsLogs } from "./messages/errorsServerLogMessages";
1922

2023
import {
@@ -147,6 +150,9 @@ class DeepCodeExtension extends DeepCodeLib implements DeepCode.ExtensionInterfa
147150
this.startExtension().catch((err) => this.processError(err, {
148151
message: errorsLogs.failedExecution,
149152
}));
153+
this.checkWelcomeNotification().catch((err) => this.processError(err, {
154+
message: errorsLogs.welcomeNotification,
155+
}));
150156
}
151157

152158
}

src/deepcode/constants/commands.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// vscode commands used in extension work
2-
export const VSCODE_GO_TO_SETTINGS_COMMAND = "workbench.action.openSettings";
2+
export const VSCODE_GO_TO_SETTINGS_COMMAND = "workbench.action.openSettings";
3+
export const VSCODE_VIEW_CONTAINER_PREFIX = "workbench.view.extension.";
34
export const VSCODE_ADD_COMMENT_COMMAND = "editor.action.addCommentLine";
45

56
// custom depcode commands

src/deepcode/constants/views.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
export const DEEPCODE_VIEW_ERROR = "deepcode.views.error";
2-
export const DEEPCODE_VIEW_WELCOME = "deepcode.views.welcome";
3-
export const DEEPCODE_VIEW_TC = "deepcode.views.tc";
4-
export const DEEPCODE_VIEW_EMPTY = "deepcode.views.empty";
51
export const DEEPCODE_VIEW_ANALYSIS = "deepcode.views.analysis";
62
export const DEEPCODE_VIEW_SUPPORT = "deepcode.views.support";
73
export const DEEPCODE_VIEW_ACTIONS = "deepcode.views.actions";
@@ -14,6 +10,7 @@ export const DEEPCODE_CONTEXT = {
1410
ANALYZING: "workspaceFound",
1511
ERROR: "error",
1612
MODE: "mode",
13+
ADVANCED: "advanced",
1714
};
1815

1916
export const DEEPCODE_ERROR_CODES = {

src/deepcode/lib/modules/BaseDeepCodeModule.ts

Lines changed: 60 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,12 @@ import DeepCodeFilesWatcher from "../watchers/DeepCodeFilesWatcher";
77
import DeepCodeWorkspaceFoldersWatcher from "../watchers/WorkspaceFoldersWatcher";
88
import DeepCodeEditorsWatcher from "../watchers/EditorsWatcher";
99
import DeepCodeSettingsWatcher from "../watchers/DeepCodeSettingsWatcher";
10+
import { PendingTask, PendingTaskInterface } from "../../utils/pendingTask";
1011
import { IDE_NAME, REFRESH_VIEW_DEBOUNCE_INTERVAL } from "../../constants/general";
11-
import { errorsLogs } from "../../messages/errorsServerLogMessages";
12+
import { setContext } from "../../utils/vscodeCommandsUtils";
13+
import { DEEPCODE_VIEW_ANALYSIS } from "../../constants/views";
14+
import { errorsLogs } from '../../messages/errorsServerLogMessages';
15+
import { pendingMocks } from 'nock/types';
1216

1317
export default abstract class BaseDeepCodeModule implements DeepCode.BaseDeepCodeModuleInterface {
1418
currentWorkspacePath: string;
@@ -27,8 +31,9 @@ export default abstract class BaseDeepCodeModule implements DeepCode.BaseDeepCod
2731
refreshViewEmitter: vscode.EventEmitter<any>;
2832
analysisStatus = '';
2933
analysisProgress = 0;
30-
private progressBadgePromise: Promise<void> | undefined;
31-
private progressBadgeResolveFn: (() => void) | undefined;
34+
private initializedView: PendingTaskInterface;
35+
private progressBadge: PendingTaskInterface | undefined;
36+
private viewContext: {[key: string]: unknown};
3237

3338
// These attributes are used in tests
3439
staticToken = '';
@@ -51,6 +56,8 @@ export default abstract class BaseDeepCodeModule implements DeepCode.BaseDeepCod
5156
this.refreshViewEmitter = new vscode.EventEmitter<any>();
5257
this.analysisStatus = '';
5358
this.analysisProgress = 0;
59+
this.viewContext = {};
60+
this.initializedView = new PendingTask();
5461
}
5562

5663
get baseURL(): string {
@@ -92,34 +99,66 @@ export default abstract class BaseDeepCodeModule implements DeepCode.BaseDeepCod
9299
return !!vscode.workspace.getConfiguration('deepcode').get<boolean>('yesTelemetry');
93100
}
94101

95-
private getProgressBadgePromise(): Promise<void> {
96-
if (this.progressBadgePromise === undefined) {
97-
// This should not be needed, but we resolve pending Promises
98-
// before overwriting the progressBadgeResolveFn reference.
99-
if (this.progressBadgeResolveFn) this.progressBadgeResolveFn();
100-
this.progressBadgePromise = new Promise(
101-
(resolve) => {
102-
this.progressBadgeResolveFn = resolve;
103-
}
102+
get shouldShowWelcomeNotification(): boolean {
103+
return !!vscode.workspace.getConfiguration('deepcode').get<boolean>('yesWelcomeNotification');
104+
}
105+
106+
async hideWelcomeNotification(): Promise<void> {
107+
await vscode.workspace.getConfiguration('deepcode').update('yesWelcomeNotification', false, true);
108+
}
109+
110+
get shouldShowAdvancedView(): boolean {
111+
return !!vscode.workspace.getConfiguration('deepcode').get<boolean>('advancedMode');
112+
}
113+
114+
async setContext(key: string, value: unknown): Promise<void> {
115+
console.log("DeepCode context", key, value);
116+
this.viewContext[key] = value;
117+
await setContext(key, value);
118+
this.refreshViews();
119+
}
120+
121+
get shouldShowAnalysis(): boolean {
122+
return !this.viewContext['error'] &&
123+
['loggedIn', 'uploadApproved', 'workspaceFound'].every(
124+
(c) => !!this.viewContext[c]
104125
);
126+
}
127+
128+
private getProgressBadgePromise(): Promise<void> {
129+
if (!this.progressBadge || this.progressBadge.isCompleted) {
130+
this.progressBadge = new PendingTask();
105131
}
106-
return this.progressBadgePromise;
132+
return this.progressBadge.waiter;
107133
}
108134

109135
// Leave viewId undefined to remove the badge from all views
110-
async setLoadingBadge(viewId?: string): Promise<void> {
111-
if (viewId) {
112-
await vscode.window.withProgress(
113-
{ location: { viewId } },
114-
this.getProgressBadgePromise.bind(this)
136+
async setLoadingBadge(value: boolean): Promise<void> {
137+
if (value) {
138+
// Using closure on this to allow partial binding in arbitrary positions
139+
const self = this;
140+
this.initializedView.waiter.then(
141+
() => vscode.window.withProgress(
142+
{ location: { viewId: DEEPCODE_VIEW_ANALYSIS } },
143+
() => self.getProgressBadgePromise()
144+
)
145+
).then(
146+
() => {},
147+
(error) => self.processError(error, {
148+
message: errorsLogs.loadingBadge,
149+
})
115150
);
116151
} else {
117-
if (this.progressBadgeResolveFn) this.progressBadgeResolveFn();
118-
this.progressBadgePromise = undefined;
119-
this.progressBadgeResolveFn = undefined;
152+
if (this.progressBadge && !this.progressBadge.isCompleted) {
153+
this.progressBadge.complete();
154+
}
120155
}
121156
}
122157

158+
emitViewInitialized(): void {
159+
if (!this.initializedView.isCompleted) this.initializedView.complete();
160+
}
161+
123162
// Avoid refreshing context/views too often:
124163
// https://github.com/Microsoft/vscode/issues/68424
125164
refreshViews = _.debounce(

src/deepcode/lib/modules/BundlesModule.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import { checkIfBundleIsEmpty } from "../../utils/bundlesUtils";
77
import { createListOfDirFiles } from "../../utils/packageUtils";
88
import { BUNDLE_EVENTS } from "../../constants/events";
99
import LoginModule from "../../lib/modules/LoginModule";
10-
import { setContext } from "../../utils/vscodeCommandsUtils";
1110
import { DEEPCODE_ANALYSIS_STATUS, DEEPCODE_CONTEXT } from "../../constants/views";
1211
import { errorsLogs } from "../../messages/errorsServerLogMessages";
1312

@@ -287,22 +286,22 @@ abstract class BundlesModule extends LoginModule
287286
try {
288287
const workspaceFolders: readonly vscode.WorkspaceFolder[] | undefined = vscode.workspace.workspaceFolders;
289288
if (!workspaceFolders || !workspaceFolders.length) {
290-
await setContext(DEEPCODE_CONTEXT.ANALYZING, false);
289+
await this.setContext(DEEPCODE_CONTEXT.ANALYZING, false);
291290
return;
292291
}
293292

294293
this.createWorkspacesList(workspaceFolders);
295294

296295
if (this.workspacesPaths.length) {
297-
await setContext(DEEPCODE_CONTEXT.ANALYZING, true);
296+
await this.setContext(DEEPCODE_CONTEXT.ANALYZING, true);
298297
this.updateCurrentWorkspacePath(this.workspacesPaths[0]);
299298

300299
await this.updateHashesBundles();
301300
for await (const path of this.workspacesPaths) {
302301
await this.performBundlesActions(path);
303302
}
304303
} else {
305-
await setContext(DEEPCODE_CONTEXT.ANALYZING, false);
304+
await this.setContext(DEEPCODE_CONTEXT.ANALYZING, false);
306305
}
307306
} catch(err) {
308307
await this.processError(err, {

src/deepcode/lib/modules/DeepCodeLib.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import * as _ from "lodash";
22
import DeepCode from "../../../interfaces/DeepCodeInterfaces";
33
import BundlesModule from "./BundlesModule";
4-
import { setContext } from "../../utils/vscodeCommandsUtils";
54
import { DEEPCODE_CONTEXT, DEEPCODE_MODE_CODES } from "../../constants/views";
65
import { errorsLogs } from "../../messages/errorsServerLogMessages";
76
import {
@@ -43,8 +42,8 @@ export default class DeepCodeLib extends BundlesModule implements DeepCode.DeepC
4342

4443
private async executeExtensionPipeline(): Promise<void> {
4544
console.log("DeepCode: starting execution pipeline");
46-
await setContext(DEEPCODE_CONTEXT.ERROR, false);
47-
await this.setLoadingBadge();
45+
await this.setContext(DEEPCODE_CONTEXT.ERROR, false);
46+
await this.setLoadingBadge(false);
4847

4948
const loggedIn = await this.checkSession();
5049
if (!loggedIn) return;
@@ -83,7 +82,7 @@ export default class DeepCodeLib extends BundlesModule implements DeepCode.DeepC
8382
async setMode(mode: string): Promise<void> {
8483
if (!Object.values(DEEPCODE_MODE_CODES).includes(mode)) return;
8584
this._mode = mode;
86-
await setContext(DEEPCODE_CONTEXT.MODE, mode);
85+
await this.setContext(DEEPCODE_CONTEXT.MODE, mode);
8786
switch(mode) {
8887
case DEEPCODE_MODE_CODES.PAUSED:
8988
this._unpauseTimeout = setTimeout(this.unpause.bind(this), EXECUTION_PAUSE_INTERVAL);

0 commit comments

Comments
 (0)