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";
|
"use strict";
|
||||||
|
|
||||||
const t = require("@babel/core").types;
|
const t = require("@babel/core").types;
|
||||||
const convertComments = require("./convertComments");
|
const convertProgramNode = require("./convertProgramNode");
|
||||||
|
|
||||||
module.exports = function(ast, traverse, code) {
|
module.exports = function(ast, traverse, code) {
|
||||||
const state = { source: code };
|
const state = { source: code };
|
||||||
@ -20,6 +20,8 @@ module.exports = function(ast, traverse, code) {
|
|||||||
|
|
||||||
delete t.VISITOR_KEYS.Property;
|
delete t.VISITOR_KEYS.Property;
|
||||||
delete t.VISITOR_KEYS.MethodDefinition;
|
delete t.VISITOR_KEYS.MethodDefinition;
|
||||||
|
|
||||||
|
convertProgramNode(ast);
|
||||||
};
|
};
|
||||||
|
|
||||||
const astTransformVisitor = {
|
const astTransformVisitor = {
|
||||||
@ -31,16 +33,15 @@ const astTransformVisitor = {
|
|||||||
node._babelType = node.type;
|
node._babelType = node.type;
|
||||||
|
|
||||||
if (node.innerComments) {
|
if (node.innerComments) {
|
||||||
node.trailingComments = node.innerComments;
|
|
||||||
delete node.innerComments;
|
delete node.innerComments;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (node.trailingComments) {
|
if (node.trailingComments) {
|
||||||
convertComments(node.trailingComments);
|
delete node.trailingComments;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (node.leadingComments) {
|
if (node.leadingComments) {
|
||||||
convertComments(node.leadingComments);
|
delete node.leadingComments;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
exit(path) {
|
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";
|
"use strict";
|
||||||
|
|
||||||
const convertTemplateType = require("./convertTemplateType");
|
const convertTemplateType = require("./convertTemplateType");
|
||||||
const toToken = require("./toToken");
|
const convertToken = require("./convertToken");
|
||||||
|
|
||||||
module.exports = function(tokens, tt, code) {
|
module.exports = function(tokens, tt, code) {
|
||||||
return convertTemplateType(tokens, tt)
|
return convertTemplateType(tokens, tt)
|
||||||
.filter(t => t.type !== "CommentLine" && t.type !== "CommentBlock")
|
.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";
|
"use strict";
|
||||||
|
|
||||||
const attachComments = require("./attachComments");
|
const convertTokens = require("./convertTokens");
|
||||||
const convertComments = require("./convertComments");
|
const convertComments = require("./convertComments");
|
||||||
const toTokens = require("./toTokens");
|
const convertAST = require("./convertAST");
|
||||||
const toAST = require("./toAST");
|
|
||||||
|
|
||||||
module.exports = function(ast, traverse, tt, code) {
|
module.exports = function(ast, traverse, tt, code) {
|
||||||
// convert tokens
|
ast.tokens = convertTokens(ast.tokens, tt, code);
|
||||||
ast.tokens = toTokens(ast.tokens, tt, code);
|
|
||||||
|
|
||||||
// add comments
|
|
||||||
convertComments(ast.comments);
|
convertComments(ast.comments);
|
||||||
|
convertAST(ast, traverse, code);
|
||||||
// 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);
|
|
||||||
};
|
};
|
||||||
|
|||||||
@ -4,23 +4,9 @@ const assert = require("assert");
|
|||||||
const babelEslint = require("../..");
|
const babelEslint = require("../..");
|
||||||
const espree = require("espree");
|
const espree = require("espree");
|
||||||
const escope = require("eslint-scope");
|
const escope = require("eslint-scope");
|
||||||
const util = require("util");
|
|
||||||
const unpad = require("dedent");
|
const unpad = require("dedent");
|
||||||
const assertImplementsAST = require("../helpers/assert-implements-ast");
|
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) {
|
function parseAndAssertSame(code) {
|
||||||
code = unpad(code);
|
code = unpad(code);
|
||||||
const esAST = espree.parse(code, {
|
const esAST = espree.parse(code, {
|
||||||
@ -38,7 +24,6 @@ function parseAndAssertSame(code) {
|
|||||||
loc: true,
|
loc: true,
|
||||||
range: true,
|
range: true,
|
||||||
comment: true,
|
comment: true,
|
||||||
attachComment: true,
|
|
||||||
ecmaVersion: 2018,
|
ecmaVersion: 2018,
|
||||||
sourceType: "module",
|
sourceType: "module",
|
||||||
});
|
});
|
||||||
@ -46,25 +31,7 @@ function parseAndAssertSame(code) {
|
|||||||
eslintVisitorKeys: true,
|
eslintVisitorKeys: true,
|
||||||
eslintScopeManager: true,
|
eslintScopeManager: true,
|
||||||
}).ast;
|
}).ast;
|
||||||
try {
|
assertImplementsAST(esAST, babylonAST);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
describe("babylon-to-espree", () => {
|
describe("babylon-to-espree", () => {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user