summaryrefslogtreecommitdiffstats
path: root/devtools/shared/wasm-source-map.js
blob: 716c794db2418c0229ff1915f8046658fe43dfc6 (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
/* 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/. */

"use strict";

/**
 * SourceMapConsumer for WebAssembly source maps. It transposes columns with
 * lines, which allows mapping data to be used with SpiderMonkey Debugger API.
 */
class WasmRemap {
  /**
   * @param map SourceMapConsumer
   */
  constructor(map) {
    this._map = map;
    this.version = map.version;
    this.file = map.file;
    this._computeColumnSpans = false;
  }

  get sources() {
    return this._map.sources;
  }

  get sourceRoot() {
    return this._map.sourceRoot;
  }

  /**
   * @param url string
   */
  set sourceRoot(url) {
    // important, since sources are using this.
    this._map.sourceRoot = url;
  }

  get names() {
    return this._map.names;
  }

  get sourcesContent() {
    return this._map.sourcesContent;
  }

  get mappings() {
    throw new Error("not supported");
  }

  computeColumnSpans() {
    this._computeColumnSpans = true;
  }

  originalPositionFor(generatedPosition) {
    const result = this._map.originalPositionFor({
      line: 1,
      column: generatedPosition.line,
      bias: generatedPosition.bias,
    });
    return result;
  }

  _remapGeneratedPosition(position) {
    const generatedPosition = {
      line: position.column,
      column: 0,
    };
    if (this._computeColumnSpans) {
      generatedPosition.lastColumn = Infinity;
    }
    return generatedPosition;
  }

  generatedPositionFor(originalPosition) {
    const position = this._map.generatedPositionFor(originalPosition);
    return this._remapGeneratedPosition(position);
  }

  allGeneratedPositionsFor(originalPosition) {
    const positions = this._map.allGeneratedPositionsFor(originalPosition);
    return positions.map(position => {
      return this._remapGeneratedPosition(position);
    });
  }

  hasContentsOfAllSources() {
    return this._map.hasContentsOfAllSources();
  }

  sourceContentFor(source, returnNullOnMissing) {
    return this._map.sourceContentFor(source, returnNullOnMissing);
  }

  eachMapping(callback, context, order) {
    this._map.eachMapping(
      entry => {
        const { source, generatedColumn, originalLine, originalColumn, name } =
          entry;
        callback({
          source,
          generatedLine: generatedColumn,
          generatedColumn: 0,
          originalLine,
          originalColumn,
          name,
        });
      },
      context,
      order
    );
  }
}

exports.WasmRemap = WasmRemap;