// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'package:analyzer/dart/ast/ast.dart'; import 'package:analyzer/dart/ast/token.dart'; import 'package:test_reflective_loader/test_reflective_loader.dart'; import '../src/dart/resolution/node_text_expectations.dart'; import '../src/diagnostics/parser_diagnostics.dart'; main() { defineReflectiveSuite(() { defineReflectiveTests(ExpressionParserTest); defineReflectiveTests(UpdateNodeTextExpectations); }); } @reflectiveTest class ExpressionParserTest extends ParserDiagnosticsTest { void test_binaryExpression_allOperators() { // https://github.com/dart-lang/sdk/issues/36255 for (var type in TokenType.all) { if (type.precedence <= 0) { continue; } parseTestCodeIgnoringDiagnostics('var x = a ${type.lexeme} b;'); } } void test_invalidExpression_37706() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = (); // ^ // [diag.expectedToken] Expected to find '>'. // ^ // [diag.unexpectedToken] Unexpected text ';'. // [diag.missingFunctionBody] A function body must be provided. // [diag.expectedToken] Expected to find ';'. '''); var node = parseResult.findNode.unit; assertParsedNodeText(node, r''' CompilationUnit declarations TopLevelVariableDeclaration variables: VariableDeclarationList keyword: var variables VariableDeclaration name: v equals: = initializer: FunctionExpression typeParameters: TypeParameterList leftBracket: < typeParameters TypeParameter name: b rightBracket: > parameters: FormalParameterList leftParenthesis: ( rightParenthesis: ) body: EmptyFunctionBody semicolon: ; semicolon: ; '''); } void test_listLiteral_invalid_assert() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = n=<.["$assert; // ^ // [diag.expectedTypeName] Expected a type name. // ^ // [diag.expectedTypeName] Expected a type name. // ^^^^^^ // [diag.expectedIdentifierButGotKeyword] 'assert' can't be used as an identifier because it's a keyword. // ^ // [diag.expectedToken] Expected to find ';'. // [diag.unterminatedStringLiteral] Unterminated string literal. // [diag.expectedToken][column 23][length 1] Expected to find ']'. '''); var node = parseResult.findNode.unit; assertParsedNodeText(node, r''' CompilationUnit declarations TopLevelVariableDeclaration variables: VariableDeclarationList keyword: var variables VariableDeclaration name: v equals: = initializer: AssignmentExpression leftHandSide: SimpleIdentifier token: n operator: = rightHandSide: ListLiteral typeArguments: TypeArgumentList leftBracket: < arguments NamedType importPrefix: ImportPrefixReference name: period: . name: rightBracket: > leftBracket: [ elements StringInterpolation elements InterpolationString contents: " InterpolationExpression leftBracket: $ expression: SimpleIdentifier token: assert InterpolationString contents: ;" stringValue: null rightBracket: ] semicolon: ; '''); } void test_listLiteral_invalidElement_37697() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = [(){}]; // ^ // [diag.expectedTypeName] Expected a type name. // ^ // [diag.expectedToken] Expected to find '>'. '''); var node = parseResult.findNode.unit; assertParsedNodeText(node, r''' CompilationUnit declarations TopLevelVariableDeclaration variables: VariableDeclarationList keyword: var variables VariableDeclaration name: v equals: = initializer: ListLiteral leftBracket: [ elements SetOrMapLiteral typeArguments: TypeArgumentList leftBracket: < arguments NamedType importPrefix: ImportPrefixReference name: y period: . name: typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: z rightBracket: > rightBracket: > leftBracket: { rightBracket: } isMap: false rightBracket: ] semicolon: ; '''); } void test_lt_dot_bracket_quote() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = <.["; // ^ // [diag.expectedTypeName] Expected a type name. // ^ // [diag.expectedTypeName] Expected a type name. // ^^ // [diag.expectedToken] Expected to find ';'. // ^ // [diag.unterminatedStringLiteral] Unterminated string literal. // [diag.expectedToken][column 14][length 1] Expected to find ']'. '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' ListLiteral typeArguments: TypeArgumentList leftBracket: < arguments NamedType importPrefix: ImportPrefixReference name: period: . name: rightBracket: > leftBracket: [ elements SimpleStringLiteral literal: ";" rightBracket: ] '''); } void test_lt_dot_listLiteral() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = <.[]; // ^ // [diag.expectedTypeName] Expected a type name. // ^^ // [diag.expectedTypeName] Expected a type name. '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' ListLiteral typeArguments: TypeArgumentList leftBracket: < arguments NamedType importPrefix: ImportPrefixReference name: period: . name: rightBracket: > leftBracket: [ rightBracket: ] '''); } void test_mapLiteral() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = {3: 6}; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SetOrMapLiteral leftBracket: { elements MapLiteralEntry key: IntegerLiteral literal: 3 separator: : value: IntegerLiteral literal: 6 rightBracket: } isMap: false '''); } void test_mapLiteral_const() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = const {3: 6}; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SetOrMapLiteral constKeyword: const leftBracket: { elements MapLiteralEntry key: IntegerLiteral literal: 3 separator: : value: IntegerLiteral literal: 6 rightBracket: } isMap: false '''); } @skippedTest // TODO(scheglov): fix it void test_mapLiteral_invalid_too_many_type_arguments1() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = {}; // ^^^ // [diag.expectedToken] Expected to find '>'. '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SetOrMapLiteral typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: int NamedType name: int NamedType name: int rightBracket: > leftBracket: { rightBracket: } isMap: false '''); } @skippedTest // TODO(scheglov): fix it void test_mapLiteral_invalid_too_many_type_arguments2() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = {1}; // ^^^ // [diag.expectedToken] Expected to find '>'. '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SetOrMapLiteral typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: int NamedType name: int NamedType name: int rightBracket: > leftBracket: { elements IntegerLiteral literal: 1 rightBracket: } isMap: false '''); } void test_namedArgument() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = m(a: 1, b: 2); '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' MethodInvocation methodName: SimpleIdentifier token: m argumentList: ArgumentList leftParenthesis: ( arguments NamedArgument name: a colon: : argumentExpression: IntegerLiteral literal: 1 NamedArgument name: b colon: : argumentExpression: IntegerLiteral literal: 2 rightParenthesis: ) '''); } void test_nullableTypeInStringInterpolations_as_48999() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = ${i as int?}; // ^ // [diag.expectedToken] Expected to find ';'. // ^ // [diag.expectedExecutable] Expected a method, getter, setter or operator declaration. // ^ // [diag.unexpectedToken] Unexpected text ';'. '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SimpleIdentifier token: $ '''); } void test_nullableTypeInStringInterpolations_is_48999() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = ${i is int?}; // ^ // [diag.expectedToken] Expected to find ';'. // ^ // [diag.expectedExecutable] Expected a method, getter, setter or operator declaration. // ^ // [diag.unexpectedToken] Unexpected text ';'. '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SimpleIdentifier token: $ '''); } void test_parseAdditiveExpression_normal() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x + y; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' BinaryExpression leftOperand: SimpleIdentifier token: x operator: + rightOperand: SimpleIdentifier token: y '''); } void test_parseAdditiveExpression_super() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = super + y; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' BinaryExpression leftOperand: SuperExpression superKeyword: super operator: + rightOperand: SimpleIdentifier token: y '''); } void test_parseAssignableExpression_expression_args_dot() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = (x)(y).z; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' PropertyAccess target: FunctionExpressionInvocation function: ParenthesizedExpression leftParenthesis: ( expression: SimpleIdentifier token: x rightParenthesis: ) argumentList: ArgumentList leftParenthesis: ( arguments SimpleIdentifier token: y rightParenthesis: ) operator: . propertyName: SimpleIdentifier token: z '''); } void test_parseAssignableExpression_expression_args_dot_typeArguments() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = (x)(y).z; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' PropertyAccess target: FunctionExpressionInvocation function: ParenthesizedExpression leftParenthesis: ( expression: SimpleIdentifier token: x rightParenthesis: ) typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: F rightBracket: > argumentList: ArgumentList leftParenthesis: ( arguments SimpleIdentifier token: y rightParenthesis: ) operator: . propertyName: SimpleIdentifier token: z '''); } void test_parseAssignableExpression_expression_dot() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = (x).y; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' PropertyAccess target: ParenthesizedExpression leftParenthesis: ( expression: SimpleIdentifier token: x rightParenthesis: ) operator: . propertyName: SimpleIdentifier token: y '''); } void test_parseAssignableExpression_expression_index() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = (x)[y]; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' IndexExpression target: ParenthesizedExpression leftParenthesis: ( expression: SimpleIdentifier token: x rightParenthesis: ) leftBracket: [ index: SimpleIdentifier token: y rightBracket: ] '''); } void test_parseAssignableExpression_expression_question_dot() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = (x)?.y; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' PropertyAccess target: ParenthesizedExpression leftParenthesis: ( expression: SimpleIdentifier token: x rightParenthesis: ) operator: ?. propertyName: SimpleIdentifier token: y '''); } void test_parseAssignableExpression_identifier() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SimpleIdentifier token: x '''); } void test_parseAssignableExpression_identifier_args_dot() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x(y).z; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' PropertyAccess target: MethodInvocation methodName: SimpleIdentifier token: x argumentList: ArgumentList leftParenthesis: ( arguments SimpleIdentifier token: y rightParenthesis: ) operator: . propertyName: SimpleIdentifier token: z '''); } void test_parseAssignableExpression_identifier_args_dot_typeArguments() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x(y).z; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' PropertyAccess target: MethodInvocation methodName: SimpleIdentifier token: x typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: E rightBracket: > argumentList: ArgumentList leftParenthesis: ( arguments SimpleIdentifier token: y rightParenthesis: ) operator: . propertyName: SimpleIdentifier token: z '''); } void test_parseAssignableExpression_identifier_dot() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x.y; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' PrefixedIdentifier prefix: SimpleIdentifier token: x period: . identifier: SimpleIdentifier token: y '''); } void test_parseAssignableExpression_identifier_index() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x[y]; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' IndexExpression target: SimpleIdentifier token: x leftBracket: [ index: SimpleIdentifier token: y rightBracket: ] '''); } void test_parseAssignableExpression_identifier_question_dot() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x?.y; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' PropertyAccess target: SimpleIdentifier token: x operator: ?. propertyName: SimpleIdentifier token: y '''); } void test_parseAssignableExpression_super_dot() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = super.y; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' PropertyAccess target: SuperExpression superKeyword: super operator: . propertyName: SimpleIdentifier token: y '''); } void test_parseAssignableExpression_super_index() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = super[y]; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' IndexExpression target: SuperExpression superKeyword: super leftBracket: [ index: SimpleIdentifier token: y rightBracket: ] '''); } void test_parseAssignableSelector_dot() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x.x; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' PrefixedIdentifier prefix: SimpleIdentifier token: x period: . identifier: SimpleIdentifier token: x '''); } void test_parseAssignableSelector_index() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x[x]; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' IndexExpression target: SimpleIdentifier token: x leftBracket: [ index: SimpleIdentifier token: x rightBracket: ] '''); } void test_parseAssignableSelector_none() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SimpleIdentifier token: x '''); } void test_parseAssignableSelector_question_dot() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x?.x; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' PropertyAccess target: SimpleIdentifier token: x operator: ?. propertyName: SimpleIdentifier token: x '''); } void test_parseAwaitExpression() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = await x; // ^^^^^ // [diag.awaitInWrongContext] The await expression can only be used in an async function. '''); var node = parseResult.findNode.singleAwaitExpression; assertParsedNodeText(node, r''' AwaitExpression awaitKeyword: await expression: SimpleIdentifier token: x '''); } void test_parseBitwiseAndExpression_normal() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x & y; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' BinaryExpression leftOperand: SimpleIdentifier token: x operator: & rightOperand: SimpleIdentifier token: y '''); } void test_parseBitwiseAndExpression_super() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = super & y; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' BinaryExpression leftOperand: SuperExpression superKeyword: super operator: & rightOperand: SimpleIdentifier token: y '''); } void test_parseBitwiseOrExpression_normal() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x | y; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' BinaryExpression leftOperand: SimpleIdentifier token: x operator: | rightOperand: SimpleIdentifier token: y '''); } void test_parseBitwiseOrExpression_super() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = super | y; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' BinaryExpression leftOperand: SuperExpression superKeyword: super operator: | rightOperand: SimpleIdentifier token: y '''); } void test_parseBitwiseXorExpression_normal() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x ^ y; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' BinaryExpression leftOperand: SimpleIdentifier token: x operator: ^ rightOperand: SimpleIdentifier token: y '''); } void test_parseBitwiseXorExpression_super() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = super ^ y; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' BinaryExpression leftOperand: SuperExpression superKeyword: super operator: ^ rightOperand: SimpleIdentifier token: y '''); } void test_parseCascadeSection_i() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = null..[i]; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' CascadeExpression target: NullLiteral literal: null cascadeSections IndexExpression period: .. leftBracket: [ index: SimpleIdentifier token: i rightBracket: ] '''); } void test_parseCascadeSection_ia() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = null..[i](b); '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' CascadeExpression target: NullLiteral literal: null cascadeSections FunctionExpressionInvocation function: IndexExpression period: .. leftBracket: [ index: SimpleIdentifier token: i rightBracket: ] argumentList: ArgumentList leftParenthesis: ( arguments SimpleIdentifier token: b rightParenthesis: ) '''); } void test_parseCascadeSection_ia_typeArguments() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = null..[i](b); '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' CascadeExpression target: NullLiteral literal: null cascadeSections FunctionExpressionInvocation function: IndexExpression period: .. leftBracket: [ index: SimpleIdentifier token: i rightBracket: ] typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: E rightBracket: > argumentList: ArgumentList leftParenthesis: ( arguments SimpleIdentifier token: b rightParenthesis: ) '''); } void test_parseCascadeSection_ii() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = null..a(b).c(d); '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' CascadeExpression target: NullLiteral literal: null cascadeSections MethodInvocation target: MethodInvocation operator: .. methodName: SimpleIdentifier token: a argumentList: ArgumentList leftParenthesis: ( arguments SimpleIdentifier token: b rightParenthesis: ) operator: . methodName: SimpleIdentifier token: c argumentList: ArgumentList leftParenthesis: ( arguments SimpleIdentifier token: d rightParenthesis: ) '''); } void test_parseCascadeSection_ii_typeArguments() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = null..a(b).c(d); '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' CascadeExpression target: NullLiteral literal: null cascadeSections MethodInvocation target: MethodInvocation operator: .. methodName: SimpleIdentifier token: a typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: E rightBracket: > argumentList: ArgumentList leftParenthesis: ( arguments SimpleIdentifier token: b rightParenthesis: ) operator: . methodName: SimpleIdentifier token: c typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: F rightBracket: > argumentList: ArgumentList leftParenthesis: ( arguments SimpleIdentifier token: d rightParenthesis: ) '''); } void test_parseCascadeSection_p() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = null..a; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' CascadeExpression target: NullLiteral literal: null cascadeSections PropertyAccess operator: .. propertyName: SimpleIdentifier token: a '''); } void test_parseCascadeSection_p_assign() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = null..a = 3; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' CascadeExpression target: NullLiteral literal: null cascadeSections AssignmentExpression leftHandSide: PropertyAccess operator: .. propertyName: SimpleIdentifier token: a operator: = rightHandSide: IntegerLiteral literal: 3 '''); } void test_parseCascadeSection_p_assign_withCascade() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = null ..a = 3 ..m(); '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' CascadeExpression target: NullLiteral literal: null cascadeSections AssignmentExpression leftHandSide: PropertyAccess operator: .. propertyName: SimpleIdentifier token: a operator: = rightHandSide: IntegerLiteral literal: 3 MethodInvocation operator: .. methodName: SimpleIdentifier token: m argumentList: ArgumentList leftParenthesis: ( rightParenthesis: ) '''); } void test_parseCascadeSection_p_assign_withCascade_typeArguments() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = null ..a = 3 ..m(); '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' CascadeExpression target: NullLiteral literal: null cascadeSections AssignmentExpression leftHandSide: PropertyAccess operator: .. propertyName: SimpleIdentifier token: a operator: = rightHandSide: IntegerLiteral literal: 3 MethodInvocation operator: .. methodName: SimpleIdentifier token: m typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: E rightBracket: > argumentList: ArgumentList leftParenthesis: ( rightParenthesis: ) '''); } void test_parseCascadeSection_p_builtIn() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = null..as; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' CascadeExpression target: NullLiteral literal: null cascadeSections PropertyAccess operator: .. propertyName: SimpleIdentifier token: as '''); } void test_parseCascadeSection_pa() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = null..a(b); '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' CascadeExpression target: NullLiteral literal: null cascadeSections MethodInvocation operator: .. methodName: SimpleIdentifier token: a argumentList: ArgumentList leftParenthesis: ( arguments SimpleIdentifier token: b rightParenthesis: ) '''); } void test_parseCascadeSection_pa_typeArguments() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = null..a(b); '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' CascadeExpression target: NullLiteral literal: null cascadeSections MethodInvocation operator: .. methodName: SimpleIdentifier token: a typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: E rightBracket: > argumentList: ArgumentList leftParenthesis: ( arguments SimpleIdentifier token: b rightParenthesis: ) '''); } void test_parseCascadeSection_paa() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = null..a(b)(c); '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' CascadeExpression target: NullLiteral literal: null cascadeSections FunctionExpressionInvocation function: MethodInvocation operator: .. methodName: SimpleIdentifier token: a argumentList: ArgumentList leftParenthesis: ( arguments SimpleIdentifier token: b rightParenthesis: ) argumentList: ArgumentList leftParenthesis: ( arguments SimpleIdentifier token: c rightParenthesis: ) '''); } void test_parseCascadeSection_paa_typeArguments() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = null..a(b)(c); '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' CascadeExpression target: NullLiteral literal: null cascadeSections FunctionExpressionInvocation function: MethodInvocation operator: .. methodName: SimpleIdentifier token: a typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: E rightBracket: > argumentList: ArgumentList leftParenthesis: ( arguments SimpleIdentifier token: b rightParenthesis: ) typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: F rightBracket: > argumentList: ArgumentList leftParenthesis: ( arguments SimpleIdentifier token: c rightParenthesis: ) '''); } void test_parseCascadeSection_paapaa() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = null..a(b)(c).d(e)(f); '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' CascadeExpression target: NullLiteral literal: null cascadeSections FunctionExpressionInvocation function: MethodInvocation target: FunctionExpressionInvocation function: MethodInvocation operator: .. methodName: SimpleIdentifier token: a argumentList: ArgumentList leftParenthesis: ( arguments SimpleIdentifier token: b rightParenthesis: ) argumentList: ArgumentList leftParenthesis: ( arguments SimpleIdentifier token: c rightParenthesis: ) operator: . methodName: SimpleIdentifier token: d argumentList: ArgumentList leftParenthesis: ( arguments SimpleIdentifier token: e rightParenthesis: ) argumentList: ArgumentList leftParenthesis: ( arguments SimpleIdentifier token: f rightParenthesis: ) '''); } void test_parseCascadeSection_paapaa_typeArguments() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = null..a(b)(c).d(e)(f); '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' CascadeExpression target: NullLiteral literal: null cascadeSections FunctionExpressionInvocation function: MethodInvocation target: FunctionExpressionInvocation function: MethodInvocation operator: .. methodName: SimpleIdentifier token: a typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: E rightBracket: > argumentList: ArgumentList leftParenthesis: ( arguments SimpleIdentifier token: b rightParenthesis: ) typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: F rightBracket: > argumentList: ArgumentList leftParenthesis: ( arguments SimpleIdentifier token: c rightParenthesis: ) operator: . methodName: SimpleIdentifier token: d typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: G rightBracket: > argumentList: ArgumentList leftParenthesis: ( arguments SimpleIdentifier token: e rightParenthesis: ) typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: H rightBracket: > argumentList: ArgumentList leftParenthesis: ( arguments SimpleIdentifier token: f rightParenthesis: ) '''); } void test_parseCascadeSection_pap() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = null..a(b).c; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' CascadeExpression target: NullLiteral literal: null cascadeSections PropertyAccess target: MethodInvocation operator: .. methodName: SimpleIdentifier token: a argumentList: ArgumentList leftParenthesis: ( arguments SimpleIdentifier token: b rightParenthesis: ) operator: . propertyName: SimpleIdentifier token: c '''); } void test_parseCascadeSection_pap_typeArguments() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = null..a(b).c; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' CascadeExpression target: NullLiteral literal: null cascadeSections PropertyAccess target: MethodInvocation operator: .. methodName: SimpleIdentifier token: a typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: E rightBracket: > argumentList: ArgumentList leftParenthesis: ( arguments SimpleIdentifier token: b rightParenthesis: ) operator: . propertyName: SimpleIdentifier token: c '''); } void test_parseConditionalExpression() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x ? y : z; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' ConditionalExpression condition: SimpleIdentifier token: x question: ? thenExpression: SimpleIdentifier token: y colon: : elseExpression: SimpleIdentifier token: z '''); } void test_parseConstExpression_instanceCreation() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = const A(); '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' InstanceCreationExpression keyword: const constructorName: ConstructorName type: NamedType name: A argumentList: ArgumentList leftParenthesis: ( rightParenthesis: ) '''); } void test_parseConstExpression_listLiteral_typed() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = const []; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' ListLiteral constKeyword: const typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: A rightBracket: > leftBracket: [ rightBracket: ] '''); } void test_parseConstExpression_listLiteral_untyped() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = const []; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' ListLiteral constKeyword: const leftBracket: [ rightBracket: ] '''); } void test_parseConstExpression_mapLiteral_typed() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = const {}; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SetOrMapLiteral constKeyword: const typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: A NamedType name: B rightBracket: > leftBracket: { rightBracket: } isMap: false '''); } void test_parseConstExpression_mapLiteral_typed_missingGt() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = const '. '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SetOrMapLiteral constKeyword: const typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: A NamedType name: B rightBracket: > leftBracket: { rightBracket: } isMap: false '''); } void test_parseConstExpression_mapLiteral_untyped() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = const {}; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SetOrMapLiteral constKeyword: const leftBracket: { rightBracket: } isMap: false '''); } void test_parseConstructorInitializer_functionExpression() { var parseResult = parseTestCodeWithDiagnostics(r''' class C { C.n() : this()(); } // ^^^^^^^^ // [diag.invalidInitializer] Not a valid initializer. '''); var node = parseResult.findNode.unit; assertParsedNodeText(node, r''' CompilationUnit declarations ClassDeclaration classKeyword: class namePart: NameWithTypeParameters typeName: C body: BlockClassBody leftBracket: { members ConstructorDeclaration typeName: SimpleIdentifier token: C period: . name: n parameters: FormalParameterList leftParenthesis: ( rightParenthesis: ) separator: : body: EmptyFunctionBody semicolon: ; rightBracket: } '''); } void test_parseEqualityExpression_normal() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x == y; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' BinaryExpression leftOperand: SimpleIdentifier token: x operator: == rightOperand: SimpleIdentifier token: y '''); } void test_parseEqualityExpression_super() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = super == y; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' BinaryExpression leftOperand: SuperExpression superKeyword: super operator: == rightOperand: SimpleIdentifier token: y '''); } void test_parseExpression_assign() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x = y; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' AssignmentExpression leftHandSide: SimpleIdentifier token: x operator: = rightHandSide: SimpleIdentifier token: y '''); } void test_parseExpression_assign_compound() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x ||= y; // ^^^^ // [diag.missingAssignableSelector] Missing selector such as '.identifier' or '[0]'. // ^ // [diag.missingIdentifier] Expected an identifier. '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' AssignmentExpression leftHandSide: BinaryExpression leftOperand: SimpleIdentifier token: x operator: || rightOperand: SimpleIdentifier token: operator: = rightHandSide: SimpleIdentifier token: y '''); } void test_parseExpression_comparison() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = --a.b == c; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' BinaryExpression leftOperand: PrefixExpression operator: -- operand: PrefixedIdentifier prefix: SimpleIdentifier token: a period: . identifier: SimpleIdentifier token: b operator: == rightOperand: SimpleIdentifier token: c '''); } void test_parseExpression_constAndTypeParameters() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = const ; // ^ // [diag.expectedToken] Expected to find '['. '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' ListLiteral constKeyword: const typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: E rightBracket: > leftBracket: [ rightBracket: ] '''); } void test_parseExpression_function_async() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = () async {}; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' FunctionExpression parameters: FormalParameterList leftParenthesis: ( rightParenthesis: ) body: BlockFunctionBody keyword: async block: Block leftBracket: { rightBracket: } '''); } void test_parseExpression_function_asyncStar() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = () async* {}; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' FunctionExpression parameters: FormalParameterList leftParenthesis: ( rightParenthesis: ) body: BlockFunctionBody keyword: async star: * block: Block leftBracket: { rightBracket: } '''); } void test_parseExpression_function_sync() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = () {}; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' FunctionExpression parameters: FormalParameterList leftParenthesis: ( rightParenthesis: ) body: BlockFunctionBody block: Block leftBracket: { rightBracket: } '''); } void test_parseExpression_function_syncStar() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = () sync* {}; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' FunctionExpression parameters: FormalParameterList leftParenthesis: ( rightParenthesis: ) body: BlockFunctionBody keyword: sync star: * block: Block leftBracket: { rightBracket: } '''); } void test_parseExpression_invokeFunctionExpression() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = (a) { return a + a; }(3); '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' FunctionExpressionInvocation function: FunctionExpression parameters: FormalParameterList leftParenthesis: ( parameter: RegularFormalParameter name: a rightParenthesis: ) body: BlockFunctionBody block: Block leftBracket: { statements ReturnStatement returnKeyword: return expression: BinaryExpression leftOperand: SimpleIdentifier token: a operator: + rightOperand: SimpleIdentifier token: a semicolon: ; rightBracket: } argumentList: ArgumentList leftParenthesis: ( arguments IntegerLiteral literal: 3 rightParenthesis: ) '''); } void test_parseExpression_nonAwait() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = await(); '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' MethodInvocation methodName: SimpleIdentifier token: await argumentList: ArgumentList leftParenthesis: ( rightParenthesis: ) '''); } void test_parseExpression_sendWithTypeParam_afterIndex() { var parseResult = parseTestCodeWithDiagnostics(r''' main() { factories[C](); } '''); var node = parseResult.findNode.unit; assertParsedNodeText(node, r''' CompilationUnit declarations FunctionDeclaration name: main functionExpression: FunctionExpression parameters: FormalParameterList leftParenthesis: ( rightParenthesis: ) body: BlockFunctionBody block: Block leftBracket: { statements ExpressionStatement expression: FunctionExpressionInvocation function: IndexExpression target: SimpleIdentifier token: factories leftBracket: [ index: SimpleIdentifier token: C rightBracket: ] typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: num NamedType name: int rightBracket: > argumentList: ArgumentList leftParenthesis: ( rightParenthesis: ) semicolon: ; rightBracket: } '''); } void test_parseExpression_sendWithTypeParam_afterSend() { var parseResult = parseTestCodeWithDiagnostics(r''' main() { factories(C)(); } '''); var node = parseResult.findNode.unit; assertParsedNodeText(node, r''' CompilationUnit declarations FunctionDeclaration name: main functionExpression: FunctionExpression parameters: FormalParameterList leftParenthesis: ( rightParenthesis: ) body: BlockFunctionBody block: Block leftBracket: { statements ExpressionStatement expression: FunctionExpressionInvocation function: MethodInvocation methodName: SimpleIdentifier token: factories argumentList: ArgumentList leftParenthesis: ( arguments SimpleIdentifier token: C rightParenthesis: ) typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: num NamedType name: int rightBracket: > argumentList: ArgumentList leftParenthesis: ( rightParenthesis: ) semicolon: ; rightBracket: } '''); } void test_parseExpression_superMethodInvocation() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = super.m(); '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' MethodInvocation target: SuperExpression superKeyword: super operator: . methodName: SimpleIdentifier token: m argumentList: ArgumentList leftParenthesis: ( rightParenthesis: ) '''); } void test_parseExpression_superMethodInvocation_typeArguments() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = super.m(); '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' MethodInvocation target: SuperExpression superKeyword: super operator: . methodName: SimpleIdentifier token: m typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: E rightBracket: > argumentList: ArgumentList leftParenthesis: ( rightParenthesis: ) '''); } void test_parseExpression_superMethodInvocation_typeArguments_chained() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = super.b.c(); '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' MethodInvocation target: PropertyAccess target: SuperExpression superKeyword: super operator: . propertyName: SimpleIdentifier token: b operator: . methodName: SimpleIdentifier token: c typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: D rightBracket: > argumentList: ArgumentList leftParenthesis: ( rightParenthesis: ) '''); } void test_parseExpressionList_multiple() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = [1, 2, 3]; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' ListLiteral leftBracket: [ elements IntegerLiteral literal: 1 IntegerLiteral literal: 2 IntegerLiteral literal: 3 rightBracket: ] '''); } void test_parseExpressionList_single() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = [1]; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' ListLiteral leftBracket: [ elements IntegerLiteral literal: 1 rightBracket: ] '''); } void test_parseExpressionWithoutCascade_assign() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x = y; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' AssignmentExpression leftHandSide: SimpleIdentifier token: x operator: = rightHandSide: SimpleIdentifier token: y '''); } void test_parseExpressionWithoutCascade_comparison() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = --a.b == c; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' BinaryExpression leftOperand: PrefixExpression operator: -- operand: PrefixedIdentifier prefix: SimpleIdentifier token: a period: . identifier: SimpleIdentifier token: b operator: == rightOperand: SimpleIdentifier token: c '''); } void test_parseExpressionWithoutCascade_superMethodInvocation() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = super.m(); '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' MethodInvocation target: SuperExpression superKeyword: super operator: . methodName: SimpleIdentifier token: m argumentList: ArgumentList leftParenthesis: ( rightParenthesis: ) '''); } void test_parseExpressionWithoutCascade_superMethodInvocation_typeArguments() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = super.m(); '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' MethodInvocation target: SuperExpression superKeyword: super operator: . methodName: SimpleIdentifier token: m typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: E rightBracket: > argumentList: ArgumentList leftParenthesis: ( rightParenthesis: ) '''); } void test_parseFunctionExpression_body_inExpression() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = (int i) => i++; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' FunctionExpression parameters: FormalParameterList leftParenthesis: ( parameter: RegularFormalParameter type: NamedType name: int name: i rightParenthesis: ) body: ExpressionFunctionBody functionDefinition: => expression: PostfixExpression operand: SimpleIdentifier token: i operator: ++ '''); } void test_parseFunctionExpression_constAndTypeParameters2() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = const (E i) => i++; // ^^^^^ // [diag.unexpectedToken] Unexpected text 'const'. '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' FunctionExpression typeParameters: TypeParameterList leftBracket: < typeParameters TypeParameter name: E rightBracket: > parameters: FormalParameterList leftParenthesis: ( parameter: RegularFormalParameter type: NamedType name: E name: i rightParenthesis: ) body: ExpressionFunctionBody functionDefinition: => expression: PostfixExpression operand: SimpleIdentifier token: i operator: ++ '''); } void test_parseFunctionExpression_functionInPlaceOfTypeName() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = [0, 1, 2]; // ^^^^ // [diag.expectedToken] Expected to find '>'. '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' ListLiteral typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: test rightBracket: > leftBracket: [ elements IntegerLiteral literal: 0 IntegerLiteral literal: 1 IntegerLiteral literal: 2 rightBracket: ] '''); } void test_parseFunctionExpression_typeParameters() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = (E i) => i++; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' FunctionExpression typeParameters: TypeParameterList leftBracket: < typeParameters TypeParameter name: E rightBracket: > parameters: FormalParameterList leftParenthesis: ( parameter: RegularFormalParameter type: NamedType name: E name: i rightParenthesis: ) body: ExpressionFunctionBody functionDefinition: => expression: PostfixExpression operand: SimpleIdentifier token: i operator: ++ '''); } void test_parseInstanceCreationExpression_qualifiedType() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = new $token; // ^^^^^^ // [diag.expectedToken] Expected to find '('. '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' InstanceCreationExpression keyword: new constructorName: ConstructorName type: NamedType name: $token argumentList: ArgumentList leftParenthesis: ( rightParenthesis: ) '''); } void test_parseInstanceCreationExpression_qualifiedType_named() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = new $token; // ^^^^^^ // [diag.expectedToken] Expected to find '('. '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' InstanceCreationExpression keyword: new constructorName: ConstructorName type: NamedType name: $token argumentList: ArgumentList leftParenthesis: ( rightParenthesis: ) '''); } void test_parseInstanceCreationExpression_qualifiedType_named_typeArguments() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = new $token; // ^^^^^^ // [diag.expectedToken] Expected to find '('. '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' InstanceCreationExpression keyword: new constructorName: ConstructorName type: NamedType name: $token argumentList: ArgumentList leftParenthesis: ( rightParenthesis: ) '''); } void test_parseInstanceCreationExpression_qualifiedType_typeArguments() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = new $token; // ^^^^^^ // [diag.expectedToken] Expected to find '('. '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' InstanceCreationExpression keyword: new constructorName: ConstructorName type: NamedType name: $token argumentList: ArgumentList leftParenthesis: ( rightParenthesis: ) '''); } void test_parseInstanceCreationExpression_type() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = new $token; // ^^^^^^ // [diag.expectedToken] Expected to find '('. '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' InstanceCreationExpression keyword: new constructorName: ConstructorName type: NamedType name: $token argumentList: ArgumentList leftParenthesis: ( rightParenthesis: ) '''); } void test_parseInstanceCreationExpression_type_named() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = new $token; // ^^^^^^ // [diag.expectedToken] Expected to find '('. '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' InstanceCreationExpression keyword: new constructorName: ConstructorName type: NamedType name: $token argumentList: ArgumentList leftParenthesis: ( rightParenthesis: ) '''); } void test_parseInstanceCreationExpression_type_named_typeArguments() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = new $token; // ^^^^^^ // [diag.expectedToken] Expected to find '('. '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' InstanceCreationExpression keyword: new constructorName: ConstructorName type: NamedType name: $token argumentList: ArgumentList leftParenthesis: ( rightParenthesis: ) '''); } void test_parseInstanceCreationExpression_type_named_typeArguments_34403() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = new a.b.c(); // ^ // [diag.constructorWithTypeArguments] A constructor invocation can't have type arguments after the constructor name. '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' InstanceCreationExpression keyword: new constructorName: ConstructorName type: NamedType importPrefix: ImportPrefixReference name: a period: . name: b period: . name: SimpleIdentifier token: c typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: C rightBracket: > argumentList: ArgumentList leftParenthesis: ( rightParenthesis: ) '''); } void test_parseInstanceCreationExpression_type_typeArguments() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = new $token; // ^^^^^^ // [diag.expectedToken] Expected to find '('. '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' InstanceCreationExpression keyword: new constructorName: ConstructorName type: NamedType name: $token argumentList: ArgumentList leftParenthesis: ( rightParenthesis: ) '''); } void test_parseListLiteral_empty_oneToken() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = []; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' ListLiteral leftBracket: [ rightBracket: ] '''); } void test_parseListLiteral_empty_oneToken_withComment() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = /* 0 */ []; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' ListLiteral leftBracket: [ rightBracket: ] '''); } void test_parseListLiteral_empty_twoTokens() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = []; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' ListLiteral leftBracket: [ rightBracket: ] '''); } void test_parseListLiteral_multiple() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = [1, 2, 3]; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' ListLiteral leftBracket: [ elements IntegerLiteral literal: 1 IntegerLiteral literal: 2 IntegerLiteral literal: 3 rightBracket: ] '''); } void test_parseListLiteral_single() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = [1]; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' ListLiteral leftBracket: [ elements IntegerLiteral literal: 1 rightBracket: ] '''); } void test_parseListLiteral_single_withTypeArgument() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = [1]; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' ListLiteral typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: int rightBracket: > leftBracket: [ elements IntegerLiteral literal: 1 rightBracket: ] '''); } void test_parseListOrMapLiteral_list_noType() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = [1][1]; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' IndexExpression target: ListLiteral leftBracket: [ elements IntegerLiteral literal: 1 rightBracket: ] leftBracket: [ index: IntegerLiteral literal: 1 rightBracket: ] '''); } void test_parseListOrMapLiteral_list_type() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = [1] [1]; // ^ // [diag.equalityCannotBeEqualityOperand] A comparison expression can't be an operand of another comparison expression. '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' BinaryExpression leftOperand: BinaryExpression leftOperand: ListLiteral typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: int rightBracket: > leftBracket: [ elements IntegerLiteral literal: 1 rightBracket: ] operator: < rightOperand: SimpleIdentifier token: int operator: > rightOperand: ListLiteral leftBracket: [ elements IntegerLiteral literal: 1 rightBracket: ] '''); } void test_parseListOrMapLiteral_map_noType() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = {'1' : 1} {'1' : 1}; // ^ // [diag.expectedToken] Expected to find ';'. // ^ // [diag.expectedExecutable] Expected a method, getter, setter or operator declaration. // ^ // [diag.unexpectedToken] Unexpected text ';'. '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SetOrMapLiteral leftBracket: { elements MapLiteralEntry key: SimpleStringLiteral literal: '1' separator: : value: IntegerLiteral literal: 1 rightBracket: } isMap: false '''); } void test_parseListOrMapLiteral_map_type() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = {'1' : 1} {'1' : 1}; // ^^^ // [diag.expectedToken] Expected to find ';'. // ^ // [diag.expectedExecutable] Expected a method, getter, setter or operator declaration. // ^ // [diag.expectedExecutable] Expected a method, getter, setter or operator declaration. // ^ // [diag.unexpectedToken] Unexpected text ';'. '''); var node = parseResult.findNode.unit; assertParsedNodeText(node, r''' CompilationUnit declarations TopLevelVariableDeclaration variables: VariableDeclarationList keyword: var variables VariableDeclaration name: v equals: = initializer: BinaryExpression leftOperand: SetOrMapLiteral typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: String NamedType name: int rightBracket: > leftBracket: { elements MapLiteralEntry key: SimpleStringLiteral literal: '1' separator: : value: IntegerLiteral literal: 1 rightBracket: } isMap: false operator: < rightOperand: SimpleIdentifier token: String VariableDeclaration name: int semicolon: ; '''); } void test_parseLogicalAndExpression() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x && y; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' BinaryExpression leftOperand: SimpleIdentifier token: x operator: && rightOperand: SimpleIdentifier token: y '''); } void test_parseLogicalOrExpression() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x || y; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' BinaryExpression leftOperand: SimpleIdentifier token: x operator: || rightOperand: SimpleIdentifier token: y '''); } void test_parseMapLiteral_empty() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = {}; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SetOrMapLiteral typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: String NamedType name: int rightBracket: > leftBracket: { rightBracket: } isMap: false '''); } void test_parseMapLiteral_multiple() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = {'a': b, 'x': y}; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SetOrMapLiteral leftBracket: { elements MapLiteralEntry key: SimpleStringLiteral literal: 'a' separator: : value: SimpleIdentifier token: b MapLiteralEntry key: SimpleStringLiteral literal: 'x' separator: : value: SimpleIdentifier token: y rightBracket: } isMap: false '''); } void test_parseMapLiteral_multiple_trailing_comma() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = {'a': b, 'x': y}; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SetOrMapLiteral leftBracket: { elements MapLiteralEntry key: SimpleStringLiteral literal: 'a' separator: : value: SimpleIdentifier token: b MapLiteralEntry key: SimpleStringLiteral literal: 'x' separator: : value: SimpleIdentifier token: y rightBracket: } isMap: false '''); } void test_parseMapLiteral_single() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = {'x': y}; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SetOrMapLiteral leftBracket: { elements MapLiteralEntry key: SimpleStringLiteral literal: 'x' separator: : value: SimpleIdentifier token: y rightBracket: } isMap: false '''); } void test_parseMapLiteralEntry_complex() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = {2 + 2: y}; '''); var node = (parseResult.findNode.singleVariableDeclaration.initializer as SetOrMapLiteral) .elements .single; assertParsedNodeText(node, r''' MapLiteralEntry key: BinaryExpression leftOperand: IntegerLiteral literal: 2 operator: + rightOperand: IntegerLiteral literal: 2 separator: : value: SimpleIdentifier token: y '''); } void test_parseMapLiteralEntry_int() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = {0: y}; '''); var node = (parseResult.findNode.singleVariableDeclaration.initializer as SetOrMapLiteral) .elements .single; assertParsedNodeText(node, r''' MapLiteralEntry key: IntegerLiteral literal: 0 separator: : value: SimpleIdentifier token: y '''); } void test_parseMapLiteralEntry_string() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = { x' : }; // ^^^^^^^ // [diag.expectedToken] Expected to find ','. // [diag.expectedToken] Expected to find ';'. // ^ // [diag.unterminatedStringLiteral] Unterminated string literal. // [diag.expectedToken][column 19][length 1] Expected to find '}'. '''); var node = parseResult.findNode.unit; assertParsedNodeText(node, r''' CompilationUnit declarations TopLevelVariableDeclaration variables: VariableDeclarationList keyword: var variables VariableDeclaration name: v equals: = initializer: SetOrMapLiteral leftBracket: { elements SimpleIdentifier token: x SimpleStringLiteral literal: ' : };' rightBracket: } isMap: false semicolon: ; '''); } void test_parseMultiplicativeExpression_normal() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x * y; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' BinaryExpression leftOperand: SimpleIdentifier token: x operator: * rightOperand: SimpleIdentifier token: y '''); } void test_parseMultiplicativeExpression_super() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = super * y; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' BinaryExpression leftOperand: SuperExpression superKeyword: super operator: * rightOperand: SimpleIdentifier token: y '''); } void test_parseNewExpression() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = new A(); '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' InstanceCreationExpression keyword: new constructorName: ConstructorName type: NamedType name: A argumentList: ArgumentList leftParenthesis: ( rightParenthesis: ) '''); } void test_parsePostfixExpression_decrement() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = i--; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' PostfixExpression operand: SimpleIdentifier token: i operator: -- '''); } void test_parsePostfixExpression_increment() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = i++; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' PostfixExpression operand: SimpleIdentifier token: i operator: ++ '''); } void test_parsePostfixExpression_none_indexExpression() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = a[0]; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' IndexExpression target: SimpleIdentifier token: a leftBracket: [ index: IntegerLiteral literal: 0 rightBracket: ] '''); } void test_parsePostfixExpression_none_methodInvocation() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = a.m(); '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' MethodInvocation target: SimpleIdentifier token: a operator: . methodName: SimpleIdentifier token: m argumentList: ArgumentList leftParenthesis: ( rightParenthesis: ) '''); } void test_parsePostfixExpression_none_methodInvocation_question_dot() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = a?.m(); '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' MethodInvocation target: SimpleIdentifier token: a operator: ?. methodName: SimpleIdentifier token: m argumentList: ArgumentList leftParenthesis: ( rightParenthesis: ) '''); } void test_parsePostfixExpression_none_methodInvocation_question_dot_typeArguments() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = a?.m(); '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' MethodInvocation target: SimpleIdentifier token: a operator: ?. methodName: SimpleIdentifier token: m typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: E rightBracket: > argumentList: ArgumentList leftParenthesis: ( rightParenthesis: ) '''); } void test_parsePostfixExpression_none_methodInvocation_typeArguments() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = a.m(); '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' MethodInvocation target: SimpleIdentifier token: a operator: . methodName: SimpleIdentifier token: m typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: E rightBracket: > argumentList: ArgumentList leftParenthesis: ( rightParenthesis: ) '''); } void test_parsePostfixExpression_none_propertyAccess() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = a.b; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' PrefixedIdentifier prefix: SimpleIdentifier token: a period: . identifier: SimpleIdentifier token: b '''); } void test_parsePrefixedIdentifier_noPrefix() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = $lexeme; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SimpleIdentifier token: $lexeme '''); } void test_parsePrefixedIdentifier_prefix() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = $lexeme; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SimpleIdentifier token: $lexeme '''); } void test_parsePrimaryExpression_const() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = const A(); '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' InstanceCreationExpression keyword: const constructorName: ConstructorName type: NamedType name: A argumentList: ArgumentList leftParenthesis: ( rightParenthesis: ) '''); } void test_parsePrimaryExpression_double() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = $doubleLiteral; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SimpleIdentifier token: $doubleLiteral '''); } void test_parsePrimaryExpression_false() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = false; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' BooleanLiteral literal: false '''); } void test_parsePrimaryExpression_function_arguments() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = (int i) => i + 1; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' FunctionExpression parameters: FormalParameterList leftParenthesis: ( parameter: RegularFormalParameter type: NamedType name: int name: i rightParenthesis: ) body: ExpressionFunctionBody functionDefinition: => expression: BinaryExpression leftOperand: SimpleIdentifier token: i operator: + rightOperand: IntegerLiteral literal: 1 '''); } void test_parsePrimaryExpression_function_noArguments() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = () => 42; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' FunctionExpression parameters: FormalParameterList leftParenthesis: ( rightParenthesis: ) body: ExpressionFunctionBody functionDefinition: => expression: IntegerLiteral literal: 42 '''); } void test_parsePrimaryExpression_genericFunctionExpression() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = (Map m, X x) => m[x]; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' FunctionExpression typeParameters: TypeParameterList leftBracket: < typeParameters TypeParameter name: X TypeParameter name: Y rightBracket: > parameters: FormalParameterList leftParenthesis: ( parameter: RegularFormalParameter type: NamedType name: Map typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: X NamedType name: Y rightBracket: > name: m parameter: RegularFormalParameter type: NamedType name: X name: x rightParenthesis: ) body: ExpressionFunctionBody functionDefinition: => expression: IndexExpression target: SimpleIdentifier token: m leftBracket: [ index: SimpleIdentifier token: x rightBracket: ] '''); } void test_parsePrimaryExpression_hex() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = $hexLiteral; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SimpleIdentifier token: $hexLiteral '''); } void test_parsePrimaryExpression_identifier() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = a; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SimpleIdentifier token: a '''); } void test_parsePrimaryExpression_int() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = $intLiteral; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SimpleIdentifier token: $intLiteral '''); } void test_parsePrimaryExpression_listLiteral() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = []; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' ListLiteral leftBracket: [ rightBracket: ] '''); } void test_parsePrimaryExpression_listLiteral_index() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = []; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' ListLiteral leftBracket: [ rightBracket: ] '''); } void test_parsePrimaryExpression_listLiteral_typed() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = []; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' ListLiteral typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: A rightBracket: > leftBracket: [ rightBracket: ] '''); } void test_parsePrimaryExpression_mapLiteral() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = {}; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SetOrMapLiteral leftBracket: { rightBracket: } isMap: false '''); } void test_parsePrimaryExpression_mapLiteral_typed() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = {}; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SetOrMapLiteral typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: A NamedType name: B rightBracket: > leftBracket: { rightBracket: } isMap: false '''); } void test_parsePrimaryExpression_new() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = new A(); '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' InstanceCreationExpression keyword: new constructorName: ConstructorName type: NamedType name: A argumentList: ArgumentList leftParenthesis: ( rightParenthesis: ) '''); } void test_parsePrimaryExpression_null() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = null; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' NullLiteral literal: null '''); } void test_parsePrimaryExpression_parenthesized() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = (x); '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' ParenthesizedExpression leftParenthesis: ( expression: SimpleIdentifier token: x rightParenthesis: ) '''); } void test_parsePrimaryExpression_string() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = string; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SimpleIdentifier token: string '''); } void test_parsePrimaryExpression_string_multiline() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = string; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SimpleIdentifier token: string '''); } void test_parsePrimaryExpression_string_raw() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = r'string'; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SimpleStringLiteral literal: r'string' '''); } void test_parsePrimaryExpression_super() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = super.x; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' PropertyAccess target: SuperExpression superKeyword: super operator: . propertyName: SimpleIdentifier token: x '''); } void test_parsePrimaryExpression_this() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = this; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' ThisExpression thisKeyword: this '''); } void test_parsePrimaryExpression_true() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = true; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' BooleanLiteral literal: true '''); } void test_parseRedirectingConstructorInvocation_named() { var parseResult = parseTestCodeWithDiagnostics(r''' class C { C() : this.a(); } '''); var node = parseResult.findNode.unit; assertParsedNodeText(node, r''' CompilationUnit declarations ClassDeclaration classKeyword: class namePart: NameWithTypeParameters typeName: C body: BlockClassBody leftBracket: { members ConstructorDeclaration typeName: SimpleIdentifier token: C parameters: FormalParameterList leftParenthesis: ( rightParenthesis: ) separator: : initializers RedirectingConstructorInvocation thisKeyword: this period: . constructorName: SimpleIdentifier token: a argumentList: ArgumentList leftParenthesis: ( rightParenthesis: ) body: EmptyFunctionBody semicolon: ; rightBracket: } '''); } void test_parseRedirectingConstructorInvocation_unnamed() { var parseResult = parseTestCodeWithDiagnostics(r''' class C { C() : this(); } '''); var node = parseResult.findNode.unit; assertParsedNodeText(node, r''' CompilationUnit declarations ClassDeclaration classKeyword: class namePart: NameWithTypeParameters typeName: C body: BlockClassBody leftBracket: { members ConstructorDeclaration typeName: SimpleIdentifier token: C parameters: FormalParameterList leftParenthesis: ( rightParenthesis: ) separator: : initializers RedirectingConstructorInvocation thisKeyword: this argumentList: ArgumentList leftParenthesis: ( rightParenthesis: ) body: EmptyFunctionBody semicolon: ; rightBracket: } '''); } void test_parseRelationalExpression_as_chained() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x as Y as Z; // ^^ // [diag.unexpectedToken] Unexpected text 'as'. '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' AsExpression expression: SimpleIdentifier token: x asOperator: as type: NamedType name: Y '''); } void test_parseRelationalExpression_as_functionType_noReturnType() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x as Function(int); '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' AsExpression expression: SimpleIdentifier token: x asOperator: as type: GenericFunctionType functionKeyword: Function parameters: FormalParameterList leftParenthesis: ( parameter: RegularFormalParameter type: NamedType name: int rightParenthesis: ) '''); } void test_parseRelationalExpression_as_functionType_returnType() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x as String Function(int); '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' AsExpression expression: SimpleIdentifier token: x asOperator: as type: GenericFunctionType returnType: NamedType name: String functionKeyword: Function parameters: FormalParameterList leftParenthesis: ( parameter: RegularFormalParameter type: NamedType name: int rightParenthesis: ) '''); } void test_parseRelationalExpression_as_generic() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x as C; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' AsExpression expression: SimpleIdentifier token: x asOperator: as type: NamedType name: C typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: D rightBracket: > '''); } void test_parseRelationalExpression_as_simple() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x as Y; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' AsExpression expression: SimpleIdentifier token: x asOperator: as type: NamedType name: Y '''); } void test_parseRelationalExpression_as_simple_function() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x as Function; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' AsExpression expression: SimpleIdentifier token: x asOperator: as type: NamedType name: Function '''); } void test_parseRelationalExpression_is() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x is y; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' IsExpression expression: SimpleIdentifier token: x isOperator: is type: NamedType name: y '''); } void test_parseRelationalExpression_is_chained() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x is Y is! Z; // ^^ // [diag.unexpectedToken] Unexpected text 'is'. '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' IsExpression expression: SimpleIdentifier token: x isOperator: is type: NamedType name: Y '''); } void test_parseRelationalExpression_isNot() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x is! y; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' IsExpression expression: SimpleIdentifier token: x isOperator: is notOperator: ! type: NamedType name: y '''); } void test_parseRelationalExpression_normal() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x < y; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' BinaryExpression leftOperand: SimpleIdentifier token: x operator: < rightOperand: SimpleIdentifier token: y '''); } void test_parseRelationalExpression_super() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = super < y; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' BinaryExpression leftOperand: SuperExpression superKeyword: super operator: < rightOperand: SimpleIdentifier token: y '''); } void test_parseRethrowExpression() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = rethrow; // ^^^^^^^ // [diag.expectedIdentifierButGotKeyword] 'rethrow' can't be used as an identifier because it's a keyword. '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SimpleIdentifier token: rethrow '''); } void test_parseShiftExpression_normal() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x << y; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' BinaryExpression leftOperand: SimpleIdentifier token: x operator: << rightOperand: SimpleIdentifier token: y '''); } void test_parseShiftExpression_super() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = super << y; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' BinaryExpression leftOperand: SuperExpression superKeyword: super operator: << rightOperand: SimpleIdentifier token: y '''); } void test_parseSimpleIdentifier1_normalIdentifier() { // TODO(brianwilkerson): Implement tests for this method. } void test_parseSimpleIdentifier_builtInIdentifier() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = $lexeme; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SimpleIdentifier token: $lexeme '''); } void test_parseSimpleIdentifier_normalIdentifier() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = $lexeme; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SimpleIdentifier token: $lexeme '''); } void test_parseStringLiteral_adjacent() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = a' 'b; // ^ // [diag.expectedToken] Expected to find ';'. // ^^^ // [diag.expectedExecutable] Expected a method, getter, setter or operator declaration. // ^ // [diag.missingConstFinalVarOrType] Variables must be declared using the keywords 'const', 'final', 'var' or a type name. '''); var node = parseResult.findNode.unit; assertParsedNodeText(node, r''' CompilationUnit declarations TopLevelVariableDeclaration variables: VariableDeclarationList keyword: var variables VariableDeclaration name: v equals: = initializer: SimpleIdentifier token: a semicolon: ; TopLevelVariableDeclaration variables: VariableDeclarationList variables VariableDeclaration name: b semicolon: ; '''); } void test_parseStringLiteral_endsWithInterpolation() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x$y; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SimpleIdentifier token: x$y '''); } void test_parseStringLiteral_interpolated() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = a ${b} c $this d; // ^ // [diag.expectedToken] Expected to find ';'. // ^ // [diag.missingFunctionParameters] Functions must have an explicit list of parameters. // ^ // [diag.expectedToken] Expected to find ';'. // ^^^^^ // [diag.expectedToken] Expected to find ';'. // ^ // [diag.missingConstFinalVarOrType] Variables must be declared using the keywords 'const', 'final', 'var' or a type name. '''); var node = parseResult.findNode.unit; assertParsedNodeText(node, r''' CompilationUnit declarations TopLevelVariableDeclaration variables: VariableDeclarationList keyword: var variables VariableDeclaration name: v equals: = initializer: SimpleIdentifier token: a semicolon: ; FunctionDeclaration name: $ functionExpression: FunctionExpression parameters: FormalParameterList leftParenthesis: ( rightParenthesis: ) body: BlockFunctionBody block: Block leftBracket: { statements ExpressionStatement expression: SimpleIdentifier token: b semicolon: ; rightBracket: } TopLevelVariableDeclaration variables: VariableDeclarationList type: NamedType name: c variables VariableDeclaration name: $this semicolon: ; TopLevelVariableDeclaration variables: VariableDeclarationList variables VariableDeclaration name: d semicolon: ; '''); } void test_parseStringLiteral_interpolated_void() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = $void; // ^ // [diag.expectedToken] Expected to find ';'. // ^^^^^ // [diag.expectedToken] Expected to find '['. // [diag.missingFunctionParameters] Functions must have an explicit list of parameters. // ^ // [diag.missingIdentifier] Expected an identifier. // ^^^^ // [diag.expectedToken] Expected to find ','. '''); var node = parseResult.findNode.unit; assertParsedNodeText(node, r''' CompilationUnit declarations TopLevelVariableDeclaration variables: VariableDeclarationList keyword: var variables VariableDeclaration name: v equals: = initializer: ListLiteral typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: html rightBracket: > leftBracket: [ rightBracket: ] semicolon: ; FunctionDeclaration name: $void functionExpression: FunctionExpression typeParameters: TypeParameterList leftBracket: < typeParameters TypeParameter name: TypeParameter name: html rightBracket: > parameters: FormalParameterList leftParenthesis: ( rightParenthesis: ) body: EmptyFunctionBody semicolon: ; '''); } void test_parseStringLiteral_multiline_encodedSpace() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = \x20 // ^ // [diag.missingIdentifier] Expected an identifier. // [diag.expectedToken] Expected to find ';'. a; '''); var node = parseResult.findNode.unit; assertParsedNodeText(node, r''' CompilationUnit declarations TopLevelVariableDeclaration variables: VariableDeclarationList keyword: var variables VariableDeclaration name: v equals: = initializer: SimpleIdentifier token: semicolon: ; TopLevelVariableDeclaration variables: VariableDeclarationList type: NamedType name: x20 variables VariableDeclaration name: a semicolon: ; '''); } void test_parseStringLiteral_multiline_endsWithInterpolation() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = x$y; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SimpleIdentifier token: x$y '''); } void test_parseStringLiteral_multiline_escapedBackslash() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = \\ // ^ // [diag.missingIdentifier] Expected an identifier. // [diag.expectedToken] Expected to find ';'. // ^ // [diag.expectedExecutable] Expected a method, getter, setter or operator declaration. a; // [diag.missingConstFinalVarOrType][column 1][length 1] Variables must be declared using the keywords 'const', 'final', 'var' or a type name. '''); var node = parseResult.findNode.unit; assertParsedNodeText(node, r''' CompilationUnit declarations TopLevelVariableDeclaration variables: VariableDeclarationList keyword: var variables VariableDeclaration name: v equals: = initializer: SimpleIdentifier token: semicolon: ; TopLevelVariableDeclaration variables: VariableDeclarationList variables VariableDeclaration name: a semicolon: ; '''); } void test_parseStringLiteral_multiline_escapedBackslash_raw() { var parseResult = parseTestCodeWithDiagnostics(r""" var v = r'''\\ a'''; """); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r""" SimpleStringLiteral literal: r'''\\ a''' """); } void test_parseStringLiteral_multiline_escapedEolMarker() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = \ // ^ // [diag.missingIdentifier] Expected an identifier. // [diag.expectedToken] Expected to find ';'. a; // [diag.missingConstFinalVarOrType][column 1][length 1] Variables must be declared using the keywords 'const', 'final', 'var' or a type name. '''); var node = parseResult.findNode.unit; assertParsedNodeText(node, r''' CompilationUnit declarations TopLevelVariableDeclaration variables: VariableDeclarationList keyword: var variables VariableDeclaration name: v equals: = initializer: SimpleIdentifier token: semicolon: ; TopLevelVariableDeclaration variables: VariableDeclarationList variables VariableDeclaration name: a semicolon: ; '''); } void test_parseStringLiteral_multiline_escapedEolMarker_raw() { var parseResult = parseTestCodeWithDiagnostics(r""" var v = r'''\ a'''; """); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r""" SimpleStringLiteral literal: r'''\ a''' """); } void test_parseStringLiteral_multiline_escapedSpaceAndEolMarker() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = \ \ // ^ // [diag.missingIdentifier] Expected an identifier. // [diag.expectedToken] Expected to find ';'. // ^ // [diag.expectedExecutable] Expected a method, getter, setter or operator declaration. a; // [diag.missingConstFinalVarOrType][column 1][length 1] Variables must be declared using the keywords 'const', 'final', 'var' or a type name. '''); var node = parseResult.findNode.unit; assertParsedNodeText(node, r''' CompilationUnit declarations TopLevelVariableDeclaration variables: VariableDeclarationList keyword: var variables VariableDeclaration name: v equals: = initializer: SimpleIdentifier token: semicolon: ; TopLevelVariableDeclaration variables: VariableDeclarationList variables VariableDeclaration name: a semicolon: ; '''); } void test_parseStringLiteral_multiline_escapedSpaceAndEolMarker_raw() { var parseResult = parseTestCodeWithDiagnostics(r""" var v = r'''\ \ a'''; """); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r""" SimpleStringLiteral literal: r'''\ \ a''' """); } void test_parseStringLiteral_multiline_escapedTab() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = \t // ^ // [diag.missingIdentifier] Expected an identifier. // [diag.expectedToken] Expected to find ';'. a; '''); var node = parseResult.findNode.unit; assertParsedNodeText(node, r''' CompilationUnit declarations TopLevelVariableDeclaration variables: VariableDeclarationList keyword: var variables VariableDeclaration name: v equals: = initializer: SimpleIdentifier token: semicolon: ; TopLevelVariableDeclaration variables: VariableDeclarationList type: NamedType name: t variables VariableDeclaration name: a semicolon: ; '''); } void test_parseStringLiteral_multiline_escapedTab_raw() { var parseResult = parseTestCodeWithDiagnostics(r""" var v = r'''\t a'''; """); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r""" SimpleStringLiteral literal: r'''\t a''' """); } void test_parseStringLiteral_multiline_quoteAfterInterpolation() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = $x'y; // ^^ // [diag.expectedToken] Expected to find ';'. // ^^^ // [diag.expectedExecutable] Expected a method, getter, setter or operator declaration. // ^ // [diag.unterminatedStringLiteral] Unterminated string literal. '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SimpleIdentifier token: $x '''); } void test_parseStringLiteral_multiline_startsWithInterpolation() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = ${x}y; // ^ // [diag.expectedToken] Expected to find ';'. // ^ // [diag.expectedExecutable] Expected a method, getter, setter or operator declaration. // ^ // [diag.missingConstFinalVarOrType] Variables must be declared using the keywords 'const', 'final', 'var' or a type name. '''); var node = parseResult.findNode.unit; assertParsedNodeText(node, r''' CompilationUnit declarations TopLevelVariableDeclaration variables: VariableDeclarationList keyword: var variables VariableDeclaration name: v equals: = initializer: SimpleIdentifier token: $ semicolon: ; TopLevelVariableDeclaration variables: VariableDeclarationList variables VariableDeclaration name: y semicolon: ; '''); } void test_parseStringLiteral_multiline_twoSpaces() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = a; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SimpleIdentifier token: a '''); } void test_parseStringLiteral_multiline_twoSpaces_raw() { var parseResult = parseTestCodeWithDiagnostics(r""" var v = r''' a'''; """); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r""" SimpleStringLiteral literal: r''' a''' """); } void test_parseStringLiteral_multiline_untrimmed() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = a // ^ // [diag.expectedToken] Expected to find ';'. b; // [diag.missingConstFinalVarOrType][column 1][length 1] Variables must be declared using the keywords 'const', 'final', 'var' or a type name. '''); var node = parseResult.findNode.unit; assertParsedNodeText(node, r''' CompilationUnit declarations TopLevelVariableDeclaration variables: VariableDeclarationList keyword: var variables VariableDeclaration name: v equals: = initializer: SimpleIdentifier token: a semicolon: ; TopLevelVariableDeclaration variables: VariableDeclarationList variables VariableDeclaration name: b semicolon: ; '''); } void test_parseStringLiteral_quoteAfterInterpolation() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = $x"; // ^^ // [diag.expectedToken] Expected to find ';'. // ^^ // [diag.expectedExecutable] Expected a method, getter, setter or operator declaration. // ^ // [diag.unterminatedStringLiteral] Unterminated string literal. '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SimpleIdentifier token: $x '''); } void test_parseStringLiteral_single() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = a; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SimpleIdentifier token: a '''); } void test_parseStringLiteral_startsWithInterpolation() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = ${x}y; // ^ // [diag.expectedToken] Expected to find ';'. // ^ // [diag.expectedExecutable] Expected a method, getter, setter or operator declaration. // ^ // [diag.missingConstFinalVarOrType] Variables must be declared using the keywords 'const', 'final', 'var' or a type name. '''); var node = parseResult.findNode.unit; assertParsedNodeText(node, r''' CompilationUnit declarations TopLevelVariableDeclaration variables: VariableDeclarationList keyword: var variables VariableDeclaration name: v equals: = initializer: SimpleIdentifier token: $ semicolon: ; TopLevelVariableDeclaration variables: VariableDeclarationList variables VariableDeclaration name: y semicolon: ; '''); } void test_parseSuperConstructorInvocation_named() { var parseResult = parseTestCodeWithDiagnostics(r''' class C { C() : super.a(); } '''); var node = parseResult.findNode.unit; assertParsedNodeText(node, r''' CompilationUnit declarations ClassDeclaration classKeyword: class namePart: NameWithTypeParameters typeName: C body: BlockClassBody leftBracket: { members ConstructorDeclaration typeName: SimpleIdentifier token: C parameters: FormalParameterList leftParenthesis: ( rightParenthesis: ) separator: : initializers SuperConstructorInvocation superKeyword: super period: . constructorName: SimpleIdentifier token: a argumentList: ArgumentList leftParenthesis: ( rightParenthesis: ) body: EmptyFunctionBody semicolon: ; rightBracket: } '''); } void test_parseSuperConstructorInvocation_unnamed() { var parseResult = parseTestCodeWithDiagnostics(r''' class C { C() : super(); } '''); var node = parseResult.findNode.unit; assertParsedNodeText(node, r''' CompilationUnit declarations ClassDeclaration classKeyword: class namePart: NameWithTypeParameters typeName: C body: BlockClassBody leftBracket: { members ConstructorDeclaration typeName: SimpleIdentifier token: C parameters: FormalParameterList leftParenthesis: ( rightParenthesis: ) separator: : initializers SuperConstructorInvocation superKeyword: super argumentList: ArgumentList leftParenthesis: ( rightParenthesis: ) body: EmptyFunctionBody semicolon: ; rightBracket: } '''); } void test_parseSymbolLiteral_builtInIdentifier() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = #dynamic.static.abstract; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SymbolLiteral poundSign: # components dynamic static abstract '''); } void test_parseSymbolLiteral_multiple() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = #a.b.c; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SymbolLiteral poundSign: # components a b c '''); } void test_parseSymbolLiteral_operator() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = #==; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SymbolLiteral poundSign: # components == '''); } void test_parseSymbolLiteral_single() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = #a; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SymbolLiteral poundSign: # components a '''); } void test_parseSymbolLiteral_void() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = #void; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SymbolLiteral poundSign: # components void '''); } void test_parseThrowExpression() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = throw x; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' ThrowExpression throwKeyword: throw expression: SimpleIdentifier token: x '''); } void test_parseThrowExpressionWithoutCascade() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = throw x; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' ThrowExpression throwKeyword: throw expression: SimpleIdentifier token: x '''); } void test_parseUnaryExpression_decrement_identifier_index() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = --a[0]; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' PrefixExpression operator: -- operand: IndexExpression target: SimpleIdentifier token: a leftBracket: [ index: IntegerLiteral literal: 0 rightBracket: ] '''); } void test_parseUnaryExpression_decrement_normal() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = --x; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' PrefixExpression operator: -- operand: SimpleIdentifier token: x '''); } @skippedTest // TODO(scheglov): fix it void test_parseUnaryExpression_decrement_super() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = --super; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' PrefixExpression operator: -- operand: SuperExpression superKeyword: super '''); } void test_parseUnaryExpression_decrement_super_propertyAccess() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = --super.x; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' PrefixExpression operator: -- operand: PropertyAccess target: SuperExpression superKeyword: super operator: . propertyName: SimpleIdentifier token: x '''); } @skippedTest // TODO(scheglov): fix it void test_parseUnaryExpression_decrement_super_withComment() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = /* 0 */ --super; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' PrefixExpression operator: -- operand: SuperExpression superKeyword: super '''); } void test_parseUnaryExpression_increment_identifier_index() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = ++a[0]; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' PrefixExpression operator: ++ operand: IndexExpression target: SimpleIdentifier token: a leftBracket: [ index: IntegerLiteral literal: 0 rightBracket: ] '''); } void test_parseUnaryExpression_increment_normal() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = ++x; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' PrefixExpression operator: ++ operand: SimpleIdentifier token: x '''); } void test_parseUnaryExpression_increment_super_index() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = ++super[0]; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' PrefixExpression operator: ++ operand: IndexExpression target: SuperExpression superKeyword: super leftBracket: [ index: IntegerLiteral literal: 0 rightBracket: ] '''); } void test_parseUnaryExpression_increment_super_propertyAccess() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = ++super.x; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' PrefixExpression operator: ++ operand: PropertyAccess target: SuperExpression superKeyword: super operator: . propertyName: SimpleIdentifier token: x '''); } void test_parseUnaryExpression_minus_identifier_index() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = -a[0]; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' PrefixExpression operator: - operand: IndexExpression target: SimpleIdentifier token: a leftBracket: [ index: IntegerLiteral literal: 0 rightBracket: ] '''); } void test_parseUnaryExpression_minus_normal() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = -x; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' PrefixExpression operator: - operand: SimpleIdentifier token: x '''); } void test_parseUnaryExpression_minus_super() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = -super; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' PrefixExpression operator: - operand: SuperExpression superKeyword: super '''); } void test_parseUnaryExpression_not_normal() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = !x; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' PrefixExpression operator: ! operand: SimpleIdentifier token: x '''); } void test_parseUnaryExpression_not_super() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = !super; // ^^^^^ // [diag.missingAssignableSelector] Missing selector such as '.identifier' or '[0]'. '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' PrefixExpression operator: ! operand: SuperExpression superKeyword: super '''); } void test_parseUnaryExpression_tilda_normal() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = ~x; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' PrefixExpression operator: ~ operand: SimpleIdentifier token: x '''); } void test_parseUnaryExpression_tilda_super() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = ~super; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' PrefixExpression operator: ~ operand: SuperExpression superKeyword: super '''); } void test_parseUnaryExpression_tilde_identifier_index() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = ~a[0]; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' PrefixExpression operator: ~ operand: IndexExpression target: SimpleIdentifier token: a leftBracket: [ index: IntegerLiteral literal: 0 rightBracket: ] '''); } void test_setLiteral() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = {3}; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SetOrMapLiteral leftBracket: { elements IntegerLiteral literal: 3 rightBracket: } isMap: false '''); } void test_setLiteral_const() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = const {3, 6}; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SetOrMapLiteral constKeyword: const leftBracket: { elements IntegerLiteral literal: 3 IntegerLiteral literal: 6 rightBracket: } isMap: false '''); } void test_setLiteral_const_typed() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = const {3}; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SetOrMapLiteral constKeyword: const typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: int rightBracket: > leftBracket: { elements IntegerLiteral literal: 3 rightBracket: } isMap: false '''); } void test_setLiteral_nested_typeArgument() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = >{ {3}, }; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SetOrMapLiteral typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: Set typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: int rightBracket: > rightBracket: > leftBracket: { elements SetOrMapLiteral leftBracket: { elements IntegerLiteral literal: 3 rightBracket: } isMap: false rightBracket: } isMap: false '''); } void test_setLiteral_typed() { var parseResult = parseTestCodeWithDiagnostics(r''' var v = {3}; '''); var node = parseResult.findNode.singleVariableDeclaration.initializer!; assertParsedNodeText(node, r''' SetOrMapLiteral typeArguments: TypeArgumentList leftBracket: < arguments NamedType name: int rightBracket: > leftBracket: { elements IntegerLiteral literal: 3 rightBracket: } isMap: false '''); } }