summaryrefslogtreecommitdiffstats
path: root/devtools/client/debugger/src/utils/function.js
blob: 39d0f5a9a7c2267d67c840dcec90f4276d1d8a51 (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
/* 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 { isFulfilled } from "./async-value";
import { findClosestFunction } from "./ast";
import { correctIndentation } from "./indentation";

export function findFunctionText(line, source, sourceTextContent, symbols) {
  const func = findClosestFunction(symbols, {
    sourceId: source.id,
    line,
    column: Infinity,
  });

  if (
    source.isWasm ||
    !func ||
    !sourceTextContent ||
    !isFulfilled(sourceTextContent) ||
    sourceTextContent.value.type !== "text"
  ) {
    return null;
  }

  const {
    location: { start, end },
  } = func;
  const lines = sourceTextContent.value.value.split("\n");
  const firstLine = lines[start.line - 1].slice(start.column);
  const lastLine = lines[end.line - 1].slice(0, end.column);
  const middle = lines.slice(start.line, end.line - 1);
  const functionText = [firstLine, ...middle, lastLine].join("\n");
  const indentedFunctionText = correctIndentation(functionText);

  return indentedFunctionText;
}