aboutsummaryrefslogtreecommitdiffstats
path: root/qt-cpp/src/commands/natvis.ts
blob: e68e082a4642d4756f1a169868c71637603e5f4d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only

import * as vscode from 'vscode';
import * as path from 'path';
import * as fs from 'fs';

import { getSelectedKit, IsQtKit } from '@cmd/register-qt-path';
import { createLogger, telemetry } from 'qt-lib';
import { EXTENSION_ID } from '@/constants';
import { QtVersionFromKit } from '@/util/util';

const logger = createLogger('natvis');

export function registerNatvisCommand() {
  const getNatvis = (version: string) => {
    const extension = vscode.extensions.getExtension(
      `theqtcompany.${EXTENSION_ID}`
    );
    if (!extension) {
      const error = 'Could not find the extension';
      logger.error(error);
      throw new Error(error);
    }
    const extensionPath = extension.extensionPath;
    if (!extensionPath) {
      const error = 'Could not find the extension path';
      logger.error(error);
      throw new Error(error);
    }
    const natvisFile = path.join(
      extensionPath,
      'res',
      'natvis',
      `qt${version}.natvis.xml`
    );
    if (!fs.existsSync(natvisFile)) {
      const error = `Could not find the natvis file: ${natvisFile}`;
      logger.error(error);
      throw new Error(error);
    }
    return natvisFile;
  };

  const natvisDisposal = vscode.commands.registerCommand(
    `${EXTENSION_ID}.natvis`,
    async () => {
      telemetry.sendAction('natvis');
      const kit = await getSelectedKit();
      if (!kit || !IsQtKit(kit)) {
        const error = `${kit?.name} is not a Qt kit`;
        throw new Error(error);
      }
      const version = QtVersionFromKit(kit);
      if (version) {
        const majorVersion = version.split('.')[0];
        if (!majorVersion) {
          throw new Error('Could not determine the major version');
        }
        return getNatvis(majorVersion);
      }
      return undefined;
    }
  );
  const natvis5Disposal = vscode.commands.registerCommand(
    `${EXTENSION_ID}.natvis5`,
    () => {
      telemetry.sendAction('natvis5');
      return getNatvis('5');
    }
  );
  const natvis6Disposal = vscode.commands.registerCommand(
    `${EXTENSION_ID}.natvis6`,
    () => {
      telemetry.sendAction('natvis6');
      return getNatvis('6');
    }
  );

  return [natvisDisposal, natvis5Disposal, natvis6Disposal];
}