aboutsummaryrefslogtreecommitdiff
path: root/src/implement-interface.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/implement-interface.js')
-rw-r--r--src/implement-interface.js95
1 files changed, 95 insertions, 0 deletions
diff --git a/src/implement-interface.js b/src/implement-interface.js
new file mode 100644
index 0000000..8c6f3a3
--- /dev/null
+++ b/src/implement-interface.js
@@ -0,0 +1,95 @@
+const vscode = require('vscode');
+const { dirname } = require('path');
+const cp = require('child_process');
+const provideInterfaces = require('./interfaces-provider');
+const debounce = require('lodash.debounce');
+
+
+
+function selectReceiver() {
+ const receiverInput = vscode.window.createInputBox();
+ const pattern = /^([a-zA-Z_][a-zA-Z0-9_]*)\s+(\*?(?:[a-zA-Z_][a-zA-Z0-9]*\.)?[a-zA-Z_][a-zA-Z0-9_]*)$/;
+ receiverInput.placeholder = "Enter receiver (ex: 'm *MyType')";
+
+ receiverInput.onDidChangeValue(value => {
+ if (value != "" && !value.match(pattern)) {
+ receiverInput.validationMessage = `Valid format: "f *File", "m MyType", "c CustomType"`;
+ } else {
+ receiverInput.validationMessage = '';
+ }
+ });
+
+ receiverInput.onDidAccept(e => {
+ const receiver = receiverInput.value;
+ const matches = receiver.match(pattern);
+ if (!matches) {
+ vscode.window.showWarningMessage(`Receiver is not in the correct format. Valid: "f *File", "m MyType", "c CustomType"`);
+ return undefined;
+ }
+ selectInterface({ name: matches[1], type_: matches[2] });
+ receiverInput.hide();
+ });
+
+ receiverInput.onDidHide(() => {
+ receiverInput.dispose();
+ });
+ receiverInput.show();
+}
+
+/**
+ *
+ * @param {*} receiver
+ */
+function selectInterface(receiver) {
+ const quickPick = vscode.window.createQuickPick();
+ quickPick.placeholder = "Which interface would you like to implement?";
+ const debounced = debounce((value) => {
+ provideInterfaces(value, (interfaces) => {
+ const items = interfaces.map((label) => ({ label }));
+ quickPick.items = items;
+ });
+ }, 400, { trailing: true });
+
+ quickPick.onDidChangeValue(value => {
+ debounced(value);
+ });
+
+ quickPick.onDidChangeSelection(selection => {
+ if (selection[0]) {
+ implement(selection[0].label, receiver);
+ }
+ quickPick.hide();
+ });
+
+ quickPick.onDidHide(() => {
+ quickPick.dispose();
+ });
+ quickPick.show();
+}
+
+function implement(interface_, receiver) {
+ const editor = vscode.window.activeTextEditor;
+ vscode.window.withProgress({
+ location: vscode.ProgressLocation.Notification,
+ title: "Generating stub methods..."
+ }, (progress, token) => {
+ return new Promise((resolve) => {
+ const r = `${receiver.name} ${receiver.type_}`
+ cp.exec(`impl "${r}" ${interface_}`,
+ { cwd: dirname(editor.document.fileName) },
+ (error, stdout, stderr) => {
+ if (error) {
+ vscode.window.showInformationMessage(stderr);
+ return resolve(true);
+ }
+
+ const position = editor.selection.active;
+
+ editor.insertSnippet(new vscode.SnippetString("\n" + stdout), position.with(position.line+1, 0));
+ resolve(true);
+ });
+ });
+ });
+}
+
+module.exports = selectReceiver; \ No newline at end of file