Files
sdk/pkg/analyzer/test/generated/parser_fasta_test.dart
T
Peter von der Ahé 032925c4ff Remove obsolete features
Remove tree-shaker as we're not using it, and it creates problems
when the SDK changes.

Remove scopes from AstBuilder as we will be phasing out AstBuilder
in favor of using BodyBuilder and the Forest API.

Change-Id: I51950c5d8bfb0493587336325f9da8f5bf8ecea6
Reviewed-on: https://dart-review.googlesource.com/57261
Commit-Queue: Peter von der Ahé <ahe@google.com>
Reviewed-by: Dan Rubel <danrubel@google.com>
2018-05-31 07:24:54 +00:00

1448 lines
54 KiB
Dart

// Copyright (c) 2017, 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' as analyzer;
import 'package:analyzer/dart/ast/token.dart' show Token, TokenType;
import 'package:analyzer/error/error.dart';
import 'package:analyzer/error/listener.dart' show ErrorReporter;
import 'package:analyzer/src/dart/scanner/scanner.dart';
import 'package:analyzer/src/generated/parser.dart' as analyzer;
import 'package:analyzer/src/generated/utilities_dart.dart';
import 'package:analyzer/src/string_source.dart';
import 'package:front_end/src/fasta/scanner/error_token.dart' show ErrorToken;
import 'package:front_end/src/fasta/scanner/string_scanner.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'parser_fasta_listener.dart';
import 'parser_test.dart';
import 'test_support.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(ClassMemberParserTest_Fasta);
defineReflectiveTests(ComplexParserTest_Fasta);
defineReflectiveTests(ErrorParserTest_Fasta);
defineReflectiveTests(ExpressionParserTest_Fasta);
defineReflectiveTests(FormalParameterParserTest_Fasta);
defineReflectiveTests(RecoveryParserTest_Fasta);
defineReflectiveTests(SimpleParserTest_Fasta);
defineReflectiveTests(StatementParserTest_Fasta);
defineReflectiveTests(TopLevelParserTest_Fasta);
});
}
/**
* Type of the "parse..." methods defined in the Fasta parser.
*/
typedef analyzer.Token ParseFunction(analyzer.Token token);
@reflectiveTest
class ClassMemberParserTest_Fasta extends FastaParserTestCase
with ClassMemberParserTestMixin {
@override
void test_parseClassMember_method_generic_comment_noReturnType() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void test_parseClassMember_method_generic_comment_parameterType() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void test_parseClassMember_method_generic_comment_returnType() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void test_parseClassMember_method_generic_comment_returnType_bound() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void test_parseClassMember_method_generic_comment_returnType_complex() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void test_parseClassMember_method_generic_comment_void() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void test_parseClassMember_method_static_generic_comment_returnType() {
// Ignored: Fasta does not support the generic comment syntax.
}
}
/**
* Tests of the fasta parser based on [ComplexParserTestMixin].
*/
@reflectiveTest
class ComplexParserTest_Fasta extends FastaParserTestCase
with ComplexParserTestMixin {
@override
void test_assignableExpression_arguments_normal_chain_typeArgumentComments() {
// Ignored: Fasta does not support the generic comment syntax.
}
}
/**
* Tests of the fasta parser based on [ErrorParserTest].
*/
@reflectiveTest
class ErrorParserTest_Fasta extends FastaParserTestCase
with ErrorParserTestMixin {
@override
@failingTest
void test_expectedListOrMapLiteral() {
// TODO(brianwilkerson) Does not recover.
// type 'IntegerLiteralImpl' is not a subtype of type 'TypedLiteral' in type cast where
// IntegerLiteralImpl is from package:analyzer/src/dart/ast/ast.dart
// TypedLiteral is from package:analyzer/dart/ast/ast.dart
//
// dart:core Object._as
// test/generated/parser_fasta_test.dart 2480:48 FastaParserTestCase.parseListOrMapLiteral
super.test_expectedListOrMapLiteral();
}
@override
@failingTest
void test_expectedStringLiteral() {
// TODO(brianwilkerson) Does not recover.
// type 'IntegerLiteralImpl' is not a subtype of type 'StringLiteral' of 'literal' where
// IntegerLiteralImpl is from package:analyzer/src/dart/ast/ast.dart
// StringLiteral is from package:analyzer/dart/ast/ast.dart
//
// test/generated/parser_test.dart 2652:29 FastaParserTestCase&ErrorParserTestMixin.test_expectedStringLiteral
super.test_expectedStringLiteral();
}
void test_getterNativeWithBody() {
createParser('String get m native "str" => 0;');
parser.parseClassMember('C') as MethodDeclaration;
if (!allowNativeClause) {
assertErrorsWithCodes([
ParserErrorCode.NATIVE_CLAUSE_SHOULD_BE_ANNOTATION,
ParserErrorCode.EXTERNAL_METHOD_WITH_BODY,
]);
} else {
assertErrorsWithCodes([
ParserErrorCode.EXTERNAL_METHOD_WITH_BODY,
]);
}
}
@override
@failingTest
void test_invalidCodePoint() {
// TODO(brianwilkerson) Does not recover.
// Internal problem: Compiler cannot run without a compiler context.
// Tip: Are calls to the compiler wrapped in CompilerContext.runInContext?
// package:front_end/src/fasta/compiler_context.dart 81:7 CompilerContext.current
// package:front_end/src/fasta/command_line_reporting.dart 112:30 shouldThrowOn
// package:front_end/src/fasta/deprecated_problems.dart 41:7 deprecated_inputError
// package:front_end/src/fasta/quote.dart 181:5 unescapeCodeUnits.error
// package:front_end/src/fasta/quote.dart 251:40 unescapeCodeUnits
// package:front_end/src/fasta/quote.dart 147:13 unescape
// package:front_end/src/fasta/quote.dart 135:10 unescapeString
// package:analyzer/src/fasta/ast_builder.dart 159:22 AstBuilder.endLiteralString
// test/generated/parser_fasta_listener.dart 896:14 ForwardingTestListener.endLiteralString
// package:front_end/src/fasta/parser/parser.dart 3497:14 Parser.parseSingleLiteralString
// package:front_end/src/fasta/parser/parser.dart 3434:13 Parser.parseLiteralString
// package:front_end/src/fasta/parser/parser.dart 3133:14 Parser.parsePrimary
// package:front_end/src/fasta/parser/parser.dart 3097:14 Parser.parseUnaryExpression
// package:front_end/src/fasta/parser/parser.dart 2968:13 Parser.parsePrecedenceExpression
// package:front_end/src/fasta/parser/parser.dart 2942:11 Parser.parseExpression
// test/generated/parser_fasta_test.dart 3196:39 ParserProxy._run
super.test_invalidCodePoint();
}
@override
@failingTest
void test_invalidCommentReference__new_nonIdentifier() {
// TODO(brianwilkerson) Parsing comment references not yet supported.
super.test_invalidCommentReference__new_nonIdentifier();
}
@override
@failingTest
void test_invalidCommentReference__new_tooMuch() {
// TODO(brianwilkerson) Parsing comment references not yet supported.
super.test_invalidCommentReference__new_tooMuch();
}
@override
@failingTest
void test_invalidCommentReference__nonNew_nonIdentifier() {
// TODO(brianwilkerson) Parsing comment references not yet supported.
super.test_invalidCommentReference__nonNew_nonIdentifier();
}
@override
@failingTest
void test_invalidCommentReference__nonNew_tooMuch() {
// TODO(brianwilkerson) Parsing comment references not yet supported.
super.test_invalidCommentReference__nonNew_tooMuch();
}
@override
@failingTest
void test_invalidHexEscape_invalidDigit() {
// TODO(brianwilkerson) Does not recover.
// Internal problem: Compiler cannot run without a compiler context.
// Tip: Are calls to the compiler wrapped in CompilerContext.runInContext?
// package:front_end/src/fasta/compiler_context.dart 81:7 CompilerContext.current
// package:front_end/src/fasta/command_line_reporting.dart 112:30 shouldThrowOn
// package:front_end/src/fasta/deprecated_problems.dart 41:7 deprecated_inputError
// package:front_end/src/fasta/quote.dart 181:5 unescapeCodeUnits.error
// package:front_end/src/fasta/quote.dart 221:47 unescapeCodeUnits
// package:front_end/src/fasta/quote.dart 147:13 unescape
// package:front_end/src/fasta/quote.dart 135:10 unescapeString
// package:analyzer/src/fasta/ast_builder.dart 159:22 AstBuilder.endLiteralString
// test/generated/parser_fasta_listener.dart 896:14 ForwardingTestListener.endLiteralString
// package:front_end/src/fasta/parser/parser.dart 3497:14 Parser.parseSingleLiteralString
// package:front_end/src/fasta/parser/parser.dart 3434:13 Parser.parseLiteralString
// package:front_end/src/fasta/parser/parser.dart 3133:14 Parser.parsePrimary
// package:front_end/src/fasta/parser/parser.dart 3097:14 Parser.parseUnaryExpression
// package:front_end/src/fasta/parser/parser.dart 2968:13 Parser.parsePrecedenceExpression
// package:front_end/src/fasta/parser/parser.dart 2942:11 Parser.parseExpression
// test/generated/parser_fasta_test.dart 3196:39 ParserProxy._run
super.test_invalidHexEscape_invalidDigit();
}
@override
@failingTest
void test_invalidHexEscape_tooFewDigits() {
// TODO(brianwilkerson) Does not recover.
// Internal problem: Compiler cannot run without a compiler context.
// Tip: Are calls to the compiler wrapped in CompilerContext.runInContext?
// package:front_end/src/fasta/compiler_context.dart 81:7 CompilerContext.current
// package:front_end/src/fasta/command_line_reporting.dart 112:30 shouldThrowOn
// package:front_end/src/fasta/deprecated_problems.dart 41:7 deprecated_inputError
// package:front_end/src/fasta/quote.dart 181:5 unescapeCodeUnits.error
// package:front_end/src/fasta/quote.dart 217:52 unescapeCodeUnits
// package:front_end/src/fasta/quote.dart 147:13 unescape
// package:front_end/src/fasta/quote.dart 135:10 unescapeString
// package:analyzer/src/fasta/ast_builder.dart 159:22 AstBuilder.endLiteralString
// test/generated/parser_fasta_listener.dart 896:14 ForwardingTestListener.endLiteralString
// package:front_end/src/fasta/parser/parser.dart 3497:14 Parser.parseSingleLiteralString
// package:front_end/src/fasta/parser/parser.dart 3434:13 Parser.parseLiteralString
// package:front_end/src/fasta/parser/parser.dart 3133:14 Parser.parsePrimary
// package:front_end/src/fasta/parser/parser.dart 3097:14 Parser.parseUnaryExpression
// package:front_end/src/fasta/parser/parser.dart 2968:13 Parser.parsePrecedenceExpression
// package:front_end/src/fasta/parser/parser.dart 2942:11 Parser.parseExpression
// test/generated/parser_fasta_test.dart 3196:39 ParserProxy._run
super.test_invalidHexEscape_tooFewDigits();
}
@override
@failingTest
void test_invalidOperatorAfterSuper_primaryExpression() {
// TODO(brianwilkerson) Does not recover.
// Expected: true
// Actual: <false>
//
// package:test expect
// test/generated/parser_fasta_test.dart 3197:5 ParserProxy._run
super.test_invalidOperatorAfterSuper_primaryExpression();
}
@override
@failingTest
void test_invalidStarAfterAsync() {
// TODO(brianwilkerson) Does not recover.
// Expected: an object with length of <1>
// Actual: <Instance of 'Stack'>
// Which: has length of <0>
//
// package:test expect
// test/generated/parser_fasta_test.dart 3290:7 ParserProxy._run
super.test_invalidStarAfterAsync();
}
@override
@failingTest
void test_invalidSync() {
// TODO(brianwilkerson) Does not recover.
// Expected: an object with length of <1>
// Actual: <Instance of 'Stack'>
// Which: has length of <0>
//
// package:test expect
// test/generated/parser_fasta_test.dart 3290:7 ParserProxy._run
super.test_invalidSync();
}
@override
@failingTest
void test_invalidUnicodeEscape_incomplete_noDigits() {
// TODO(brianwilkerson) Does not recover.
// Internal problem: Compiler cannot run without a compiler context.
// Tip: Are calls to the compiler wrapped in CompilerContext.runInContext?
// package:front_end/src/fasta/compiler_context.dart 81:7 CompilerContext.current
// package:front_end/src/fasta/command_line_reporting.dart 112:30 shouldThrowOn
// package:front_end/src/fasta/deprecated_problems.dart 41:7 deprecated_inputError
// package:front_end/src/fasta/quote.dart 181:5 unescapeCodeUnits.error
// package:front_end/src/fasta/quote.dart 232:54 unescapeCodeUnits
// package:front_end/src/fasta/quote.dart 147:13 unescape
// package:front_end/src/fasta/quote.dart 135:10 unescapeString
// package:analyzer/src/fasta/ast_builder.dart 159:22 AstBuilder.endLiteralString
// test/generated/parser_fasta_listener.dart 896:14 ForwardingTestListener.endLiteralString
// package:front_end/src/fasta/parser/parser.dart 3497:14 Parser.parseSingleLiteralString
// package:front_end/src/fasta/parser/parser.dart 3434:13 Parser.parseLiteralString
// package:front_end/src/fasta/parser/parser.dart 3133:14 Parser.parsePrimary
// package:front_end/src/fasta/parser/parser.dart 3097:14 Parser.parseUnaryExpression
// package:front_end/src/fasta/parser/parser.dart 2968:13 Parser.parsePrecedenceExpression
// package:front_end/src/fasta/parser/parser.dart 2942:11 Parser.parseExpression
// package:front_end/src/fasta/parser/parser.dart 2862:13 Parser.parseExpressionStatement
// package:front_end/src/fasta/parser/parser.dart 2790:14 Parser.parseStatementX
// package:front_end/src/fasta/parser/parser.dart 2722:20 Parser.parseStatement
// test/generated/parser_fasta_test.dart 3287:39 ParserProxy._run
super.test_invalidUnicodeEscape_incomplete_noDigits();
}
@override
@failingTest
void test_invalidUnicodeEscape_incomplete_someDigits() {
// TODO(brianwilkerson) Does not recover.
// Internal problem: Compiler cannot run without a compiler context.
// Tip: Are calls to the compiler wrapped in CompilerContext.runInContext?
// package:front_end/src/fasta/compiler_context.dart 81:7 CompilerContext.current
// package:front_end/src/fasta/command_line_reporting.dart 112:30 shouldThrowOn
// package:front_end/src/fasta/deprecated_problems.dart 41:7 deprecated_inputError
// package:front_end/src/fasta/quote.dart 181:5 unescapeCodeUnits.error
// package:front_end/src/fasta/quote.dart 232:54 unescapeCodeUnits
// package:front_end/src/fasta/quote.dart 147:13 unescape
// package:front_end/src/fasta/quote.dart 135:10 unescapeString
// package:analyzer/src/fasta/ast_builder.dart 159:22 AstBuilder.endLiteralString
// test/generated/parser_fasta_listener.dart 896:14 ForwardingTestListener.endLiteralString
// package:front_end/src/fasta/parser/parser.dart 3497:14 Parser.parseSingleLiteralString
// package:front_end/src/fasta/parser/parser.dart 3434:13 Parser.parseLiteralString
// package:front_end/src/fasta/parser/parser.dart 3133:14 Parser.parsePrimary
// package:front_end/src/fasta/parser/parser.dart 3097:14 Parser.parseUnaryExpression
// package:front_end/src/fasta/parser/parser.dart 2968:13 Parser.parsePrecedenceExpression
// package:front_end/src/fasta/parser/parser.dart 2942:11 Parser.parseExpression
// package:front_end/src/fasta/parser/parser.dart 2862:13 Parser.parseExpressionStatement
// package:front_end/src/fasta/parser/parser.dart 2790:14 Parser.parseStatementX
// package:front_end/src/fasta/parser/parser.dart 2722:20 Parser.parseStatement
// test/generated/parser_fasta_test.dart 3287:39 ParserProxy._run
super.test_invalidUnicodeEscape_incomplete_someDigits();
}
@override
@failingTest
void test_invalidUnicodeEscape_invalidDigit() {
// TODO(brianwilkerson) Does not recover.
// Internal problem: Compiler cannot run without a compiler context.
// Tip: Are calls to the compiler wrapped in CompilerContext.runInContext?
// package:front_end/src/fasta/compiler_context.dart 81:7 CompilerContext.current
// package:front_end/src/fasta/command_line_reporting.dart 112:30 shouldThrowOn
// package:front_end/src/fasta/deprecated_problems.dart 41:7 deprecated_inputError
// package:front_end/src/fasta/quote.dart 181:5 unescapeCodeUnits.error
// package:front_end/src/fasta/quote.dart 240:54 unescapeCodeUnits
// package:front_end/src/fasta/quote.dart 147:13 unescape
// package:front_end/src/fasta/quote.dart 135:10 unescapeString
// package:analyzer/src/fasta/ast_builder.dart 159:22 AstBuilder.endLiteralString
// test/generated/parser_fasta_listener.dart 896:14 ForwardingTestListener.endLiteralString
// package:front_end/src/fasta/parser/parser.dart 3497:14 Parser.parseSingleLiteralString
// package:front_end/src/fasta/parser/parser.dart 3434:13 Parser.parseLiteralString
// package:front_end/src/fasta/parser/parser.dart 3133:14 Parser.parsePrimary
// package:front_end/src/fasta/parser/parser.dart 3097:14 Parser.parseUnaryExpression
// package:front_end/src/fasta/parser/parser.dart 2968:13 Parser.parsePrecedenceExpression
// package:front_end/src/fasta/parser/parser.dart 2942:11 Parser.parseExpression
// package:front_end/src/fasta/parser/parser.dart 2862:13 Parser.parseExpressionStatement
// package:front_end/src/fasta/parser/parser.dart 2790:14 Parser.parseStatementX
// package:front_end/src/fasta/parser/parser.dart 2722:20 Parser.parseStatement
// test/generated/parser_fasta_test.dart 3287:39 ParserProxy._run
super.test_invalidUnicodeEscape_invalidDigit();
}
@override
@failingTest
void test_invalidUnicodeEscape_tooFewDigits_fixed() {
// TODO(brianwilkerson) Does not recover.
// Internal problem: Compiler cannot run without a compiler context.
// Tip: Are calls to the compiler wrapped in CompilerContext.runInContext?
// package:front_end/src/fasta/compiler_context.dart 81:7 CompilerContext.current
// package:front_end/src/fasta/command_line_reporting.dart 112:30 shouldThrowOn
// package:front_end/src/fasta/deprecated_problems.dart 41:7 deprecated_inputError
// package:front_end/src/fasta/quote.dart 181:5 unescapeCodeUnits.error
// package:front_end/src/fasta/quote.dart 240:54 unescapeCodeUnits
// package:front_end/src/fasta/quote.dart 147:13 unescape
// package:front_end/src/fasta/quote.dart 135:10 unescapeString
// package:analyzer/src/fasta/ast_builder.dart 159:22 AstBuilder.endLiteralString
// test/generated/parser_fasta_listener.dart 896:14 ForwardingTestListener.endLiteralString
// package:front_end/src/fasta/parser/parser.dart 3497:14 Parser.parseSingleLiteralString
// package:front_end/src/fasta/parser/parser.dart 3434:13 Parser.parseLiteralString
// package:front_end/src/fasta/parser/parser.dart 3133:14 Parser.parsePrimary
// package:front_end/src/fasta/parser/parser.dart 3097:14 Parser.parseUnaryExpression
// package:front_end/src/fasta/parser/parser.dart 2968:13 Parser.parsePrecedenceExpression
// package:front_end/src/fasta/parser/parser.dart 2942:11 Parser.parseExpression
// package:front_end/src/fasta/parser/parser.dart 2862:13 Parser.parseExpressionStatement
// package:front_end/src/fasta/parser/parser.dart 2790:14 Parser.parseStatementX
// package:front_end/src/fasta/parser/parser.dart 2722:20 Parser.parseStatement
// test/generated/parser_fasta_test.dart 3287:39 ParserProxy._run
super.test_invalidUnicodeEscape_tooFewDigits_fixed();
}
@override
@failingTest
void test_invalidUnicodeEscape_tooFewDigits_variable() {
// TODO(brianwilkerson) Does not recover.
// Internal problem: Compiler cannot run without a compiler context.
// Tip: Are calls to the compiler wrapped in CompilerContext.runInContext?
// package:front_end/src/fasta/compiler_context.dart 81:7 CompilerContext.current
// package:front_end/src/fasta/command_line_reporting.dart 112:30 shouldThrowOn
// package:front_end/src/fasta/deprecated_problems.dart 41:7 deprecated_inputError
// package:front_end/src/fasta/quote.dart 181:5 unescapeCodeUnits.error
// package:front_end/src/fasta/quote.dart 235:49 unescapeCodeUnits
// package:front_end/src/fasta/quote.dart 147:13 unescape
// package:front_end/src/fasta/quote.dart 135:10 unescapeString
// package:analyzer/src/fasta/ast_builder.dart 159:22 AstBuilder.endLiteralString
// test/generated/parser_fasta_listener.dart 896:14 ForwardingTestListener.endLiteralString
// package:front_end/src/fasta/parser/parser.dart 3497:14 Parser.parseSingleLiteralString
// package:front_end/src/fasta/parser/parser.dart 3434:13 Parser.parseLiteralString
// package:front_end/src/fasta/parser/parser.dart 3133:14 Parser.parsePrimary
// package:front_end/src/fasta/parser/parser.dart 3097:14 Parser.parseUnaryExpression
// package:front_end/src/fasta/parser/parser.dart 2968:13 Parser.parsePrecedenceExpression
// package:front_end/src/fasta/parser/parser.dart 2942:11 Parser.parseExpression
// package:front_end/src/fasta/parser/parser.dart 2862:13 Parser.parseExpressionStatement
// package:front_end/src/fasta/parser/parser.dart 2790:14 Parser.parseStatementX
// package:front_end/src/fasta/parser/parser.dart 2722:20 Parser.parseStatement
// test/generated/parser_fasta_test.dart 3287:39 ParserProxy._run
super.test_invalidUnicodeEscape_tooFewDigits_variable();
}
@override
@failingTest
void test_invalidUnicodeEscape_tooManyDigits_variable() {
// TODO(brianwilkerson) Does not recover.
// Internal problem: Compiler cannot run without a compiler context.
// Tip: Are calls to the compiler wrapped in CompilerContext.runInContext?
// package:front_end/src/fasta/compiler_context.dart 81:7 CompilerContext.current
// package:front_end/src/fasta/command_line_reporting.dart 112:30 shouldThrowOn
// package:front_end/src/fasta/deprecated_problems.dart 41:7 deprecated_inputError
// package:front_end/src/fasta/quote.dart 181:5 unescapeCodeUnits.error
// package:front_end/src/fasta/quote.dart 251:40 unescapeCodeUnits
// package:front_end/src/fasta/quote.dart 147:13 unescape
// package:front_end/src/fasta/quote.dart 135:10 unescapeString
// package:analyzer/src/fasta/ast_builder.dart 159:22 AstBuilder.endLiteralString
// test/generated/parser_fasta_listener.dart 896:14 ForwardingTestListener.endLiteralString
// package:front_end/src/fasta/parser/parser.dart 3497:14 Parser.parseSingleLiteralString
// package:front_end/src/fasta/parser/parser.dart 3434:13 Parser.parseLiteralString
// package:front_end/src/fasta/parser/parser.dart 3133:14 Parser.parsePrimary
// package:front_end/src/fasta/parser/parser.dart 3097:14 Parser.parseUnaryExpression
// package:front_end/src/fasta/parser/parser.dart 2968:13 Parser.parsePrecedenceExpression
// package:front_end/src/fasta/parser/parser.dart 2942:11 Parser.parseExpression
// package:front_end/src/fasta/parser/parser.dart 2862:13 Parser.parseExpressionStatement
// package:front_end/src/fasta/parser/parser.dart 2790:14 Parser.parseStatementX
// package:front_end/src/fasta/parser/parser.dart 2722:20 Parser.parseStatement
// test/generated/parser_fasta_test.dart 3287:39 ParserProxy._run
super.test_invalidUnicodeEscape_tooManyDigits_variable();
}
@override
void test_method_invalidTypeParameterComments() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void test_method_invalidTypeParameterExtendsComment() {
// Fasta no longer supports type comment based syntax
// super.test_method_invalidTypeParameterExtendsComment();
}
@override
@failingTest
void test_missingFunctionParameters_topLevel_void_block() {
// TODO(brianwilkerson) Wrong errors:
// Expected 1 errors of type ParserErrorCode.MISSING_FUNCTION_PARAMETERS, found 0
super.test_missingFunctionParameters_topLevel_void_block();
}
@override
@failingTest
void test_missingFunctionParameters_topLevel_void_expression() {
// TODO(brianwilkerson) Wrong errors:
// Expected 1 errors of type ParserErrorCode.MISSING_FUNCTION_PARAMETERS, found 0
super.test_missingFunctionParameters_topLevel_void_expression();
}
}
/**
* Tests of the fasta parser based on [ExpressionParserTestMixin].
*/
@reflectiveTest
class ExpressionParserTest_Fasta extends FastaParserTestCase
with ExpressionParserTestMixin {
@override
void
test_parseAssignableExpression_expression_args_dot_typeArgumentComments() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void
test_parseAssignableExpression_identifier_args_dot_typeArgumentComments() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void test_parseCascadeSection_ia_typeArgumentComments() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void test_parseCascadeSection_ii_typeArgumentComments() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void test_parseCascadeSection_pa_typeArgumentComments() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void test_parseCascadeSection_paa_typeArgumentComments() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void test_parseCascadeSection_paapaa_typeArgumentComments() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void test_parseConstExpression_listLiteral_typed_genericComment() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void test_parseConstExpression_mapLiteral_typed_genericComment() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void test_parseExpression_superMethodInvocation_typeArgumentComments() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void
test_parseExpressionWithoutCascade_superMethodInvocation_typeArgumentComments() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void test_parseFunctionExpression_typeParameterComments() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void
test_parseInstanceCreationExpression_qualifiedType_named_typeArgumentComments() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void
test_parseInstanceCreationExpression_qualifiedType_typeArgumentComments() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void test_parseInstanceCreationExpression_type_named_typeArgumentComments() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void test_parseInstanceCreationExpression_type_typeArgumentComments() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void
test_parsePostfixExpression_none_methodInvocation_question_dot_typeArgumentComments() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void
test_parsePostfixExpression_none_methodInvocation_typeArgumentComments() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void test_parsePrimaryExpression_listLiteral_typed_genericComment() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void test_parsePrimaryExpression_mapLiteral_typed_genericComment() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
@failingTest
void test_parseUnaryExpression_decrement_super() {
// TODO(brianwilkerson) Does not recover.
// Expected: TokenType:<MINUS>
// Actual: TokenType:<MINUS_MINUS>
super.test_parseUnaryExpression_decrement_super();
}
@override
@failingTest
void test_parseUnaryExpression_decrement_super_withComment() {
// TODO(brianwilkerson) Does not recover.
// Expected: TokenType:<MINUS>
// Actual: TokenType:<MINUS_MINUS>
super.test_parseUnaryExpression_decrement_super_withComment();
}
}
/**
* Implementation of [AbstractParserTestCase] specialized for testing the
* Fasta parser.
*/
class FastaParserTestCase extends Object
with ParserTestHelpers
implements AbstractParserTestCase {
static final List<ErrorCode> NO_ERROR_COMPARISON = <ErrorCode>[];
ParserProxy _parserProxy;
analyzer.Token _fastaTokens;
@override
bool allowNativeClause = false;
/**
* Whether generic method comments should be enabled for the test.
*/
bool get enableGenericMethodComments => false;
void set enableGenericMethodComments(bool enable) {}
@override
set enableLazyAssignmentOperators(bool value) {
// Lazy assignment operators are always enabled
}
@override
set enableNnbd(bool value) {
if (value == true) {
// TODO(paulberry,ahe): non-null-by-default syntax is not supported by
// Fasta.
throw new UnimplementedError();
}
}
set enableOptionalNewAndConst(bool enable) {
// ignored
}
@override
set enableUriInPartOf(bool value) {
if (value == false) {
throw new UnimplementedError(
'URIs in "part of" declarations cannot be disabled in Fasta.');
}
}
@override
GatheringErrorListener get listener => _parserProxy._errorListener;
@override
analyzer.Parser get parser => _parserProxy;
@override
bool get usingFastaParser => true;
void assertErrors({List<ErrorCode> codes, List<ExpectedError> errors}) {
if (codes != null) {
if (!identical(codes, NO_ERROR_COMPARISON)) {
assertErrorsWithCodes(codes);
}
} else if (errors != null) {
listener.assertErrors(errors);
} else {
assertNoErrors();
}
}
@override
void assertErrorsWithCodes(List<ErrorCode> expectedErrorCodes) {
_parserProxy._errorListener.assertErrorsWithCodes(
_toFastaGeneratedAnalyzerErrorCodes(expectedErrorCodes));
}
@override
void assertNoErrors() {
_parserProxy._errorListener.assertNoErrors();
}
@override
void createParser(String content, {int expectedEndOffset}) {
var scanner = new StringScanner(content, includeComments: true);
scanner.scanGenericMethodComments = enableGenericMethodComments;
_fastaTokens = scanner.tokenize();
_parserProxy = new ParserProxy(_fastaTokens,
allowNativeClause: allowNativeClause,
enableGenericMethodComments: enableGenericMethodComments,
expectedEndOffset: expectedEndOffset);
}
@override
ExpectedError expectedError(ErrorCode code, int offset, int length) =>
new ExpectedError(
_toFastaGeneratedAnalyzerErrorCode(code), offset, length);
@override
void expectNotNullIfNoErrors(Object result) {
if (!listener.hasErrors) {
expect(result, isNotNull);
}
}
@override
Expression parseAdditiveExpression(String code) {
return _parseExpression(code);
}
@override
Expression parseAssignableExpression(String code, bool primaryAllowed) {
return _parseExpression(code);
}
@override
Expression parseAssignableSelector(String code, bool optional,
{bool allowConditional: true}) {
if (optional) {
if (code.isEmpty) {
return _parseExpression('foo');
}
return _parseExpression('(foo)$code');
}
return _parseExpression('foo$code');
}
@override
AwaitExpression parseAwaitExpression(String code) {
var function = _parseExpression('() async => $code') as FunctionExpression;
return (function.body as ExpressionFunctionBody).expression;
}
@override
Expression parseBitwiseAndExpression(String code) {
return _parseExpression(code);
}
@override
Expression parseBitwiseOrExpression(String code) {
return _parseExpression(code);
}
@override
Expression parseBitwiseXorExpression(String code) {
return _parseExpression(code);
}
@override
Expression parseCascadeSection(String code) {
var cascadeExpression = _parseExpression('null$code') as CascadeExpression;
return cascadeExpression.cascadeSections.first;
}
@override
CompilationUnit parseCompilationUnit(String content,
{List<ErrorCode> codes, List<ExpectedError> errors}) {
GatheringErrorListener listener =
new GatheringErrorListener(checkRanges: true);
CompilationUnit unit = parseCompilationUnit2(content, listener);
// Assert and return result
if (codes != null) {
listener
.assertErrorsWithCodes(_toFastaGeneratedAnalyzerErrorCodes(codes));
} else if (errors != null) {
listener.assertErrors(errors);
} else {
listener.assertNoErrors();
}
return unit;
}
CompilationUnit parseCompilationUnit2(
String content, GatheringErrorListener listener) {
// Scan tokens
var source = new StringSource(content, 'parser_test_StringSource.dart');
var scanner = new Scanner.fasta(source, listener);
scanner.scanGenericMethodComments = enableGenericMethodComments;
_fastaTokens = scanner.tokenize();
// Run parser
analyzer.Parser parser =
new analyzer.Parser(source, listener, useFasta: true);
CompilationUnit unit = parser.parseCompilationUnit(_fastaTokens);
expect(unit, isNotNull);
return unit;
}
@override
ConditionalExpression parseConditionalExpression(String code) {
return _parseExpression(code);
}
@override
Expression parseConstExpression(String code) {
return _parseExpression(code);
}
@override
ConstructorInitializer parseConstructorInitializer(String code) {
createParser('class __Test { __Test() : $code; }');
CompilationUnit unit = _parserProxy.parseCompilationUnit2();
assertNoErrors();
var clazz = unit.declarations[0] as ClassDeclaration;
var constructor = clazz.members[0] as ConstructorDeclaration;
return constructor.initializers.single;
}
@override
CompilationUnit parseDirectives(String source,
[List<ErrorCode> errorCodes = const <ErrorCode>[]]) {
createParser(source);
CompilationUnit unit =
_parserProxy.parseDirectives(_parserProxy.currentToken);
expect(unit, isNotNull);
expect(unit.declarations, hasLength(0));
listener.assertErrorsWithCodes(errorCodes);
return unit;
}
@override
BinaryExpression parseEqualityExpression(String code) {
return _parseExpression(code);
}
@override
Expression parseExpression(String source,
{List<ErrorCode> codes,
List<ExpectedError> errors,
int expectedEndOffset}) {
createParser(source, expectedEndOffset: expectedEndOffset);
Expression result = _parserProxy.parseExpression2();
assertErrors(codes: codes, errors: errors);
return result;
}
@override
List<Expression> parseExpressionList(String code) {
return (_parseExpression('[$code]') as ListLiteral).elements.toList();
}
@override
Expression parseExpressionWithoutCascade(String code) {
return _parseExpression(code);
}
@override
FormalParameter parseFormalParameter(String code, ParameterKind kind,
{List<ErrorCode> errorCodes: const <ErrorCode>[]}) {
String parametersCode;
if (kind == ParameterKind.REQUIRED) {
parametersCode = '($code)';
} else if (kind == ParameterKind.POSITIONAL) {
parametersCode = '([$code])';
} else if (kind == ParameterKind.NAMED) {
parametersCode = '({$code})';
} else {
fail('$kind');
}
FormalParameterList list = parseFormalParameterList(parametersCode,
inFunctionType: false, errorCodes: errorCodes);
return list.parameters.single;
}
@override
FormalParameterList parseFormalParameterList(String code,
{bool inFunctionType: false,
List<ErrorCode> errorCodes: const <ErrorCode>[],
List<ExpectedError> errors}) {
createParser(code);
FormalParameterList result =
_parserProxy.parseFormalParameterList(inFunctionType: inFunctionType);
assertErrors(codes: errors != null ? null : errorCodes, errors: errors);
return result;
}
@override
CompilationUnitMember parseFullCompilationUnitMember() {
return _parserProxy.parseTopLevelDeclaration(false);
}
@override
Directive parseFullDirective() {
return _parserProxy.parseTopLevelDeclaration(true);
}
@override
FunctionExpression parseFunctionExpression(String code) {
return _parseExpression(code);
}
@override
InstanceCreationExpression parseInstanceCreationExpression(
String code, analyzer.Token newToken) {
return _parseExpression('$newToken $code');
}
@override
ListLiteral parseListLiteral(
analyzer.Token token, String typeArgumentsCode, String code) {
String sc = '';
if (token != null) {
sc += token.lexeme + ' ';
}
if (typeArgumentsCode != null) {
sc += typeArgumentsCode;
}
sc += code;
return _parseExpression(sc);
}
@override
TypedLiteral parseListOrMapLiteral(analyzer.Token modifier, String code) {
String literalCode = modifier != null ? '$modifier $code' : code;
return parsePrimaryExpression(literalCode) as TypedLiteral;
}
@override
Expression parseLogicalAndExpression(String code) {
return _parseExpression(code);
}
@override
Expression parseLogicalOrExpression(String code) {
return _parseExpression(code);
}
@override
MapLiteral parseMapLiteral(
analyzer.Token token, String typeArgumentsCode, String code) {
String sc = '';
if (token != null) {
sc += token.lexeme + ' ';
}
if (typeArgumentsCode != null) {
sc += typeArgumentsCode;
}
sc += code;
return parsePrimaryExpression(sc) as MapLiteral;
}
@override
MapLiteralEntry parseMapLiteralEntry(String code) {
var mapLiteral = parseMapLiteral(null, null, '{ $code }');
return mapLiteral.entries.single;
}
@override
Expression parseMultiplicativeExpression(String code) {
return _parseExpression(code);
}
@override
InstanceCreationExpression parseNewExpression(String code) {
return _parseExpression(code);
}
@override
NormalFormalParameter parseNormalFormalParameter(String code,
{bool inFunctionType: false,
List<ErrorCode> errorCodes: const <ErrorCode>[]}) {
FormalParameterList list = parseFormalParameterList('($code)',
inFunctionType: inFunctionType, errorCodes: errorCodes);
return list.parameters.single;
}
@override
Expression parsePostfixExpression(String code) {
return _parseExpression(code);
}
@override
Identifier parsePrefixedIdentifier(String code) {
return _parseExpression(code);
}
@override
Expression parsePrimaryExpression(String code,
{int expectedEndOffset, List<ExpectedError> errors}) {
createParser(code, expectedEndOffset: expectedEndOffset);
Expression result = _parserProxy.parsePrimaryExpression();
assertErrors(codes: null, errors: errors);
return result;
}
@override
Expression parseRelationalExpression(String code) {
return _parseExpression(code);
}
@override
RethrowExpression parseRethrowExpression(String code) {
return _parseExpression(code);
}
@override
BinaryExpression parseShiftExpression(String code) {
return _parseExpression(code);
}
@override
SimpleIdentifier parseSimpleIdentifier(String code) {
return _parseExpression(code);
}
@override
Statement parseStatement(String source,
{bool enableLazyAssignmentOperators, int expectedEndOffset}) {
createParser(source, expectedEndOffset: expectedEndOffset);
Statement statement = _parserProxy.parseStatement2();
assertErrors(codes: NO_ERROR_COMPARISON);
return statement;
}
@override
Expression parseStringLiteral(String code) {
return _parseExpression(code);
}
@override
SymbolLiteral parseSymbolLiteral(String code) {
return _parseExpression(code);
}
@override
Expression parseThrowExpression(String code) {
return _parseExpression(code);
}
@override
Expression parseThrowExpressionWithoutCascade(String code) {
return _parseExpression(code);
}
@override
PrefixExpression parseUnaryExpression(String code) {
return _parseExpression(code);
}
@override
VariableDeclarationList parseVariableDeclarationList(String code) {
var statement = parseStatement('$code;') as VariableDeclarationStatement;
return statement.variables;
}
Expression _parseExpression(String code) {
var statement = parseStatement('$code;') as ExpressionStatement;
return statement.expression;
}
ErrorCode _toFastaGeneratedAnalyzerErrorCode(ErrorCode code) {
if (code == ParserErrorCode.ABSTRACT_ENUM ||
code == ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION ||
code == ParserErrorCode.ABSTRACT_TOP_LEVEL_VARIABLE ||
code == ParserErrorCode.ABSTRACT_TYPEDEF ||
code == ParserErrorCode.CONST_ENUM ||
code == ParserErrorCode.CONST_TYPEDEF ||
code == ParserErrorCode.COVARIANT_TOP_LEVEL_DECLARATION ||
code == ParserErrorCode.FINAL_CLASS ||
code == ParserErrorCode.FINAL_ENUM ||
code == ParserErrorCode.FINAL_TYPEDEF ||
code == ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION)
return ParserErrorCode.EXTRANEOUS_MODIFIER;
return code;
}
List<ErrorCode> _toFastaGeneratedAnalyzerErrorCodes(
List<ErrorCode> expectedErrorCodes) =>
expectedErrorCodes.map(_toFastaGeneratedAnalyzerErrorCode).toList();
}
/**
* Tests of the fasta parser based on [FormalParameterParserTestMixin].
*/
@reflectiveTest
class FormalParameterParserTest_Fasta extends FastaParserTestCase
with FormalParameterParserTestMixin {
@override
void test_parseNormalFormalParameter_function_noType_typeParameterComments() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void test_parseNormalFormalParameter_function_type_typeParameterComments() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void test_parseNormalFormalParameter_function_void_typeParameterComments() {
// Ignored: Fasta does not support the generic comment syntax.
}
}
/**
* Proxy implementation of the analyzer parser, implemented in terms of the
* Fasta parser.
*
* This allows many of the analyzer parser tests to be run on Fasta, even if
* they call into the analyzer parser class directly.
*/
class ParserProxy extends analyzer.ParserAdapter {
/**
* The error listener to which scanner and parser errors will be reported.
*/
final GatheringErrorListener _errorListener;
ForwardingTestListener _eventListener;
final int expectedEndOffset;
/**
* Creates a [ParserProxy] which is prepared to begin parsing at the given
* Fasta token.
*/
factory ParserProxy(analyzer.Token firstToken,
{bool allowNativeClause: false,
bool enableGenericMethodComments: false,
int expectedEndOffset}) {
TestSource source = new TestSource();
var errorListener = new GatheringErrorListener(checkRanges: true);
var errorReporter = new ErrorReporter(errorListener, source);
return new ParserProxy._(firstToken, errorReporter, null, errorListener,
allowNativeClause: allowNativeClause,
enableGenericMethodComments: enableGenericMethodComments,
expectedEndOffset: expectedEndOffset);
}
ParserProxy._(analyzer.Token firstToken, ErrorReporter errorReporter,
Uri fileUri, this._errorListener,
{bool allowNativeClause: false,
bool enableGenericMethodComments: false,
this.expectedEndOffset})
: super(firstToken, errorReporter, fileUri,
allowNativeClause: allowNativeClause,
enableGenericMethodComments: enableGenericMethodComments) {
_eventListener = new ForwardingTestListener(astBuilder);
fastaParser.listener = _eventListener;
}
noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
@override
Annotation parseAnnotation() {
return _run('MetadataStar', () => super.parseAnnotation());
}
@override
ArgumentList parseArgumentList() {
return _run('unspecified', () => super.parseArgumentList());
}
@override
ClassMember parseClassMember(String className) {
return _run('ClassBody', () => super.parseClassMember(className));
}
List<Combinator> parseCombinators() {
return _run('Import', () => super.parseCombinators());
}
@override
CompilationUnit parseCompilationUnit2() {
CompilationUnit result = super.parseCompilationUnit2();
expect(currentToken.isEof, isTrue, reason: currentToken.lexeme);
expect(astBuilder.stack, hasLength(0));
_eventListener.expectEmpty();
return result;
}
@override
Configuration parseConfiguration() {
return _run('ConditionalUris', () => super.parseConfiguration());
}
@override
DottedName parseDottedName() {
return _run('unspecified', () => super.parseDottedName());
}
@override
Expression parseExpression2() {
return _run('unspecified', () => super.parseExpression2());
}
@override
FormalParameterList parseFormalParameterList({bool inFunctionType: false}) {
return _run('unspecified',
() => super.parseFormalParameterList(inFunctionType: inFunctionType));
}
@override
FunctionBody parseFunctionBody(
bool mayBeEmpty, ParserErrorCode emptyErrorCode, bool inExpression) {
Token lastToken;
FunctionBody body = _run('unspecified', () {
FunctionBody body =
super.parseFunctionBody(mayBeEmpty, emptyErrorCode, inExpression);
lastToken = currentToken;
currentToken = currentToken.next;
return body;
});
if (!inExpression) {
if (![';', '}'].contains(lastToken.lexeme)) {
fail('Expected ";" or "}", but found: ${lastToken.lexeme}');
}
}
return body;
}
@override
Expression parsePrimaryExpression() {
return _run('unspecified', () => super.parsePrimaryExpression());
}
@override
Statement parseStatement(Token token) {
return _run('unspecified', () => super.parseStatement(token));
}
@override
Statement parseStatement2() {
return _run('unspecified', () => super.parseStatement2());
}
@override
AnnotatedNode parseTopLevelDeclaration(bool isDirective) {
return _run(
'CompilationUnit', () => super.parseTopLevelDeclaration(isDirective));
}
@override
TypeAnnotation parseTypeAnnotation(bool inExpression) {
return _run('unspecified', () => super.parseTypeAnnotation(inExpression));
}
@override
TypeArgumentList parseTypeArgumentList() {
return _run('unspecified', () => super.parseTypeArgumentList());
}
@override
TypeName parseTypeName(bool inExpression) {
return _run('unspecified', () => super.parseTypeName(inExpression));
}
@override
TypeParameter parseTypeParameter() {
return _run('unspecified', () => super.parseTypeParameter());
}
@override
TypeParameterList parseTypeParameterList() {
return _run('unspecified', () => super.parseTypeParameterList());
}
/**
* Runs the specified function and returns the result.
* It checks the enclosing listener events,
* that the parse consumed all of the tokens,
* and that the result stack is empty.
*/
_run(String enclosingEvent, f()) {
_eventListener.begin(enclosingEvent);
var result = f();
_eventListener.end(enclosingEvent);
String lexeme = currentToken is ErrorToken
? currentToken.runtimeType.toString()
: currentToken.lexeme;
if (expectedEndOffset == null) {
expect(currentToken.isEof, isTrue, reason: lexeme);
} else {
expect(currentToken.offset, expectedEndOffset, reason: lexeme);
}
expect(astBuilder.stack, hasLength(0));
expect(astBuilder.directives, hasLength(0));
expect(astBuilder.declarations, hasLength(0));
return result;
}
}
@reflectiveTest
class RecoveryParserTest_Fasta extends FastaParserTestCase
with RecoveryParserTestMixin {
@override
void test_equalityExpression_precedence_relational_right() {
parseExpression("== is", codes: [
ParserErrorCode.EXPECTED_TYPE_NAME,
ParserErrorCode.MISSING_IDENTIFIER,
ParserErrorCode.MISSING_IDENTIFIER
]);
}
@override
@failingTest
void test_missingIdentifier_afterAnnotation() {
// TODO(brianwilkerson) reportUnrecoverableErrorWithToken
super.test_missingIdentifier_afterAnnotation();
}
@override
void test_relationalExpression_missing_LHS_RHS() {
parseExpression("is", codes: [
ParserErrorCode.EXPECTED_TYPE_NAME,
ParserErrorCode.MISSING_IDENTIFIER
]);
}
@override
void test_relationalExpression_precedence_shift_right() {
parseExpression("<< is", codes: [
ParserErrorCode.EXPECTED_TYPE_NAME,
ParserErrorCode.MISSING_IDENTIFIER,
ParserErrorCode.MISSING_IDENTIFIER
]);
}
}
@reflectiveTest
class SimpleParserTest_Fasta extends FastaParserTestCase
with SimpleParserTestMixin {
@override
@failingTest
void test_parseInstanceCreation_noKeyword_noPrefix() {
super.test_parseInstanceCreation_noKeyword_noPrefix();
}
@override
@failingTest
void test_parseInstanceCreation_noKeyword_prefix() {
super.test_parseInstanceCreation_noKeyword_prefix();
}
@override
@failingTest
void test_parseTypeParameterList_single() {
// TODO(brianwilkerson) Does not use all tokens.
super.test_parseTypeParameterList_single();
}
}
/**
* Tests of the fasta parser based on [StatementParserTestMixin].
*/
@reflectiveTest
class StatementParserTest_Fasta extends FastaParserTestCase
with StatementParserTestMixin {
@override
void test_parseFunctionDeclarationStatement_typeParameterComments() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void
test_parseStatement_functionDeclaration_noReturnType_typeParameterComments() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void test_parseVariableDeclarationListAfterMetadata_const_typeComment() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void test_parseVariableDeclarationListAfterMetadata_dynamic_typeComment() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void test_parseVariableDeclarationListAfterMetadata_final_typeComment() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void test_parseVariableDeclarationListAfterMetadata_type_typeComment() {
// Ignored: Fasta does not support the generic comment syntax.
}
@override
void test_parseVariableDeclarationListAfterMetadata_var_typeComment() {
// Ignored: Fasta does not support the generic comment syntax.
}
}
/**
* Tests of the fasta parser based on [TopLevelParserTestMixin].
*/
@reflectiveTest
class TopLevelParserTest_Fasta extends FastaParserTestCase
with TopLevelParserTestMixin {
void test_parseClassDeclaration_native_allowed() {
allowNativeClause = true;
test_parseClassDeclaration_native();
}
void test_parseClassDeclaration_native_allowedWithFields() {
allowNativeClause = true;
createParser(r'''
class A native 'something' {
final int x;
A() {}
}
''');
CompilationUnitMember member = parseFullCompilationUnitMember();
expect(member, isNotNull);
assertNoErrors();
}
void test_parseClassDeclaration_native_missing_literal() {
createParser('class A native {}');
CompilationUnitMember member = parseFullCompilationUnitMember();
expect(member, isNotNull);
if (allowNativeClause) {
assertNoErrors();
} else {
assertErrorsWithCodes([
ParserErrorCode.NATIVE_CLAUSE_SHOULD_BE_ANNOTATION,
]);
}
expect(member, new isInstanceOf<ClassDeclaration>());
ClassDeclaration declaration = member;
expect(declaration.nativeClause, isNotNull);
expect(declaration.nativeClause.nativeKeyword, isNotNull);
expect(declaration.nativeClause.name, isNull);
expect(declaration.endToken.type, TokenType.CLOSE_CURLY_BRACKET);
}
void test_parseClassDeclaration_native_missing_literal_allowed() {
allowNativeClause = true;
test_parseClassDeclaration_native_missing_literal();
}
void test_parseClassDeclaration_native_missing_literal_not_allowed() {
allowNativeClause = false;
test_parseClassDeclaration_native_missing_literal();
}
void test_parseClassDeclaration_native_not_allowed() {
allowNativeClause = false;
test_parseClassDeclaration_native();
}
}