Merge pull request #40 from github/elbrenn/range

Add range to CompletionItems
This commit is contained in:
Beth Brennan
2022-12-07 10:55:35 -05:00
committed by GitHub
5 changed files with 65 additions and 39 deletions
@@ -1,3 +1,4 @@
import {TextEdit} from "vscode-languageserver-types";
import {complete} from "./complete"; import {complete} from "./complete";
import {WorkflowContext} from "./context/workflow-context"; import {WorkflowContext} from "./context/workflow-context";
import {getPositionFromCursor} from "./test-utils/cursor-position"; import {getPositionFromCursor} from "./test-utils/cursor-position";
@@ -329,4 +330,25 @@ o|
"You can now create workflows that are manually triggered with the new workflow_dispatch event. You will then see a 'Run workflow' button on the Actions tab, enabling you to easily trigger a run." "You can now create workflows that are manually triggered with the new workflow_dispatch event. You will then see a 'Run workflow' button on the Actions tab, enabling you to easily trigger a run."
); );
}); });
it("sets range when completing token", async () => {
const input = `on: push
jobs:
pre-build:
runs-on: ubuntu-latest
build:
runs-on: ubuntu-latest
needs: pre-bu|`;
const result = await complete(...getPositionFromCursor(input));
expect(result).not.toBeUndefined();
expect(result.length).toEqual(1);
let textEdit = result[0].textEdit as TextEdit;
expect(textEdit.newText).toEqual("pre-build");
expect(textEdit.range).toEqual({
start: {line: 6, character: 11},
end: {line: 6, character: 17}
});
});
}); });
+11 -1
View File
@@ -9,13 +9,14 @@ import {MappingToken} from "@github/actions-workflow-parser/templates/tokens/map
import {TokenType} from "@github/actions-workflow-parser/templates/tokens/types"; import {TokenType} from "@github/actions-workflow-parser/templates/tokens/types";
import {File} from "@github/actions-workflow-parser/workflows/file"; import {File} from "@github/actions-workflow-parser/workflows/file";
import {Position, TextDocument} from "vscode-languageserver-textdocument"; import {Position, TextDocument} from "vscode-languageserver-textdocument";
import {CompletionItem} from "vscode-languageserver-types"; import {CompletionItem, TextEdit, Range} from "vscode-languageserver-types";
import {ContextProviderConfig} from "./context-providers/config"; import {ContextProviderConfig} from "./context-providers/config";
import {getContext} from "./context-providers/default"; import {getContext} from "./context-providers/default";
import {getWorkflowContext, WorkflowContext} from "./context/workflow-context"; import {getWorkflowContext, WorkflowContext} from "./context/workflow-context";
import {nullTrace} from "./nulltrace"; import {nullTrace} from "./nulltrace";
import {getAllowedContext} from "./utils/allowed-context"; import {getAllowedContext} from "./utils/allowed-context";
import {findToken} from "./utils/find-token"; import {findToken} from "./utils/find-token";
import {mapRange} from "./utils/range";
import {transform} from "./utils/transform"; import {transform} from "./utils/transform";
import {Value, ValueProviderConfig} from "./value-providers/config"; import {Value, ValueProviderConfig} from "./value-providers/config";
import {defaultValueProviders} from "./value-providers/default"; import {defaultValueProviders} from "./value-providers/default";
@@ -91,9 +92,18 @@ export async function complete(
} }
const values = await getValues(token, keyToken, parent, valueProviderConfig, workflowContext); const values = await getValues(token, keyToken, parent, valueProviderConfig, workflowContext);
let replaceRange: Range | undefined;
if (token?.range) {
replaceRange = mapRange(token.range);
}
return values.map(value => { return values.map(value => {
const item = CompletionItem.create(value.label); const item = CompletionItem.create(value.label);
item.detail = value.description; item.detail = value.description;
if (replaceRange) {
item.textEdit = TextEdit.replace(replaceRange, value.label);
}
return item; return item;
}); });
} }
+2 -10
View File
@@ -6,6 +6,7 @@ import {Hover} from "vscode-languageserver-types";
import {info} from "./log"; import {info} from "./log";
import {nullTrace} from "./nulltrace"; import {nullTrace} from "./nulltrace";
import {findToken} from "./utils/find-token"; import {findToken} from "./utils/find-token";
import {mapRange} from "./utils/range";
// Render value description and Context when hovering over a key in a MappingToken // Render value description and Context when hovering over a key in a MappingToken
export async function hover(document: TextDocument, position: Position): Promise<Hover | null> { export async function hover(document: TextDocument, position: Position): Promise<Hover | null> {
@@ -41,16 +42,7 @@ function getHover(token: TemplateToken): Hover | null {
return { return {
contents: description, contents: description,
range: { range: mapRange(token.range)
start: {
line: token.range!.start[0] - 1,
character: token.range!.start[1] - 1
},
end: {
line: token.range!.end[0] - 1,
character: token.range!.end[1] - 1
}
}
} as Hover; } as Hover;
} }
return null; return null;
@@ -0,0 +1,28 @@
import {TokenRange} from "@github/actions-workflow-parser/templates/tokens/token-range";
import {Range} from "vscode-languageserver-types";
export function mapRange(range: TokenRange | undefined): Range {
if (!range) {
return {
start: {
line: 1,
character: 1
},
end: {
line: 1,
character: 1
}
};
}
return {
start: {
line: range.start[0] - 1,
character: range.start[1] - 1
},
end: {
line: range.end[0] - 1,
character: range.end[1] - 1
}
};
}
+2 -28
View File
@@ -14,10 +14,9 @@ import {Definition} from "@github/actions-workflow-parser/templates/schema/defin
import {BasicExpressionToken} from "@github/actions-workflow-parser/templates/tokens/basic-expression-token"; import {BasicExpressionToken} from "@github/actions-workflow-parser/templates/tokens/basic-expression-token";
import {StringToken} from "@github/actions-workflow-parser/templates/tokens/string-token"; import {StringToken} from "@github/actions-workflow-parser/templates/tokens/string-token";
import {TemplateToken} from "@github/actions-workflow-parser/templates/tokens/template-token"; import {TemplateToken} from "@github/actions-workflow-parser/templates/tokens/template-token";
import {TokenRange} from "@github/actions-workflow-parser/templates/tokens/token-range";
import {File} from "@github/actions-workflow-parser/workflows/file"; import {File} from "@github/actions-workflow-parser/workflows/file";
import {TextDocument} from "vscode-languageserver-textdocument"; import {TextDocument} from "vscode-languageserver-textdocument";
import {Diagnostic, DiagnosticSeverity, Range, URI} from "vscode-languageserver-types"; import {Diagnostic, DiagnosticSeverity, URI} from "vscode-languageserver-types";
import {ContextProviderConfig} from "./context-providers/config"; import {ContextProviderConfig} from "./context-providers/config";
import {getContext} from "./context-providers/default"; import {getContext} from "./context-providers/default";
@@ -25,6 +24,7 @@ import {getWorkflowContext, WorkflowContext} from "./context/workflow-context";
import {AccessError, wrapDictionary} from "./expression-validation/error-dictionary"; import {AccessError, wrapDictionary} from "./expression-validation/error-dictionary";
import {nullTrace} from "./nulltrace"; import {nullTrace} from "./nulltrace";
import {findToken} from "./utils/find-token"; import {findToken} from "./utils/find-token";
import {mapRange} from "./utils/range";
import {ValueProviderConfig, ValueProviderKind} from "./value-providers/config"; import {ValueProviderConfig, ValueProviderKind} from "./value-providers/config";
import {defaultValueProviders} from "./value-providers/default"; import {defaultValueProviders} from "./value-providers/default";
@@ -80,32 +80,6 @@ export async function validate(
return diagnostics; return diagnostics;
} }
function mapRange(range: TokenRange | undefined): Range {
if (!range) {
return {
start: {
line: 1,
character: 1
},
end: {
line: 1,
character: 1
}
};
}
return {
start: {
line: range.start[0] - 1,
character: range.start[1] - 1
},
end: {
line: range.end[0] - 1,
character: range.end[1] - 1
}
};
}
async function additionalValidations( async function additionalValidations(
diagnostics: Diagnostic[], diagnostics: Diagnostic[],
documentUri: URI, documentUri: URI,