Remove comment attachment (babel/babel-eslint#736)
* Remove comment attachment * Simplify error messaging in tests
This commit is contained in:
parent
2b9ee42ded
commit
bbce2b3807
@ -1,59 +0,0 @@
|
||||
"use strict";
|
||||
|
||||
// comment fixes
|
||||
module.exports = function(ast, comments, tokens) {
|
||||
if (comments.length) {
|
||||
const firstComment = comments[0];
|
||||
const lastComment = comments[comments.length - 1];
|
||||
// fixup program start
|
||||
if (!tokens.length) {
|
||||
// if no tokens, the program starts at the end of the last comment
|
||||
ast.start = lastComment.end;
|
||||
ast.loc.start.line = lastComment.loc.end.line;
|
||||
ast.loc.start.column = lastComment.loc.end.column;
|
||||
|
||||
if (ast.leadingComments === null && ast.innerComments.length) {
|
||||
ast.leadingComments = ast.innerComments;
|
||||
}
|
||||
} else if (firstComment.start < tokens[0].start) {
|
||||
// if there are comments before the first token, the program starts at the first token
|
||||
const token = tokens[0];
|
||||
// ast.start = token.start;
|
||||
// ast.loc.start.line = token.loc.start.line;
|
||||
// ast.loc.start.column = token.loc.start.column;
|
||||
|
||||
// estraverse do not put leading comments on first node when the comment
|
||||
// appear before the first token
|
||||
if (ast.body.length) {
|
||||
const node = ast.body[0];
|
||||
node.leadingComments = [];
|
||||
const firstTokenStart = token.start;
|
||||
const len = comments.length;
|
||||
for (let i = 0; i < len && comments[i].start < firstTokenStart; i++) {
|
||||
node.leadingComments.push(comments[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
// fixup program end
|
||||
if (tokens.length) {
|
||||
const lastToken = tokens[tokens.length - 1];
|
||||
if (lastComment.end > lastToken.end) {
|
||||
// If there is a comment after the last token, the program ends at the
|
||||
// last token and not the comment
|
||||
// ast.end = lastToken.end;
|
||||
ast.range[1] = lastToken.end;
|
||||
ast.loc.end.line = lastToken.loc.end.line;
|
||||
ast.loc.end.column = lastToken.loc.end.column;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (!tokens.length) {
|
||||
ast.loc.start.line = 1;
|
||||
ast.loc.end.line = 1;
|
||||
}
|
||||
}
|
||||
if (ast.body && ast.body.length > 0) {
|
||||
ast.loc.start.line = ast.body[0].loc.start.line;
|
||||
ast.range[0] = ast.body[0].start;
|
||||
}
|
||||
};
|
||||
@ -1,7 +1,7 @@
|
||||
"use strict";
|
||||
|
||||
const t = require("@babel/core").types;
|
||||
const convertComments = require("./convertComments");
|
||||
const convertProgramNode = require("./convertProgramNode");
|
||||
|
||||
module.exports = function(ast, traverse, code) {
|
||||
const state = { source: code };
|
||||
@ -20,6 +20,8 @@ module.exports = function(ast, traverse, code) {
|
||||
|
||||
delete t.VISITOR_KEYS.Property;
|
||||
delete t.VISITOR_KEYS.MethodDefinition;
|
||||
|
||||
convertProgramNode(ast);
|
||||
};
|
||||
|
||||
const astTransformVisitor = {
|
||||
@ -31,16 +33,15 @@ const astTransformVisitor = {
|
||||
node._babelType = node.type;
|
||||
|
||||
if (node.innerComments) {
|
||||
node.trailingComments = node.innerComments;
|
||||
delete node.innerComments;
|
||||
}
|
||||
|
||||
if (node.trailingComments) {
|
||||
convertComments(node.trailingComments);
|
||||
delete node.trailingComments;
|
||||
}
|
||||
|
||||
if (node.leadingComments) {
|
||||
convertComments(node.leadingComments);
|
||||
delete node.leadingComments;
|
||||
}
|
||||
},
|
||||
exit(path) {
|
||||
@ -0,0 +1,40 @@
|
||||
"use strict";
|
||||
|
||||
module.exports = function(ast) {
|
||||
ast.type = "Program";
|
||||
ast.sourceType = ast.program.sourceType;
|
||||
ast.directives = ast.program.directives;
|
||||
ast.body = ast.program.body;
|
||||
delete ast.program;
|
||||
|
||||
if (ast.comments.length) {
|
||||
const lastComment = ast.comments[ast.comments.length - 1];
|
||||
|
||||
if (!ast.tokens.length) {
|
||||
// if no tokens, the program starts at the end of the last comment
|
||||
ast.start = lastComment.end;
|
||||
ast.loc.start.line = lastComment.loc.end.line;
|
||||
ast.loc.start.column = lastComment.loc.end.column;
|
||||
} else {
|
||||
const lastToken = ast.tokens[ast.tokens.length - 1];
|
||||
|
||||
if (lastComment.end > lastToken.end) {
|
||||
// If there is a comment after the last token, the program ends at the
|
||||
// last token and not the comment
|
||||
ast.range[1] = lastToken.end;
|
||||
ast.loc.end.line = lastToken.loc.end.line;
|
||||
ast.loc.end.column = lastToken.loc.end.column;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (!ast.tokens.length) {
|
||||
ast.loc.start.line = 1;
|
||||
ast.loc.end.line = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (ast.body && ast.body.length > 0) {
|
||||
ast.loc.start.line = ast.body[0].loc.start.line;
|
||||
ast.range[0] = ast.body[0].start;
|
||||
}
|
||||
};
|
||||
@ -1,10 +1,10 @@
|
||||
"use strict";
|
||||
|
||||
const convertTemplateType = require("./convertTemplateType");
|
||||
const toToken = require("./toToken");
|
||||
const convertToken = require("./convertToken");
|
||||
|
||||
module.exports = function(tokens, tt, code) {
|
||||
return convertTemplateType(tokens, tt)
|
||||
.filter(t => t.type !== "CommentLine" && t.type !== "CommentBlock")
|
||||
.map(t => toToken(t, tt, code));
|
||||
.map(t => convertToken(t, tt, code));
|
||||
};
|
||||
@ -1,30 +1,11 @@
|
||||
"use strict";
|
||||
|
||||
const attachComments = require("./attachComments");
|
||||
const convertTokens = require("./convertTokens");
|
||||
const convertComments = require("./convertComments");
|
||||
const toTokens = require("./toTokens");
|
||||
const toAST = require("./toAST");
|
||||
const convertAST = require("./convertAST");
|
||||
|
||||
module.exports = function(ast, traverse, tt, code) {
|
||||
// convert tokens
|
||||
ast.tokens = toTokens(ast.tokens, tt, code);
|
||||
|
||||
// add comments
|
||||
ast.tokens = convertTokens(ast.tokens, tt, code);
|
||||
convertComments(ast.comments);
|
||||
|
||||
// transform esprima and acorn divergent nodes
|
||||
toAST(ast, traverse, code);
|
||||
|
||||
// ast.program.tokens = ast.tokens;
|
||||
// ast.program.comments = ast.comments;
|
||||
// ast = ast.program;
|
||||
|
||||
// remove File
|
||||
ast.type = "Program";
|
||||
ast.sourceType = ast.program.sourceType;
|
||||
ast.directives = ast.program.directives;
|
||||
ast.body = ast.program.body;
|
||||
delete ast.program;
|
||||
|
||||
attachComments(ast, ast.comments, ast.tokens);
|
||||
convertAST(ast, traverse, code);
|
||||
};
|
||||
|
||||
@ -4,23 +4,9 @@ const assert = require("assert");
|
||||
const babelEslint = require("../..");
|
||||
const espree = require("espree");
|
||||
const escope = require("eslint-scope");
|
||||
const util = require("util");
|
||||
const unpad = require("dedent");
|
||||
const assertImplementsAST = require("../helpers/assert-implements-ast");
|
||||
|
||||
function lookup(obj, keypath, backwardsDepth) {
|
||||
if (!keypath) {
|
||||
return obj;
|
||||
}
|
||||
|
||||
return keypath
|
||||
.split(".")
|
||||
.slice(0, -1 * backwardsDepth)
|
||||
.reduce((base, segment) => {
|
||||
return base && base[segment], obj;
|
||||
});
|
||||
}
|
||||
|
||||
function parseAndAssertSame(code) {
|
||||
code = unpad(code);
|
||||
const esAST = espree.parse(code, {
|
||||
@ -38,7 +24,6 @@ function parseAndAssertSame(code) {
|
||||
loc: true,
|
||||
range: true,
|
||||
comment: true,
|
||||
attachComment: true,
|
||||
ecmaVersion: 2018,
|
||||
sourceType: "module",
|
||||
});
|
||||
@ -46,25 +31,7 @@ function parseAndAssertSame(code) {
|
||||
eslintVisitorKeys: true,
|
||||
eslintScopeManager: true,
|
||||
}).ast;
|
||||
try {
|
||||
assertImplementsAST(esAST, babylonAST);
|
||||
} catch (err) {
|
||||
const traversal = err.message.slice(3, err.message.indexOf(":"));
|
||||
err.message += unpad(`
|
||||
espree:
|
||||
${util.inspect(lookup(esAST, traversal, 2), {
|
||||
depth: err.depth,
|
||||
colors: true,
|
||||
})}
|
||||
babel-eslint:
|
||||
${util.inspect(lookup(babylonAST, traversal, 2), {
|
||||
depth: err.depth,
|
||||
colors: true,
|
||||
})}
|
||||
`);
|
||||
throw err;
|
||||
}
|
||||
//assert.equal(esAST, babylonAST);
|
||||
assertImplementsAST(esAST, babylonAST);
|
||||
}
|
||||
|
||||
describe("babylon-to-espree", () => {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user