export function activate()

in src/extension.ts [33:225]


export function activate(context: vscode.ExtensionContext) {
    TelemetryClient.sendEvent("extensionActivated");
    const outputChannel: vscode.OutputChannel = vscode.window.createOutputChannel(Constants.edgeDisplayName);
    const edgeManager = new EdgeManager(context);
    const gallery = new Gallery(context);
    const simulator = new Simulator(context);
    simulator.validateSimulatorUpdated(outputChannel);
    const containerManager = new ContainerManager(simulator);
    Utility.checkDockerState(outputChannel);

    const statusBar: vscode.StatusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, -10000);
    statusBar.command = "azure-iot-edge.setDefaultPlatform";
    statusBar.text = formatStatusBarText(Platform.getDefaultPlatformStr());
    statusBar.tooltip = Constants.platformStatusBarTooltip;
    statusBar.show();

    context.subscriptions.push(vscode.workspace.onDidChangeConfiguration((e: vscode.ConfigurationChangeEvent) => {
        if (e.affectsConfiguration("azure-iot-edge.defaultPlatform")) {
            statusBar.text = formatStatusBarText(Platform.getDefaultPlatformStr());
        }
    }));

    context.subscriptions.push(statusBar);
    context.subscriptions.push(
        vscode.languages.registerCompletionItemProvider([{ scheme: "file", language: "json" }, { scheme: "file", language: "jsonc" }],
            new ConfigCompletionItemProvider(), "\"", ".", ":"));
    context.subscriptions.push(
        vscode.languages.registerHoverProvider([{ scheme: "file", language: "json" }, { scheme: "file", language: "jsonc" }],
            new ConfigHoverProvider()));
    // Calling registerDefinitionProvider will add "Go to definition" and "Peek definition" context menus to documents matched with the filter.
    // Use the strict { pattern: "**/deployment.template.json" } instead of { language: "json" }, { language: "jsonc" } to avoid polluting the context menu of non-config JSON files.
    context.subscriptions.push(
        vscode.languages.registerDefinitionProvider([{ scheme: "file", pattern: Constants.deploymentTemplatePattern }, { scheme: "file", pattern: Constants.debugDeploymentTemplatePattern }],
            new ConfigDefinitionProvider()));

    const diagCollection: vscode.DiagnosticCollection = vscode.languages.createDiagnosticCollection(Constants.edgeDisplayName);
    const configDiagnosticProvider: ConfigDiagnosticProvider = new ConfigDiagnosticProvider();
    if (vscode.window.activeTextEditor) {
        configDiagnosticProvider.updateDiagnostics(vscode.window.activeTextEditor.document, diagCollection);
    }
    context.subscriptions.push(diagCollection);
    // For files that are over 5MB in size, an undefined event will be created
    // https://github.com/Microsoft/vscode/issues/27100
    context.subscriptions.push(vscode.window.onDidChangeActiveTextEditor((event) => { if (event) { configDiagnosticProvider.updateDiagnostics(event.document, diagCollection); } }));
    context.subscriptions.push(vscode.workspace.onDidSaveTextDocument((document) => configDiagnosticProvider.updateDiagnostics(document, diagCollection)));
    context.subscriptions.push(vscode.workspace.onDidCloseTextDocument((document) => diagCollection.delete(document.uri)));
    context.subscriptions.push(outputChannel);

    context.subscriptions.push(vscode.debug.registerDebugConfigurationProvider("edge-coreclr", {resolveDebugConfiguration}));
    context.subscriptions.push(vscode.debug.registerDebugConfigurationProvider("edge-node", {resolveDebugConfiguration}));
    context.subscriptions.push(vscode.debug.registerDebugConfigurationProvider("edge-python", {resolveDebugConfiguration}));

    context.subscriptions.push(vscode.languages.registerCodeLensProvider({ pattern: `**/{deployment.*.template.json,deployment.template.json}` }, new ASAModuleUpdateCodeLensProvider()));

    initCommandAsync(context, outputChannel,
        "azure-iot-edge.buildModuleImage",
        (fileUri?: vscode.Uri): Promise<void> => {
            return containerManager.buildModuleImage(fileUri, false);
        });

    initCommandAsync(context, outputChannel,
        "azure-iot-edge.buildAndPushModuleImage",
        (fileUri?: vscode.Uri): Promise<void> => {
            return containerManager.buildModuleImage(fileUri, true);
        });

    initCommandAsync(context, outputChannel,
        "azure-iot-edge.newSolution",
        (parentUri?: vscode.Uri): Promise<void> => {
            return edgeManager.createEdgeSolution(outputChannel, parentUri);
        });

    initCommandAsync(context, outputChannel,
        "azure-iot-edge.buildSolution",
        (templateUri?: vscode.Uri): Promise<void> => {
            return containerManager.buildSolution(outputChannel, templateUri, false, false);
        });

    initCommandAsync(context, outputChannel,
        "azure-iot-edge.buildAndPushSolution",
        (templateUri?: vscode.Uri): Promise<void> => {
            return containerManager.buildSolution(outputChannel, templateUri, true, false);
        });

    initCommandAsync(context, outputChannel,
        "azure-iot-edge.buildAndRunSolution",
        (templateUri?: vscode.Uri): Promise<void> => {
            return containerManager.buildSolution(outputChannel, templateUri, false, true);
        });

    initCommandAsync(context, outputChannel,
        "azure-iot-edge.runSolution",
        (deployFileUri?: vscode.Uri): Promise<void> => {
            return simulator.runSolution(outputChannel, deployFileUri);
        });

    initCommandAsync(context, outputChannel,
        "azure-iot-edge.stopSolution",
        (): Promise<void> => {
            return simulator.stopSolution(outputChannel);
        });

    initCommandAsync(context, outputChannel,
        "azure-iot-edge.generateDeployment",
        (templateUri?: vscode.Uri): Promise<void> => {
            return containerManager.generateDeployment(outputChannel, templateUri);
        });

    initCommandAsync(context, outputChannel,
        "azure-iot-edge.addModule",
        (templateUri?: vscode.Uri): Promise<void> => {
            return edgeManager.addModuleForSolution(outputChannel, templateUri);
        });

    initCommandAsync(context, outputChannel,
        "azure-iot-edge.convertModule",
        (fileUri?: vscode.Uri): Promise<void> => {
            return edgeManager.convertModule(fileUri);
        });

    initCommandAsync(context, outputChannel,
        "azure-iot-edge.setupIotedgehubdev",
        (deviceItem?: IDeviceItem): Promise<void> => {
            return simulator.setupIotedgehubdev(deviceItem, outputChannel);
        });

    initCommandAsync(context, outputChannel,
        "azure-iot-edge.startEdgeHubSingle",
        (): Promise<void> => {
            return simulator.startEdgeHubSingleModule(outputChannel);
        });

    initCommandAsync(context, outputChannel,
        "azure-iot-edge.setModuleCred",
        (): Promise<void> => {
            return simulator.setModuleCred(outputChannel);
        });

    initCommandAsync(context, outputChannel,
        "azure-iot-edge.setDefaultPlatform",
        async (): Promise<void> => {
            await edgeManager.selectDefaultPlatform(outputChannel);
            const document = vscode.window && vscode.window.activeTextEditor ? vscode.window.activeTextEditor.document : null;
            return configDiagnosticProvider.updateDiagnostics(document, diagCollection);
        });

    initCommandAsync(context, outputChannel,
        "azure-iot-edge.setDefaultEdgeRuntimeVersion",
        async (): Promise<void> => {
            await edgeManager.selectDefaultEdgeRuntimeVersion(outputChannel);
            const document = vscode.window && vscode.window.activeTextEditor ? vscode.window.activeTextEditor.document : null;
            return configDiagnosticProvider.updateDiagnostics(document, diagCollection);
        });

    initCommandAsync(context, outputChannel,
        "azure-iot-edge.showGallery",
        async (): Promise<void> => {
          return gallery.loadWebView();
        });

    initCommandAsync(context, outputChannel,
        "azure-iot-edge.addDevContainer",
        async (): Promise<void> => {
            return edgeManager.addDevContainerDefinition();
        });

    initCommandAsync(context, outputChannel,
        "azure-iot-edge.initializeSample",
        async (name: string, url: string, platform: string): Promise<void> => {
            return gallery.initializeSample(name, url, platform, outputChannel);
        });

    initCommandAsync(context, outputChannel,
        "azure-iot-edge.internal.addModule",
        async (templateFile: string, isNewSolution: boolean, moduleInfo: ModuleInfo, template: string): Promise<void> => {
            return edgeManager.addModuleInfo(templateFile, outputChannel, isNewSolution, template, moduleInfo);
        });

    initCommandAsync(context, outputChannel,
        "azure-iot-edge.internal.checkUpdateForASAModule",
        async (templateFile: string, moduleName: string): Promise<void> => {
            return edgeManager.checkAndUpdateASAJob(templateFile, moduleName);
        });

    context.subscriptions.push(vscode.window.onDidCloseTerminal((closedTerminal: vscode.Terminal) => {
        Executor.onDidCloseTerminal(closedTerminal);
    }));

    const folders = vscode.workspace.workspaceFolders;
    if (folders && folders.length > 0) {
        folders.forEach((value) => edgeManager.checkRegistryEnv(value));
    }
}