react / react-0.13.3 / examples / basic-commonjs / node_modules / reactify / node_modules / react-tools / node_modules / commoner / node_modules / recast / lib / mapping.js
81169 viewsvar assert = require("assert");1var types = require("./types");2var isString = types.builtInTypes.string;3var isNumber = types.builtInTypes.number;4var SourceLocation = types.namedTypes.SourceLocation;5var Position = types.namedTypes.Position;6var linesModule = require("./lines");7var comparePos = require("./util").comparePos;89function Mapping(sourceLines, sourceLoc, targetLoc) {10assert.ok(this instanceof Mapping);11assert.ok(sourceLines instanceof linesModule.Lines);12SourceLocation.assert(sourceLoc);1314if (targetLoc) {15// In certain cases it's possible for targetLoc.{start,end}.column16// values to be negative, which technically makes them no longer17// valid SourceLocation nodes, so we need to be more forgiving.18assert.ok(19isNumber.check(targetLoc.start.line) &&20isNumber.check(targetLoc.start.column) &&21isNumber.check(targetLoc.end.line) &&22isNumber.check(targetLoc.end.column)23);24} else {25// Assume identity mapping if no targetLoc specified.26targetLoc = sourceLoc;27}2829Object.defineProperties(this, {30sourceLines: { value: sourceLines },31sourceLoc: { value: sourceLoc },32targetLoc: { value: targetLoc }33});34}3536var Mp = Mapping.prototype;37module.exports = Mapping;3839Mp.slice = function(lines, start, end) {40assert.ok(lines instanceof linesModule.Lines);41Position.assert(start);4243if (end) {44Position.assert(end);45} else {46end = lines.lastPos();47}4849var sourceLines = this.sourceLines;50var sourceLoc = this.sourceLoc;51var targetLoc = this.targetLoc;5253function skip(name) {54var sourceFromPos = sourceLoc[name];55var targetFromPos = targetLoc[name];56var targetToPos = start;5758if (name === "end") {59targetToPos = end;60} else {61assert.strictEqual(name, "start");62}6364return skipChars(65sourceLines, sourceFromPos,66lines, targetFromPos, targetToPos67);68}6970if (comparePos(start, targetLoc.start) <= 0) {71if (comparePos(targetLoc.end, end) <= 0) {72targetLoc = {73start: subtractPos(targetLoc.start, start.line, start.column),74end: subtractPos(targetLoc.end, start.line, start.column)75};7677// The sourceLoc can stay the same because the contents of the78// targetLoc have not changed.7980} else if (comparePos(end, targetLoc.start) <= 0) {81return null;8283} else {84sourceLoc = {85start: sourceLoc.start,86end: skip("end")87};8889targetLoc = {90start: subtractPos(targetLoc.start, start.line, start.column),91end: subtractPos(end, start.line, start.column)92};93}9495} else {96if (comparePos(targetLoc.end, start) <= 0) {97return null;98}99100if (comparePos(targetLoc.end, end) <= 0) {101sourceLoc = {102start: skip("start"),103end: sourceLoc.end104};105106targetLoc = {107// Same as subtractPos(start, start.line, start.column):108start: { line: 1, column: 0 },109end: subtractPos(targetLoc.end, start.line, start.column)110};111112} else {113sourceLoc = {114start: skip("start"),115end: skip("end")116};117118targetLoc = {119// Same as subtractPos(start, start.line, start.column):120start: { line: 1, column: 0 },121end: subtractPos(end, start.line, start.column)122};123}124}125126return new Mapping(this.sourceLines, sourceLoc, targetLoc);127};128129Mp.add = function(line, column) {130return new Mapping(this.sourceLines, this.sourceLoc, {131start: addPos(this.targetLoc.start, line, column),132end: addPos(this.targetLoc.end, line, column)133});134};135136function addPos(toPos, line, column) {137return {138line: toPos.line + line - 1,139column: (toPos.line === 1)140? toPos.column + column141: toPos.column142};143}144145Mp.subtract = function(line, column) {146return new Mapping(this.sourceLines, this.sourceLoc, {147start: subtractPos(this.targetLoc.start, line, column),148end: subtractPos(this.targetLoc.end, line, column)149});150};151152function subtractPos(fromPos, line, column) {153return {154line: fromPos.line - line + 1,155column: (fromPos.line === line)156? fromPos.column - column157: fromPos.column158};159}160161Mp.indent = function(by, skipFirstLine, noNegativeColumns) {162if (by === 0) {163return this;164}165166var targetLoc = this.targetLoc;167var startLine = targetLoc.start.line;168var endLine = targetLoc.end.line;169170if (skipFirstLine && startLine === 1 && endLine === 1) {171return this;172}173174targetLoc = {175start: targetLoc.start,176end: targetLoc.end177};178179if (!skipFirstLine || startLine > 1) {180var startColumn = targetLoc.start.column + by;181targetLoc.start = {182line: startLine,183column: noNegativeColumns184? Math.max(0, startColumn)185: startColumn186};187}188189if (!skipFirstLine || endLine > 1) {190var endColumn = targetLoc.end.column + by;191targetLoc.end = {192line: endLine,193column: noNegativeColumns194? Math.max(0, endColumn)195: endColumn196};197}198199return new Mapping(this.sourceLines, this.sourceLoc, targetLoc);200};201202function skipChars(203sourceLines, sourceFromPos,204targetLines, targetFromPos, targetToPos205) {206assert.ok(sourceLines instanceof linesModule.Lines);207assert.ok(targetLines instanceof linesModule.Lines);208Position.assert(sourceFromPos);209Position.assert(targetFromPos);210Position.assert(targetToPos);211212var targetComparison = comparePos(targetFromPos, targetToPos);213if (targetComparison === 0) {214// Trivial case: no characters to skip.215return sourceFromPos;216}217218if (targetComparison < 0) {219// Skipping forward.220221var sourceCursor = sourceLines.skipSpaces(sourceFromPos);222var targetCursor = targetLines.skipSpaces(targetFromPos);223224var lineDiff = targetToPos.line - targetCursor.line;225sourceCursor.line += lineDiff;226targetCursor.line += lineDiff;227228if (lineDiff > 0) {229// If jumping to later lines, reset columns to the beginnings230// of those lines.231sourceCursor.column = 0;232targetCursor.column = 0;233} else {234assert.strictEqual(lineDiff, 0);235}236237while (comparePos(targetCursor, targetToPos) < 0 &&238targetLines.nextPos(targetCursor, true)) {239assert.ok(sourceLines.nextPos(sourceCursor, true));240assert.strictEqual(241sourceLines.charAt(sourceCursor),242targetLines.charAt(targetCursor)243);244}245246} else {247// Skipping backward.248249var sourceCursor = sourceLines.skipSpaces(sourceFromPos, true);250var targetCursor = targetLines.skipSpaces(targetFromPos, true);251252var lineDiff = targetToPos.line - targetCursor.line;253sourceCursor.line += lineDiff;254targetCursor.line += lineDiff;255256if (lineDiff < 0) {257// If jumping to earlier lines, reset columns to the ends of258// those lines.259sourceCursor.column = sourceLines.getLineLength(sourceCursor.line);260targetCursor.column = targetLines.getLineLength(targetCursor.line);261} else {262assert.strictEqual(lineDiff, 0);263}264265while (comparePos(targetToPos, targetCursor) < 0 &&266targetLines.prevPos(targetCursor, true)) {267assert.ok(sourceLines.prevPos(sourceCursor, true));268assert.strictEqual(269sourceLines.charAt(sourceCursor),270targetLines.charAt(targetCursor)271);272}273}274275return sourceCursor;276}277278279