theBenForce/vscode-appsync-resolver-autocomplete

View on GitHub
src/providers/index.ts

Summary

Maintainability
A
0 mins
Test Coverage
import * as vscode from "vscode";
import allTypes from "./allTypes";
import { AutocompleteData } from "./dataTypes";
import { AppsyncSignatureHelpProvider } from "./AppsyncSignatureHelpProvider";

const ROOT_PROPERTIES = [
    { names: ['context', 'ctx'], documentation: "The [`$context`](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference.html#accessing-the-context) variable is a map that holds all of the contextual information for your resolver invocation." },
    { names: ['util'], documentation: 'The [`$util`](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-util-reference.html#utility-helpers-in-util) variable contains general utility methods that make it easier to work with data.' }
] as Array<AutocompleteData.Item>;

const register = (item: AutocompleteData.CompletionItemSettings) => vscode.languages.registerCompletionItemProvider(
    'velocity',
    {
        provideCompletionItems(document: vscode.TextDocument, position: vscode.Position) {
            let linePrefix = document.lineAt(position).text.substr(0, position.character);
            if (item.prefixes.find(x => linePrefix.endsWith(x))) {
                return item.properties.map(property => property.names.map(label => {

                    const result = new vscode.CompletionItem(label, property.kind ?? vscode.CompletionItemKind.Module);
                    result.documentation = new vscode.MarkdownString(property.documentation);
                    if (property.kind === vscode.CompletionItemKind.Method) {
                        result.commitCharacters = ['('];
                        // result.insertText = `${label}()`;
                    } else {
                        result.commitCharacters = ['.'];
                    }
                    return result;
                })
                ).reduce((result, next) => result.concat(next), []);
            }



            return undefined;
        }
    },
    '.' // triggered whenever a '.' is being typed
);

export default (ctx: vscode.ExtensionContext) => {

    ctx.subscriptions.push(
        vscode.languages.registerSignatureHelpProvider(
            'velocity', new AppsyncSignatureHelpProvider(), '(', ','));

    vscode.languages.registerCompletionItemProvider(
        'velocity',
        {
            provideCompletionItems(document: vscode.TextDocument, position: vscode.Position) {
                let linePrefix = document.lineAt(position).text.substr(0, position.character);
                if (!linePrefix.endsWith('$')) {
                    return undefined;
                }

                return ROOT_PROPERTIES.map(property => {
                    const results = property.names.map(label => {
                        const result = new vscode.CompletionItem(label, property.kind ?? vscode.CompletionItemKind.Module);
                        result.documentation = new vscode.MarkdownString(property.documentation);
                        return result;
                    });
                    return results;
                }).reduce((result, next) => result.concat(next), []);
            }
        },
        '$' // triggered whenever a '$' is being typed
    );

    allTypes.forEach(register);
};