Skip to content

Commit

Permalink
@babel/eslint-parser: Fix ClassPrivateMethods (#10913)
Browse files Browse the repository at this point in the history
  • Loading branch information
kaicataldo committed Jan 2, 2020
1 parent daaa206 commit 9f832c2
Show file tree
Hide file tree
Showing 5 changed files with 103 additions and 30 deletions.
1 change: 1 addition & 0 deletions eslint/babel-eslint-parser/package.json
Expand Up @@ -34,6 +34,7 @@
"@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0",
"@babel/plugin-proposal-optional-chaining": "^7.0.0",
"@babel/plugin-proposal-pipeline-operator": "^7.0.0",
"@babel/plugin-proposal-private-methods": "^7.7.4",
"@babel/plugin-syntax-bigint": "^7.7.4",
"@babel/plugin-syntax-dynamic-import": "^7.0.0",
"@babel/plugin-syntax-export-default-from": "^7.0.0",
Expand Down
25 changes: 15 additions & 10 deletions eslint/babel-eslint-parser/src/analyze-scope.js
Expand Up @@ -16,16 +16,16 @@ const flowFlippedAliasKeys = t.FLIPPED_ALIAS_KEYS.Flow.concat([
"ObjectPattern",
"RestElement",
]);
const visitorKeysMap = Object.entries(t.VISITOR_KEYS).reduce(function(
acc,
[key, value],
) {
if (flowFlippedAliasKeys.indexOf(value) === -1) {
acc[key] = value;
}
return acc;
},
{});

const visitorKeysMap = Object.entries(t.VISITOR_KEYS).reduce(
(acc, [key, value]) => {
if (!flowFlippedAliasKeys.includes(value)) {
acc[key] = value;
}
return acc;
},
{},
);

const propertyTypes = {
// loops
Expand Down Expand Up @@ -166,6 +166,11 @@ class Referencer extends OriginalReferencer {
this._visitClassProperty(node);
}

// TODO: Update to visit type annotations when TypeScript/Flow support this syntax.
ClassPrivateMethod(node) {
super.MethodDefinition(node);
}

DeclareModule(node) {
this._visitDeclareX(node);
}
Expand Down
2 changes: 1 addition & 1 deletion eslint/babel-eslint-parser/test/babel-eslint-parser.js
Expand Up @@ -270,7 +270,7 @@ describe("babylon-to-espree", () => {
assert.strictEqual(babylonAST.tokens[1].type, "Punctuator");
});

// Espree doesn't support the private fields yet
// Espree doesn't support private fields yet
it("hash (token)", () => {
const code = "class A { #x }";
const babylonAST = parseForESLint(code, {
Expand Down
Expand Up @@ -18,5 +18,6 @@ module.exports = {
["@babel/plugin-proposal-decorators", { decoratorsBeforeExport: false }],
["@babel/plugin-proposal-pipeline-operator", { proposal: "minimal" }],
"@babel/plugin-syntax-bigint",
"@babel/plugin-proposal-private-methods",
],
};
104 changes: 85 additions & 19 deletions eslint/babel-eslint-parser/test/non-regression.js
Expand Up @@ -1763,27 +1763,77 @@ describe("verify", () => {
);
});

describe("private class properties", () => {
it("should not be undefined", () => {
verifyAndAssertMessages(
`
class C {
#d = 1;
}
`,
{ "no-undef": 1 },
);
describe("class field declarations", () => {
describe("field declarations", () => {
it("should not be undefined", () => {
verifyAndAssertMessages(
`
class C {
d = 1;
}
`,
{ "no-undef": 1 },
);
});

it("should not be unused", () => {
verifyAndAssertMessages(
`
export class C {
d = 1;
}
`,
{ "no-unused-vars": 1 },
);
});
});

it("should not be unused", () => {
verifyAndAssertMessages(
`
export class C {
#d = 1;
}
`,
{ "no-unused-vars": 1 },
);
describe("private field declarations", () => {
it("should not be undefined", () => {
verifyAndAssertMessages(
`
class C {
#d = 1;
}
`,
{ "no-undef": 1 },
);
});

it("should not be unused", () => {
verifyAndAssertMessages(
`
export class C {
#d = 1;
}
`,
{ "no-unused-vars": 1 },
);
});
});

describe("private methods", () => {
it("should not be undefined", () => {
verifyAndAssertMessages(
`
class C {
#d() {};
}
`,
{ "no-undef": 1 },
);
});

it("should not be unused", () => {
verifyAndAssertMessages(
`
export class C {
#d() {};
}
`,
{ "no-unused-vars": 1 },
);
});
});
});

Expand Down Expand Up @@ -1853,6 +1903,22 @@ describe("verify", () => {
);
});

it("works with classPrivateMethods", () => {
verifyAndAssertMessages(
`
class A { #a(b, c) {} }
`,
);
});

it("works with arrow function classPrivateProperties", () => {
verifyAndAssertMessages(
`
class A { #a = (a, b) => {}; }
`,
);
});

it("works with optionalCatchBinding", () => {
verifyAndAssertMessages(
`
Expand Down

0 comments on commit 9f832c2

Please sign in to comment.