constructor()

in src/AzureRMTools.ts [197:427]


    constructor(context: vscode.ExtensionContext) {
        ext.provideOpenedDocuments = this;

        const jsonOutline: JsonOutlineProvider = new JsonOutlineProvider(context);
        ext.jsonOutlineProvider = jsonOutline;
        context.subscriptions.push(vscode.window.registerTreeDataProvider("azurerm-vscode-tools.template-outline", jsonOutline));
        context.subscriptions.push(this.getRegisteredRenameCodeActionProvider());
        // For telemetry
        registerCommand("azurerm-vscode-tools.completion-activated", (actionContext: IActionContext, args: object) => {
            onCompletionActivated(actionContext, <{ [key: string]: string }>args);
        });
        registerCommand("azurerm-vscode-tools.treeview.goto", (_actionContext: IActionContext, range: vscode.Range) => {
            jsonOutline.revealRangeInEditor(range);
        });
        registerCommand("azurerm-vscode-tools.sortTemplate", async (_context: IActionContext, uri?: vscode.Uri, editor?: vscode.TextEditor) => {
            editor = editor || vscode.window.activeTextEditor;
            uri = uri || vscode.window.activeTextEditor?.document.uri;
            // If "Sort template..." was called from the context menu for ARM template outline
            if (typeof uri === "string") {
                uri = vscode.window.activeTextEditor?.document.uri;
            }
            if (uri && editor) {
                const sectionType = await ext.ui.showQuickPick(getQuickPickItems(), { placeHolder: 'What do you want to sort?' });
                await this.sortTemplate(sectionType.value, uri, editor);
            }
        });
        registerCommand("azurerm-vscode-tools.sortFunctions", async () => {
            await this.sortTemplate(TemplateSectionType.Functions);
        });
        registerCommand("azurerm-vscode-tools.sortOutputs", async () => {
            await this.sortTemplate(TemplateSectionType.Outputs);
        });
        registerCommand("azurerm-vscode-tools.sortParameters", async () => {
            await this.sortTemplate(TemplateSectionType.Parameters);
        });
        registerCommand("azurerm-vscode-tools.sortResources", async () => {
            await this.sortTemplate(TemplateSectionType.Resources);
        });
        registerCommand("azurerm-vscode-tools.sortVariables", async () => {
            await this.sortTemplate(TemplateSectionType.Variables);
        });
        registerCommand("azurerm-vscode-tools.sortTopLevel", async () => {
            await this.sortTemplate(TemplateSectionType.TopLevel);
        });
        registerCommand(
            "azurerm-vscode-tools.selectParameterFile", async (actionContext: IActionContext, sourceTemplateUri?: vscode.Uri) => {
                await selectParameterFile(actionContext, this._mapping, sourceTemplateUri);
            });
        registerCommand(
            "azurerm-vscode-tools.openParameterFile", async (_actionContext: IActionContext, sourceTemplateUri?: vscode.Uri) => {
                sourceTemplateUri = sourceTemplateUri ?? vscode.window.activeTextEditor?.document.uri;
                await openParameterFile(this._mapping, sourceTemplateUri, undefined);
            });
        registerCommand(
            "azurerm-vscode-tools.openTemplateFile", async (_actionContext: IActionContext, sourceParamUri?: vscode.Uri) => {
                sourceParamUri = sourceParamUri ?? vscode.window.activeTextEditor?.document.uri;
                await openTemplateFile(this._mapping, sourceParamUri, undefined);
            });
        registerCommand(
            "azurerm-vscode-tools.codeLens.openLinkedTemplateFile", async (actionContext: IActionContext, linkedTemplateUri: vscode.Uri) => {
                await openLinkedTemplateFileCommand(linkedTemplateUri, actionContext);
            });
        registerCommand(
            "azurerm-vscode-tools.codeLens.reloadLinkedTemplateFile", async (actionContext: IActionContext, linkedTemplateUri: vscode.Uri) => {
                this.closeDeploymentFile(linkedTemplateUri);
                this._linkedTemplateDocProviderChangedEmitter.fire(prependLinkedTemplateScheme(linkedTemplateUri));
            });
        registerCommand("azurerm-vscode-tools.insertItem", async (actionContext: IActionContext, uri?: vscode.Uri, editor?: vscode.TextEditor) => {
            editor = editor || vscode.window.activeTextEditor;
            uri = uri || vscode.window.activeTextEditor?.document.uri;
            // If "Sort template..." was called from the context menu for ARM template outline
            if (typeof uri === "string") {
                uri = vscode.window.activeTextEditor?.document.uri;
            }
            if (uri && editor) {
                const sectionType = await ext.ui.showQuickPick(getItemTypeQuickPicks(), { placeHolder: 'What do you want to insert?' });
                await this.insertItem(sectionType.value, actionContext, uri, editor);
            }
        });
        registerCommand("azurerm-vscode-tools.insertParameter", async (actionContext: IActionContext) => {
            await this.insertItem(TemplateSectionType.Parameters, actionContext);
        });
        registerCommand("azurerm-vscode-tools.insertVariable", async (actionContext: IActionContext) => {
            await this.insertItem(TemplateSectionType.Variables, actionContext);
        });
        registerCommand("azurerm-vscode-tools.insertOutput", async (actionContext: IActionContext) => {
            await this.insertItem(TemplateSectionType.Outputs, actionContext);
        });
        registerCommand("azurerm-vscode-tools.insertFunction", async (actionContext: IActionContext) => {
            await this.insertItem(TemplateSectionType.Functions, actionContext);
        });
        registerCommand("azurerm-vscode-tools.insertResource", async (actionContext: IActionContext) => {
            await this.insertItem(TemplateSectionType.Resources, actionContext);
        });

        // Code action commands
        registerCommand("azurerm-vscode-tools.codeAction.addAllMissingParameters", async (actionContext: IActionContext, source?: vscode.Uri, args?: IAddMissingParametersArgs) => {
            await this.addMissingParameters(actionContext, source, args, false);
        });
        registerCommand("azurerm-vscode-tools.codeAction.addMissingRequiredParameters", async (actionContext: IActionContext, source?: vscode.Uri, args?: IAddMissingParametersArgs) => {
            await this.addMissingParameters(actionContext, source, args, true);
        });
        registerCommand("azurerm-vscode-tools.codeAction.extractParameter", async (_context: IActionContext, uri?: vscode.Uri, editor?: vscode.TextEditor) => {
            editor = editor || vscode.window.activeTextEditor;
            uri = uri || vscode.window.activeTextEditor?.document.uri;
            if (editor) {
                let deploymentTemplate = this.getOpenedDeploymentTemplate(editor.document);
                if (!deploymentTemplate) {
                    return;
                }
                await new ExtractItem(ext.ui).extractParameter(editor, deploymentTemplate, _context);
            }
        });
        registerCommand("azurerm-vscode-tools.codeAction.extractVariable", async (_context: IActionContext, uri?: vscode.Uri, editor?: vscode.TextEditor) => {
            editor = editor || vscode.window.activeTextEditor;
            uri = uri || vscode.window.activeTextEditor?.document.uri;
            if (editor) {
                let deploymentTemplate = this.getOpenedDeploymentTemplate(editor.document);
                if (!deploymentTemplate) {
                    return;
                }
                await new ExtractItem(ext.ui).extractVariable(editor, deploymentTemplate, _context);
            }
        });

        // Code lens commands
        registerCommand(
            // Executed when the user clicks on a code lens for a parameter value
            "azurerm-vscode-tools.codeLens.gotoParameterValue",
            async (actionContext: IActionContext, args: IGotoParameterValueArgs) => {
                await this.onGotoParameterValue(actionContext, args);
            });
        registerCommand(
            // Executed when the user clicks on a code lens that shows the children or parent of a resource
            "azurerm-vscode-tools.codeLens.gotoResources",
            async (actionContext: IActionContext, args: IGotoResourcesArgs) => {
                await gotoResources(actionContext, args);
            });

        // Developer commands
        registerCommand("azurerm-vscode-tools.developer.resetGlobalState", resetGlobalState);
        registerCommand("azurerm-vscode-tools.developer.showAvailableResourceTypesAndVersions", async (_context: IActionContext, uri?: vscode.Uri, editor?: vscode.TextEditor) => {
            editor = editor || vscode.window.activeTextEditor;
            uri = uri || vscode.window.activeTextEditor?.document.uri;
            if (editor) {
                let deploymentTemplate = this.getOpenedDeploymentTemplate(editor.document);
                if (!deploymentTemplate) {
                    return;
                }
                const schema = deploymentTemplate.schemaUri;
                if (schema) {
                    ext.outputChannel.appendLine(`Retrieving available resource types and apiVersions for ${schema}...`);
                    await showAvailableResourceTypesAndVersions(schema);
                }
            }
        });
        registerCommand(
            "azurerm-vscode-tools.developer.showInsertionContext",
            async (actionContext: IActionContext) => {
                let editor: vscode.TextEditor | undefined = vscode.window.activeTextEditor;
                if (editor) {
                    let position = editor.selection.anchor;
                    let pc: PositionContext | undefined = await this.getPositionContext(editor.document, position, Cancellation.cantCancel);
                    if (pc) {
                        showInsertionContext(pc);
                    }
                }
            });

        this._paramsStatusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left);
        ext.context.subscriptions.push(this._paramsStatusBarItem);

        vscode.window.onDidChangeActiveTextEditor(this.onActiveTextEditorChanged, this, context.subscriptions);
        vscode.workspace.onDidOpenTextDocument(this.onDocumentOpened, this, context.subscriptions);
        vscode.workspace.onDidChangeTextDocument(this.onDocumentChanged, this, context.subscriptions);
        vscode.workspace.onDidCloseTextDocument(this.onDocumentClosed, this, ext.context.subscriptions);
        vscode.workspace.onDidChangeConfiguration(
            async () => {
                this._mapping.resetCache();
                this.updateEditorStateInBackground();
                this._codeLensChangedEmitter.fire();
            },
            this,
            context.subscriptions);

        this._diagnosticsCollection = vscode.languages.createDiagnosticCollection("azurerm-tools-expressions");
        context.subscriptions.push(this._diagnosticsCollection);

        // Hook up completion provider immediately because it also handles unsupported JSON files (for non-template JSON files)
        const completionProvider: vscode.CompletionItemProvider = {
            provideCompletionItems: async (
                document: vscode.TextDocument,
                position: vscode.Position,
                token: vscode.CancellationToken,
                ctx: vscode.CompletionContext
            ): Promise<vscode.CompletionList | undefined> => {
                return await this.onProvideCompletions(document, position, token, ctx);
            },
            resolveCompletionItem: (item: vscode.CompletionItem, token: vscode.CancellationToken): vscode.CompletionItem => {
                return this.onResolveCompletionItem(item, token);
            }
        };
        ext.context.subscriptions.push(
            vscode.languages.registerCompletionItemProvider(
                templateOrParameterDocumentSelector,
                completionProvider,
                "'",
                "[",
                ".",
                '"',
                '(',
                ',',
                ' ',
                '{'
            ));

        const activeEditor: vscode.TextEditor | undefined = vscode.window.activeTextEditor;
        if (activeEditor) {
            const activeDocument = activeEditor.document;
            this.updateOpenedDocument(activeDocument);
        }

        // If the bicep extension is installed, don't ever show the "try bicep" message
        if (vscode.extensions.getExtension('ms-azuretools.vscode-bicep')) {
            // Don't wait
            this._bicepMessage.neverShowAgain().catch(err => {
                // Ignore
                assert.fail("neverShowAgain failed");
            });
        }
    }