From ccb523481a1943829f205ba99da7d152d14080b1 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 4 Jul 2020 18:43:51 +0300 Subject: [PATCH 1/3] init --- src/parser.ts | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/parser.ts b/src/parser.ts index e0d61fa581..d3f6f6ddbe 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -2225,7 +2225,11 @@ export class Parser extends DiagnosticEmitter { body, tn.range(startPos, tn.pos) ); - tn.skip(Token.SEMICOLON); + if (isInterface && tn.peek(false) == Token.COMMA) { + tn.skip(Token.COMMA); + } else { + tn.skip(Token.SEMICOLON); + } return retMethod; } else if (isConstructor) { @@ -2288,7 +2292,10 @@ export class Parser extends DiagnosticEmitter { if (!initializer) return null; } let range = tn.range(startPos, tn.pos); - if ((flags & CommonFlags.DEFINITELY_ASSIGNED) != 0 && ((flags & CommonFlags.STATIC) != 0 || isInterface || initializer !== null)) { + if ( + (flags & CommonFlags.DEFINITELY_ASSIGNED) != 0 && + (isInterface || initializer !== null || (flags & CommonFlags.STATIC) != 0) + ) { this.error( DiagnosticCode.A_definite_assignment_assertion_is_not_permitted_in_this_context, range @@ -2302,7 +2309,11 @@ export class Parser extends DiagnosticEmitter { initializer, range ); - tn.skip(Token.SEMICOLON); + if (isInterface && tn.peek(false) == Token.COMMA) { + tn.skip(Token.COMMA); + } else { + tn.skip(Token.SEMICOLON); + } return retField; } return null; From 9b688aa8bd71f80bfa66bd95bb3497de94dc7db9 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 4 Jul 2020 18:49:45 +0300 Subject: [PATCH 2/3] add test + refactoring --- src/parser.ts | 4 ++-- tests/parser/interface.ts | 6 ++++++ tests/parser/interface.ts.fixture.ts | 5 +++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/parser.ts b/src/parser.ts index d3f6f6ddbe..743a90524d 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -2169,7 +2169,7 @@ export class Parser extends DiagnosticEmitter { tn.range() ); } - returnType = this.parseType(tn, name.kind == NodeKind.CONSTRUCTOR || isSetter); + returnType = this.parseType(tn, isSetter || name.kind == NodeKind.CONSTRUCTOR); if (!returnType) return null; } else { returnType = Node.createOmittedType(tn.range(tn.pos)); @@ -2209,7 +2209,7 @@ export class Parser extends DiagnosticEmitter { } body = this.parseBlockStatement(tn, false); if (!body) return null; - } else if (!(flags & (CommonFlags.AMBIENT | CommonFlags.ABSTRACT)) && !isInterface) { + } else if (!isInterface && !(flags & (CommonFlags.AMBIENT | CommonFlags.ABSTRACT))) { this.error( DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration, tn.range() diff --git a/tests/parser/interface.ts b/tests/parser/interface.ts index f65fbcd714..db94e6119e 100644 --- a/tests/parser/interface.ts +++ b/tests/parser/interface.ts @@ -3,3 +3,9 @@ interface Foo { baz: i32; readonly baz2: f64; } + +interface Boo { + bar(): void, + baz: i32, + readonly baz2: f64, +} diff --git a/tests/parser/interface.ts.fixture.ts b/tests/parser/interface.ts.fixture.ts index f65fbcd714..aacb138d03 100644 --- a/tests/parser/interface.ts.fixture.ts +++ b/tests/parser/interface.ts.fixture.ts @@ -3,3 +3,8 @@ interface Foo { baz: i32; readonly baz2: f64; } +interface Boo { + bar(): void; + baz: i32; + readonly baz2: f64; +} From 0dbed60d0f755c4e451a37e322ff35b1789564d5 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 4 Jul 2020 18:55:28 +0300 Subject: [PATCH 3/3] refactor according review --- src/parser.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/parser.ts b/src/parser.ts index 743a90524d..0cd9b9243e 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -2225,9 +2225,7 @@ export class Parser extends DiagnosticEmitter { body, tn.range(startPos, tn.pos) ); - if (isInterface && tn.peek(false) == Token.COMMA) { - tn.skip(Token.COMMA); - } else { + if (!(isInterface && tn.skip(Token.COMMA))) { tn.skip(Token.SEMICOLON); } return retMethod; @@ -2309,9 +2307,7 @@ export class Parser extends DiagnosticEmitter { initializer, range ); - if (isInterface && tn.peek(false) == Token.COMMA) { - tn.skip(Token.COMMA); - } else { + if (!(isInterface && tn.skip(Token.COMMA))) { tn.skip(Token.SEMICOLON); } return retField;