From cb5ec8ce53136db123bbf05e700af2f5f3453434 Mon Sep 17 00:00:00 2001 From: Lee Byron Date: Thu, 26 Jan 2017 18:06:30 -0800 Subject: [PATCH] Pretty: Remove line containing multiple removed tokens (#34) When --pretty mode is enabled, if multiple tokens exist on a line and all are removed, then the full line should be removed as well. This PR adds that behavior. --- index.js | 54 ++++++++++++++++++++-- test/expected-pretty-inlinemap.js | 3 +- test/expected-pretty.js | 1 - test/expected-with-maps/test/source.js | 1 - test/expected-with-maps/test/source.js.map | 2 +- 5 files changed, 52 insertions(+), 9 deletions(-) diff --git a/index.js b/index.js index 0a8594e..049b028 100644 --- a/index.js +++ b/index.js @@ -284,10 +284,7 @@ function getTrailingLineNode(context, node) { } end++; - var ast = state.ast; - var idx = findTokenIndex(ast.tokens, node.start); - var prevToken = ast.tokens[idx - 1]; - if (prevToken.loc.end.line !== node.loc.end.line) { + if (isLastNodeRemovedFromLine(context, node)) { return { start: start, end: end, @@ -297,6 +294,55 @@ function getTrailingLineNode(context, node) { } } +// Returns true if node is the last to be removed from a line. +function isLastNodeRemovedFromLine(context, node) { + var tokens = context.ast.tokens; + var priorTokenIdx = findTokenIndex(tokens, node.start) - 1; + var token = tokens[priorTokenIdx]; + var line = node.loc.end.line; + + // Find previous token that was not removed on the same line. + while (priorTokenIdx >= 0 && + token.loc.end.line === line && + isRemovedToken(context, token)) { + token = tokens[--priorTokenIdx] + } + + // If there's no prior token (start of file), or the prior token is on another + // line, this line must be fully removed. + return !token || token.loc.end.line !== line; +} + +// Returns true if the provided token was previously marked as removed. +function isRemovedToken(context, token) { + var removedNodes = context.removedNodes; + var nodeIdx = removedNodes.length - 1; + + // Find the last removed node which could possibly contain this token. + while (nodeIdx >= 0 && removedNodes[nodeIdx].start > token.start) { + nodeIdx--; + } + + var node = removedNodes[nodeIdx]; + + // This token couldn't be removed if not contained within the removed node. + if (nodeIdx === -1 || node.end < token.end) { + return false; + } + + // Iterate through the tokens contained by the removed node to find a match. + var tokens = context.ast.tokens; + var tokenIdx = findTokenIndex(tokens, node.start); + while (tokens[tokenIdx].end <= node.end) { + if (token === tokens[tokenIdx]) { + return true; + } + tokenIdx++; + } + + return false; +} + // Given the AST output of babylon parse, walk through in a depth-first order, // calling methods on the given visitor, providing context as the first argument. function visit(ast, context, visitor) { diff --git a/test/expected-pretty-inlinemap.js b/test/expected-pretty-inlinemap.js index a11fa21..b28b30b 100644 --- a/test/expected-pretty-inlinemap.js +++ b/test/expected-pretty-inlinemap.js @@ -3,7 +3,6 @@ // Regular import import { Something, - } from 'some-module'; // Import types @@ -100,4 +99,4 @@ export class MyClass extends SomeClass { } -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3Qvc291cmNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJHQUFHLEFBQUs7Ozs7O0VBS04sQUFBQSxBQUFhLEFBQUM7RUFDZCxBQUFBLEFBQXFCLEFBQUE7Ozs7QUFJdkIsQUFBNEMsQUFBQTs7O3FCQUd2QixBQUFNLFVBQVUsQUFBQSxBQUFDLGlCQUFpQixBQUFBLEFBQUMsT0FBTyxBQUFBLEFBQWMsT0FBTyxBQUFROztpQkFFM0UsQUFBSzs7OztBQUl0QixBQUlDLEFBQUE7OztBQUdELEFBRUMsQUFBQTs7O0FBR0QsQUFFQyxBQUFBOzs7d0JBR3VCLEFBQUEsQUFBVSxPQUFPLEFBQUEsQUFBRyxBQUFDLENBQUMsQUFBQSxBQUFVOztRQUVoRCxBQUFROzs7RUFHZCxBQUFBLEFBQVUsQUFBQTs7VUFFRixBQUFPOzs7Ozs7MEJBTVMsQUFBQSxBQUFVLENBQUMsQUFBQSxBQUFHO0VBQ3RDLEFBQUEsQUFBVSxBQUFBOztVQUVGLEFBQU87Ozs7OzthQU1KLEFBQUc7T0FDVCxBQUFHOzs7O0tBSUwsQUFBRyxFQUFFLEFBQVk7Ozs7OzttQ0FNYSxBQUFROzs7OztBQUszQyxBQUVDLEFBQUE7OztBQUdELEFBQWtDLEFBQUE7OztBQUdsQyxBQUVDLEFBQUE7OztBQUdELEFBRUMsQUFBQTs7O0FBR0QsQUFHRSxBQUFBOzs7QUFHRixBQUErQixBQUFBOzs7QUFHL0IsQUFBZ0IsQUFBQTs7O0FBR2hCLEFBQWtCLEFBQUE7Ozs7OztBQU1sQixBQUFrQyxBQUFBOzs7O2FBSXJCLEFBQU07Ozs7Ozs7QUFPbkIsQUFBZ0QsQUFBQTs7b0JBRTVCLEFBQUcsbUJBQW1CLEFBQUEsQUFBVSxDQUFDLEFBQUEsQUFBYTs7RUFFaEUsQUFBQSxBQUFRLEFBQUE7O21CQUVTLEFBQUc7Ozs7T0FJZixBQUFHIn0= +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3Qvc291cmNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJHQUFHLEFBQUs7Ozs7O0VBS04sQUFBQSxBQUFhLEFBQUMsQUFBQTtFQUNkLEFBQUEsQUFBcUIsQUFBQTs7OztBQUl2QixBQUE0QyxBQUFBOzs7cUJBR3ZCLEFBQU0sVUFBVSxBQUFBLEFBQUMsaUJBQWlCLEFBQUEsQUFBQyxPQUFPLEFBQUEsQUFBYyxPQUFPLEFBQVE7O2lCQUUzRSxBQUFLOzs7O0FBSXRCLEFBSUMsQUFBQTs7O0FBR0QsQUFFQyxBQUFBOzs7QUFHRCxBQUVDLEFBQUE7Ozt3QkFHdUIsQUFBQSxBQUFVLE9BQU8sQUFBQSxBQUFHLEFBQUMsQ0FBQyxBQUFBLEFBQVU7O1FBRWhELEFBQVE7OztFQUdkLEFBQUEsQUFBVSxBQUFBOztVQUVGLEFBQU87Ozs7OzswQkFNUyxBQUFBLEFBQVUsQ0FBQyxBQUFBLEFBQUc7RUFDdEMsQUFBQSxBQUFVLEFBQUE7O1VBRUYsQUFBTzs7Ozs7O2FBTUosQUFBRztPQUNULEFBQUc7Ozs7S0FJTCxBQUFHLEVBQUUsQUFBWTs7Ozs7O21DQU1hLEFBQVE7Ozs7O0FBSzNDLEFBRUMsQUFBQTs7O0FBR0QsQUFBa0MsQUFBQTs7O0FBR2xDLEFBRUMsQUFBQTs7O0FBR0QsQUFFQyxBQUFBOzs7QUFHRCxBQUdFLEFBQUE7OztBQUdGLEFBQStCLEFBQUE7OztBQUcvQixBQUFnQixBQUFBOzs7QUFHaEIsQUFBa0IsQUFBQTs7Ozs7O0FBTWxCLEFBQWtDLEFBQUE7Ozs7YUFJckIsQUFBTTs7Ozs7OztBQU9uQixBQUFnRCxBQUFBOztvQkFFNUIsQUFBRyxtQkFBbUIsQUFBQSxBQUFVLENBQUMsQUFBQSxBQUFhOztFQUVoRSxBQUFBLEFBQVEsQUFBQTs7bUJBRVMsQUFBRzs7OztPQUlmLEFBQUcifQ== diff --git a/test/expected-pretty.js b/test/expected-pretty.js index b903c12..af54964 100644 --- a/test/expected-pretty.js +++ b/test/expected-pretty.js @@ -3,7 +3,6 @@ // Regular import import { Something, - } from 'some-module'; // Import types diff --git a/test/expected-with-maps/test/source.js b/test/expected-with-maps/test/source.js index 6043eef..f364726 100644 --- a/test/expected-with-maps/test/source.js +++ b/test/expected-with-maps/test/source.js @@ -3,7 +3,6 @@ // Regular import import { Something, - } from 'some-module'; // Import types diff --git a/test/expected-with-maps/test/source.js.map b/test/expected-with-maps/test/source.js.map index c6707a9..d6efd8a 100644 --- a/test/expected-with-maps/test/source.js.map +++ b/test/expected-with-maps/test/source.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../source.js"],"names":[],"mappings":"GAAG,AAAK;;;;;EAKN,AAAA,AAAa,AAAC;EACd,AAAA,AAAqB,AAAA;;;;AAIvB,AAA4C,AAAA;;;qBAGvB,AAAM,UAAU,AAAA,AAAC,iBAAiB,AAAA,AAAC,OAAO,AAAA,AAAc,OAAO,AAAQ;;iBAE3E,AAAK;;;;AAItB,AAIC,AAAA;;;AAGD,AAEC,AAAA;;;AAGD,AAEC,AAAA;;;wBAGuB,AAAA,AAAU,OAAO,AAAA,AAAG,AAAC,CAAC,AAAA,AAAU;;QAEhD,AAAQ;;;EAGd,AAAA,AAAU,AAAA;;UAEF,AAAO;;;;;;0BAMS,AAAA,AAAU,CAAC,AAAA,AAAG;EACtC,AAAA,AAAU,AAAA;;UAEF,AAAO;;;;;;aAMJ,AAAG;OACT,AAAG;;;;KAIL,AAAG,EAAE,AAAY;;;;;;mCAMa,AAAQ;;;;;AAK3C,AAEC,AAAA;;;AAGD,AAAkC,AAAA;;;AAGlC,AAEC,AAAA;;;AAGD,AAEC,AAAA;;;AAGD,AAGE,AAAA;;;AAGF,AAA+B,AAAA;;;AAG/B,AAAgB,AAAA;;;AAGhB,AAAkB,AAAA;;;;;;AAMlB,AAAkC,AAAA;;;;aAIrB,AAAM;;;;;;;AAOnB,AAAgD,AAAA;;oBAE5B,AAAG,mBAAmB,AAAA,AAAU,CAAC,AAAA,AAAa;;EAEhE,AAAA,AAAQ,AAAA;;mBAES,AAAG;;;;OAIf,AAAG"} +{"version":3,"sources":["../../source.js"],"names":[],"mappings":"GAAG,AAAK;;;;;EAKN,AAAA,AAAa,AAAC,AAAA;EACd,AAAA,AAAqB,AAAA;;;;AAIvB,AAA4C,AAAA;;;qBAGvB,AAAM,UAAU,AAAA,AAAC,iBAAiB,AAAA,AAAC,OAAO,AAAA,AAAc,OAAO,AAAQ;;iBAE3E,AAAK;;;;AAItB,AAIC,AAAA;;;AAGD,AAEC,AAAA;;;AAGD,AAEC,AAAA;;;wBAGuB,AAAA,AAAU,OAAO,AAAA,AAAG,AAAC,CAAC,AAAA,AAAU;;QAEhD,AAAQ;;;EAGd,AAAA,AAAU,AAAA;;UAEF,AAAO;;;;;;0BAMS,AAAA,AAAU,CAAC,AAAA,AAAG;EACtC,AAAA,AAAU,AAAA;;UAEF,AAAO;;;;;;aAMJ,AAAG;OACT,AAAG;;;;KAIL,AAAG,EAAE,AAAY;;;;;;mCAMa,AAAQ;;;;;AAK3C,AAEC,AAAA;;;AAGD,AAAkC,AAAA;;;AAGlC,AAEC,AAAA;;;AAGD,AAEC,AAAA;;;AAGD,AAGE,AAAA;;;AAGF,AAA+B,AAAA;;;AAG/B,AAAgB,AAAA;;;AAGhB,AAAkB,AAAA;;;;;;AAMlB,AAAkC,AAAA;;;;aAIrB,AAAM;;;;;;;AAOnB,AAAgD,AAAA;;oBAE5B,AAAG,mBAAmB,AAAA,AAAU,CAAC,AAAA,AAAa;;EAEhE,AAAA,AAAQ,AAAA;;mBAES,AAAG;;;;OAIf,AAAG"}