Skip to content

Commit 9126a4f

Browse files
authored
Merge branch 'main' into dependabot/npm_and_yarn/fast-xml-parser-4.4.1
2 parents 8f75a08 + ddc4674 commit 9126a4f

File tree

11 files changed

+1209
-50
lines changed

11 files changed

+1209
-50
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ meta.json
88
stats.html
99
server
1010
test/result
11+
*.bazel.lock

package-lock.json

Lines changed: 40 additions & 34 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"description": "Bazel support for Java Linting, Intellisense, formatting, refactoring and more...",
55
"author": "Salesforce Engineering",
66
"license": "BSD-3-Clause",
7-
"version": "1.3.0",
7+
"version": "1.4.0",
88
"publisher": "sfdc",
99
"bugs": "https://github.com/salesforce/bazel-vscode-java/issues",
1010
"preview": true,
@@ -41,7 +41,7 @@
4141
"./server/com.github.ben-manes.caffeine.jar",
4242
"./server/org.jsr-305.jar",
4343
"./server/org.fusesource.jansi.jar",
44-
"./server/wrapped.com.google.protobuf.protobuf-java.jar",
44+
"./server/com.google.protobuf.jar",
4545
"./server/com.salesforce.bazel.importedsource.jar",
4646
"./server/com.salesforce.bazel.sdk.jar",
4747
"./server/com.salesforce.bazel.eclipse.core.jar",
@@ -57,20 +57,46 @@
5757
{
5858
"id": "bazelproject",
5959
"aliases": [
60-
"bazelproject",
6160
"bazelproject"
6261
],
6362
"extensions": [
6463
".bazelproject"
6564
],
6665
"configuration": "./syntaxes/bazelproject-language-configuration.json"
66+
},
67+
{
68+
"id": "starlark",
69+
"aliases": [
70+
"Starlark",
71+
"starlark",
72+
"Bazel"
73+
],
74+
"extensions": [
75+
".BUILD",
76+
".WORKSPACE",
77+
".bazel",
78+
".bzl",
79+
".bzlmod",
80+
".sky",
81+
".star"
82+
],
83+
"filenames": [
84+
"BUILD",
85+
"WORKSPACE"
86+
],
87+
"configuration": "./syntaxes/starlark-language-configuration.json"
6788
}
6889
],
6990
"grammars": [
7091
{
7192
"language": "bazelproject",
7293
"scopeName": "source.bazelproject",
7394
"path": "./syntaxes/bazelproject.tmLanguage.json"
95+
},
96+
{
97+
"language": "starlark",
98+
"scopeName": "source.starlark",
99+
"path": "./syntaxes/starlark.tmLanguage.json"
74100
}
75101
],
76102
"taskDefinitions": [
@@ -131,6 +157,18 @@
131157
"default": true,
132158
"description": "Display 'sync project view' notification info window on .bazelproject edit",
133159
"scope": "window"
160+
},
161+
"bazel.buildifier.enable": {
162+
"type": "boolean",
163+
"default": true,
164+
"description": "Enable buildifier formatting tool on save",
165+
"scope": "window"
166+
},
167+
"bazel.buildifier.binary": {
168+
"type": ["string", "null"],
169+
"default": null,
170+
"description": "path to buildifier binary. If not set buildifier from your PATH will be used",
171+
"scope": "window"
134172
}
135173
}
136174
},
@@ -270,7 +308,7 @@
270308
"esbuild:watch": "npm run esbuild:base -- --sourcemap --watch",
271309
"analyze": "npm run esbuild:base -- --minify --metafile --analyze && esbuild-visualizer --metadata ./meta.json --open",
272310
"lint": "eslint src --ext ts",
273-
"lint:fix" : "eslint src --ext ts --fix",
311+
"lint:fix": "eslint src --ext ts --fix",
274312
"test": "run-s clean test:*",
275313
"test:compile": "tsc -b ./test/tsconfig.json",
276314
"test:lint": "eslint --ext .js,.ts,.tsx src",
@@ -290,7 +328,7 @@
290328
"@typescript-eslint/eslint-plugin": "^6.0.0",
291329
"@typescript-eslint/parser": "^6.0.0",
292330
"@vscode/test-electron": "^2.3.4",
293-
"@vscode/vsce": "^3.0.0",
331+
"@vscode/vsce": "^3.2.1",
294332
"esbuild": "0.19.8",
295333
"esbuild-plugin-eslint": "^0.3.7",
296334
"esbuild-visualizer": "^0.4.1",

