Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Formatter off on #289

Closed
wants to merge 6 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 87 additions & 1 deletion packages/java-parser/src/comments.js
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ function findUpperBoundToken(tokens, comment) {

/**
* Extends each comments offsets to the left and the right in order to match the
* previous and next token offset. This allow to directly match the prettier-ignore
* previous and next token offset. This allow to directly match the prettier-ignore or formatter:off|on
* comment to the correct CSTNode.
* @param {*} tokens ordered array of tokens
* @param {*} comments array of prettier-ignore comments
Expand All @@ -137,6 +137,11 @@ function extendCommentRange(tokens, comments) {
return ignoreComments;
}

/**
* Filter comments to find prettier-ignore's ones.
* @param comments
* @returns prettier-ignore comments
*/
function filterPrettierIgnore(comments) {
return [...comments].filter(comment =>
comment.image.match(
Expand All @@ -145,6 +150,12 @@ function filterPrettierIgnore(comments) {
);
}

/**
* Check if an node must be ignore because of prettier-ignore comment
* @param node
* @param comments
* @param ignoredNodes
*/
function shouldIgnore(node, comments, ignoredNodes) {
const matchingComment = _.find(
comments,
Expand All @@ -167,9 +178,84 @@ function ignoredComments(tokens, comments) {
return extendCommentRange(tokens, filterPrettierIgnore(comments));
}

/**
* Filter comments to find formatter:off and formatter:on.
* @param comments
* @returns formatter:off and formatter:on comments
*/
function filterFormatterOffOn(comments) {
return [...comments].filter(comment =>
comment.image.match(
/(\/\/(\s*)@formatter:(off|on)(\s*))|(\/\*(\s*)@formatter:(off|on)(\s*)\*\/)/gm
)
);
}

/**
* Create pairs of formatter:off and formatter:on
* @param comments
* @returns pairs of formatter:off and formatter:on
*/
function matchFormatterOffOnPair(comments) {
let isPreviousCommentOff = false;
let isCurrentCommentOff = true;
const pairs = [];
let paired = {};
comments.forEach(comment => {
isCurrentCommentOff = comment.image.slice(-3) === "off";

if (!isPreviousCommentOff) {
if (isCurrentCommentOff) {
paired.off = comment;
}
} else {
if (!isCurrentCommentOff) {
paired.on = comment;
pairs.push(paired);
paired = {};
}
}
isPreviousCommentOff = isCurrentCommentOff;
});

if (comments.length > 0 && isCurrentCommentOff) {
paired.on = undefined;
pairs.push(paired);
}

return pairs;
}

/**
* Check if the node is between formatter:off and formatter:on and change his ignore state
* @param node
* @param commentPairs
*/
function shouldNotFormat(node, commentPairs) {
const matchingPair = _.findLast(
commentPairs,
comment => comment.off.extendedRange.endOffset <= node.location.startOffset
);
if (
matchingPair !== undefined &&
(matchingPair.on === undefined ||
matchingPair.on.startOffset > node.location.endOffset)
) {
node.ignore = true;
}
}

function formatterOffOnComments(tokens, comments) {
const offOn = filterFormatterOffOn(comments);
const extendedRangeOffOn = extendCommentRange(tokens, offOn);
return matchFormatterOffOnPair(extendedRangeOffOn);
}

module.exports = {
attachComments,
shouldIgnore,
shouldNotFormat,
formatterOffOnComments,
ignoredComments,
attachIgnoreNodes
};
9 changes: 8 additions & 1 deletion packages/java-parser/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ const JavaParser = require("./parser");
const {
attachComments,
ignoredComments,
attachIgnoreNodes
attachIgnoreNodes,
formatterOffOnComments
} = require("./comments");

const parser = new JavaParser();
Expand Down Expand Up @@ -36,6 +37,12 @@ function parse(inputText, entryPoint = "compilationUnit") {
);
parser.setIgnoredComments(ignoreComments);

const offOnComments = formatterOffOnComments(
lexResult.tokens,
lexResult.groups.comments
);
parser.setOffOnComments(offOnComments);

// Automatic CST created when parsing
const cst = parser[entryPoint]();

Expand Down
7 changes: 6 additions & 1 deletion packages/java-parser/src/parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ const interfaces = require("./productions/interfaces");
const arrays = require("./productions/arrays");
const blocksStatements = require("./productions/blocks-and-statements");
const expressions = require("./productions/expressions");
const { shouldIgnore } = require("./comments");
const { shouldIgnore, shouldNotFormat } = require("./comments");

/**
* This parser attempts to strongly align with the specs style at:
Expand Down Expand Up @@ -79,6 +79,7 @@ class JavaParser extends Parser {
super.cstPostNonTerminal(ruleCstResult, ruleName);
if (this.isBackTracking() === false) {
shouldIgnore(ruleCstResult, this.ignoredComments, this.ignoredNodes);
shouldNotFormat(ruleCstResult, this.offOnComments);
}
}

Expand Down Expand Up @@ -108,6 +109,10 @@ class JavaParser extends Parser {
this.ignoredNodes = {};
this.ignoredComments = [...comments];
}

setOffOnComments(commentOffOn) {
this.offOnComments = [...commentOffOn];
}
}

module.exports = JavaParser;
Original file line number Diff line number Diff line change
@@ -1,33 +1,9 @@
public enum Enum {
public class PrettierIgnoreClass {
// @formatter:off

SOME_ENUM, ANOTHER_ENUM, LAST_ENUM;

}

public enum Enum {

THIS_IS_GOOD("abc"), THIS_IS_FINE("abc");

public static final String thisWillBeDeleted = "DELETED";

private final String value;

public Enum(String value) {
this.value = value;
}

public String toString() {
return "STRING";
}

}

class CLassWithEnum {

public static enum VALID_THINGS {

FIRST, SECOND
public void myMethod() {

// @formatter:on
}

}
Original file line number Diff line number Diff line change
@@ -1,25 +1,8 @@
public enum Enum {
SOME_ENUM, ANOTHER_ENUM, LAST_ENUM;
}

public enum Enum {
THIS_IS_GOOD("abc"), THIS_IS_FINE("abc");
public static final String thisWillBeDeleted = "DELETED";

private final String value;

public Enum(String value) {
this.value = value;
}

public String toString() {
return "STRING";
}
}
public class PrettierIgnoreClass {

class CLassWithEnum {
// @formatter:off

public static enum VALID_THINGS {
FIRST, SECOND;
public void myMethod() {
// @formatter:on
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// @formatter:on
public class PrettierIgnoreClass {
public void myMethod(int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, int param10) {

}
}

// @formatter:off
public class PrettierIgnoreClass {
public void myMethod(int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, int param10) {

}
}
// @formatter:on
public class PrettierIgnoreClass {
public void myMethod(int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, int param10) {

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
// @formatter:on
public class PrettierIgnoreClass {

public void myMethod(
int param1,
int param2,
int param3,
int param4,
int param5,
int param6,
int param7,
int param8,
int param9,
int param10
) {}
}

// @formatter:off
public class PrettierIgnoreClass {
public void myMethod(int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, int param10) {

}
}

// @formatter:on
public class PrettierIgnoreClass {

public void myMethod(
int param1,
int param2,
int param3,
int param4,
int param5,
int param6,
int param7,
int param8,
int param9,
int param10
) {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// @formatter:off
public class PrettierIgnoreClass {
public void myMethod(int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, int param10) {

}
}
// @formatter:on
public class PrettierIgnoreClass {
public void myMethod(int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, int param10) {

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// @formatter:off
public class PrettierIgnoreClass {
public void myMethod(int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, int param10) {

}
}

// @formatter:on
public class PrettierIgnoreClass {

public void myMethod(
int param1,
int param2,
int param3,
int param4,
int param5,
int param6,
int param7,
int param8,
int param9,
int param10
) {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// @formatter:off
public class PrettierIgnoreClass {
public void myMethod(int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, int param10) {

}
}
// @formatter:on
public class PrettierIgnoreClass {
public void myMethod(int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, int param10) {

}
}

// @formatter:off
public class PrettierIgnoreClass {
public void myMethod(int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, int param10) {

}
}

public class PrettierIgnoreClass {
public void myMethod(int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, int param10) {

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
// @formatter:off
public class PrettierIgnoreClass {
public void myMethod(int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, int param10) {

}
}

// @formatter:on
public class PrettierIgnoreClass {

public void myMethod(
int param1,
int param2,
int param3,
int param4,
int param5,
int param6,
int param7,
int param8,
int param9,
int param10
) {}
}

// @formatter:off
public class PrettierIgnoreClass {
public void myMethod(int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, int param10) {

}
}

public class PrettierIgnoreClass {
public void myMethod(int param1, int param2, int param3, int param4, int param5, int param6, int param7, int param8, int param9, int param10) {

}
}
Loading