summaryrefslogtreecommitdiff
path: root/extension
diff options
context:
space:
mode:
authorNate Sesti <sestinj@gmail.com>2023-06-21 14:02:56 -0700
committerNate Sesti <sestinj@gmail.com>2023-06-21 14:02:56 -0700
commit287ec48055b86afad2fdd62fdd3f3987077f448b (patch)
tree909e15a69d0f1bd521c9e13721dd9f2ab4d41619 /extension
parent5165f4b3a44b3293972657b4c64210d92784b076 (diff)
downloadsncontinue-287ec48055b86afad2fdd62fdd3f3987077f448b.tar.gz
sncontinue-287ec48055b86afad2fdd62fdd3f3987077f448b.tar.bz2
sncontinue-287ec48055b86afad2fdd62fdd3f3987077f448b.zip
first slightly working version of suggestions
Diffstat (limited to 'extension')
-rw-r--r--extension/src/continueIdeClient.ts25
-rw-r--r--extension/src/lang-server/codeLens.ts19
-rw-r--r--extension/src/suggestions.ts60
-rw-r--r--extension/src/util/vscode.ts20
4 files changed, 60 insertions, 64 deletions
diff --git a/extension/src/continueIdeClient.ts b/extension/src/continueIdeClient.ts
index fbad5f5d..fbd00c6e 100644
--- a/extension/src/continueIdeClient.ts
+++ b/extension/src/continueIdeClient.ts
@@ -1,5 +1,8 @@
// import { ShowSuggestionRequest } from "../schema/ShowSuggestionRequest";
-import { showSuggestion, SuggestionRanges } from "./suggestions";
+import {
+ showSuggestion as showSuggestionInEditor,
+ SuggestionRanges,
+} from "./suggestions";
import { openEditorAndRevealRange, getRightViewColumn } from "./util/vscode";
import { FileEdit } from "../schema/FileEdit";
import { RangeInFile } from "../schema/RangeInFile";
@@ -115,7 +118,10 @@ class IdeProtocolClient {
break;
case "setFileOpen":
this.openFile(data.filepath);
- // TODO: Close file
+ // TODO: Close file if False
+ break;
+ case "showSuggestion":
+ this.showSuggestion(data.edit);
break;
case "openGUI":
case "connected":
@@ -157,25 +163,12 @@ class IdeProtocolClient {
isWholeLine: true,
});
editor.setDecorations(decorationType, [range]);
-
- // Listen for changes to cursor position and then remove the decoration (but keep for at least 2 seconds)
- const allowRemoveHighlight = () => {
- const cursorDisposable = vscode.window.onDidChangeTextEditorSelection(
- (event) => {
- if (event.textEditor.document.uri.fsPath === rangeInFile.filepath) {
- cursorDisposable.dispose();
- editor.setDecorations(decorationType, []);
- }
- }
- );
- };
- setTimeout(allowRemoveHighlight, 2000);
}
}
showSuggestion(edit: FileEdit) {
// showSuggestion already exists
- showSuggestion(
+ showSuggestionInEditor(
edit.filepath,
new vscode.Range(
edit.range.start.line,
diff --git a/extension/src/lang-server/codeLens.ts b/extension/src/lang-server/codeLens.ts
index 2a362b62..e8766c3c 100644
--- a/extension/src/lang-server/codeLens.ts
+++ b/extension/src/lang-server/codeLens.ts
@@ -13,8 +13,8 @@ class SuggestionsCodeLensProvider implements vscode.CodeLensProvider {
}
let codeLenses: vscode.CodeLens[] = [];
- for (let suggestion of suggestions) {
- let range = new vscode.Range(
+ for (const suggestion of suggestions) {
+ const range = new vscode.Range(
suggestion.oldRange.start,
suggestion.newRange.end
);
@@ -57,16 +57,16 @@ class PytestCodeLensProvider implements vscode.CodeLensProvider {
document: vscode.TextDocument,
token: vscode.CancellationToken
): vscode.CodeLens[] | Thenable<vscode.CodeLens[]> {
- let codeLenses: vscode.CodeLens[] = [];
+ const codeLenses: vscode.CodeLens[] = [];
let lineno = 1;
- let languageLibrary = getLanguageLibrary(document.fileName);
+ const languageLibrary = getLanguageLibrary(document.fileName);
for (let line of document.getText().split("\n")) {
if (
languageLibrary.lineIsFunctionDef(line) &&
languageLibrary.parseFunctionDefForName(line).startsWith("test_")
) {
- let functionToTest = languageLibrary.parseFunctionDefForName(line);
- let fileAndFunctionNameSpecifier =
+ const functionToTest = languageLibrary.parseFunctionDefForName(line);
+ const fileAndFunctionNameSpecifier =
document.fileName + "::" + functionToTest;
codeLenses.push(
new vscode.CodeLens(new vscode.Range(lineno, 0, lineno, 1), {
@@ -85,12 +85,13 @@ class PytestCodeLensProvider implements vscode.CodeLensProvider {
const allCodeLensProviders: { [langauge: string]: vscode.CodeLensProvider[] } =
{
- python: [new SuggestionsCodeLensProvider(), new PytestCodeLensProvider()],
+ // python: [new SuggestionsCodeLensProvider(), new PytestCodeLensProvider()],
+ "*": [new SuggestionsCodeLensProvider()],
};
export function registerAllCodeLensProviders(context: vscode.ExtensionContext) {
- for (let language in allCodeLensProviders) {
- for (let codeLensProvider of allCodeLensProviders[language]) {
+ for (const language in allCodeLensProviders) {
+ for (const codeLensProvider of allCodeLensProviders[language]) {
context.subscriptions.push(
vscode.languages.registerCodeLensProvider(language, codeLensProvider)
);
diff --git a/extension/src/suggestions.ts b/extension/src/suggestions.ts
index c66fad86..5ac6e095 100644
--- a/extension/src/suggestions.ts
+++ b/extension/src/suggestions.ts
@@ -14,7 +14,7 @@ export const editorToSuggestions: Map<
string, // URI of file
SuggestionRanges[]
> = new Map();
-export let currentSuggestion: Map<string, number> = new Map(); // Map from editor URI to index of current SuggestionRanges in editorToSuggestions
+export const currentSuggestion: Map<string, number> = new Map(); // Map from editor URI to index of current SuggestionRanges in editorToSuggestions
// When tab is reopened, rerender the decorations:
vscode.window.onDidChangeActiveTextEditor((editor) => {
@@ -25,16 +25,16 @@ vscode.workspace.onDidOpenTextDocument((doc) => {
rerenderDecorations(doc.uri.toString());
});
-let newDecorationType = vscode.window.createTextEditorDecorationType({
+const newDecorationType = vscode.window.createTextEditorDecorationType({
backgroundColor: "rgb(0, 255, 0, 0.1)",
isWholeLine: true,
});
-let oldDecorationType = vscode.window.createTextEditorDecorationType({
+const oldDecorationType = vscode.window.createTextEditorDecorationType({
backgroundColor: "rgb(255, 0, 0, 0.1)",
isWholeLine: true,
cursor: "pointer",
});
-let newSelDecorationType = vscode.window.createTextEditorDecorationType({
+const newSelDecorationType = vscode.window.createTextEditorDecorationType({
backgroundColor: "rgb(0, 255, 0, 0.25)",
isWholeLine: true,
after: {
@@ -42,7 +42,7 @@ let newSelDecorationType = vscode.window.createTextEditorDecorationType({
margin: "0 0 0 1em",
},
});
-let oldSelDecorationType = vscode.window.createTextEditorDecorationType({
+const oldSelDecorationType = vscode.window.createTextEditorDecorationType({
backgroundColor: "rgb(255, 0, 0, 0.25)",
isWholeLine: true,
after: {
@@ -52,19 +52,19 @@ let oldSelDecorationType = vscode.window.createTextEditorDecorationType({
});
export function rerenderDecorations(editorUri: string) {
- let suggestions = editorToSuggestions.get(editorUri);
- let idx = currentSuggestion.get(editorUri);
- let editor = vscode.window.visibleTextEditors.find(
+ const suggestions = editorToSuggestions.get(editorUri);
+ const idx = currentSuggestion.get(editorUri);
+ const editor = vscode.window.visibleTextEditors.find(
(editor) => editor.document.uri.toString() === editorUri
);
if (!suggestions || !editor) return;
- let olds: vscode.Range[] = [],
- news: vscode.Range[] = [],
- oldSels: vscode.Range[] = [],
- newSels: vscode.Range[] = [];
+ const olds: vscode.Range[] = [];
+ const news: vscode.Range[] = [];
+ const oldSels: vscode.Range[] = [];
+ const newSels: vscode.Range[] = [];
for (let i = 0; i < suggestions.length; i++) {
- let suggestion = suggestions[i];
+ const suggestion = suggestions[i];
if (typeof idx != "undefined" && idx === i) {
if (suggestion.newSelected) {
olds.push(suggestion.oldRange);
@@ -92,14 +92,14 @@ export function rerenderDecorations(editorUri: string) {
}
export function suggestionDownCommand() {
- let editor = vscode.window.activeTextEditor;
+ const editor = vscode.window.activeTextEditor;
if (!editor) return;
- let editorUri = editor.document.uri.toString();
- let suggestions = editorToSuggestions.get(editorUri);
- let idx = currentSuggestion.get(editorUri);
+ const editorUri = editor.document.uri.toString();
+ const suggestions = editorToSuggestions.get(editorUri);
+ const idx = currentSuggestion.get(editorUri);
if (!suggestions || idx === undefined) return;
- let suggestion = suggestions[idx];
+ const suggestion = suggestions[idx];
if (!suggestion.newSelected) {
suggestion.newSelected = true;
} else if (idx + 1 < suggestions.length) {
@@ -109,14 +109,14 @@ export function suggestionDownCommand() {
}
export function suggestionUpCommand() {
- let editor = vscode.window.activeTextEditor;
+ const editor = vscode.window.activeTextEditor;
if (!editor) return;
- let editorUri = editor.document.uri.toString();
- let suggestions = editorToSuggestions.get(editorUri);
- let idx = currentSuggestion.get(editorUri);
+ const editorUri = editor.document.uri.toString();
+ const suggestions = editorToSuggestions.get(editorUri);
+ const idx = currentSuggestion.get(editorUri);
if (!suggestions || idx === undefined) return;
- let suggestion = suggestions[idx];
+ const suggestion = suggestions[idx];
if (suggestion.newSelected) {
suggestion.newSelected = false;
} else if (idx > 0) {
@@ -130,10 +130,10 @@ function selectSuggestion(
accept: SuggestionSelectionOption,
key: SuggestionRanges | null = null
) {
- let editor = vscode.window.activeTextEditor;
+ const editor = vscode.window.activeTextEditor;
if (!editor) return;
- let editorUri = editor.document.uri.toString();
- let suggestions = editorToSuggestions.get(editorUri);
+ const editorUri = editor.document.uri.toString();
+ const suggestions = editorToSuggestions.get(editorUri);
if (!suggestions) return;
@@ -218,14 +218,14 @@ export async function showSuggestion(
range: vscode.Range,
suggestion: string
): Promise<boolean> {
- let existingCode = await readFileAtRange(
+ const existingCode = await readFileAtRange(
new vscode.Range(range.start, range.end),
editorFilename
);
// If any of the outside lines are the same, don't repeat them in the suggestion
- let slines = suggestion.split("\n");
- let elines = existingCode.split("\n");
+ const slines = suggestion.split("\n");
+ const elines = existingCode.split("\n");
let linesRemovedBefore = 0;
let linesRemovedAfter = 0;
while (slines.length > 0 && elines.length > 0 && slines[0] === elines[0]) {
@@ -255,7 +255,7 @@ export async function showSuggestion(
)
);
- let editor = await openEditorAndRevealRange(editorFilename, range);
+ const editor = await openEditorAndRevealRange(editorFilename, range);
if (!editor) return Promise.resolve(false);
return new Promise((resolve, reject) => {
diff --git a/extension/src/util/vscode.ts b/extension/src/util/vscode.ts
index a76b53c7..3110d589 100644
--- a/extension/src/util/vscode.ts
+++ b/extension/src/util/vscode.ts
@@ -118,9 +118,11 @@ export async function readFileAtRange(
)
);
} else {
- let firstLine = lines[range.start.line].slice(range.start.character);
- let lastLine = lines[range.end.line].slice(0, range.end.character);
- let middleLines = lines.slice(range.start.line + 1, range.end.line);
+ const firstLine = lines[range.start.line].slice(
+ range.start.character
+ );
+ const lastLine = lines[range.end.line].slice(0, range.end.character);
+ const middleLines = lines.slice(range.start.line + 1, range.end.line);
resolve([firstLine, ...middleLines, lastLine].join("\n"));
}
}
@@ -144,7 +146,7 @@ export function openEditorAndRevealRange(
setInterval(() => {
resolve(null);
}, 200);
- })
+ });
}
showTextDocumentInProcess = true;
vscode.window
@@ -158,10 +160,10 @@ export function openEditorAndRevealRange(
}
resolve(editor);
showTextDocumentInProcess = false;
- })
- } catch (err) {
- console.log(err);
- }
- });
+ });
+ } catch (err) {
+ console.log(err);
+ }
+ });
});
}