Skip to content

Commit f00c98b

Browse files
authored
chore: Add telemetry for authoring features (#1127)
1 parent 6b99786 commit f00c98b

File tree

5 files changed

+133
-20
lines changed

5 files changed

+133
-20
lines changed

extension/src/Extension.ts

+54-17
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,16 @@ import { GradleDependencyProvider } from "./dependencies/GradleDependencyProvide
3131
import { isLanguageServerStarted, startLanguageServer, syncLanguageServer } from "./languageServer/languageServer";
3232
import { DefaultProjectsTreeDataProvider } from "./views/defaultProject/DefaultProjectsTreeDataProvider";
3333
import { GradleProjectContentProvider } from "./projectContent/GradleProjectContentProvider";
34-
import { Context } from "./constant";
34+
import {
35+
CompletionKinds,
36+
Context,
37+
GRADLE_BUILD_FILE_CHANGE,
38+
GRADLE_BUILD_FILE_OPEN,
39+
GRADLE_COMPLETION,
40+
GRADLE_PROPERTIES_FILE_CHANGE,
41+
VSCODE_TRIGGER_COMPLETION,
42+
} from "./constant";
43+
import { instrumentOperation, sendInfo } from "vscode-extension-telemetry-wrapper";
3544

3645
export class Extension {
3746
private readonly client: GradleClient;
@@ -181,6 +190,28 @@ export class Extension {
181190
}
182191
});
183192

193+
this.context.subscriptions.push(
194+
vscode.commands.registerCommand(
195+
GRADLE_COMPLETION,
196+
instrumentOperation(GRADLE_COMPLETION, async (operationId: string, ...args: string[]) => {
197+
if (args.length === 2) {
198+
const completionKind = args[0];
199+
const completionContent = args[1];
200+
sendInfo(operationId, {
201+
kind: completionKind,
202+
content: completionContent,
203+
});
204+
if (
205+
completionKind === CompletionKinds.DEPENDENCY_GROUP ||
206+
completionKind === CompletionKinds.DEPENDENCY_ARTIFACT
207+
) {
208+
vscode.commands.executeCommand(VSCODE_TRIGGER_COMPLETION);
209+
}
210+
}
211+
})
212+
)
213+
);
214+
184215
void this.activate();
185216
void startLanguageServer(this.context, this.gradleProjectContentProvider);
186217
void vscode.commands.executeCommand("setContext", "allowParallelRun", getAllowParallelRun());
@@ -258,22 +289,28 @@ export class Extension {
258289
}
259290

260291
private handleWatchEvents(): void {
261-
this.buildFileWatcher.onDidChange(async (uri: vscode.Uri) => {
262-
logger.info("Build file changed:", uri.fsPath);
263-
await this.refresh();
264-
void this.syncBuildFile(uri);
265-
});
266-
this.buildFileWatcher.onDidOpen(async (uri: vscode.Uri) => {
267-
logger.info("Build file opened:", uri.fsPath);
268-
void this.syncBuildFile(uri);
269-
});
270-
this.gradleWrapperWatcher.onDidChange(async (uri: vscode.Uri) => {
271-
logger.info("Gradle wrapper properties changed:", uri.fsPath);
272-
await this.restartServer();
273-
if (isLanguageServerStarted) {
274-
void vscode.commands.executeCommand("gradle.distributionChanged");
275-
}
276-
});
292+
this.buildFileWatcher.onDidChange(
293+
instrumentOperation(GRADLE_BUILD_FILE_CHANGE, async (_operationId: string, uri: vscode.Uri) => {
294+
logger.info("Build file changed:", uri.fsPath);
295+
await this.refresh();
296+
void this.syncBuildFile(uri);
297+
})
298+
);
299+
this.buildFileWatcher.onDidOpen(
300+
instrumentOperation(GRADLE_BUILD_FILE_OPEN, async (_operationId: string, uri: vscode.Uri) => {
301+
logger.info("Build file opened:", uri.fsPath);
302+
void this.syncBuildFile(uri);
303+
})
304+
);
305+
this.gradleWrapperWatcher.onDidChange(
306+
instrumentOperation(GRADLE_PROPERTIES_FILE_CHANGE, async (_operationId: string, uri: vscode.Uri) => {
307+
logger.info("Gradle wrapper properties changed:", uri.fsPath);
308+
await this.restartServer();
309+
if (isLanguageServerStarted) {
310+
void vscode.commands.executeCommand("gradle.distributionChanged");
311+
}
312+
})
313+
);
277314
}
278315

