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");
});
}
}