forked from redhat-developer/vscode-java
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathplugin.ts
More file actions
168 lines (151 loc) · 5.11 KB
/
plugin.ts
File metadata and controls
168 lines (151 loc) · 5.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
'use strict';
import * as vscode from 'vscode';
import * as path from 'path';
import { Commands } from './commands';
import { extensions } from 'vscode';
export let existingExtensions: Array<string> = [];
export let buildFilePatterns: Array<string> = [];
let javaShortcuts: Array<IJavaShortcut> | undefined;
export interface IJavaShortcut {
title: string;
command: string;
arguments?: any[];
}
export function getShortcuts(): Array<IJavaShortcut> {
if (javaShortcuts === undefined) {
javaShortcuts = [];
const selfOwnedShortcuts = getShortcutsRegistration(extensions.getExtension(EXTENSION_ID));
if (selfOwnedShortcuts) {
javaShortcuts.push(...selfOwnedShortcuts);
}
for (const extension of extensions.all) {
if (extension.id === EXTENSION_ID) {
continue;
}
const shortcuts = getShortcutsRegistration(extension);
if (shortcuts) {
javaShortcuts.push(...shortcuts);
}
}
}
return javaShortcuts;
}
function getShortcutsRegistration(extension: vscode.Extension<any>): Array<IJavaShortcut> | undefined {
if (!extension) {
return undefined;
}
const contributesSection = extension.packageJSON['contributes'];
if (contributesSection) {
const shortcuts = contributesSection['javaShortcuts'];
if (shortcuts && Array.isArray(shortcuts) && shortcuts.length) {
return shortcuts;
}
}
return undefined;
}
export function collectJavaExtensions(extensions: readonly vscode.Extension<any>[]): string[] {
const result = [];
if (extensions && extensions.length) {
for (const extension of extensions) {
const contributesSection = extension.packageJSON['contributes'];
if (contributesSection) {
const javaExtensions = contributesSection['javaExtensions'];
if (Array.isArray(javaExtensions) && javaExtensions.length) {
for (const javaExtensionPath of javaExtensions) {
result.push(path.resolve(extension.extensionPath, javaExtensionPath));
}
}
}
}
}
// Make a copy of extensions:
existingExtensions = result.slice();
return result;
}
export function collectBuildFilePattern(extensions: readonly vscode.Extension<any>[]) {
const result = [];
if (extensions && extensions.length) {
for (const extension of extensions) {
const contributesSection = extension.packageJSON['contributes'];
if (contributesSection) {
const buildFilePatterns = contributesSection['javaBuildFilePatterns'];
if (Array.isArray(buildFilePatterns) && buildFilePatterns.length) {
result.push(...buildFilePatterns);
}
}
}
}
buildFilePatterns = result.slice();
return result;
}
export function getBundlesToReload(): string[] {
const previousContributions: string[] = [...existingExtensions];
const currentContributions = collectJavaExtensions(extensions.all);
if (isContributedPartUpdated(previousContributions, currentContributions)) {
return currentContributions;
}
return [];
}
export async function onExtensionChange(extensions: readonly vscode.Extension<any>[]): Promise<void> {
if (isContributedPartUpdated(buildFilePatterns, collectBuildFilePattern(extensions))) {
return promptToReload();
}
const bundlesToRefresh: string[] = getBundlesToReload();
if (bundlesToRefresh.length) {
const success = await vscode.commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.REFRESH_BUNDLES, bundlesToRefresh);
if (!success) {
// if hot refreshing bundle fails, fallback to reload window.
return promptToReload();
}
}
}
function promptToReload() {
const msg = `Java Extension Contributions changed, reloading ${vscode.env.appName} is required for the changes to take effect.`;
const action = 'Reload';
const restartId = Commands.RELOAD_WINDOW;
vscode.window.showWarningMessage(msg, action).then((selection) => {
if (action === selection) {
vscode.commands.executeCommand(restartId);
}
});
}
export function isContributedPartUpdated(oldContributedPart: Array<string>, newContributedPart: Array<string>) {
if (!oldContributedPart) {
return false;
}
const oldContribution = new Set(oldContributedPart.slice());
const newContribution = newContributedPart;
const hasChanged = (oldContribution.size !== newContribution.length);
if (!hasChanged) {
for (const newExtension of newContribution) {
if (!oldContribution.has(newExtension)) {
return true;
}
}
}
return hasChanged;
}
export function getContributedBuildTools(): IBuildTool[] {
const buildTypes: IBuildTool[] = [];
for (const extension of extensions.all) {
const javaBuildTools: IBuildTool[] = extension.packageJSON.contributes?.javaBuildTools;
if (!Array.isArray(javaBuildTools)) {
continue;
}
for (const buildType of javaBuildTools) {
if (!isValidBuildTypeConfiguration(buildType)) {
continue;
}
buildTypes.push(buildType);
}
}
return buildTypes;
}
export interface IBuildTool {
displayName: string;
buildFileNames: string[];
}
function isValidBuildTypeConfiguration(buildType: IBuildTool): boolean {
return !!buildType.displayName && !!buildType.buildFileNames;
}
const EXTENSION_ID = 'redhat.java';