279316
private async syncBuildFile(uri: vscode.Uri): Promise<void> {

extension/src/constant.ts

+18
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,21 @@
55
export namespace Context {
66
export const ACTIVATION_CONTEXT_KEY = "gradle:extensionActivated";
77
}
8+
9+
export const GRADLE_BUILD_FILE_CHANGE = "gradle.buildFileChanged";
10+
11+
export const GRADLE_BUILD_FILE_OPEN = "gradle.buildFileOpened";
12+
13+
export const GRADLE_PROPERTIES_FILE_CHANGE = "gradle.propertiesFileChanged";
14+
15+
export const GRADLE_COMPLETION = "gradle.completion";
16+
17+
export const VSCODE_TRIGGER_COMPLETION = "editor.action.triggerSuggest";
18+
19+
export enum CompletionKinds {
20+
DEPENDENCY_GROUP = "dependency_group",
21+
DEPENDENCY_ARTIFACT = "dependency_artifact",
22+
DEPENDENCY_VERSION = "dependency_version",
23+
METHOD_CALL = "method_call",
24+
PROPERTY = "property",
25+
}

gradle-language-server/src/main/java/com/microsoft/gradle/handlers/CompletionHandler.java

+26
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import com.microsoft.gradle.resolver.GradleField;
99
import com.microsoft.gradle.resolver.GradleLibraryResolver;
1010
import com.microsoft.gradle.resolver.GradleMethod;
11+
import com.microsoft.gradle.utils.CompletionUtils;
12+
import com.microsoft.gradle.utils.CompletionUtils.CompletionKinds;
1113
import java.lang.reflect.Modifier;
1214
import java.util.ArrayList;
1315
import java.util.Arrays;
@@ -21,6 +23,7 @@
2123
import org.apache.bcel.classfile.Method;
2224
import org.apache.bcel.generic.ObjectType;
2325
import org.codehaus.groovy.ast.expr.MethodCallExpression;
26+
import org.eclipse.lsp4j.Command;
2427
import org.eclipse.lsp4j.CompletionItem;
2528
import org.eclipse.lsp4j.CompletionItemKind;
2629
import org.eclipse.lsp4j.CompletionItemTag;
@@ -121,6 +124,11 @@ private List<CompletionItem> getCompletionItemsFromClass(JavaClass javaClass, Gr
121124
property.setTags(Arrays.asList(CompletionItemTag.Deprecated));
122125
}
123126
property.setKind(CompletionItemKind.Property);
127+
List<Object> propertyArguments = new ArrayList<>();
128+
propertyArguments.add(CompletionKinds.PROPERTY.toString());
129+
propertyArguments.add(propertyName);
130+
item.setCommand(new Command(CompletionUtils.completionTitle, CompletionUtils.completionCommand,
131+
propertyArguments));
124132
if (resultSet.add(propertyName)) {
125133
results.add(property);
126134
}
@@ -140,6 +148,11 @@ private List<CompletionItem> getCompletionItemsFromClass(JavaClass javaClass, Gr
140148
item.setKind(CompletionItemKind.Function);
141149
item.setInsertTextFormat(InsertTextFormat.Snippet);
142150
item.setInsertText(insertBuilder.toString());
151+
List<Object> arguments = new ArrayList<>();
152+
arguments.add(CompletionKinds.METHOD_CALL.toString());
153+
arguments.add(plugin);
154+
item.setCommand(
155+
new Command(CompletionUtils.completionTitle, CompletionUtils.completionCommand, arguments));
143156
results.add(item);
144157
}
145158
}
@@ -164,6 +177,10 @@ private List<CompletionItem> getCompletionItemsFromExtClosures(GradleLibraryReso
164177
insertTextBuilder.append(closure.name);
165178
insertTextBuilder.append(" {$0}");
166179
item.setInsertText(insertTextBuilder.toString());
180+
List<Object> arguments = new ArrayList<>();
181+
arguments.add(CompletionKinds.METHOD_CALL.toString());
182+
arguments.add(closure.name);
183+
item.setCommand(new Command(CompletionUtils.completionTitle, CompletionUtils.completionCommand, arguments));
167184
if (resultSet.add(item.getLabel())) {
168185
results.add(item);
169186
}
@@ -193,6 +210,11 @@ private List<CompletionItem> getCompletionItemsFromExtClosures(GradleLibraryReso
193210
if (field.deprecated) {
194211
property.setTags(Arrays.asList(CompletionItemTag.Deprecated));
195212
}
213+
List<Object> arguments = new ArrayList<>();
214+
arguments.add(CompletionKinds.PROPERTY.toString());
215+
arguments.add(field.name);
216+
property.setCommand(
217+
new Command(CompletionUtils.completionTitle, CompletionUtils.completionCommand, arguments));
196218
if (resultSet.add(field.name)) {
197219
results.add(property);
198220
}
@@ -237,6 +259,10 @@ private static CompletionItem generateCompletionItemForMethod(String name, List<
237259
builder.append("($0)");
238260
}
239261
item.setInsertText(builder.toString());
262+
List<Object> itemArguments = new ArrayList<>();
263+
itemArguments.add(CompletionKinds.METHOD_CALL.toString());
264+
itemArguments.add(name);
265+
item.setCommand(new Command(CompletionUtils.completionTitle, CompletionUtils.completionCommand, itemArguments));
240266
return item;
241267
}
242268

gradle-language-server/src/main/java/com/microsoft/gradle/handlers/MavenCentralCompletionHandler.java

+10
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.google.gson.JsonObject;
1010
import com.microsoft.gradle.compile.CompletionVisitor.DependencyItem;
1111
import com.microsoft.gradle.utils.CompletionUtils;
12+
import com.microsoft.gradle.utils.CompletionUtils.CompletionKinds;
1213
import com.microsoft.gradle.utils.LSPUtils;
1314
import java.io.InputStreamReader;
1415
import java.net.URL;
@@ -100,6 +101,7 @@ private List<CompletionItem> getDependenciesFromRestAPI(String url, DependencyCo
100101
CompletionItem completionItem = new CompletionItem();
101102
String groupId = ((JsonObject) element).get("g").getAsJsonPrimitive().getAsString();
102103
String artifactId = ((JsonObject) element).get("a").getAsJsonPrimitive().getAsString();
104+
List<Object> arguments = new ArrayList<>();
103105
if (kind == DependencyCompletionKind.GROUPID) {
104106
TextEdit textEdit = new TextEdit(range, groupId + ":");
105107
completionItem.setTextEdit(Either.forLeft(textEdit));
@@ -108,6 +110,8 @@ private List<CompletionItem> getDependenciesFromRestAPI(String url, DependencyCo
108110
completionItem.setDetail("GroupID: " + groupId);
109111
completionItem.setCommand(
110112
new Command(CompletionUtils.completionTitle, CompletionUtils.completionCommand));
113+
arguments.add(CompletionKinds.DEPENDENCY_GROUP.toString());
114+
arguments.add(groupId);
111115
} else if (kind == DependencyCompletionKind.ARTIFACTID) {
112116
// ${groupId}:${artifactId}
113117
int character = range.getStart().getCharacter() + groupId.length() + 1;
@@ -120,6 +124,8 @@ private List<CompletionItem> getDependenciesFromRestAPI(String url, DependencyCo
120124
completionItem.setDetail("ArtifactID: " + artifactId);
121125
completionItem.setCommand(
122126
new Command(CompletionUtils.completionTitle, CompletionUtils.completionCommand));
127+
arguments.add(CompletionKinds.DEPENDENCY_ARTIFACT.toString());
128+
arguments.add(groupId + ":" + artifactId);
123129
} else if (kind == DependencyCompletionKind.VERSION) {
124130
String version = ((JsonObject) element).get("v").getAsJsonPrimitive().getAsString();
125131
String timestampValue = ((JsonObject) element).get("timestamp").getAsJsonPrimitive()
@@ -136,7 +142,11 @@ private List<CompletionItem> getDependenciesFromRestAPI(String url, DependencyCo
136142
completionItem.setLabel(version);
137143
completionItem.setKind(CompletionItemKind.Constant);
138144
completionItem.setDetail("Updated: " + date.toString());
145+
arguments.add(CompletionKinds.DEPENDENCY_VERSION.toString());
146+
arguments.add(groupId + ":" + artifactId + ":" + version);
139147
}
148+
completionItem.setCommand(
149+
new Command(CompletionUtils.completionTitle, CompletionUtils.completionCommand, arguments));
140150
completionItem.setSortText(sequence + String.format("%08d", i));
141151
completions.add(completionItem);
142152
}

gradle-language-server/src/main/java/com/microsoft/gradle/utils/CompletionUtils.java

+25-3
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,25 @@
1818

1919
public class CompletionUtils {
2020

21-
public static String completionCommand = "editor.action.triggerSuggest";
21+
public static String completionCommand = "gradle.completion";
2222
public static String completionTitle = "completion";
2323

24+
public enum CompletionKinds {
25+
DEPENDENCY_GROUP("dependency_group"), DEPENDENCY_ARTIFACT("dependency_artifact"), DEPENDENCY_VERSION(
26+
"dependency_version"), METHOD_CALL("method_call"), PROPERTY("property");
27+
28+
private final String text;
29+
30+
CompletionKinds(final String text) {
31+
this.text = text;
32+
}
33+
34+
@Override
35+
public String toString() {
36+
return text;
37+
}
38+
}
39+
2440
public static List<CompletionItem> getGroupIdCompletions(String text, Range range, Collection<String> keys,
2541
String sequence) {
2642
List<String> results = CompletionUtils.sortResults(text, keys);
@@ -34,7 +50,10 @@ public static List<CompletionItem> getGroupIdCompletions(String text, Range rang
3450
completionItem.setKind(CompletionItemKind.Module);
3551
completionItem.setDetail("GroupID: " + groupId);
3652
completionItem.setSortText(sequence + String.format("%08d", i));
37-
completionItem.setCommand(new Command(completionTitle, completionCommand));
53+
List<Object> arguments = new ArrayList<>();
54+
arguments.add(CompletionKinds.DEPENDENCY_GROUP.toString());
55+
arguments.add(groupId);
56+
completionItem.setCommand(new Command(completionTitle, completionCommand, arguments));
3857
items.add(completionItem);
3958
}
4059
return items;
@@ -56,7 +75,10 @@ public static List<CompletionItem> getArtifactIdCompletions(String groupId, Stri
5675
completionItem.setKind(CompletionItemKind.Module);
5776
completionItem.setDetail("ArtifactID: " + artifactId);
5877
completionItem.setSortText(sequence + String.format("%08d", i));
59-
completionItem.setCommand(new Command(completionTitle, completionCommand));
78+
List<Object> arguments = new ArrayList<>();
79+
arguments.add(CompletionKinds.DEPENDENCY_ARTIFACT.toString());
80+
arguments.add(groupId + ":" + artifactId);
81+
completionItem.setCommand(new Command(completionTitle, completionCommand, arguments));
6082
items.add(completionItem);
6183
}
6284
return items;

0 commit comments

Comments
 (0)