aboutsummaryrefslogtreecommitdiff
path: root/node_modules/acorn/src/locutil.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/acorn/src/locutil.js')
-rw-r--r--node_modules/acorn/src/locutil.js42
1 files changed, 42 insertions, 0 deletions
diff --git a/node_modules/acorn/src/locutil.js b/node_modules/acorn/src/locutil.js
new file mode 100644
index 000000000..5a9465e01
--- /dev/null
+++ b/node_modules/acorn/src/locutil.js
@@ -0,0 +1,42 @@
+import {lineBreakG} from "./whitespace"
+
+// These are used when `options.locations` is on, for the
+// `startLoc` and `endLoc` properties.
+
+export class Position {
+ constructor(line, col) {
+ this.line = line
+ this.column = col
+ }
+
+ offset(n) {
+ return new Position(this.line, this.column + n)
+ }
+}
+
+export class SourceLocation {
+ constructor(p, start, end) {
+ this.start = start
+ this.end = end
+ if (p.sourceFile !== null) this.source = p.sourceFile
+ }
+}
+
+// The `getLineInfo` function is mostly useful when the
+// `locations` option is off (for performance reasons) and you
+// want to find the line/column position for a given character
+// offset. `input` should be the code string that the offset refers
+// into.
+
+export function getLineInfo(input, offset) {
+ for (let line = 1, cur = 0;;) {
+ lineBreakG.lastIndex = cur
+ let match = lineBreakG.exec(input)
+ if (match && match.index < offset) {
+ ++line
+ cur = match.index + match[0].length
+ } else {
+ return new Position(line, offset - cur)
+ }
+ }
+}