diff --git a/Dart/gen/com/jetbrains/lang/dart/DartParser.java b/Dart/gen/com/jetbrains/lang/dart/DartParser.java index 4a121d6da2d..e54ded1264b 100644 --- a/Dart/gen/com/jetbrains/lang/dart/DartParser.java +++ b/Dart/gen/com/jetbrains/lang/dart/DartParser.java @@ -658,12 +658,13 @@ private static boolean breakStatement_1(PsiBuilder b, int l) { } /* ********************************************************** */ - // typeArguments? <> + // typeArguments? ('.' 'new')? <> public static boolean callExpression(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "callExpression")) return false; boolean r; Marker m = enter_section_(b, l, _LEFT_, CALL_EXPRESSION, ""); r = callExpression_0(b, l + 1); + r = r && callExpression_1(b, l + 1); r = r && argumentsWrapper(b, l + 1); exit_section_(b, l, m, r, false, null); return r; @@ -676,6 +677,23 @@ private static boolean callExpression_0(PsiBuilder b, int l) { return true; } + // ('.' 'new')? + private static boolean callExpression_1(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "callExpression_1")) return false; + callExpression_1_0(b, l + 1); + return true; + } + + // '.' 'new' + private static boolean callExpression_1_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "callExpression_1_0")) return false; + boolean r; + Marker m = enter_section_(b); + r = consumeTokens(b, 0, DOT, NEW); + exit_section_(b, m, null, r); + return r; + } + /* ********************************************************** */ // (callExpression | arrayAccessExpression | qualifiedReferenceExpression | '!')* static boolean callOrArrayAccessOrQualifiedRefExpression(PsiBuilder b, int l) { @@ -4343,7 +4361,7 @@ public static boolean namedArgument(PsiBuilder b, int l) { } /* ********************************************************** */ - // metadata* ('external' | 'const')* componentName '.' componentName formalParameterList initializers? (';' | functionBodyOrNative | redirection)? + // metadata* ('external' | 'const')* componentName '.' (componentName | 'new') formalParameterList initializers? (';' | functionBodyOrNative | redirection)? public static boolean namedConstructorDeclaration(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "namedConstructorDeclaration")) return false; boolean r, p; @@ -4352,7 +4370,7 @@ public static boolean namedConstructorDeclaration(PsiBuilder b, int l) { r = r && namedConstructorDeclaration_1(b, l + 1); r = r && componentName(b, l + 1); r = r && consumeToken(b, DOT); - r = r && componentName(b, l + 1); + r = r && namedConstructorDeclaration_4(b, l + 1); r = r && formalParameterList(b, l + 1); p = r; // pin = 6 r = r && report_error_(b, namedConstructorDeclaration_6(b, l + 1)); @@ -4392,6 +4410,15 @@ private static boolean namedConstructorDeclaration_1_0(PsiBuilder b, int l) { return r; } + // componentName | 'new' + private static boolean namedConstructorDeclaration_4(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "namedConstructorDeclaration_4")) return false; + boolean r; + r = componentName(b, l + 1); + if (!r) r = consumeToken(b, NEW); + return r; + } + // initializers? private static boolean namedConstructorDeclaration_6(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "namedConstructorDeclaration_6")) return false; @@ -4523,7 +4550,7 @@ private static boolean namedParameterTypes_4(PsiBuilder b, int l) { } /* ********************************************************** */ - // newExpressionWithKeyword | simpleQualifiedReferenceExpression typeArguments '.' referenceExpression <> + // newExpressionWithKeyword | simpleQualifiedReferenceExpression typeArguments '.' (referenceExpression | 'new') <> public static boolean newExpression(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "newExpression")) return false; boolean r; @@ -4534,7 +4561,7 @@ public static boolean newExpression(PsiBuilder b, int l) { return r; } - // simpleQualifiedReferenceExpression typeArguments '.' referenceExpression <> + // simpleQualifiedReferenceExpression typeArguments '.' (referenceExpression | 'new') <> private static boolean newExpression_1(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "newExpression_1")) return false; boolean r; @@ -4542,14 +4569,23 @@ private static boolean newExpression_1(PsiBuilder b, int l) { r = simpleQualifiedReferenceExpression(b, l + 1); r = r && typeArguments(b, l + 1); r = r && consumeToken(b, DOT); - r = r && referenceExpression(b, l + 1); + r = r && newExpression_1_3(b, l + 1); r = r && argumentsWrapper(b, l + 1); exit_section_(b, m, null, r); return r; } + // referenceExpression | 'new' + private static boolean newExpression_1_3(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "newExpression_1_3")) return false; + boolean r; + r = referenceExpression(b, l + 1); + if (!r) r = consumeToken(b, NEW); + return r; + } + /* ********************************************************** */ - // ('new' | 'const') type ('.' referenceExpression)? <> + // ('new' | 'const') type ('.' (referenceExpression | 'new'))? <> static boolean newExpressionWithKeyword(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "newExpressionWithKeyword")) return false; if (!nextTokenIs(b, "", CONST, NEW)) return false; @@ -4573,24 +4609,33 @@ private static boolean newExpressionWithKeyword_0(PsiBuilder b, int l) { return r; } - // ('.' referenceExpression)? + // ('.' (referenceExpression | 'new'))? private static boolean newExpressionWithKeyword_2(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "newExpressionWithKeyword_2")) return false; newExpressionWithKeyword_2_0(b, l + 1); return true; } - // '.' referenceExpression + // '.' (referenceExpression | 'new') private static boolean newExpressionWithKeyword_2_0(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "newExpressionWithKeyword_2_0")) return false; boolean r; Marker m = enter_section_(b); r = consumeToken(b, DOT); - r = r && referenceExpression(b, l + 1); + r = r && newExpressionWithKeyword_2_0_1(b, l + 1); exit_section_(b, m, null, r); return r; } + // referenceExpression | 'new' + private static boolean newExpressionWithKeyword_2_0_1(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "newExpressionWithKeyword_2_0_1")) return false; + boolean r; + r = referenceExpression(b, l + 1); + if (!r) r = consumeToken(b, NEW); + return r; + } + /* ********************************************************** */ // block // Guard to break tie with map literal. // | functionDeclarationWithBody @@ -5166,7 +5211,7 @@ static boolean primary(PsiBuilder b, int l) { } /* ********************************************************** */ - // '.' referenceExpression | '?.' referenceExpression + // '.' (referenceExpression | 'new') | '?.' referenceExpression public static boolean qualifiedReferenceExpression(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "qualifiedReferenceExpression")) return false; if (!nextTokenIs(b, "", DOT, QUEST_DOT)) return false; @@ -5178,17 +5223,26 @@ public static boolean qualifiedReferenceExpression(PsiBuilder b, int l) { return r; } - // '.' referenceExpression + // '.' (referenceExpression | 'new') private static boolean qualifiedReferenceExpression_0(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "qualifiedReferenceExpression_0")) return false; boolean r; Marker m = enter_section_(b); r = consumeToken(b, DOT); - r = r && referenceExpression(b, l + 1); + r = r && qualifiedReferenceExpression_0_1(b, l + 1); exit_section_(b, m, null, r); return r; } + // referenceExpression | 'new' + private static boolean qualifiedReferenceExpression_0_1(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "qualifiedReferenceExpression_0_1")) return false; + boolean r; + r = referenceExpression(b, l + 1); + if (!r) r = consumeToken(b, NEW); + return r; + } + // '?.' referenceExpression private static boolean qualifiedReferenceExpression_1(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "qualifiedReferenceExpression_1")) return false; @@ -5201,7 +5255,7 @@ private static boolean qualifiedReferenceExpression_1(PsiBuilder b, int l) { } /* ********************************************************** */ - // ':' 'this' ('.' referenceExpression)? <> + // ':' 'this' ('.' (referenceExpression | 'new'))? <> public static boolean redirection(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "redirection")) return false; if (!nextTokenIs(b, COLON)) return false; @@ -5215,24 +5269,33 @@ public static boolean redirection(PsiBuilder b, int l) { return r || p; } - // ('.' referenceExpression)? + // ('.' (referenceExpression | 'new'))? private static boolean redirection_2(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "redirection_2")) return false; redirection_2_0(b, l + 1); return true; } - // '.' referenceExpression + // '.' (referenceExpression | 'new') private static boolean redirection_2_0(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "redirection_2_0")) return false; boolean r; Marker m = enter_section_(b); r = consumeToken(b, DOT); - r = r && referenceExpression(b, l + 1); + r = r && redirection_2_0_1(b, l + 1); exit_section_(b, m, null, r); return r; } + // referenceExpression | 'new' + private static boolean redirection_2_0_1(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "redirection_2_0_1")) return false; + boolean r; + r = referenceExpression(b, l + 1); + if (!r) r = consumeToken(b, NEW); + return r; + } + /* ********************************************************** */ // referenceExpression | thisExpression | superExpression | << parenthesizedExpressionWrapper >> static boolean refOrThisOrSuperOrParenExpression(PsiBuilder b, int l) { @@ -5993,7 +6056,7 @@ private static boolean suffixExpressionWrapper_1(PsiBuilder b, int l) { } /* ********************************************************** */ - // (superExpression | thisExpression) ('.' referenceExpression)? <> + // (superExpression | thisExpression) ('.' (referenceExpression | 'new'))? <> // | fieldInitializer // | assertStatement public static boolean superCallOrFieldInitializer(PsiBuilder b, int l) { @@ -6007,7 +6070,7 @@ public static boolean superCallOrFieldInitializer(PsiBuilder b, int l) { return r; } - // (superExpression | thisExpression) ('.' referenceExpression)? <> + // (superExpression | thisExpression) ('.' (referenceExpression | 'new'))? <> private static boolean superCallOrFieldInitializer_0(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "superCallOrFieldInitializer_0")) return false; boolean r; @@ -6028,24 +6091,33 @@ private static boolean superCallOrFieldInitializer_0_0(PsiBuilder b, int l) { return r; } - // ('.' referenceExpression)? + // ('.' (referenceExpression | 'new'))? private static boolean superCallOrFieldInitializer_0_1(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "superCallOrFieldInitializer_0_1")) return false; superCallOrFieldInitializer_0_1_0(b, l + 1); return true; } - // '.' referenceExpression + // '.' (referenceExpression | 'new') private static boolean superCallOrFieldInitializer_0_1_0(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "superCallOrFieldInitializer_0_1_0")) return false; boolean r; Marker m = enter_section_(b); r = consumeToken(b, DOT); - r = r && referenceExpression(b, l + 1); + r = r && superCallOrFieldInitializer_0_1_0_1(b, l + 1); exit_section_(b, m, null, r); return r; } + // referenceExpression | 'new' + private static boolean superCallOrFieldInitializer_0_1_0_1(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "superCallOrFieldInitializer_0_1_0_1")) return false; + boolean r; + r = referenceExpression(b, l + 1); + if (!r) r = consumeToken(b, NEW); + return r; + } + /* ********************************************************** */ // 'super' public static boolean superExpression(PsiBuilder b, int l) { @@ -7197,7 +7269,7 @@ static boolean varDeclarationListWithSemicolon(PsiBuilder b, int l) { } /* ********************************************************** */ - // '=' type ['.' referenceExpression] + // '=' type ['.' (referenceExpression | 'new')] static boolean varFactoryDeclaration(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "varFactoryDeclaration")) return false; if (!nextTokenIs(b, EQ)) return false; @@ -7211,25 +7283,34 @@ static boolean varFactoryDeclaration(PsiBuilder b, int l) { return r || p; } - // ['.' referenceExpression] + // ['.' (referenceExpression | 'new')] private static boolean varFactoryDeclaration_2(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "varFactoryDeclaration_2")) return false; varFactoryDeclaration_2_0(b, l + 1); return true; } - // '.' referenceExpression + // '.' (referenceExpression | 'new') private static boolean varFactoryDeclaration_2_0(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "varFactoryDeclaration_2_0")) return false; boolean r, p; Marker m = enter_section_(b, l, _NONE_); r = consumeToken(b, DOT); p = r; // pin = 1 - r = r && referenceExpression(b, l + 1); + r = r && varFactoryDeclaration_2_0_1(b, l + 1); exit_section_(b, l, m, r, p, null); return r || p; } + // referenceExpression | 'new' + private static boolean varFactoryDeclaration_2_0_1(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "varFactoryDeclaration_2_0_1")) return false; + boolean r; + r = referenceExpression(b, l + 1); + if (!r) r = consumeToken(b, NEW); + return r; + } + /* ********************************************************** */ // '=' expression public static boolean varInit(PsiBuilder b, int l) { diff --git a/Dart/src/com/jetbrains/lang/dart/Dart.bnf b/Dart/src/com/jetbrains/lang/dart/Dart.bnf index 7e5d743c950..ea7e9c04f8f 100644 --- a/Dart/src/com/jetbrains/lang/dart/Dart.bnf +++ b/Dart/src/com/jetbrains/lang/dart/Dart.bnf @@ -315,17 +315,17 @@ methodDeclaration ::= metadata* ('external' | 'static' | 'const')* methodDeclara {pin=3 mixin="com.jetbrains.lang.dart.psi.impl.AbstractDartMethodDeclarationImpl" implements="com.jetbrains.lang.dart.psi.DartComponent"} private methodDeclarationPrivate ::= returnType <> typeParameters? formalParameterList | !untypedFunctionType <> typeParameters? formalParameterList // todo remove, use functionSignature as in spec -namedConstructorDeclaration ::= metadata* ('external' | 'const')* componentName '.' componentName formalParameterList initializers? (';' | functionBodyOrNative | redirection)? +namedConstructorDeclaration ::= metadata* ('external' | 'const')* componentName '.' (componentName | 'new') formalParameterList initializers? (';' | functionBodyOrNative | redirection)? {pin=6 mixin="com.jetbrains.lang.dart.psi.impl.AbstractDartComponentImpl" implements="com.jetbrains.lang.dart.psi.DartComponent" methods = [getComponentName]} initializers ::= ':' superCallOrFieldInitializer (',' superCallOrFieldInitializer)* // If it were possible to edit Object or Null then we'd have to allow for ?. -redirection ::= ':' 'this' ('.' referenceExpression)? <> {pin=2} +redirection ::= ':' 'this' ('.' (referenceExpression | 'new'))? <> {pin=2} fieldInitializer ::= ('this' '.')? referenceExpression '=' expression {pin=2} -superCallOrFieldInitializer ::= (superExpression | thisExpression) ('.' referenceExpression)? <> +superCallOrFieldInitializer ::= (superExpression | thisExpression) ('.' (referenceExpression | 'new'))? <> | fieldInitializer | assertStatement {recoverWhile="super_call_or_field_initializer_recover"} @@ -355,7 +355,7 @@ private namedParameterTypes ::= '{' 'required'? typedIdentifier (',' 'required'? factoryConstructorDeclaration ::= metadata* ('external' | 'const')* 'factory' componentName ('.' componentName)? formalParameterList factoryTail? {pin=3 mixin="com.jetbrains.lang.dart.psi.impl.AbstractDartComponentImpl" implements="com.jetbrains.lang.dart.psi.DartComponent" methods = [getComponentName]} private factoryTail ::= varFactoryDeclaration ';' | functionBodyOrNative | ';' {pin(".*")=1} -private varFactoryDeclaration ::= '=' type ['.' referenceExpression] {pin(".*")=1} +private varFactoryDeclaration ::= '=' type ['.' (referenceExpression | 'new')] {pin(".*")=1} userDefinableOperator ::= binaryOperator | '~' | @@ -617,7 +617,7 @@ private callOrArrayAccessOrQualifiedRefExpression ::= (callExpression | arrayAcc private refOrThisOrSuperOrParenExpression ::= (referenceExpression | thisExpression | superExpression | << parenthesizedExpressionWrapper >>) -left callExpression ::= typeArguments? <> +left callExpression ::= typeArguments? ('.' 'new')? <> {mixin="com.jetbrains.lang.dart.psi.impl.DartReferenceImpl" implements="com.jetbrains.lang.dart.psi.DartReference" methods = [getArguments]} left arrayAccessExpression ::= arrayAccess {mixin="com.jetbrains.lang.dart.psi.impl.DartClassReferenceImpl" implements="com.jetbrains.lang.dart.psi.DartReference"} @@ -630,7 +630,7 @@ libraryComponentReferenceExpression ::= << nonStrictID >> referenceExpression ::= << nonStrictID >> {mixin="com.jetbrains.lang.dart.psi.impl.DartReferenceImpl" implements="com.jetbrains.lang.dart.psi.DartReference"} -left qualifiedReferenceExpression ::= '.' referenceExpression | '?.' referenceExpression {elementType="referenceExpression"} +left qualifiedReferenceExpression ::= '.' (referenceExpression | 'new') | '?.' referenceExpression {elementType="referenceExpression"} cascadeReferenceExpression ::= ('?..' | '..') << cascadeStopper >> (arrayAccess | refOrThisOrSuperOrParenExpression callOrArrayAccessOrQualifiedRefExpression) << varInitWrapper >> {mixin="com.jetbrains.lang.dart.psi.impl.DartReferenceImpl" implements="com.jetbrains.lang.dart.psi.DartReference"} @@ -641,13 +641,13 @@ thisExpression ::= 'this' superExpression ::= 'super' {mixin="com.jetbrains.lang.dart.psi.impl.DartReferenceImpl" implements="com.jetbrains.lang.dart.psi.DartReference"} -newExpression ::= newExpressionWithKeyword | simpleQualifiedReferenceExpression typeArguments '.' referenceExpression <> { +newExpression ::= newExpressionWithKeyword | simpleQualifiedReferenceExpression typeArguments '.' (referenceExpression | 'new') <> { mixin="com.jetbrains.lang.dart.psi.impl.DartReferenceImpl" implements="com.jetbrains.lang.dart.psi.DartReference" methods=[isConstantObjectExpression getArguments] } -private newExpressionWithKeyword ::= ('new' | 'const') type ('.' referenceExpression)? <> { pin=1 } +private newExpressionWithKeyword ::= ('new' | 'const') type ('.' (referenceExpression | 'new'))? <> { pin=1 } throwExpression ::= 'throw' expression diff --git a/Dart/testData/parsing/ConstructorTearoffs.dart b/Dart/testData/parsing/ConstructorTearoffs.dart new file mode 100644 index 00000000000..4efd16eb0b7 --- /dev/null +++ b/Dart/testData/parsing/ConstructorTearoffs.dart @@ -0,0 +1,22 @@ +// Constructor Tearoffs +// https://github.com/dart-lang/language/blob/master/accepted/future-releases/constructor-tearoffs/feature-specification.md + +class C { + final T x; + const C.new(this.x); // Same as: `const C(this.x);` + C.other(T x) : this.new(x); // Same as: `: this(x)` + factory C.d(T x) = D.new; // same as: `= D;` +} +class D extends C { + const D(T x) : super.new(x); // Same as: `: super(x);` +} +void main() { + const C.new(0); // Same as: `const C(0);`. (Inferred `T` = `int`.) + const C.new(0); // Same as: `const C(0);`. + new C.new(0); // Same as `new C(0);`. + new C.new(0); // Same as `new C(0);`. + C.new(0); // Same as `C(0);`. + C.new(0); // Same as `C(0);`. + var f1 = C.new; // New tear-off, not expressible without `.new`. + var f2 = C.new; // New tear-off, not expressible without `.new`. +} diff --git a/Dart/testData/parsing/ConstructorTearoffs.txt b/Dart/testData/parsing/ConstructorTearoffs.txt new file mode 100644 index 00000000000..ccbd1f081ab --- /dev/null +++ b/Dart/testData/parsing/ConstructorTearoffs.txt @@ -0,0 +1,373 @@ +Dart File + PsiComment(SINGLE_LINE_COMMENT)('// Constructor Tearoffs') + PsiComment(SINGLE_LINE_COMMENT)('// https://github.com/dart-lang/language/blob/master/accepted/future-releases/constructor-tearoffs/feature-specification.md') + CLASS_DEFINITION + PsiElement(class)('class') + COMPONENT_NAME + ID + PsiElement(IDENTIFIER)('C') + TYPE_PARAMETERS + PsiElement(<)('<') + TYPE_PARAMETER + COMPONENT_NAME + ID + PsiElement(IDENTIFIER)('T') + PsiElement(>)('>') + CLASS_BODY + PsiElement({)('{') + CLASS_MEMBERS + VAR_DECLARATION_LIST + VAR_ACCESS_DECLARATION + PsiElement(final)('final') + TYPE + SIMPLE_TYPE + REFERENCE_EXPRESSION + ID + PsiElement(IDENTIFIER)('T') + COMPONENT_NAME + ID + PsiElement(IDENTIFIER)('x') + PsiElement(;)(';') + NAMED_CONSTRUCTOR_DECLARATION + PsiElement(const)('const') + COMPONENT_NAME + ID + PsiElement(IDENTIFIER)('C') + PsiElement(.)('.') + PsiElement(new)('new') + FORMAL_PARAMETER_LIST + PsiElement(()('(') + NORMAL_FORMAL_PARAMETER + FIELD_FORMAL_PARAMETER + PsiElement(this)('this') + PsiElement(.)('.') + REFERENCE_EXPRESSION + ID + PsiElement(IDENTIFIER)('x') + PsiElement())(')') + PsiElement(;)(';') + PsiComment(SINGLE_LINE_COMMENT)('// Same as: `const C(this.x);`') + NAMED_CONSTRUCTOR_DECLARATION + COMPONENT_NAME + ID + PsiElement(IDENTIFIER)('C') + PsiElement(.)('.') + COMPONENT_NAME + ID + PsiElement(IDENTIFIER)('other') + FORMAL_PARAMETER_LIST + PsiElement(()('(') + NORMAL_FORMAL_PARAMETER + SIMPLE_FORMAL_PARAMETER + TYPE + SIMPLE_TYPE + REFERENCE_EXPRESSION + ID + PsiElement(IDENTIFIER)('T') + COMPONENT_NAME + ID + PsiElement(IDENTIFIER)('x') + PsiElement())(')') + INITIALIZERS + PsiElement(:)(':') + SUPER_CALL_OR_FIELD_INITIALIZER + THIS_EXPRESSION + PsiElement(this)('this') + PsiElement(.)('.') + PsiElement(new)('new') + ARGUMENTS + PsiElement(()('(') + ARGUMENT_LIST + REFERENCE_EXPRESSION + ID + PsiElement(IDENTIFIER)('x') + PsiElement())(')') + PsiElement(;)(';') + PsiComment(SINGLE_LINE_COMMENT)('// Same as: `: this(x)`') + FACTORY_CONSTRUCTOR_DECLARATION + PsiElement(factory)('factory') + COMPONENT_NAME + ID + PsiElement(IDENTIFIER)('C') + PsiElement(.)('.') + COMPONENT_NAME + ID + PsiElement(IDENTIFIER)('d') + FORMAL_PARAMETER_LIST + PsiElement(()('(') + NORMAL_FORMAL_PARAMETER + SIMPLE_FORMAL_PARAMETER + TYPE + SIMPLE_TYPE + REFERENCE_EXPRESSION + ID + PsiElement(IDENTIFIER)('T') + COMPONENT_NAME + ID + PsiElement(IDENTIFIER)('x') + PsiElement())(')') + PsiElement(=)('=') + TYPE + SIMPLE_TYPE + REFERENCE_EXPRESSION + ID + PsiElement(IDENTIFIER)('D') + TYPE_ARGUMENTS + PsiElement(<)('<') + TYPE_LIST + TYPE + SIMPLE_TYPE + REFERENCE_EXPRESSION + ID + PsiElement(IDENTIFIER)('T') + PsiElement(>)('>') + PsiElement(.)('.') + PsiElement(new)('new') + PsiElement(;)(';') + PsiComment(SINGLE_LINE_COMMENT)('// same as: `= D;`') + PsiElement(})('}') + CLASS_DEFINITION + PsiElement(class)('class') + COMPONENT_NAME + ID + PsiElement(IDENTIFIER)('D') + TYPE_PARAMETERS + PsiElement(<)('<') + TYPE_PARAMETER + COMPONENT_NAME + ID + PsiElement(IDENTIFIER)('T') + PsiElement(>)('>') + SUPERCLASS + PsiElement(extends)('extends') + TYPE + SIMPLE_TYPE + REFERENCE_EXPRESSION + ID + PsiElement(IDENTIFIER)('C') + TYPE_ARGUMENTS + PsiElement(<)('<') + TYPE_LIST + TYPE + SIMPLE_TYPE + REFERENCE_EXPRESSION + ID + PsiElement(IDENTIFIER)('T') + PsiElement(>)('>') + CLASS_BODY + PsiElement({)('{') + CLASS_MEMBERS + METHOD_DECLARATION + PsiElement(const)('const') + COMPONENT_NAME + ID + PsiElement(IDENTIFIER)('D') + FORMAL_PARAMETER_LIST + PsiElement(()('(') + NORMAL_FORMAL_PARAMETER + SIMPLE_FORMAL_PARAMETER + TYPE + SIMPLE_TYPE + REFERENCE_EXPRESSION + ID + PsiElement(IDENTIFIER)('T') + COMPONENT_NAME + ID + PsiElement(IDENTIFIER)('x') + PsiElement())(')') + INITIALIZERS + PsiElement(:)(':') + SUPER_CALL_OR_FIELD_INITIALIZER + SUPER_EXPRESSION + PsiElement(super)('super') + PsiElement(.)('.') + PsiElement(new)('new') + ARGUMENTS + PsiElement(()('(') + ARGUMENT_LIST + REFERENCE_EXPRESSION + ID + PsiElement(IDENTIFIER)('x') + PsiElement())(')') + PsiElement(;)(';') + PsiComment(SINGLE_LINE_COMMENT)('// Same as: `: super(x);`') + PsiElement(})('}') + FUNCTION_DECLARATION_WITH_BODY_OR_NATIVE + RETURN_TYPE + PsiElement(void)('void') + COMPONENT_NAME + ID + PsiElement(IDENTIFIER)('main') + FORMAL_PARAMETER_LIST + PsiElement(()('(') + PsiElement())(')') + FUNCTION_BODY + LAZY_PARSEABLE_BLOCK + PsiElement({)('{') + STATEMENTS + NEW_EXPRESSION + PsiElement(const)('const') + TYPE + SIMPLE_TYPE + REFERENCE_EXPRESSION + REFERENCE_EXPRESSION + ID + PsiElement(IDENTIFIER)('C') + PsiElement(.)('.') + PsiElement(new)('new') + ARGUMENTS + PsiElement(()('(') + ARGUMENT_LIST + LITERAL_EXPRESSION + PsiElement(NUMBER)('0') + PsiElement())(')') + PsiElement(;)(';') + PsiComment(SINGLE_LINE_COMMENT)('// Same as: `const C(0);`. (Inferred `T` = `int`.)') + NEW_EXPRESSION + PsiElement(const)('const') + TYPE + SIMPLE_TYPE + REFERENCE_EXPRESSION + ID + PsiElement(IDENTIFIER)('C') + TYPE_ARGUMENTS + PsiElement(<)('<') + TYPE_LIST + TYPE + SIMPLE_TYPE + REFERENCE_EXPRESSION + ID + PsiElement(IDENTIFIER)('num') + PsiElement(>)('>') + PsiElement(.)('.') + PsiElement(new)('new') + ARGUMENTS + PsiElement(()('(') + ARGUMENT_LIST + LITERAL_EXPRESSION + PsiElement(NUMBER)('0') + PsiElement())(')') + PsiElement(;)(';') + PsiComment(SINGLE_LINE_COMMENT)('// Same as: `const C(0);`.') + NEW_EXPRESSION + PsiElement(new)('new') + TYPE + SIMPLE_TYPE + REFERENCE_EXPRESSION + REFERENCE_EXPRESSION + ID + PsiElement(IDENTIFIER)('C') + PsiElement(.)('.') + PsiElement(new)('new') + ARGUMENTS + PsiElement(()('(') + ARGUMENT_LIST + LITERAL_EXPRESSION + PsiElement(NUMBER)('0') + PsiElement())(')') + PsiElement(;)(';') + PsiComment(SINGLE_LINE_COMMENT)('// Same as `new C(0);`.') + NEW_EXPRESSION + PsiElement(new)('new') + TYPE + SIMPLE_TYPE + REFERENCE_EXPRESSION + ID + PsiElement(IDENTIFIER)('C') + TYPE_ARGUMENTS + PsiElement(<)('<') + TYPE_LIST + TYPE + SIMPLE_TYPE + REFERENCE_EXPRESSION + ID + PsiElement(IDENTIFIER)('num') + PsiElement(>)('>') + PsiElement(.)('.') + PsiElement(new)('new') + ARGUMENTS + PsiElement(()('(') + ARGUMENT_LIST + LITERAL_EXPRESSION + PsiElement(NUMBER)('0') + PsiElement())(')') + PsiElement(;)(';') + PsiComment(SINGLE_LINE_COMMENT)('// Same as `new C(0);`.') + CALL_EXPRESSION + REFERENCE_EXPRESSION + ID + PsiElement(IDENTIFIER)('C') + PsiElement(.)('.') + PsiElement(new)('new') + ARGUMENTS + PsiElement(()('(') + ARGUMENT_LIST + LITERAL_EXPRESSION + PsiElement(NUMBER)('0') + PsiElement())(')') + PsiElement(;)(';') + PsiComment(SINGLE_LINE_COMMENT)('// Same as `C(0);`.') + NEW_EXPRESSION + REFERENCE_EXPRESSION + ID + PsiElement(IDENTIFIER)('C') + TYPE_ARGUMENTS + PsiElement(<)('<') + TYPE_LIST + TYPE + SIMPLE_TYPE + REFERENCE_EXPRESSION + ID + PsiElement(IDENTIFIER)('num') + PsiElement(>)('>') + PsiElement(.)('.') + PsiElement(new)('new') + ARGUMENTS + PsiElement(()('(') + ARGUMENT_LIST + LITERAL_EXPRESSION + PsiElement(NUMBER)('0') + PsiElement())(')') + PsiElement(;)(';') + PsiComment(SINGLE_LINE_COMMENT)('// Same as `C(0);`.') + VAR_DECLARATION_LIST + VAR_ACCESS_DECLARATION + PsiElement(var)('var') + COMPONENT_NAME + ID + PsiElement(IDENTIFIER)('f1') + VAR_INIT + PsiElement(=)('=') + REFERENCE_EXPRESSION + REFERENCE_EXPRESSION + ID + PsiElement(IDENTIFIER)('C') + PsiElement(.)('.') + PsiElement(new)('new') + PsiElement(;)(';') + PsiComment(SINGLE_LINE_COMMENT)('// New tear-off, not expressible without `.new`.') + VAR_DECLARATION_LIST + VAR_ACCESS_DECLARATION + PsiElement(var)('var') + COMPONENT_NAME + ID + PsiElement(IDENTIFIER)('f2') + VAR_INIT + PsiElement(=)('=') + COMPARE_EXPRESSION + REFERENCE_EXPRESSION + ID + PsiElement(IDENTIFIER)('C') + RELATIONAL_OPERATOR + PsiElement(<)('<') + REFERENCE_EXPRESSION + ID + PsiElement(IDENTIFIER)('num') + PsiErrorElement:',' or ';' expected, got '>' + + PsiElement(>)('>') + PsiElement(.)('.') + PsiElement(new)('new') + PsiElement(;)(';') + PsiComment(SINGLE_LINE_COMMENT)('// New tear-off, not expressible without `.new`.') + PsiElement(})('}') \ No newline at end of file diff --git a/Dart/testSrc/com/jetbrains/lang/dart/parser/DartParsingTest.java b/Dart/testSrc/com/jetbrains/lang/dart/parser/DartParsingTest.java index 9d77d14a2f5..6eef6c0f596 100644 --- a/Dart/testSrc/com/jetbrains/lang/dart/parser/DartParsingTest.java +++ b/Dart/testSrc/com/jetbrains/lang/dart/parser/DartParsingTest.java @@ -1,4 +1,4 @@ -// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.jetbrains.lang.dart.parser; import com.intellij.testFramework.ParsingTestCase; @@ -41,6 +41,10 @@ public void testConstructors() { doTest(); } + public void testConstructorTearoffs() { + doTest(); + } + public void testEnum() { doTest(); }