summaryrefslogtreecommitdiffstats
path: root/devtools/client/debugger/src/utils/quick-open.js
blob: f522242891ff01058979fc82f6ce3276d1b04bfa (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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */

import { endTruncateStr } from "./utils";
import {
  getFilename,
  getSourceClassnames,
  getSourceQueryString,
  getRelativeUrl,
} from "./source";

export const MODIFIERS = {
  "@": "functions",
  "#": "variables",
  ":": "goto",
  "?": "shortcuts",
};

export function parseQuickOpenQuery(query) {
  const startsWithModifier =
    query[0] === "@" ||
    query[0] === "#" ||
    query[0] === ":" ||
    query[0] === "?";

  if (startsWithModifier) {
    const modifier = query[0];
    return MODIFIERS[modifier];
  }

  const isGotoSource = query.includes(":", 1);

  if (isGotoSource) {
    return "gotoSource";
  }

  return "sources";
}

export function parseLineColumn(query) {
  const [, line, column] = query.split(":");
  const lineNumber = parseInt(line, 10);
  const columnNumber = parseInt(column, 10);
  if (isNaN(lineNumber)) {
    return null;
  }

  return {
    line: lineNumber,
    ...(!isNaN(columnNumber) ? { column: columnNumber } : null),
  };
}

export function formatSourceForList(
  source,
  hasTabOpened,
  isBlackBoxed,
  projectDirectoryRoot
) {
  const title = getFilename(source);
  const relativeUrlWithQuery = `${getRelativeUrl(
    source,
    projectDirectoryRoot
  )}${getSourceQueryString(source) || ""}`;
  const subtitle = endTruncateStr(relativeUrlWithQuery, 100);
  const value = relativeUrlWithQuery;
  return {
    value,
    title,
    subtitle,
    icon: hasTabOpened
      ? "tab result-item-icon"
      : `result-item-icon ${getSourceClassnames(source, null, isBlackBoxed)}`,
    id: source.id,
    url: source.url,
    source,
  };
}

export function formatSymbol(symbol) {
  return {
    id: `${symbol.name}:${symbol.location.start.line}`,
    title: symbol.name,
    subtitle: `${symbol.location.start.line}`,
    value: symbol.name,
    location: symbol.location,
  };
}

export function formatSymbols(symbols, maxResults) {
  if (!symbols) {
    return { functions: [] };
  }

  let { functions } = symbols;
  // Avoid formating more symbols than necessary
  functions = functions.slice(0, maxResults);

  return {
    functions: functions.map(formatSymbol),
  };
}

export function formatShortcutResults() {
  return [
    {
      value: L10N.getStr("symbolSearch.search.functionsPlaceholder.title"),
      title: `@ ${L10N.getStr("symbolSearch.search.functionsPlaceholder")}`,
      id: "@",
    },
    {
      value: L10N.getStr("symbolSearch.search.variablesPlaceholder.title"),
      title: `# ${L10N.getStr("symbolSearch.search.variablesPlaceholder")}`,
      id: "#",
    },
    {
      value: L10N.getStr("gotoLineModal.title"),
      title: `: ${L10N.getStr("gotoLineModal.placeholder")}`,
      id: ":",
    },
  ];
}