src/buildifier.ts

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
import { exec } from 'child_process';
2+
import {
3+
languages,
4+
Range,
5+
TextDocument,
6+
TextEdit,
7+
window,
8+
workspace,
9+
} from 'vscode';
10+
import { getWorkspaceRoot } from './util';
11+
12+
export function registerBuildifierFormatter() {
13+
languages.registerDocumentFormattingEditProvider(
14+
{ scheme: 'file', language: 'starlark' },
15+
{
16+
async provideDocumentFormattingEdits(
17+
document: TextDocument
18+
): Promise<TextEdit[]> {
19+
if (
20+
workspace.getConfiguration('bazel.buildifier').get('enable', false)
21+
) {
22+
try {
23+
if (await buildifierExists()) {
24+
const updatedContent = await runBuildifier(document.fileName);
25+
26+
// only return an edit if there is a value in `updatedContent`
27+
return !!updatedContent
28+
? [
29+
TextEdit.replace(
30+
new Range(
31+
0,
32+
0,
33+
document.lineCount - 1,
34+
document.lineAt(
35+
document.lineCount - 1
36+
).rangeIncludingLineBreak.end.character
37+
),
38+
updatedContent
39+
),
40+
]
41+
: [];
42+
}
43+
} catch (err) {
44+
window.showErrorMessage(`${err}`);
45+
return [];
46+
}
47+
}
48+
49+
return [];
50+
},
51+
}
52+
);
53+
}
54+
55+
function buildifierExists(): Promise<boolean> {
56+
return new Promise((resolve, reject) => {
57+
exec(
58+
`${getBuildifierCmd()} -version`,
59+
{ cwd: getWorkspaceRoot() },
60+
(err, stdout, stderr) => {
61+
if (err) {
62+
return reject(err);
63+
}
64+
return resolve(!stderr);
65+
}
66+
);
67+
});
68+
}
69+
70+
/**
71+
* Utility function used to fetch the formatted text from the `buildifier`
72+
* cmd. Uses `exec` since we want to get all of the cmd response in a single
73+
* text blob
74+
* @param bazelFile
75+
* @returns
76+
*/
77+
function runBuildifier(bazelFile: string): Promise<string> {
78+
return new Promise((resolve, reject) => {
79+
exec(
80+
`${getBuildifierCmd()} -mode print_if_changed ${workspace.asRelativePath(bazelFile)}`,
81+
{
82+
cwd: getWorkspaceRoot(),
83+
},
84+
(err, stdout, stderr) => {
85+
if (err) {
86+
console.error(stderr);
87+
return reject(err);
88+
}
89+
return resolve(stdout);
90+
}
91+
);
92+
});
93+
}
94+
95+
function getBuildifierCmd(): string {
96+
return workspace.getConfiguration('bazel.buildifier').get('binary')
97+
? workspace.getConfiguration('bazel.buildifier').get('binary', 'buildifier')
98+
: 'buildifier';
99+
}

src/extension.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
getBazelTerminal,
1616
} from './bazelLangaugeServerTerminal';
1717
import { BazelTaskManager } from './bazelTaskManager';
18+
import { registerBuildifierFormatter } from './buildifier';
1819
import { Commands, executeJavaLanguageServerCommand } from './commands';
1920
import { registerLSClient } from './loggingTCPServer';
2021
import { ProjectViewManager } from './projectViewManager';
@@ -27,7 +28,6 @@ import {
2728
} from './util';
2829

2930
const workspaceRoot = getWorkspaceRoot();
30-
const workspaceRootName = workspaceRoot.split('/').reverse()[0];
3131

3232
export async function activate(context: ExtensionContext) {
3333
// activates
@@ -66,6 +66,11 @@ export async function activate(context: ExtensionContext) {
6666
'isBazelWorkspaceRoot',
6767
isBazelWorkspaceRoot()
6868
);
69+
commands.executeCommand(
70+
'setContext',
71+
'isMultiRoot',
72+
workspace.workspaceFile?.fsPath.includes('code-workspace')
73+
);
6974
// create .eclipse/.bazelproject file if DNE
7075
if (isBazelWorkspaceRoot()) {
7176
initBazelProjectFile();
@@ -124,6 +129,8 @@ export async function activate(context: ExtensionContext) {
124129
)
125130
);
126131

132+
registerBuildifierFormatter();
133+
127134
// trigger a refresh of the tree view when any task get executed
128135
tasks.onDidStartTask((_) => BazelRunTargetProvider.instance.refresh());
129136
tasks.onDidEndTask((_) => BazelRunTargetProvider.instance.refresh());
@@ -132,7 +139,7 @@ export async function activate(context: ExtensionContext) {
132139
registerLSClient();
133140
}
134141

135-
export function deactivate() {}
142+
export function deactivate() { }
136143

137144
function syncProjectView(): void {
138145
if (!isRedhatJavaReady()) {

0 commit comments

Comments
 (0)