Skip to content

Commit a20263a

Browse files
committed
fixes ts issues in grammar
1 parent 7c3ab89 commit a20263a

File tree

18 files changed

+635
-371
lines changed

18 files changed

+635
-371
lines changed

lang-version-impl/typescript-impl/src/main/grammar/consulo/typescript/language/grammar/TypeScript.bnf

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,7 @@ private statement_list ::= statement*
296296

297297
statement ::=
298298
block_statement
299+
| enum_declaration
299300
| var_statement
300301
| empty_statement
301302
| if_statement
@@ -316,7 +317,6 @@ statement ::=
316317
| function_declaration
317318
| class_declaration
318319
| interface_declaration
319-
| enum_declaration
320320
| type_alias_declaration
321321
| namespace_declaration
322322
| import_declaration
@@ -328,7 +328,7 @@ statement ::=
328328
private statement_recover_ ::= !(
329329
IDENTIFIER | LBRACE | RBRACE | SEMICOLON |
330330
VAR_KEYWORD | LET_KEYWORD | CONST_KEYWORD |
331-
FUNCTION_KEYWORD | CLASS_KEYWORD | IF_KEYWORD |
331+
FUNCTION_KEYWORD | CLASS_KEYWORD | IF_KEYWORD | ELSE_KEYWORD |
332332
FOR_KEYWORD | WHILE_KEYWORD | DO_KEYWORD |
333333
SWITCH_KEYWORD | TRY_KEYWORD | RETURN_KEYWORD |
334334
THROW_KEYWORD | BREAK_KEYWORD | CONTINUE_KEYWORD |
@@ -474,7 +474,7 @@ enum_member ::= property_name ('=' expression)?
474474
type_alias_declaration ::= TYPE_KEYWORD IDENTIFIER type_parameter_list? '=' type_expression semicolon {pin=1}
475475

476476
// --- Namespace ---
477-
namespace_declaration ::= (NAMESPACE_KEYWORD | MODULE_KEYWORD) qualified_name block_statement {pin=1}
477+
namespace_declaration ::= (NAMESPACE_KEYWORD | MODULE_KEYWORD) (qualified_name | STRING_LITERAL | SINGLE_QUOTE_STRING_LITERAL) block_statement {pin=1}
478478

479479
// --- Ambient declaration ---
480480
ambient_declaration ::= DECLARE_KEYWORD (var_statement | function_declaration | class_declaration | enum_declaration | namespace_declaration | interface_declaration | type_alias_declaration | GLOBAL_KEYWORD block_statement) {pin=1}
@@ -505,15 +505,19 @@ import_attribute ::= (IDENTIFIER | STRING_LITERAL | SINGLE_QUOTE_STRING_LITERAL)
505505

506506
// --- Export ---
507507
export_declaration ::= 'export' (
508-
'default'? (function_declaration | class_declaration | interface_declaration | enum_declaration | type_alias_declaration)
509-
| 'default' expression semicolon
508+
'default' (function_declaration | class_declaration | expression semicolon)
510509
| ambient_declaration
510+
| function_declaration
511+
| class_declaration
512+
| interface_declaration
513+
| enum_declaration
511514
| var_statement
515+
| TYPE_KEYWORD named_exports from_clause? semicolon
516+
| TYPE_KEYWORD '*' (AS_KEYWORD IDENTIFIER)? from_clause semicolon
517+
| type_alias_declaration
512518
| named_exports from_clause? semicolon
513519
| '*' (AS_KEYWORD IDENTIFIER)? from_clause semicolon
514520
| '=' IDENTIFIER semicolon
515-
| TYPE_KEYWORD? named_exports from_clause? semicolon
516-
| TYPE_KEYWORD? '*' (AS_KEYWORD IDENTIFIER)? from_clause semicolon
517521
) {pin=1}
518522

519523
named_exports ::= '{' (export_specifier (',' export_specifier)* ','?)? '}'
@@ -626,17 +630,19 @@ private expression_list_opt ::= (expression (',' expression)* ','?)?
626630
object_literal_expression ::= '{' (property (',' property)* ','?)? '}'
627631

628632
property ::= property_name ':' expression
629-
| IDENTIFIER
630633
| '...' expression
631634
| '*'? property_name type_parameter_list? parameter_list type_annotation? block_statement
632635
| (GET_KEYWORD | SET_KEYWORD) property_name parameter_list type_annotation? block_statement
636+
| IDENTIFIER
633637

634638
computed_property_name ::= '[' expression ']'
635639

636640
parenthesized_expression ::= '(' expression ')'
637641

638-
template_literal_expression ::= NO_SUBSTITUTION_TEMPLATE
639-
| TEMPLATE_HEAD expression (TEMPLATE_MIDDLE expression)* TEMPLATE_TAIL
642+
template_literal_expression ::= TEMPLATE_HEAD template_literal_content* TEMPLATE_TAIL
643+
644+
private template_literal_content ::= NO_SUBSTITUTION_TEMPLATE
645+
| TEMPLATE_HEAD expression TEMPLATE_MIDDLE
640646

641647
spread_expression ::= '...' expression
642648

@@ -737,7 +743,7 @@ predefined_type ::= IDENTIFIER | VOID_KEYWORD
737743

738744
type_parameter_list ::= '<' type_parameter (',' type_parameter)* '>' {pin=1}
739745

740-
type_parameter ::= IDENTIFIER? IDENTIFIER ('extends' type_expression)? ('=' type_expression)?
746+
type_parameter ::= IDENTIFIER ('extends' type_expression)? ('=' type_expression)?
741747

742748
type_arguments ::= '<' type_expression (',' type_expression)* '>'
743749

lang-version-impl/typescript-impl/src/main/java/consulo/typescript/language/impl/syntax/_TypeScriptLexer.flex

Lines changed: 149 additions & 140 deletions
Large diffs are not rendered by default.

lang-version-impl/typescript-impl/src/test/java/consulo/typescript/parser/test/TypeScriptParserTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,26 @@ public void testStringLiterals(Context context) throws Exception {
7979
doTest(context, null);
8080
}
8181

82+
@Test
83+
public void testIfElse(Context context) throws Exception {
84+
doTest(context, null);
85+
}
86+
87+
@Test
88+
public void testObjectLiteralMethod(Context context) throws Exception {
89+
doTest(context, null);
90+
}
91+
92+
@Test
93+
public void testExportType(Context context) throws Exception {
94+
doTest(context, null);
95+
}
96+
97+
@Test
98+
public void testDeclareModule(Context context) throws Exception {
99+
doTest(context, null);
100+
}
101+
82102
@Override
83103
protected LanguageFileType getFileType(Context context, Object o) {
84104
return TypeScriptFileType.INSTANCE;

lang-version-impl/typescript-impl/src/test/resources/parsing/ArrowFunction.txt

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -107,17 +107,15 @@ JSFile:ArrowFunction.ts
107107
TypeScriptVariableDeclarationImpl(VARIABLE_DECLARATION)
108108
TypeScriptBindingPatternImpl(BINDING_PATTERN)
109109
PsiElement(IDENTIFIER)('identity')
110-
PsiWhiteSpace(' ')
111-
PsiElement(EQ)('=')
112-
PsiWhiteSpace(' ')
113-
PsiErrorElement:<exponentiation expression> expected, got '<'
114-
PsiElement(BAD_CHARACTER)('<')
115-
TypeScriptExpressionStatementImpl(EXPRESSION_STATEMENT)
116-
TypeScriptRelationalExpressionImpl(RELATIONAL_EXPRESSION)
117-
TypeScriptReferenceExpressionImpl(REFERENCE_EXPRESSION)
118-
PsiElement(IDENTIFIER)('T')
119-
PsiElement(GT)('>')
110+
PsiWhiteSpace(' ')
111+
PsiElement(EQ)('=')
112+
PsiWhiteSpace(' ')
120113
TypeScriptArrowFunctionImpl(ARROW_FUNCTION)
114+
TypeScriptTypeParameterListImpl(TYPE_PARAMETER_LIST)
115+
PsiElement(LT)('<')
116+
TypeScriptTypeParameterImpl(TYPE_PARAMETER)
117+
PsiElement(IDENTIFIER)('T')
118+
PsiElement(GT)('>')
121119
TypeScriptParameterListImpl:PARAMETER_LIST
122120
PsiElement(LPAR)('(')
123121
TypeScriptParameterImpl(PARAMETER)
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
declare module "orion/editor/textModel" {
2+
export class TextModel {
3+
constructor(text?: string);
4+
}
5+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
JSFile:DeclareModule.ts
2+
TypeScriptStatementImpl(STATEMENT)
3+
TypeScriptAmbientDeclarationImpl(AMBIENT_DECLARATION)
4+
PsiElement(DECLARE_KEYWORD)('declare')
5+
PsiWhiteSpace(' ')
6+
TypeScriptNamespaceDeclarationImpl(NAMESPACE_DECLARATION)
7+
PsiElement(MODULE_KEYWORD)('module')
8+
PsiWhiteSpace(' ')
9+
PsiElement(STRING_LITERAL)('"orion/editor/textModel"')
10+
PsiWhiteSpace(' ')
11+
TypeScriptBlockStatementImpl(BLOCK_STATEMENT)
12+
PsiElement(LBRACE)('{')
13+
PsiWhiteSpace('\n ')
14+
TypeScriptStatementImpl(STATEMENT)
15+
TypeScriptExportDeclarationImpl(EXPORT_DECLARATION)
16+
PsiElement(EXPORT_KEYWORD)('export')
17+
PsiWhiteSpace(' ')
18+
TypeScriptClassDeclarationImpl: TextModel
19+
TypeScriptAttributeListImpl
20+
<empty list>
21+
PsiElement(CLASS_KEYWORD)('class')
22+
PsiWhiteSpace(' ')
23+
PsiElement(IDENTIFIER)('TextModel')
24+
PsiWhiteSpace(' ')
25+
TypeScriptClassBodyImpl(CLASS_BODY)
26+
PsiElement(LBRACE)('{')
27+
PsiWhiteSpace('\n ')
28+
TypeScriptAttributeListImpl
29+
<empty list>
30+
TypeScriptConstructorDeclarationImpl(CONSTRUCTOR_DECLARATION)
31+
PsiElement(CONSTRUCTOR_KEYWORD)('constructor')
32+
TypeScriptParameterListImpl:PARAMETER_LIST
33+
PsiElement(LPAR)('(')
34+
TypeScriptParameterImpl(PARAMETER)
35+
TypeScriptAttributeListImpl
36+
<empty list>
37+
TypeScriptBindingPatternImpl(BINDING_PATTERN)
38+
PsiElement(IDENTIFIER)('text')
39+
PsiElement(QUEST)('?')
40+
TypeScriptTypeAnnotationImpl(TYPE_ANNOTATION)
41+
PsiElement(COLON)(':')
42+
PsiWhiteSpace(' ')
43+
TypeScriptTypeReferenceImpl(TYPE_REFERENCE)
44+
TypeScriptQualifiedNameImpl(QUALIFIED_NAME)
45+
PsiElement(IDENTIFIER)('string')
46+
PsiElement(RPAR)(')')
47+
PsiElement(SEMICOLON)(';')
48+
PsiWhiteSpace('\n ')
49+
PsiElement(RBRACE)('}')
50+
PsiWhiteSpace('\n')
51+
PsiElement(RBRACE)('}')
52+
PsiWhiteSpace('\n')

lang-version-impl/typescript-impl/src/test/resources/parsing/EnumDeclaration.txt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,10 @@ JSFile:EnumDeclaration.ts
2020
PsiWhiteSpace('\n')
2121
PsiElement(RBRACE)('}')
2222
PsiWhiteSpace('\n\n')
23-
TypeScriptVarStatementImpl:VAR_STATEMENT
24-
PsiElement(CONST_KEYWORD)('const')
25-
PsiErrorElement:<binding pattern> expected, got 'enum'
26-
<empty list>
27-
PsiWhiteSpace(' ')
2823
TypeScriptStatementImpl(STATEMENT)
2924
TypeScriptEnumDeclarationImpl(ENUM_DECLARATION)
25+
PsiElement(CONST_KEYWORD)('const')
26+
PsiWhiteSpace(' ')
3027
PsiElement(ENUM_KEYWORD)('enum')
3128
PsiWhiteSpace(' ')
3229
PsiElement(IDENTIFIER)('Direction')
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export type { EditorOptions, InlayHint } from "./api";
2+
export type * from "./types";
3+
export type StringOrNumber = string | number;
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
JSFile:ExportType.ts
2+
TypeScriptStatementImpl(STATEMENT)
3+
TypeScriptExportDeclarationImpl(EXPORT_DECLARATION)
4+
PsiElement(EXPORT_KEYWORD)('export')
5+
PsiWhiteSpace(' ')
6+
PsiElement(TYPE_KEYWORD)('type')
7+
PsiWhiteSpace(' ')
8+
TypeScriptNamedExportsImpl(NAMED_EXPORTS)
9+
PsiElement(LBRACE)('{')
10+
PsiWhiteSpace(' ')
11+
TypeScriptExportSpecifierImpl(EXPORT_SPECIFIER)
12+
PsiElement(IDENTIFIER)('EditorOptions')
13+
PsiElement(COMMA)(',')
14+
PsiWhiteSpace(' ')
15+
TypeScriptExportSpecifierImpl(EXPORT_SPECIFIER)
16+
PsiElement(IDENTIFIER)('InlayHint')
17+
PsiWhiteSpace(' ')
18+
PsiElement(RBRACE)('}')
19+
PsiWhiteSpace(' ')
20+
PsiElement(FROM_KEYWORD)('from')
21+
PsiWhiteSpace(' ')
22+
PsiElement(STRING_LITERAL)('"./api"')
23+
PsiElement(SEMICOLON)(';')
24+
PsiWhiteSpace('\n')
25+
TypeScriptStatementImpl(STATEMENT)
26+
TypeScriptExportDeclarationImpl(EXPORT_DECLARATION)
27+
PsiElement(EXPORT_KEYWORD)('export')
28+
PsiWhiteSpace(' ')
29+
PsiElement(TYPE_KEYWORD)('type')
30+
PsiWhiteSpace(' ')
31+
PsiElement(MULT)('*')
32+
PsiWhiteSpace(' ')
33+
PsiElement(FROM_KEYWORD)('from')
34+
PsiWhiteSpace(' ')
35+
PsiElement(STRING_LITERAL)('"./types"')
36+
PsiElement(SEMICOLON)(';')
37+
PsiWhiteSpace('\n')
38+
TypeScriptStatementImpl(STATEMENT)
39+
TypeScriptExportDeclarationImpl(EXPORT_DECLARATION)
40+
PsiElement(EXPORT_KEYWORD)('export')
41+
PsiWhiteSpace(' ')
42+
TypeScriptTypeAliasDeclarationImpl(TYPE_ALIAS_DECLARATION)
43+
PsiElement(TYPE_KEYWORD)('type')
44+
PsiWhiteSpace(' ')
45+
PsiElement(IDENTIFIER)('StringOrNumber')
46+
PsiWhiteSpace(' ')
47+
PsiElement(EQ)('=')
48+
PsiWhiteSpace(' ')
49+
TypeScriptUnionTypeImpl(UNION_TYPE)
50+
TypeScriptTypeReferenceImpl(TYPE_REFERENCE)
51+
TypeScriptQualifiedNameImpl(QUALIFIED_NAME)
52+
PsiElement(IDENTIFIER)('string')
53+
PsiWhiteSpace(' ')
54+
PsiElement(OR)('|')
55+
PsiWhiteSpace(' ')
56+
TypeScriptTypeReferenceImpl(TYPE_REFERENCE)
57+
TypeScriptQualifiedNameImpl(QUALIFIED_NAME)
58+
PsiElement(IDENTIFIER)('number')
59+
PsiElement(SEMICOLON)(';')
60+
PsiWhiteSpace('\n')

0 commit comments

Comments
 (0)