Parse declare modifier around accessibility modifiers (#11146)

* fix: parse declare modifiers around accessibility modifiers

* test: add tests

* fix: check duplicate modifiers in modified nodes

* fix flow error
This commit is contained in:
Huáng Jùnliàng
2020-02-20 23:29:47 -05:00
committed by GitHub
parent 3960f4de64
commit 223cee7246
7 changed files with 649 additions and 17 deletions

View File

@@ -135,27 +135,24 @@ export default (superClass: Class<Parser>): Class<Parser> =>
/** Parses a list of modifiers, in any order.
* If you need a specific order, you must call this function multiple times:
* this.tsParseModifiers(["public"]);
* this.tsParseModifiers(["abstract", "readonly"]);
* this.tsParseModifiers(node, ["public"]);
* this.tsParseModifiers(node, ["abstract", "readonly"]);
*/
tsParseModifiers<T: TsModifier>(
modified: { [key: TsModifier]: ?true },
allowedModifiers: T[],
): { [key: TsModifier]: ?true, __proto__: null } {
const modifiers = Object.create(null);
): void {
while (true) {
const startPos = this.state.start;
const modifier: ?T = this.tsParseModifier(allowedModifiers);
if (!modifier) break;
if (Object.hasOwnProperty.call(modifiers, modifier)) {
if (Object.hasOwnProperty.call(modified, modifier)) {
this.raise(startPos, `Duplicate modifier: '${modifier}'`);
}
modifiers[modifier] = true;
modified[modifier] = true;
}
return modifiers;
}
tsIsListTerminator(kind: ParsingContext): boolean {
@@ -1922,8 +1919,10 @@ export default (superClass: Class<Parser>): Class<Parser> =>
state: { hadConstructor: boolean },
constructorAllowsSuper: boolean,
): void {
this.tsParseModifiers(member, ["declare"]);
const accessibility = this.parseAccessModifier();
if (accessibility) member.accessibility = accessibility;
this.tsParseModifiers(member, ["declare"]);
super.parseClassMember(classBody, member, state, constructorAllowsSuper);
}
@@ -1935,19 +1934,13 @@ export default (superClass: Class<Parser>): Class<Parser> =>
isStatic: boolean,
constructorAllowsSuper: boolean,
): void {
const modifiers = this.tsParseModifiers([
"abstract",
"readonly",
"declare",
]);
Object.assign(member, modifiers);
this.tsParseModifiers(member, ["abstract", "readonly", "declare"]);
const idx = this.tsTryParseIndexSignature(member);
if (idx) {
classBody.body.push(idx);
if (modifiers.abstract) {
if ((member: any).abstract) {
this.raise(
member.start,
"Index signatures cannot have the 'abstract' modifier",