// 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:test_reflective_loader/test_reflective_loader.dart';

import 'compile_time_error_code_driver_test.dart';

main() {
  defineReflectiveSuite(() {
    defineReflectiveTests(CompileTimeErrorCodeTest_Kernel);
  });
}

/// Tests marked with this annotations fail because we either have not triaged
/// them, or know that this is an analyzer problem.
const potentialAnalyzerProblem = const Object();

@reflectiveTest
class CompileTimeErrorCodeTest_Kernel extends CompileTimeErrorCodeTest_Driver {
  @override
  bool get enableKernelDriver => true;

  @override
  bool get useCFE => true;

  @override
  @failingTest
  test_accessPrivateEnumField() async {
    // 'package:analyzer/src/dart/analysis/library_analyzer.dart': Failed assertion: line 1082 pos 18: 'memberElement != null': is not true.
    await super.test_accessPrivateEnumField();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/12916')
  test_ambiguousExport() async => super.test_ambiguousExport();

  @override
  @failingTest
  test_annotationWithNotClass() async {
    // Bad state: No reference information for property at 117
    await super.test_annotationWithNotClass();
  }

  @override
  @failingTest
  test_annotationWithNotClass_prefixed() async {
    // Bad state: No reference information for pref at 36
    await super.test_annotationWithNotClass_prefixed();
  }

  @override
  @failingTest
  test_async_used_as_identifier_in_annotation() async {
    // 'package:analyzer/src/dart/constant/utilities.dart': Failed assertion: line 184 pos 14: 'node.parent is PartOfDirective ||
    await super.test_async_used_as_identifier_in_annotation();
  }

  @override
  @failingTest
  test_async_used_as_identifier_in_break_statement() async {
    // Bad state: No type information for true at 21
    await super.test_async_used_as_identifier_in_break_statement();
  }

  @override
  @failingTest
  test_async_used_as_identifier_in_continue_statement() async {
    // Bad state: No reference information for async at 42
    await super.test_async_used_as_identifier_in_continue_statement();
  }

  @override
  @failingTest
  test_async_used_as_identifier_in_prefix() {
    // NoSuchMethodError: The getter 'element' was called on null.
    return super.test_async_used_as_identifier_in_prefix();
  }

  @override
  @failingTest
  test_bug_23176() async {
    // This test fails because the kernel driver element model produces a
    // different element model result than the regular parser produces. Once these
    // tests enable the faster parser (and not just the kernel driver), this
    // should be looked at again.
    return super.test_bug_23176();
  }

  @override
  @failingTest
  test_builtInIdentifierAsType_formalParameter_field() async {
    // Expected 1 errors of type CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE, found 0;
    //          0 errors of type ParserErrorCode.EXTRANEOUS_MODIFIER, found 1 (23)
    await super.test_builtInIdentifierAsType_formalParameter_field();
  }

  @override
  @failingTest
  test_builtInIdentifierAsType_formalParameter_simple() async {
    // Expected 1 errors of type CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE, found 0;
    //          0 errors of type ParserErrorCode.EXTRANEOUS_MODIFIER, found 1 (2)
    await super.test_builtInIdentifierAsType_formalParameter_simple();
  }

  @override
  @failingTest
  test_builtInIdentifierAsType_variableDeclaration() async {
    // Bad state: No reference information for typedef at 8
    await super.test_builtInIdentifierAsType_variableDeclaration();
  }

  @override
  @failingTest
  test_caseExpressionTypeImplementsEquals() async {
    // Expected 1 errors of type CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, found 0
    await super.test_caseExpressionTypeImplementsEquals();
  }

  @override
  @failingTest
  test_conflictingConstructorNameAndMember_field() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD, found 0
    await super.test_conflictingConstructorNameAndMember_field();
  }

  @override
  @failingTest
  test_conflictingConstructorNameAndMember_getter() async {
    // Bad state: No type information for 42 at 25
    await super.test_conflictingConstructorNameAndMember_getter();
  }

  @override
  @failingTest
  test_conflictingConstructorNameAndMember_method() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD, found 0
    await super.test_conflictingConstructorNameAndMember_method();
  }

  @override
  @failingTest
  test_conflictingGenericInterfaces_hierarchyLoop() =>
      super.test_conflictingGenericInterfaces_hierarchyLoop();

  @override
  @failingTest
  test_conflictingGenericInterfaces_simple() =>
      super.test_conflictingGenericInterfaces_simple();

  @override
  @failingTest
  test_conflictingGenericInterfaces_viaMixin() =>
      super.test_conflictingGenericInterfaces_viaMixin();

  @override
  @failingTest
  test_conflictingGetterAndMethod_field_method() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD, found 0
    await super.test_conflictingGetterAndMethod_field_method();
  }

  @override
  @failingTest
  test_conflictingGetterAndMethod_getter_method() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD, found 0
    await super.test_conflictingGetterAndMethod_getter_method();
  }

  @override
  @failingTest
  test_conflictingGetterAndMethod_method_field() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER, found 0
    await super.test_conflictingGetterAndMethod_method_field();
  }

  @override
  @failingTest
  test_conflictingGetterAndMethod_method_getter() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER, found 0
    await super.test_conflictingGetterAndMethod_method_getter();
  }

  @override
  @failingTest
  test_conflictingTypeVariableAndClass() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS, found 0
    await super.test_conflictingTypeVariableAndClass();
  }

  @override
  @failingTest
  test_conflictingTypeVariableAndMember_field() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER, found 0
    await super.test_conflictingTypeVariableAndMember_field();
  }

  @override
  @failingTest
  test_conflictingTypeVariableAndMember_getter() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER, found 0
    await super.test_conflictingTypeVariableAndMember_getter();
  }

  @override
  @failingTest
  test_conflictingTypeVariableAndMember_method() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER, found 0
    await super.test_conflictingTypeVariableAndMember_method();
  }

  @override
  @failingTest
  test_conflictingTypeVariableAndMember_method_static() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER, found 0
    await super.test_conflictingTypeVariableAndMember_method_static();
  }

  @override
  @failingTest
  test_conflictingTypeVariableAndMember_setter() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER, found 0
    await super.test_conflictingTypeVariableAndMember_setter();
  }

  @override
  @failingTest
  test_const_invalid_constructorFieldInitializer_fromLibrary() {
    return super.test_const_invalid_constructorFieldInitializer_fromLibrary();
  }

  @override
  @failingTest
  test_constConstructorWithFieldInitializedByNonConst() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST, found 0;
    //          1 errors of type CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, found 0
    await super.test_constConstructorWithFieldInitializedByNonConst();
  }

  @override
  @failingTest
  test_constConstructorWithMixin() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN, found 0
    await super.test_constConstructorWithMixin();
  }

  @override
  @failingTest
  test_constConstructorWithNonConstSuper_explicit() async {
    // UnimplementedError: For ShadowInvalidInitializer
    await super.test_constConstructorWithNonConstSuper_explicit();
  }

  @override
  @failingTest
  test_constConstructorWithNonConstSuper_implicit() async {
    // UnimplementedError: For ShadowInvalidInitializer
    await super.test_constConstructorWithNonConstSuper_implicit();
  }

  @override
  @failingTest
  test_constConstructorWithNonFinalField_mixin() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN, found 0;
    //          1 errors of type CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD, found 0
    await super.test_constConstructorWithNonFinalField_mixin();
  }

  @override
  @failingTest
  test_constConstructorWithNonFinalField_super() async {
    // UnimplementedError: For ShadowInvalidInitializer
    await super.test_constConstructorWithNonFinalField_super();
  }

  @override
  @failingTest
  test_constConstructorWithNonFinalField_this() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD, found 0
    await super.test_constConstructorWithNonFinalField_this();
  }

  @override
  @failingTest
  test_constDeferredClass() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONST_DEFERRED_CLASS, found 0;
    //          0 errors of type HintCode.UNUSED_IMPORT, found 1 (21)
    await super.test_constDeferredClass();
  }

  @override
  @failingTest
  test_constDeferredClass_namedConstructor() async {
    // 'package:analyzer/src/fasta/resolution_applier.dart': Failed assertion: line 632 pos 14: 'constructorName.name == null': is not true.
    await super.test_constDeferredClass_namedConstructor();
  }

  @override
  @failingTest
  test_constEval_newInstance_constConstructor() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, found 0
    await super.test_constEval_newInstance_constConstructor();
  }

  @override
  @failingTest
  test_constEval_nonStaticField_inGenericClass() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, found 0
    await super.test_constEval_nonStaticField_inGenericClass();
  }

  @override
  @failingTest
  test_constEval_propertyExtraction_targetNotConst() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, found 0
    await super.test_constEval_propertyExtraction_targetNotConst();
  }

  @override
  @failingTest
  test_constEvalThrowsException_binaryMinus_null() async {
    // UnimplementedError: kernel: (Let) let final dynamic #t2 = null in let ...
    await super.test_constEvalThrowsException_binaryMinus_null();
  }

  @override
  @failingTest
  test_constEvalThrowsException_binaryPlus_null() async {
    // UnimplementedError: kernel: (Let) let final dynamic #t3 = null in let ...
    await super.test_constEvalThrowsException_binaryPlus_null();
  }

  @override
  @failingTest
  test_constEvalThrowsException_divisionByZero() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONST_EVAL_THROWS_IDBZE, found 0
    await super.test_constEvalThrowsException_divisionByZero();
  }

  @override
  @failingTest
  test_constEvalThrowsException_finalAlreadySet_initializer() async {
    // Bad state: No reference information for = at 41
    await super.test_constEvalThrowsException_finalAlreadySet_initializer();
  }

  @override
  @failingTest
  test_constEvalThrowsException_finalAlreadySet_initializing_formal() async {
    // UnimplementedError: For ShadowInvalidInitializer
    await super
        .test_constEvalThrowsException_finalAlreadySet_initializing_formal();
  }

  @override
  @failingTest
  test_constEvalThrowsException_unaryBitNot_null() async {
    // UnimplementedError: kernel: (Let) let final dynamic #t4 = null in let ...
    await super.test_constEvalThrowsException_unaryBitNot_null();
  }

  @override
  @failingTest
  test_constEvalThrowsException_unaryNegated_null() async {
    // UnimplementedError: kernel: (Let) let final dynamic #t5 = null in let ...
    await super.test_constEvalThrowsException_unaryNegated_null();
  }

  @override
  @failingTest
  test_constEvalThrowsException_unaryNot_null() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, found 0
    await super.test_constEvalThrowsException_unaryNot_null();
  }

  @override
  @failingTest
  test_constEvalTypeBool_binary() async {
    // UnimplementedError: kernel: (Let) let final dynamic #t6 = "" in let ...
    await super.test_constEvalTypeBool_binary();
  }

  @override
  @failingTest
  test_constEvalTypeBool_binary_leftTrue() async {
    // UnimplementedError: kernel: (Let) let final dynamic #t7 = 0 in let ...
    await super.test_constEvalTypeBool_binary_leftTrue();
  }

  @override
  @failingTest
  test_constEvalTypeBoolNumString_equal() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING, found 0
    await super.test_constEvalTypeBoolNumString_equal();
  }

  @override
  @failingTest
  test_constEvalTypeBoolNumString_notEqual() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING, found 0
    await super.test_constEvalTypeBoolNumString_notEqual();
  }

  @override
  @failingTest
  test_constEvalTypeInt_binary() async {
    // UnimplementedError: kernel: (Let) let final dynamic #t8 = "" in let ...
    await super.test_constEvalTypeInt_binary();
  }

  @override
  @failingTest
  test_constEvalTypeNum_binary() async {
    // UnimplementedError: kernel: (Let) let final dynamic #t9 = "" in let ...
    await super.test_constEvalTypeNum_binary();
  }

  @override
  @failingTest
  test_constFormalParameter_fieldFormalParameter() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONST_FORMAL_PARAMETER, found 0;
    //          0 errors of type ParserErrorCode.EXTRANEOUS_MODIFIER, found 1 (23)
    await super.test_constFormalParameter_fieldFormalParameter();
  }

  @override
  @failingTest
  test_constFormalParameter_simpleFormalParameter() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONST_FORMAL_PARAMETER, found 0;
    //          0 errors of type ParserErrorCode.EXTRANEOUS_MODIFIER, found 1 (2)
    await super.test_constFormalParameter_simpleFormalParameter();
  }

  @override
  @failingTest
  test_constInitializedWithNonConstValue() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, found 0
    await super.test_constInitializedWithNonConstValue();
  }

  @override
  @failingTest
  test_constInitializedWithNonConstValue_finalField() async {
    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE, found 0
    await super.test_constInitializedWithNonConstValue_finalField();
  }

  @override
  @failingTest
  test_constInitializedWithNonConstValueFromDeferredClass() async {
    // Bad state: Expected element reference for analyzer offset 58; got one for kernel offset 60
    await super.test_constInitializedWithNonConstValueFromDeferredClass();
  }

  @override
  @failingTest
  test_constInitializedWithNonConstValueFromDeferredClass_nested() async {
    // Bad state: Expected element reference for analyzer offset 58; got one for kernel offset 60
    await super
        .test_constInitializedWithNonConstValueFromDeferredClass_nested();
  }

  @override
  @failingTest
  test_constInstanceField() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONST_INSTANCE_FIELD, found 0
    await super.test_constInstanceField();
  }

  @override
  @failingTest
  test_constMapKeyTypeImplementsEquals_direct() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, found 0
    await super.test_constMapKeyTypeImplementsEquals_direct();
  }

  @override
  @failingTest
  test_constMapKeyTypeImplementsEquals_dynamic() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, found 0
    await super.test_constMapKeyTypeImplementsEquals_dynamic();
  }

  @override
  @failingTest
  test_constMapKeyTypeImplementsEquals_factory() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, found 0
    await super.test_constMapKeyTypeImplementsEquals_factory();
  }

  @override
  @failingTest
  test_constMapKeyTypeImplementsEquals_super() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, found 0
    await super.test_constMapKeyTypeImplementsEquals_super();
  }

  @override
  @failingTest
  test_constWithInvalidTypeParameters() async {
    // Bad state: Found 0 argument types for 1 type arguments
    await super.test_constWithInvalidTypeParameters();
  }

  @override
  @failingTest
  test_constWithInvalidTypeParameters_tooFew() async {
    // Bad state: Found 2 argument types for 1 type arguments
    await super.test_constWithInvalidTypeParameters_tooFew();
  }

  @override
  @failingTest
  test_constWithInvalidTypeParameters_tooMany() async {
    // Bad state: Found 1 argument types for 2 type arguments
    await super.test_constWithInvalidTypeParameters_tooMany();
  }

  @override
  @failingTest
  test_constWithNonConst() async {
    // Bad state: No type information for T at 52
    await super.test_constWithNonConst();
  }

  @override
  @failingTest
  test_constWithNonConst_with() async {
    // Bad state: No type information for C at 72
    await super.test_constWithNonConst_with();
  }

  @override
  @failingTest
  test_constWithNonConst_in_const_context() async {
    // Bad state: No data for () at 58
    await super.test_constWithNonConst_in_const_context();
  }

  @override
  @failingTest
  test_constWithNonConstantArgument_annotation() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT, found 0
    await super.test_constWithNonConstantArgument_annotation();
  }

  @override
  @failingTest
  test_constWithNonConstantArgument_instanceCreation() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT, found 0;
    //          1 errors of type CompileTimeErrorCode.INVALID_CONSTANT, found 0
    await super.test_constWithNonConstantArgument_instanceCreation();
  }

  @override
  @failingTest
  test_constWithNonType() async {
    // Bad state: No type information for A at 28
    await super.test_constWithNonType();
  }

  @override
  @failingTest
  test_constWithNonType_fromLibrary() async {
    // Bad state: No type information for lib.A at 45
    await super.test_constWithNonType_fromLibrary();
  }

  @override
  @failingTest
  test_constWithUndefinedConstructor() async {
    // Bad state: No type information for A.noSuchConstructor at 46
    await super.test_constWithUndefinedConstructor();
  }

  @override
  @failingTest
  test_constWithUndefinedConstructorDefault() async {
    // Bad state: No type information for A at 51
    await super.test_constWithUndefinedConstructorDefault();
  }

  @override
  @failingTest
  test_defaultValueInFunctionTypeAlias_new_named() async {
    // Bad state: (GenericTypeAliasImpl) typedef F = int Function({Map<String, String> m : const {}})
    await super.test_defaultValueInFunctionTypeAlias_new_named();
  }

  @override
  @failingTest
  test_defaultValueInFunctionTypeAlias_new_positional() async {
    // Bad state: (GenericTypeAliasImpl) typedef F = int Function([Map<String, String> m = const {}])
    await super.test_defaultValueInFunctionTypeAlias_new_positional();
  }

  @override
  @failingTest
  test_defaultValueInFunctionTypeAlias_old_named() async {
    // Expected 1 errors of type CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS, found 0;
    //          0 errors of type ParserErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE, found 1 (13)
    await super.test_defaultValueInFunctionTypeAlias_old_named();
  }

  @override
  @failingTest
  test_defaultValueInFunctionTypeAlias_old_positional() async {
    // Expected 1 errors of type CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS, found 0;
    //          0 errors of type ParserErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE, found 1 (13)
    await super.test_defaultValueInFunctionTypeAlias_old_positional();
  }

  @override
  @failingTest
  test_defaultValueInFunctionTypedParameter_named() async {
    // Expected 1 errors of type CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER, found 0;
    //          0 errors of type ParserErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE, found 1 (6)
    await super.test_defaultValueInFunctionTypedParameter_named();
  }

  @override
  @failingTest
  test_defaultValueInFunctionTypedParameter_optional() async {
    // Expected 1 errors of type CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER, found 0;
    //          0 errors of type ParserErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE, found 1 (7)
    await super.test_defaultValueInFunctionTypedParameter_optional();
  }

  @override
  @failingTest
  test_defaultValueInRedirectingFactoryConstructor() async {
    // Expected 1 errors of type CompileTimeErrorCode.DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR, found 0
    await super.test_defaultValueInRedirectingFactoryConstructor();
  }

  @override
  @failingTest
  test_deferredImportWithInvalidUri() async {
    // Bad state: No reference information for p at 49
    await super.test_deferredImportWithInvalidUri();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/30857')
  test_duplicateConstructorName_named() async {
    return super.test_duplicateConstructorName_named();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/30857')
  test_duplicateConstructorName_unnamed() async {
    return super.test_duplicateConstructorName_unnamed();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/30857')
  test_duplicateDefinition_acrossLibraries() async {
    return super.test_duplicateDefinition_acrossLibraries();
  }

  @override
  @failingTest
  test_duplicateDefinition_catch() async {
    // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION, found 0
    await super.test_duplicateDefinition_catch();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/30857')
  test_duplicateDefinition_classMembers_fields() async {
    return super.test_duplicateDefinition_classMembers_fields();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/30857')
  test_duplicateDefinition_classMembers_fields_oneStatic() async {
    return super.test_duplicateDefinition_classMembers_fields_oneStatic();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/30857')
  test_duplicateDefinition_classMembers_methods() async {
    return super.test_duplicateDefinition_classMembers_methods();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/30857')
  test_duplicateDefinition_inPart() async {
    return super.test_duplicateDefinition_inPart();
  }

  @override
  @failingTest
  test_duplicateDefinition_locals_inCase() async {
    // Bad state: No type information for a at 58
    await super.test_duplicateDefinition_locals_inCase();
  }

  @override
  @failingTest
  test_duplicateDefinition_locals_inFunctionBlock() async {
    // Bad state: No declaration information for m(a) {} at 24
    await super.test_duplicateDefinition_locals_inFunctionBlock();
  }

  @override
  @failingTest
  test_duplicateDefinition_locals_inIf() async {
    // Bad state: No type information for a at 49
    await super.test_duplicateDefinition_locals_inIf();
  }

  @override
  @failingTest
  test_duplicateDefinition_locals_inMethodBlock() async {
    // Bad state: No type information for a at 37
    await super.test_duplicateDefinition_locals_inMethodBlock();
  }

  @override
  @failingTest
  test_duplicateDefinition_parameters_inConstructor() async {
    // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION, found 0
    await super.test_duplicateDefinition_parameters_inConstructor();
  }

  @override
  @failingTest
  test_duplicateDefinition_parameters_inFunctionTypeAlias() async {
    // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION, found 0
    await super.test_duplicateDefinition_parameters_inFunctionTypeAlias();
  }

  @override
  @failingTest
  test_duplicateDefinition_parameters_inLocalFunction() async {
    // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION, found 0
    await super.test_duplicateDefinition_parameters_inLocalFunction();
  }

  @override
  @failingTest
  test_duplicateDefinition_parameters_inMethod() async {
    // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION, found 0
    await super.test_duplicateDefinition_parameters_inMethod();
  }

  @override
  @failingTest
  test_duplicateDefinition_parameters_inTopLevelFunction() async {
    // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION, found 0
    await super.test_duplicateDefinition_parameters_inTopLevelFunction();
  }

  @override
  @failingTest
  test_duplicateDefinition_typeParameters() async {
    // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION, found 0
    await super.test_duplicateDefinition_typeParameters();
  }

  @override
  @failingTest
  test_duplicateDefinitionInheritance_instanceGetter_staticGetter() async {
    // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE, found 0
    await super
        .test_duplicateDefinitionInheritance_instanceGetter_staticGetter();
  }

  @override
  @failingTest
  test_duplicateDefinitionInheritance_instanceGetterAbstract_staticGetter() async {
    // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE, found 0
    await super
        .test_duplicateDefinitionInheritance_instanceGetterAbstract_staticGetter();
  }

  @override
  @failingTest
  test_duplicateDefinitionInheritance_instanceMethod_staticMethod() async {
    // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE, found 0
    await super
        .test_duplicateDefinitionInheritance_instanceMethod_staticMethod();
  }

  @override
  @failingTest
  test_duplicateDefinitionInheritance_instanceMethodAbstract_staticMethod() async {
    // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE, found 0
    await super
        .test_duplicateDefinitionInheritance_instanceMethodAbstract_staticMethod();
  }

  @override
  @failingTest
  test_duplicateDefinitionInheritance_instanceSetter_staticSetter() async {
    // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE, found 0
    await super
        .test_duplicateDefinitionInheritance_instanceSetter_staticSetter();
  }

  @override
  @failingTest
  test_duplicateDefinitionInheritance_instanceSetterAbstract_staticSetter() async {
    // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE, found 0
    await super
        .test_duplicateDefinitionInheritance_instanceSetterAbstract_staticSetter();
  }

  @override
  @failingTest
  test_duplicateNamedArgument() async {
    // Bad state: No type information for 1 at 29
    await super.test_duplicateNamedArgument();
  }

  @override
  @failingTest
  test_exportInternalLibrary() async {
    // Expected 1 errors of type CompileTimeErrorCode.EXPORT_INTERNAL_LIBRARY, found 0
    await super.test_exportInternalLibrary();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/30960')
  test_exportOfNonLibrary() async {
    return super.test_exportOfNonLibrary();
  }

  @override
  @failingTest
  test_extendsDeferredClass() async {
    // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS, found 0;
    //          0 errors of type HintCode.UNUSED_IMPORT, found 1 (21)
    await super.test_extendsDeferredClass();
  }

  @override
  @failingTest
  test_extendsDeferredClass_classTypeAlias() async {
    // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS, found 0;
    //          0 errors of type HintCode.UNUSED_IMPORT, found 1 (21)
    await super.test_extendsDeferredClass_classTypeAlias();
  }

  @override
  test_extendsDisallowedClass_class_Null() async {
    await super.test_extendsDisallowedClass_class_Null();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/31817')
  test_extendsDisallowedClass_classTypeAlias_Null() async {
    // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS, found 0
    await super.test_extendsDisallowedClass_classTypeAlias_Null();
  }

  @override
  @failingTest
  test_extendsEnum() async {
    // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_ENUM, found 0
    await super.test_extendsEnum();
  }

  @override
  @failingTest
  test_extendsNonClass_class() async {
    // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_NON_CLASS, found 0
    await super.test_extendsNonClass_class();
  }

  @override
  @failingTest
  test_extendsNonClass_dynamic() async {
    // Expected 1 errors of type CompileTimeErrorCode.EXTENDS_NON_CLASS, found 0
    await super.test_extendsNonClass_dynamic();
  }

  @override
  @failingTest
  test_extraPositionalArguments_const() async {
    // Bad state: No type information for A at 42
    await super.test_extraPositionalArguments_const();
  }

  @override
  @failingTest
  test_extraPositionalArguments_const_super() async {
    // Bad state: No type information for 0 at 65
    await super.test_extraPositionalArguments_const_super();
  }

  @override
  @failingTest
  test_extraPositionalArgumentsCouldBeNamed_const() async {
    // Bad state: No type information for A at 49
    await super.test_extraPositionalArgumentsCouldBeNamed_const();
  }

  @override
  @failingTest
  test_extraPositionalArgumentsCouldBeNamed_const_super() async {
    // Bad state: No type information for 0 at 72
    await super.test_extraPositionalArgumentsCouldBeNamed_const_super();
  }

  @override
  @failingTest
  test_fieldFormalParameter_assignedInInitializer() async {
    // Bad state: No reference information for = at 35
    await super.test_fieldFormalParameter_assignedInInitializer();
  }

  @override
  @failingTest
  test_fieldInitializedByMultipleInitializers() async {
    // Bad state: No reference information for = at 36
    await super.test_fieldInitializedByMultipleInitializers();
  }

  @override
  @failingTest
  test_fieldInitializedByMultipleInitializers_multipleInits() async {
    // Bad state: No reference information for = at 36
    await super.test_fieldInitializedByMultipleInitializers_multipleInits();
  }

  @override
  @failingTest
  test_fieldInitializedByMultipleInitializers_multipleNames() async {
    // Bad state: Expected element reference for analyzer offset 45; got one for kernel offset 52
    await super.test_fieldInitializedByMultipleInitializers_multipleNames();
  }

  @override
  @failingTest
  test_fieldInitializedInParameterAndInitializer() async {
    // Bad state: No reference information for = at 35
    await super.test_fieldInitializedInParameterAndInitializer();
  }

  @override
  @failingTest
  test_fieldInitializerFactoryConstructor() async {
    // Expected 1 errors of type CompileTimeErrorCode.FIELD_INITIALIZER_FACTORY_CONSTRUCTOR, found 0
    await super.test_fieldInitializerFactoryConstructor();
  }

  @override
  @failingTest
  test_fieldInitializerOutsideConstructor() async {
    // Expected 1 errors of type ParserErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, found 0;
    //          1 errors of type CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, found 0
    await super.test_fieldInitializerOutsideConstructor();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/30982')
  test_fieldInitializerRedirectingConstructor_afterRedirection() async {
    return super.test_fieldInitializerRedirectingConstructor_afterRedirection();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/30982')
  test_fieldInitializerRedirectingConstructor_beforeRedirection() async {
    return super
        .test_fieldInitializerRedirectingConstructor_beforeRedirection();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/30982')
  test_fieldInitializingFormalRedirectingConstructor() async {
    return super.test_fieldInitializingFormalRedirectingConstructor();
  }

  @override
  @failingTest
  test_finalInitializedMultipleTimes_initializers() async {
    // Bad state: No reference information for = at 38
    await super.test_finalInitializedMultipleTimes_initializers();
  }

  @override
  @failingTest
  test_finalInitializedMultipleTimes_initializingFormal_initializer() async {
    // Bad state: No reference information for = at 37
    await super
        .test_finalInitializedMultipleTimes_initializingFormal_initializer();
  }

  @override
  @failingTest
  test_finalInitializedMultipleTimes_initializingFormals() async {
    // Expected 1 errors of type CompileTimeErrorCode.DUPLICATE_DEFINITION, found 0;
    //          1 errors of type CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES, found 0
    await super.test_finalInitializedMultipleTimes_initializingFormals();
  }

  @override
  @failingTest
  test_finalNotInitialized_local_const() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONST_NOT_INITIALIZED, found 0
    await super.test_finalNotInitialized_local_const();
  }

  @override
  @failingTest
  test_fromEnvironment_bool_badArgs() async {
    // Expected 2 errors of type CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, found 0;
    //          2 errors of type StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, found 0
    await super.test_fromEnvironment_bool_badArgs();
  }

  @override
  @failingTest
  test_fromEnvironment_bool_badDefault_whenDefined() async {
    // Expected 1 errors of type CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, found 0;
    //          1 errors of type StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, found 0
    await super.test_fromEnvironment_bool_badDefault_whenDefined();
  }

  @override
  @failingTest
  test_genericFunctionTypedParameter() async {
    // Expected 1 errors of type CompileTimeErrorCode.GENERIC_FUNCTION_TYPED_PARAM_UNSUPPORTED, found 0
    await super.test_genericFunctionTypedParameter();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/30857')
  test_getterAndMethodWithSameName() async {
    return super.test_getterAndMethodWithSameName();
  }

  @override
  @failingTest
  test_implementsDeferredClass() async {
    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS, found 0;
    //          0 errors of type HintCode.UNUSED_IMPORT, found 1 (21)
    await super.test_implementsDeferredClass();
  }

  @override
  @failingTest
  test_implementsDeferredClass_classTypeAlias() async {
    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS, found 0;
    //          0 errors of type HintCode.UNUSED_IMPORT, found 1 (21)
    await super.test_implementsDeferredClass_classTypeAlias();
  }

  @override
  test_implementsDisallowedClass_class_Null() async {
    await super.test_implementsDisallowedClass_class_Null();
  }

  @override
  @failingTest
  test_implementsDisallowedClass_class_String_num() async {
    await super.test_implementsDisallowedClass_class_String_num();
  }

  @override
  test_implementsDisallowedClass_classTypeAlias_Null() async {
    await super.test_implementsDisallowedClass_classTypeAlias_Null();
  }

  @override
  @failingTest
  test_implementsDisallowedClass_classTypeAlias_String_num() async {
    await super.test_implementsDisallowedClass_classTypeAlias_String_num();
  }

  @override
  @failingTest
  test_implementsDynamic() async {
    // AnalysisException: Element mismatch in /test.dart at /test.dart
    await super.test_implementsDynamic();
  }

  @override
  @failingTest
  test_implementsEnum() async {
    // AnalysisException: Element mismatch in /test.dart at /test.dart
    await super.test_implementsEnum();
  }

  @override
  @failingTest
  test_implementsNonClass_class() async {
    // AnalysisException: Element mismatch in /test.dart at /test.dart
    await super.test_implementsNonClass_class();
  }

  @override
  @failingTest
  test_implementsNonClass_typeAlias() async {
    // AnalysisException: Element mismatch in /test.dart at /test.dart
    await super.test_implementsNonClass_typeAlias();
  }

  @override
  @failingTest
  test_implementsRepeated() async {
    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_REPEATED, found 0
    await super.test_implementsRepeated();
  }

  @override
  @failingTest
  test_implementsRepeated_3times() async {
    // Expected 3 errors of type CompileTimeErrorCode.IMPLEMENTS_REPEATED, found 0
    await super.test_implementsRepeated_3times();
  }

  @override
  @failingTest
  test_implementsSuperClass() async {
    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS, found 0
    await super.test_implementsSuperClass();
  }

  @override
  @failingTest
  test_implementsSuperClass_Object() async {
    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS, found 0
    await super.test_implementsSuperClass_Object();
  }

  @override
  @failingTest
  test_implementsSuperClass_Object_typeAlias() async {
    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS, found 0
    await super.test_implementsSuperClass_Object_typeAlias();
  }

  @override
  @failingTest
  test_implementsSuperClass_typeAlias() async {
    // Expected 1 errors of type CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS, found 0
    await super.test_implementsSuperClass_typeAlias();
  }

  @override
  @failingTest
  test_implicitThisReferenceInInitializer_field() async {
    // Expected 1 errors of type CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER, found 0
    await super.test_implicitThisReferenceInInitializer_field();
  }

  @override
  @failingTest
  test_implicitThisReferenceInInitializer_field2() async {
    // Bad state: No reference information for x at 37
    await super.test_implicitThisReferenceInInitializer_field2();
  }

  @override
  @failingTest
  test_implicitThisReferenceInInitializer_invocation() async {
    // Expected 1 errors of type CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER, found 0
    await super.test_implicitThisReferenceInInitializer_invocation();
  }

  @override
  @failingTest
  test_implicitThisReferenceInInitializer_invocationInStatic() async {
    // Bad state: No reference information for m at 27
    await super.test_implicitThisReferenceInInitializer_invocationInStatic();
  }

  @override
  @failingTest
  test_implicitThisReferenceInInitializer_redirectingConstructorInvocation() async {
    // Expected 1 errors of type CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER, found 0
    await super
        .test_implicitThisReferenceInInitializer_redirectingConstructorInvocation();
  }

  @override
  @failingTest
  test_implicitThisReferenceInInitializer_superConstructorInvocation() async {
    // Expected 1 errors of type CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER, found 0
    await super
        .test_implicitThisReferenceInInitializer_superConstructorInvocation();
  }

  @override
  @failingTest
  test_importInternalLibrary() async {
    // Expected 1 errors of type CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY, found 0
    await super.test_importInternalLibrary();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/30959')
  test_importOfNonLibrary() async {
    return super.test_importOfNonLibrary();
  }

  @override
  @failingTest
  test_inconsistentCaseExpressionTypes() async {
    // Expected 1 errors of type CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES, found 0
    await super.test_inconsistentCaseExpressionTypes();
  }

  @override
  @failingTest
  test_inconsistentCaseExpressionTypes_dynamic() async {
    // Expected 2 errors of type CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES, found 0
    await super.test_inconsistentCaseExpressionTypes_dynamic();
  }

  @override
  @failingTest
  test_inconsistentCaseExpressionTypes_repeated() async {
    // Expected 2 errors of type CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES, found 0
    await super.test_inconsistentCaseExpressionTypes_repeated();
  }

  @override
  @failingTest
  test_initializerForNonExistent_const() async {
    // Bad state: No reference information for = at 26
    await super.test_initializerForNonExistent_const();
  }

  @override
  @failingTest
  test_initializerForNonExistent_initializer() async {
    // Bad state: No reference information for = at 20
    await super.test_initializerForNonExistent_initializer();
  }

  @override
  @failingTest
  test_initializerForStaticField() async {
    // Bad state: No reference information for = at 36
    await super.test_initializerForStaticField();
  }

  @override
  @failingTest
  test_initializingFormalForNonExistentField() async {
    // Expected 1 errors of type CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD, found 0
    await super.test_initializingFormalForNonExistentField();
  }

  @override
  @failingTest
  test_initializingFormalForNonExistentField_notInEnclosingClass() async {
    // Expected 1 errors of type CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD, found 0
    await super
        .test_initializingFormalForNonExistentField_notInEnclosingClass();
  }

  @override
  @failingTest
  test_initializingFormalForNonExistentField_optional() async {
    // Expected 1 errors of type CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD, found 0
    await super.test_initializingFormalForNonExistentField_optional();
  }

  @override
  @failingTest
  test_initializingFormalForNonExistentField_synthetic() async {
    // Expected 1 errors of type CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD, found 0
    await super.test_initializingFormalForNonExistentField_synthetic();
  }

  @override
  @failingTest
  test_initializingFormalForStaticField() async {
    // Expected 1 errors of type CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD, found 0
    await super.test_initializingFormalForStaticField();
  }

  @override
  @failingTest
  test_instanceMemberAccessFromFactory_named() async {
    // Bad state: Expected element reference for analyzer offset 51; got one for kernel offset 71
    await super.test_instanceMemberAccessFromFactory_named();
  }

  @override
  @failingTest
  test_instanceMemberAccessFromFactory_unnamed() async {
    // Bad state: Expected element reference for analyzer offset 48; got one for kernel offset 68
    await super.test_instanceMemberAccessFromFactory_unnamed();
  }

  @override
  @failingTest
  test_instanceMemberAccessFromStatic_field() async {
    // Bad state: No reference information for f at 40
    await super.test_instanceMemberAccessFromStatic_field();
  }

  @override
  @failingTest
  test_instanceMemberAccessFromStatic_getter() async {
    // Bad state: No reference information for g at 48
    await super.test_instanceMemberAccessFromStatic_getter();
  }

  @override
  @failingTest
  test_instanceMemberAccessFromStatic_method() async {
    // Bad state: No reference information for m at 40
    await super.test_instanceMemberAccessFromStatic_method();
  }

  @override
  @failingTest
  test_instantiateEnum_const() async {
    // Bad state: No type information for E at 49
    await super.test_instantiateEnum_const();
  }

  @override
  @failingTest
  test_instantiateEnum_new() async {
    // Bad state: No type information for E at 47
    await super.test_instantiateEnum_new();
  }

  @override
  @failingTest
  test_integerLiteralOutOfRange_negative() async {
    // Expected 1 errors of type CompileTimeErrorCode.INTEGER_LITERAL_OUT_OF_RANGE, found 0
    await super.test_integerLiteralOutOfRange_negative();
  }

  @override
  @failingTest
  test_integerLiteralOutOfRange_positive() async {
    // Expected 1 errors of type CompileTimeErrorCode.INTEGER_LITERAL_OUT_OF_RANGE, found 0
    await super.test_integerLiteralOutOfRange_positive();
  }

  @override
  @failingTest
  test_invalidAnnotation_importWithPrefix_notConstantVariable() async {
    // Bad state: No reference information for V at 27
    await super.test_invalidAnnotation_importWithPrefix_notConstantVariable();
  }

  @override
  @failingTest
  test_invalidAnnotation_importWithPrefix_notVariableOrConstructorInvocation() {
    return super
        .test_invalidAnnotation_importWithPrefix_notVariableOrConstructorInvocation();
  }

  @override
  @failingTest
  test_invalidAnnotation_notConstantVariable() async {
    // Expected 1 errors of type CompileTimeErrorCode.INVALID_ANNOTATION, found 0
    await super.test_invalidAnnotation_notConstantVariable();
  }

  @override
  @failingTest
  test_invalidAnnotation_notVariableOrConstructorInvocation() {
    return super.test_invalidAnnotation_notVariableOrConstructorInvocation();
  }

  @override
  @failingTest
  test_invalidAnnotation_staticMethodReference() async {
    // Bad state: Expected element reference for analyzer offset 31; got one for kernel offset 30
    await super.test_invalidAnnotation_staticMethodReference();
  }

  @override
  @failingTest
  test_invalidAnnotationFromDeferredLibrary() async {
    // Bad state: No reference information for v at 51
    await super.test_invalidAnnotationFromDeferredLibrary();
  }

  @override
  @failingTest
  test_invalidAnnotationFromDeferredLibrary_constructor() async {
    // Bad state: No reference information for C at 51
    await super.test_invalidAnnotationFromDeferredLibrary_constructor();
  }

  @override
  @failingTest
  test_invalidAnnotationFromDeferredLibrary_namedConstructor() async {
    // Bad state: No reference information for C at 51
    await super.test_invalidAnnotationFromDeferredLibrary_namedConstructor();
  }

  @override
  @failingTest
  test_invalidAnnotationGetter_getter() async {
    // Expected 1 errors of type CompileTimeErrorCode.INVALID_ANNOTATION, found 0
    await super.test_invalidAnnotationGetter_getter();
  }

  @override
  @failingTest
  test_invalidAnnotationGetter_importWithPrefix_getter() async {
    // Bad state: No reference information for V at 27
    await super.test_invalidAnnotationGetter_importWithPrefix_getter();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/31001')
  test_invalidConstructorName_notEnclosingClassName_defined() async {
    return super.test_invalidConstructorName_notEnclosingClassName_defined();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/31001')
  test_invalidConstructorName_notEnclosingClassName_undefined() async {
    return super.test_invalidConstructorName_notEnclosingClassName_undefined();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/30999')
  test_invalidFactoryNameNotAClass_notClassName() async {
    return super.test_invalidFactoryNameNotAClass_notClassName();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/30999')
  test_invalidFactoryNameNotAClass_notEnclosingClassName() async {
    return super.test_invalidFactoryNameNotAClass_notEnclosingClassName();
  }

  @override
  @failingTest
  test_invalidModifierOnConstructor_async() async {
    // Expected 1 errors of type CompileTimeErrorCode.INVALID_MODIFIER_ON_CONSTRUCTOR, found 0
    await super.test_invalidModifierOnConstructor_async();
  }

  @override
  @failingTest
  test_invalidModifierOnConstructor_asyncStar() async {
    // Expected 1 errors of type CompileTimeErrorCode.INVALID_MODIFIER_ON_CONSTRUCTOR, found 0
    await super.test_invalidModifierOnConstructor_asyncStar();
  }

  @override
  @failingTest
  test_invalidModifierOnConstructor_syncStar() async {
    // Expected 1 errors of type CompileTimeErrorCode.INVALID_MODIFIER_ON_CONSTRUCTOR, found 0
    await super.test_invalidModifierOnConstructor_syncStar();
  }

  @override
  @failingTest
  test_invalidReferenceToThis_factoryConstructor() async {
    // Expected 1 errors of type CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, found 0
    await super.test_invalidReferenceToThis_factoryConstructor();
  }

  @override
  @failingTest
  test_invalidReferenceToThis_instanceVariableInitializer_inConstructor() async {
    // Expected 1 errors of type CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, found 0
    await super
        .test_invalidReferenceToThis_instanceVariableInitializer_inConstructor();
  }

  @override
  @failingTest
  test_invalidReferenceToThis_instanceVariableInitializer_inDeclaration() async {
    // Expected 1 errors of type CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, found 0
    await super
        .test_invalidReferenceToThis_instanceVariableInitializer_inDeclaration();
  }

  @override
  @failingTest
  test_invalidReferenceToThis_staticMethod() async {
    // Expected 1 errors of type CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, found 0
    await super.test_invalidReferenceToThis_staticMethod();
  }

  @override
  @failingTest
  test_invalidReferenceToThis_staticVariableInitializer() async {
    // Expected 1 errors of type CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, found 0
    await super.test_invalidReferenceToThis_staticVariableInitializer();
  }

  @override
  @failingTest
  test_invalidReferenceToThis_superInitializer() async {
    // Expected 1 errors of type CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, found 0
    await super.test_invalidReferenceToThis_superInitializer();
  }

  @override
  @failingTest
  test_invalidReferenceToThis_topLevelFunction() async {
    // Expected 1 errors of type CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, found 0
    await super.test_invalidReferenceToThis_topLevelFunction();
  }

  @override
  @failingTest
  test_invalidReferenceToThis_variableInitializer() async {
    // Expected 1 errors of type CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, found 0
    await super.test_invalidReferenceToThis_variableInitializer();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/31801')
  test_invalidUri_export() async {
    return super.test_invalidUri_export();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/31801')
  test_invalidUri_import() async {
    return super.test_invalidUri_import();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/31801')
  test_invalidUri_part() async {
    return super.test_invalidUri_part();
  }

  @override
  @failingTest
  test_isInConstInstanceCreation_restored() async {
    // Expected 1 errors of type CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, found 0
    await super.test_isInConstInstanceCreation_restored();
  }

  @override
  @failingTest
  test_isInInstanceVariableInitializer_restored() async {
    // Bad state: No reference information for _foo at 89
    await super.test_isInInstanceVariableInitializer_restored();
  }

  @override
  @failingTest
  test_labelInOuterScope() async {
    // Bad state: No reference information for l at 32
    await super.test_labelInOuterScope();
  }

  @override
  @failingTest
  test_labelUndefined_break() async {
    // Bad state: No reference information for x at 8
    await super.test_labelUndefined_break();
  }

  @override
  @failingTest
  test_labelUndefined_continue() async {
    // Bad state: No reference information for x at 8
    await super.test_labelUndefined_continue();
  }

  @override
  @failingTest
  test_length_of_erroneous_constant() async {
    // UnimplementedError: kernel: (Let) let final dynamic #t15 = 1 in let ...
    await super.test_length_of_erroneous_constant();
  }

  @override
  @failingTest
  test_memberWithClassName_field() async {
    // Expected 1 errors of type CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME, found 0
    await super.test_memberWithClassName_field();
  }

  @override
  @failingTest
  test_memberWithClassName_field2() async {
    // UnimplementedError: Multiple field
    await super.test_memberWithClassName_field2();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/30981')
  test_memberWithClassName_getter() async {
    return super.test_memberWithClassName_getter();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/30857')
  test_methodAndGetterWithSameName() async {
    return super.test_methodAndGetterWithSameName();
  }

  @override
  @failingTest
  test_mixinDeclaresConstructor_classDeclaration() async {
    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR, found 0
    await super.test_mixinDeclaresConstructor_classDeclaration();
  }

  @override
  @failingTest
  test_mixinDeclaresConstructor_typeAlias() async {
    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR, found 0
    await super.test_mixinDeclaresConstructor_typeAlias();
  }

  @override
  @failingTest
  test_mixinDeferredClass() async {
    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_DEFERRED_CLASS, found 0;
    //          0 errors of type HintCode.UNUSED_IMPORT, found 1 (21)
    await super.test_mixinDeferredClass();
  }

  @override
  @failingTest
  test_mixinDeferredClass_classTypeAlias() async {
    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_DEFERRED_CLASS, found 0;
    //          0 errors of type HintCode.UNUSED_IMPORT, found 1 (21)
    await super.test_mixinDeferredClass_classTypeAlias();
  }

  @override
  @failingTest
  test_mixinHasNoConstructors_mixinApp() async {
    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS, found 0
    await super.test_mixinHasNoConstructors_mixinApp();
  }

  @override
  @failingTest
  test_mixinHasNoConstructors_mixinClass() async {
    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS, found 0
    await super.test_mixinHasNoConstructors_mixinClass();
  }

  @override
  @failingTest
  test_mixinHasNoConstructors_mixinClass_explicitSuperCall() async {
    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS, found 0
    await super.test_mixinHasNoConstructors_mixinClass_explicitSuperCall();
  }

  @override
  @failingTest
  test_mixinHasNoConstructors_mixinClass_implicitSuperCall() async {
    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS, found 0
    await super.test_mixinHasNoConstructors_mixinClass_implicitSuperCall();
  }

  @override
  @failingTest
  test_mixinHasNoConstructors_mixinClass_namedSuperCall() async {
    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS, found 0
    await super.test_mixinHasNoConstructors_mixinClass_namedSuperCall();
  }

  @override
  @failingTest
  test_mixinInference_conflictingSubstitution() =>
      super.test_mixinInference_conflictingSubstitution();

  @override
  @failingTest
  test_mixinInference_impossibleSubstitution() =>
      super.test_mixinInference_impossibleSubstitution();

  @override
  @failingTest
  test_mixinInference_noMatchingClass() =>
      super.test_mixinInference_noMatchingClass();

  @override
  @failingTest
  test_mixinInference_noMatchingClass_constraintSatisfiedByImplementsClause() =>
      super
          .test_mixinInference_noMatchingClass_constraintSatisfiedByImplementsClause();

  @override
  @failingTest
  test_mixinInference_noMatchingClass_namedMixinApplication() =>
      super.test_mixinInference_noMatchingClass_namedMixinApplication();

  @override
  @failingTest
  test_mixinInheritsFromNotObject_classDeclaration_extends() async {
    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, found 0
    await super.test_mixinInheritsFromNotObject_classDeclaration_extends();
  }

  @override
  @failingTest
  test_mixinInheritsFromNotObject_classDeclaration_with() async {
    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, found 0
    await super.test_mixinInheritsFromNotObject_classDeclaration_with();
  }

  @override
  @failingTest
  test_mixinInheritsFromNotObject_typeAlias_extends() async {
    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, found 0
    await super.test_mixinInheritsFromNotObject_typeAlias_extends();
  }

  @override
  @failingTest
  test_mixinInheritsFromNotObject_typeAlias_with() async {
    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, found 0
    await super.test_mixinInheritsFromNotObject_typeAlias_with();
  }

  @override
  test_mixinOfDisallowedClass_class_Null() async {
    await super.test_mixinOfDisallowedClass_class_Null();
  }

  @override
  test_mixinOfDisallowedClass_classTypeAlias_Null() async {
    await super.test_mixinOfDisallowedClass_classTypeAlias_Null();
  }

  @override
  @failingTest
  test_mixinOfEnum() async {
    // AnalysisException: Element mismatch in /test.dart at /test.dart
    await super.test_mixinOfEnum();
  }

  @override
  @failingTest
  test_mixinOfNonClass_class() async {
    // AnalysisException: Element mismatch in /test.dart at /test.dart
    await super.test_mixinOfNonClass_class();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/31005')
  test_mixinOfNonClass_typeAlias() async {
    return super.test_mixinOfNonClass_typeAlias();
  }

  @override
  @failingTest
  test_mixinReferencesSuper() async {
    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_REFERENCES_SUPER, found 0
    await super.test_mixinReferencesSuper();
  }

  @override
  @failingTest
  test_mixinWithNonClassSuperclass_class() async {
    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS, found 0
    await super.test_mixinWithNonClassSuperclass_class();
  }

  @override
  @failingTest
  test_mixinWithNonClassSuperclass_typeAlias() async {
    // Expected 1 errors of type CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS, found 0
    await super.test_mixinWithNonClassSuperclass_typeAlias();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/30982')
  test_multipleRedirectingConstructorInvocations() async {
    return super.test_multipleRedirectingConstructorInvocations();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/30982')
  test_multipleSuperInitializers() async {
    return super.test_multipleSuperInitializers();
  }

  @override
  @failingTest
  test_nativeClauseInNonSDKCode() async {
    // Expected 1 errors of type ParserErrorCode.NATIVE_CLAUSE_IN_NON_SDK_CODE, found 0
    await super.test_nativeClauseInNonSDKCode();
  }

  @override
  @failingTest
  test_nativeFunctionBodyInNonSDKCode_function() async {
    // Expected 1 errors of type ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE, found 0
    await super.test_nativeFunctionBodyInNonSDKCode_function();
  }

  @override
  @failingTest
  test_nativeFunctionBodyInNonSDKCode_method() async {
    // Expected 1 errors of type ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE, found 0
    await super.test_nativeFunctionBodyInNonSDKCode_method();
  }

  @override
  @failingTest
  test_noAnnotationConstructorArguments() {
    return super.test_noAnnotationConstructorArguments();
  }

  @override
  @failingTest
  test_noDefaultSuperConstructorExplicit() async {
    // Expected 1 errors of type CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT, found 0
    await super.test_noDefaultSuperConstructorExplicit();
  }

  @override
  @failingTest
  test_noDefaultSuperConstructorExplicit_MixinAppWithDirectSuperCall() async {
    // Expected 1 errors of type CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, found 0
    await super
        .test_noDefaultSuperConstructorExplicit_MixinAppWithDirectSuperCall();
  }

  @override
  @failingTest
  test_noDefaultSuperConstructorExplicit_mixinAppWithNamedParam() async {
    // Expected 1 errors of type CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, found 0
    await super.test_noDefaultSuperConstructorExplicit_mixinAppWithNamedParam();
  }

  @override
  @failingTest
  test_noDefaultSuperConstructorExplicit_MixinAppWithNamedSuperCall() async {
    // Expected 1 errors of type CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER, found 0
    await super
        .test_noDefaultSuperConstructorExplicit_MixinAppWithNamedSuperCall();
  }

  @override
  @failingTest
  test_noDefaultSuperConstructorExplicit_mixinAppWithOptionalParam() async {
    // Expected 1 errors of type CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, found 0
    await super
        .test_noDefaultSuperConstructorExplicit_mixinAppWithOptionalParam();
  }

  @override
  @failingTest
  test_noDefaultSuperConstructorExplicit_MixinWithDirectSuperCall() async {
    // Expected 1 errors of type CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, found 0
    await super
        .test_noDefaultSuperConstructorExplicit_MixinWithDirectSuperCall();
  }

  @override
  @failingTest
  test_noDefaultSuperConstructorExplicit_mixinWithNamedParam() async {
    // Expected 1 errors of type CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT, found 0
    await super.test_noDefaultSuperConstructorExplicit_mixinWithNamedParam();
  }

  @override
  @failingTest
  test_noDefaultSuperConstructorExplicit_MixinWithNamedSuperCall() async {
    // Expected 1 errors of type CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER, found 0
    await super
        .test_noDefaultSuperConstructorExplicit_MixinWithNamedSuperCall();
  }

  @override
  @failingTest
  test_noDefaultSuperConstructorExplicit_mixinWithOptionalParam() async {
    // Expected 1 errors of type CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT, found 0
    await super.test_noDefaultSuperConstructorExplicit_mixinWithOptionalParam();
  }

  @override
  @failingTest
  test_noDefaultSuperConstructorImplicit_mixinAppWithNamedParam() async {
    // Expected 1 errors of type CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, found 0
    await super.test_noDefaultSuperConstructorImplicit_mixinAppWithNamedParam();
  }

  @override
  @failingTest
  test_noDefaultSuperConstructorImplicit_mixinAppWithOptionalParam() async {
    // Expected 1 errors of type CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, found 0
    await super
        .test_noDefaultSuperConstructorImplicit_mixinAppWithOptionalParam();
  }

  @override
  @failingTest
  test_noDefaultSuperConstructorImplicit_mixinWithNamedParam() async {
    // Expected 1 errors of type CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, found 0
    await super.test_noDefaultSuperConstructorImplicit_mixinWithNamedParam();
  }

  @override
  @failingTest
  test_noDefaultSuperConstructorImplicit_mixinWithOptionalParam() async {
    // Expected 1 errors of type CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, found 0
    await super.test_noDefaultSuperConstructorImplicit_mixinWithOptionalParam();
  }

  @override
  @failingTest
  test_nonConstantAnnotationConstructor_named() async {
    // Bad state: No reference information for A at 30
    await super.test_nonConstantAnnotationConstructor_named();
  }

  @override
  @failingTest
  test_nonConstantAnnotationConstructor_unnamed() async {
    // Bad state: No reference information for A at 22
    await super.test_nonConstantAnnotationConstructor_unnamed();
  }

  @override
  @failingTest
  test_nonConstantDefaultValue_function_named() async {
    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE, found 0
    await super.test_nonConstantDefaultValue_function_named();
  }

  @override
  @failingTest
  test_nonConstantDefaultValue_function_positional() async {
    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE, found 0
    await super.test_nonConstantDefaultValue_function_positional();
  }

  @override
  @failingTest
  test_nonConstantDefaultValue_inConstructor_named() async {
    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE, found 0
    await super.test_nonConstantDefaultValue_inConstructor_named();
  }

  @override
  @failingTest
  test_nonConstantDefaultValue_inConstructor_positional() async {
    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE, found 0
    await super.test_nonConstantDefaultValue_inConstructor_positional();
  }

  @override
  @failingTest
  test_nonConstantDefaultValue_method_named() async {
    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE, found 0
    await super.test_nonConstantDefaultValue_method_named();
  }

  @override
  @failingTest
  test_nonConstantDefaultValue_method_positional() async {
    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE, found 0
    await super.test_nonConstantDefaultValue_method_positional();
  }

  @override
  @failingTest
  test_nonConstantDefaultValueFromDeferredLibrary() async {
    // Bad state: Expected element reference for analyzer offset 55; got one for kernel offset 57
    await super.test_nonConstantDefaultValueFromDeferredLibrary();
  }

  @override
  @failingTest
  test_nonConstantDefaultValueFromDeferredLibrary_nested() async {
    // Bad state: Expected element reference for analyzer offset 55; got one for kernel offset 57
    await super.test_nonConstantDefaultValueFromDeferredLibrary_nested();
  }

  @override
  @failingTest
  test_nonConstCaseExpression() async {
    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION, found 0
    await super.test_nonConstCaseExpression();
  }

  @override
  @failingTest
  test_nonConstCaseExpressionFromDeferredLibrary() async {
    // Bad state: Expected element reference for analyzer offset 87; got one for kernel offset 89
    await super.test_nonConstCaseExpressionFromDeferredLibrary();
  }

  @override
  @failingTest
  test_nonConstCaseExpressionFromDeferredLibrary_nested() async {
    // Bad state: Expected element reference for analyzer offset 87; got one for kernel offset 89
    await super.test_nonConstCaseExpressionFromDeferredLibrary_nested();
  }

  @override
  @failingTest
  test_nonConstListElement() async {
    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, found 0
    await super.test_nonConstListElement();
  }

  @override
  @failingTest
  test_nonConstListElementFromDeferredLibrary() async {
    // Bad state: Expected element reference for analyzer offset 70; got one for kernel offset 72
    await super.test_nonConstListElementFromDeferredLibrary();
  }

  @override
  @failingTest
  test_nonConstListElementFromDeferredLibrary_nested() async {
    // Bad state: Expected element reference for analyzer offset 70; got one for kernel offset 72
    await super.test_nonConstListElementFromDeferredLibrary_nested();
  }

  @override
  @failingTest
  test_nonConstMapAsExpressionStatement_begin() async {
    // AnalysisException: Element mismatch in /test.dart at /test.dart
    await super.test_nonConstMapAsExpressionStatement_begin();
  }

  @override
  @failingTest
  test_nonConstMapAsExpressionStatement_only() async {
    // Bad state: No reference information for  at 13
    await super.test_nonConstMapAsExpressionStatement_only();
  }

  @override
  @failingTest
  test_nonConstMapKey() async {
    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, found 0
    await super.test_nonConstMapKey();
  }

  @override
  @failingTest
  test_nonConstMapKeyFromDeferredLibrary() async {
    // Bad state: Expected element reference for analyzer offset 70; got one for kernel offset 72
    await super.test_nonConstMapKeyFromDeferredLibrary();
  }

  @override
  @failingTest
  test_nonConstMapKeyFromDeferredLibrary_nested() async {
    // Bad state: Expected element reference for analyzer offset 70; got one for kernel offset 72
    await super.test_nonConstMapKeyFromDeferredLibrary_nested();
  }

  @override
  @failingTest
  test_nonConstMapValue() async {
    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, found 0
    await super.test_nonConstMapValue();
  }

  @override
  @failingTest
  test_nonConstMapValueFromDeferredLibrary() async {
    // Bad state: Expected element reference for analyzer offset 76; got one for kernel offset 78
    await super.test_nonConstMapValueFromDeferredLibrary();
  }

  @override
  @failingTest
  test_nonConstMapValueFromDeferredLibrary_nested() async {
    // Bad state: Expected element reference for analyzer offset 76; got one for kernel offset 78
    await super.test_nonConstMapValueFromDeferredLibrary_nested();
  }

  @override
  @failingTest
  test_nonConstValueInInitializer_assert_condition() async {
    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER, found 0
    await super.test_nonConstValueInInitializer_assert_condition();
  }

  @override
  @failingTest
  test_nonConstValueInInitializer_assert_message() async {
    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER, found 0
    await super.test_nonConstValueInInitializer_assert_message();
  }

  @override
  @failingTest
  test_nonConstValueInInitializer_binary_notBool_left() async {
    // UnimplementedError: kernel: (Let) let final dynamic #t17 = p in let ...
    await super.test_nonConstValueInInitializer_binary_notBool_left();
  }

  @override
  @failingTest
  test_nonConstValueInInitializer_binary_notBool_right() async {
    // UnimplementedError: kernel: (Let) let final dynamic #t18 = p in let ...
    await super.test_nonConstValueInInitializer_binary_notBool_right();
  }

  @override
  @failingTest
  test_nonConstValueInInitializer_binary_notInt() async {
    // UnimplementedError: kernel: (Let) let final dynamic #t19 = p in let ...
    await super.test_nonConstValueInInitializer_binary_notInt();
  }

  @override
  @failingTest
  test_nonConstValueInInitializer_binary_notNum() async {
    // UnimplementedError: kernel: (AsExpression) 5.{dart.core::num::+}(let ...
    await super.test_nonConstValueInInitializer_binary_notNum();
  }

  @override
  @failingTest
  test_nonConstValueInInitializer_field() async {
    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER, found 0
    await super.test_nonConstValueInInitializer_field();
  }

  @override
  @failingTest
  test_nonConstValueInInitializer_instanceCreation() async {
    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER, found 0;
    //          1 errors of type CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, found 0
    await super.test_nonConstValueInInitializer_instanceCreation();
  }

  @override
  @failingTest
  test_nonConstValueInInitializer_instanceCreation_inDifferentFile() {
    return super
        .test_nonConstValueInInitializer_instanceCreation_inDifferentFile();
  }

  @override
  @failingTest
  test_nonConstValueInInitializer_redirecting() async {
    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER, found 0
    await super.test_nonConstValueInInitializer_redirecting();
  }

  @override
  @failingTest
  test_nonConstValueInInitializer_super() async {
    // Expected 1 errors of type CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER, found 0
    await super.test_nonConstValueInInitializer_super();
  }

  @override
  @failingTest
  test_nonConstValueInInitializerFromDeferredLibrary_field() async {
    // Bad state: Expected element reference for analyzer offset 91; got one for kernel offset 93
    await super.test_nonConstValueInInitializerFromDeferredLibrary_field();
  }

  @override
  @failingTest
  test_nonConstValueInInitializerFromDeferredLibrary_field_nested() async {
    // Bad state: Expected element reference for analyzer offset 91; got one for kernel offset 93
    await super
        .test_nonConstValueInInitializerFromDeferredLibrary_field_nested();
  }

  @override
  @failingTest
  test_nonConstValueInInitializerFromDeferredLibrary_redirecting() async {
    // Bad state: Expected element reference for analyzer offset 103; got one for kernel offset 105
    await super
        .test_nonConstValueInInitializerFromDeferredLibrary_redirecting();
  }

  @override
  @failingTest
  test_nonConstValueInInitializerFromDeferredLibrary_super() async {
    // Bad state: Expected element reference for analyzer offset 114; got one for kernel offset 116
    await super.test_nonConstValueInInitializerFromDeferredLibrary_super();
  }

  @override
  @failingTest
  test_nonGenerativeConstructor_explicit() async {
    // Expected 1 errors of type CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, found 0
    await super.test_nonGenerativeConstructor_explicit();
  }

  @override
  @failingTest
  test_nonGenerativeConstructor_implicit() async {
    // Expected 1 errors of type CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, found 0
    await super.test_nonGenerativeConstructor_implicit();
  }

  @override
  @failingTest
  test_nonGenerativeConstructor_implicit2() async {
    // Expected 1 errors of type CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, found 0
    await super.test_nonGenerativeConstructor_implicit2();
  }

  @override
  @failingTest
  test_notEnoughRequiredArguments_const() async {
    // Bad state: No type information for A at 47
    await super.test_notEnoughRequiredArguments_const();
  }

  @override
  @failingTest
  test_notEnoughRequiredArguments_const_super() async {
    // UnimplementedError: For ShadowInvalidInitializer
    await super.test_notEnoughRequiredArguments_const_super();
  }

  @override
  @failingTest
  test_optionalParameterInOperator_named() async {
    // Expected 1 errors of type CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR, found 0
    await super.test_optionalParameterInOperator_named();
  }

  @override
  @failingTest
  test_optionalParameterInOperator_positional() async {
    // Expected 1 errors of type CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR, found 0
    await super.test_optionalParameterInOperator_positional();
  }

  @override
  @failingTest
  test_prefix_assignment_compound_in_method() async {
    // Bad state: No reference information for p at 46
    await super.test_prefix_assignment_compound_in_method();
  }

  @override
  @failingTest
  test_prefix_assignment_compound_not_in_method() async {
    // Bad state: No reference information for p at 32
    await super.test_prefix_assignment_compound_not_in_method();
  }

  @override
  @failingTest
  test_prefix_assignment_in_method() async {
    // Bad state: No reference information for p at 46
    await super.test_prefix_assignment_in_method();
  }

  @override
  @failingTest
  test_prefix_assignment_not_in_method() async {
    // Bad state: No reference information for p at 32
    await super.test_prefix_assignment_not_in_method();
  }

  @override
  @failingTest
  test_prefix_conditionalPropertyAccess_call() async {
    // Bad state: Expected element reference for analyzer offset 32; got one for kernel offset 35
    await super.test_prefix_conditionalPropertyAccess_call();
  }

  @override
  @failingTest
  test_prefix_conditionalPropertyAccess_call_loadLibrary() async {
    // Bad state: No reference information for p at 41
    await super.test_prefix_conditionalPropertyAccess_call_loadLibrary();
  }

  @override
  @failingTest
  test_prefix_conditionalPropertyAccess_get() async {
    // Bad state: Expected element reference for analyzer offset 39; got one for kernel offset 42
    await super.test_prefix_conditionalPropertyAccess_get();
  }

  @override
  @failingTest
  @potentialAnalyzerProblem
  test_prefix_conditionalPropertyAccess_get_loadLibrary() async {
    return super.test_prefix_conditionalPropertyAccess_get_loadLibrary();
  }

  @override
  @failingTest
  test_prefix_conditionalPropertyAccess_set() async {
    // Bad state: Expected element reference for analyzer offset 32; got one for kernel offset 35
    await super.test_prefix_conditionalPropertyAccess_set();
  }

  @override
  @failingTest
  test_prefix_conditionalPropertyAccess_set_loadLibrary() async {
    // Bad state: No reference information for p at 41
    await super.test_prefix_conditionalPropertyAccess_set_loadLibrary();
  }

  @override
  @failingTest
  test_prefix_unqualified_invocation_in_method() async {
    // Bad state: No reference information for p at 46
    await super.test_prefix_unqualified_invocation_in_method();
  }

  @override
  @failingTest
  test_prefix_unqualified_invocation_not_in_method() async {
    // Bad state: No reference information for p at 32
    await super.test_prefix_unqualified_invocation_not_in_method();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/30857')
  test_prefixCollidesWithTopLevelMembers_functionTypeAlias() async {
    return super.test_prefixCollidesWithTopLevelMembers_functionTypeAlias();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/30857')
  test_prefixCollidesWithTopLevelMembers_topLevelFunction() async {
    return super.test_prefixCollidesWithTopLevelMembers_topLevelFunction();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/30857')
  test_prefixCollidesWithTopLevelMembers_topLevelVariable() async {
    return super.test_prefixCollidesWithTopLevelMembers_topLevelVariable();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/30857')
  test_prefixCollidesWithTopLevelMembers_type() async {
    return super.test_prefixCollidesWithTopLevelMembers_type();
  }

  @override
  @failingTest
  test_prefixNotFollowedByDot() async {
    // Bad state: No reference information for p at 39
    await super.test_prefixNotFollowedByDot();
  }

  @override
  @failingTest
  test_prefixNotFollowedByDot_compoundAssignment() async {
    // Bad state: No reference information for p at 32
    await super.test_prefixNotFollowedByDot_compoundAssignment();
  }

  @override
  @failingTest
  test_prefixNotFollowedByDot_conditionalMethodInvocation() async {
    // Bad state: Expected element reference for analyzer offset 32; got one for kernel offset 35
    await super.test_prefixNotFollowedByDot_conditionalMethodInvocation();
  }

  @override
  @failingTest
  test_privateCollisionInClassTypeAlias_mixinAndMixin() async {
    // Expected 1 errors of type CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, found 0
    await super.test_privateCollisionInClassTypeAlias_mixinAndMixin();
  }

  @override
  @failingTest
  test_privateCollisionInClassTypeAlias_mixinAndMixin_indirect() async {
    // Expected 1 errors of type CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, found 0
    await super.test_privateCollisionInClassTypeAlias_mixinAndMixin_indirect();
  }

  @override
  @failingTest
  test_privateCollisionInClassTypeAlias_superclassAndMixin() async {
    // Expected 1 errors of type CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, found 0
    await super.test_privateCollisionInClassTypeAlias_superclassAndMixin();
  }

  @override
  @failingTest
  test_privateCollisionInClassTypeAlias_superclassAndMixin_same() async {
    // Expected 1 errors of type CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, found 0
    await super.test_privateCollisionInClassTypeAlias_superclassAndMixin_same();
  }

  @override
  @failingTest
  test_privateCollisionInMixinApplication_mixinAndMixin() async {
    // Expected 1 errors of type CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, found 0
    await super.test_privateCollisionInMixinApplication_mixinAndMixin();
  }

  @override
  @failingTest
  test_privateCollisionInMixinApplication_mixinAndMixin_indirect() async {
    // Expected 1 errors of type CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, found 0
    await super
        .test_privateCollisionInMixinApplication_mixinAndMixin_indirect();
  }

  @override
  @failingTest
  test_privateCollisionInMixinApplication_superclassAndMixin() async {
    // Expected 1 errors of type CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, found 0
    await super.test_privateCollisionInMixinApplication_superclassAndMixin();
  }

  @override
  @failingTest
  test_privateCollisionInMixinApplication_superclassAndMixin_same() async {
    // Expected 1 errors of type CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION, found 0
    await super
        .test_privateCollisionInMixinApplication_superclassAndMixin_same();
  }

  @override
  @failingTest
  test_privateOptionalParameter() async {
    // Expected 1 errors of type CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER, found 0
    await super.test_privateOptionalParameter();
  }

  @override
  @failingTest
  test_privateOptionalParameter_fieldFormal() async {
    // Expected 1 errors of type CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER, found 0
    await super.test_privateOptionalParameter_fieldFormal();
  }

  @override
  @failingTest
  test_privateOptionalParameter_withDefaultValue() async {
    // Expected 1 errors of type CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER, found 0
    await super.test_privateOptionalParameter_withDefaultValue();
  }

  @override
  @failingTest
  test_recursiveCompileTimeConstant() async {
    // Expected 1 errors of type CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT, found 0
    await super.test_recursiveCompileTimeConstant();
  }

  @override
  @failingTest
  test_recursiveCompileTimeConstant_cycle() async {
    // UnimplementedError: kernel: (ShadowMethodInvocation) #lib4::y.+(1)
    await super.test_recursiveCompileTimeConstant_cycle();
  }

  @override
  @failingTest
  test_recursiveCompileTimeConstant_initializer_after_toplevel_var() async {
    // Expected 1 errors of type CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT, found 0
    await super
        .test_recursiveCompileTimeConstant_initializer_after_toplevel_var();
  }

  @override
  @failingTest
  test_recursiveCompileTimeConstant_singleVariable() async {
    // Expected 1 errors of type CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT, found 0
    await super.test_recursiveCompileTimeConstant_singleVariable();
  }

  @override
  @failingTest
  test_recursiveConstructorRedirect() async {
    // Expected 2 errors of type CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT, found 0
    await super.test_recursiveConstructorRedirect();
  }

  @override
  @failingTest
  test_recursiveConstructorRedirect_directSelfReference() async {
    // Expected 1 errors of type CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT, found 0
    await super.test_recursiveConstructorRedirect_directSelfReference();
  }

  @override
  @failingTest
  test_recursiveFactoryRedirect() async {
    // AnalysisException: Element mismatch in /test.dart at /test.dart
    await super.test_recursiveFactoryRedirect();
  }

  @override
  @failingTest
  test_recursiveFactoryRedirect_directSelfReference() async {
    // Expected 1 errors of type CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT, found 0
    await super.test_recursiveFactoryRedirect_directSelfReference();
  }

  @override
  @failingTest
  test_recursiveFactoryRedirect_diverging() async {
    // Bad state: Attempting to apply a non-parameterized type (TypeParameterTypeImpl) to type arguments
    await super.test_recursiveFactoryRedirect_diverging();
  }

  @override
  @failingTest
  test_recursiveFactoryRedirect_generic() async {
    // AnalysisException: Element mismatch in /test.dart at /test.dart
    await super.test_recursiveFactoryRedirect_generic();
  }

  @override
  @failingTest
  test_recursiveFactoryRedirect_named() async {
    // AnalysisException: Element mismatch in /test.dart at /test.dart
    await super.test_recursiveFactoryRedirect_named();
  }

  @override
  @failingTest
  test_recursiveFactoryRedirect_outsideCycle() async {
    // AnalysisException: Element mismatch in /test.dart at /test.dart
    await super.test_recursiveFactoryRedirect_outsideCycle();
  }

  @override
  @failingTest
  test_recursiveInterfaceInheritance_extends() async {
    // Expected 2 errors of type CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, found 0
    await super.test_recursiveInterfaceInheritance_extends();
  }

  @override
  @failingTest
  test_recursiveInterfaceInheritance_extends_implements() async {
    // AnalysisException: Element mismatch in /test.dart at /test.dart
    await super.test_recursiveInterfaceInheritance_extends_implements();
  }

  @override
  @failingTest
  test_recursiveInterfaceInheritance_implements() async {
    // AnalysisException: Element mismatch in /test.dart at /test.dart
    await super.test_recursiveInterfaceInheritance_implements();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/31007')
  test_recursiveInterfaceInheritance_mixin() async {
    return super.test_recursiveInterfaceInheritance_mixin();
  }

  @override
  @failingTest
  test_recursiveInterfaceInheritance_mixin_superclass() async {
    // AnalysisException: Element mismatch in /test.dart at /test.dart
    await super.test_recursiveInterfaceInheritance_mixin_superclass();
  }

  @override
  @failingTest
  test_recursiveInterfaceInheritance_tail() async {
    // AnalysisException: Element mismatch in /test.dart at /test.dart
    await super.test_recursiveInterfaceInheritance_tail();
  }

  @override
  @failingTest
  test_recursiveInterfaceInheritance_tail2() async {
    // AnalysisException: Element mismatch in /test.dart at /test.dart
    await super.test_recursiveInterfaceInheritance_tail2();
  }

  @override
  @failingTest
  test_recursiveInterfaceInheritance_tail3() async {
    // AnalysisException: Element mismatch in /test.dart at /test.dart
    await super.test_recursiveInterfaceInheritance_tail3();
  }

  @override
  @failingTest
  test_recursiveInterfaceInheritanceBaseCaseExtends() async {
    // Expected 1 errors of type CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS, found 0
    await super.test_recursiveInterfaceInheritanceBaseCaseExtends();
  }

  @override
  @failingTest
  test_recursiveInterfaceInheritanceBaseCaseExtends_abstract() async {
    // Expected 1 errors of type CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS, found 0;
    //          1 errors of type StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER, found 0;
    //          1 errors of type StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE, found 0
    await super.test_recursiveInterfaceInheritanceBaseCaseExtends_abstract();
  }

  @override
  @failingTest
  test_recursiveInterfaceInheritanceBaseCaseImplements() async {
    // AnalysisException: Element mismatch in /test.dart at /test.dart
    await super.test_recursiveInterfaceInheritanceBaseCaseImplements();
  }

  @override
  @failingTest
  test_recursiveInterfaceInheritanceBaseCaseImplements_typeAlias() async {
    // AnalysisException: Element mismatch in /test.dart at /test.dart
    await super
        .test_recursiveInterfaceInheritanceBaseCaseImplements_typeAlias();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/31007')
  test_recursiveInterfaceInheritanceBaseCaseWith() async {
    return super.test_recursiveInterfaceInheritanceBaseCaseWith();
  }

  @override
  @failingTest
  test_redirectGenerativeToMissingConstructor() async {
    // Bad state: No reference information for noSuchConstructor at 23
    await super.test_redirectGenerativeToMissingConstructor();
  }

  @override
  @failingTest
  test_redirectGenerativeToNonGenerativeConstructor() async {
    // Bad state: No reference information for x at 23
    await super.test_redirectGenerativeToNonGenerativeConstructor();
  }

  @override
  @failingTest
  test_redirectToMissingConstructor_named() async {
    // NoSuchMethodError: The getter 'returnType' was called on null.
    await super.test_redirectToMissingConstructor_named();
  }

  @override
  @failingTest
  test_redirectToMissingConstructor_unnamed() async {
    // NoSuchMethodError: The getter 'returnType' was called on null.
    await super.test_redirectToMissingConstructor_unnamed();
  }

  @override
  @failingTest
  test_redirectToNonClass_notAType() async {
    // NoSuchMethodError: The getter 'returnType' was called on null.
    await super.test_redirectToNonClass_notAType();
  }

  @override
  @failingTest
  test_redirectToNonClass_undefinedIdentifier() async {
    // NoSuchMethodError: The getter 'returnType' was called on null.
    await super.test_redirectToNonClass_undefinedIdentifier();
  }

  @override
  @failingTest
  test_redirectToNonConstConstructor() async {
    // Expected 1 errors of type CompileTimeErrorCode.REDIRECT_TO_NON_CONST_CONSTRUCTOR, found 0
    await super.test_redirectToNonConstConstructor();
  }

  @override
  @failingTest
  test_referencedBeforeDeclaration_hideInBlock_local() async {
    // Bad state: No type information for v at 38
    await super.test_referencedBeforeDeclaration_hideInBlock_local();
  }

  @override
  @failingTest
  test_referencedBeforeDeclaration_hideInBlock_subBlock() async {
    // Bad state: No type information for v at 48
    await super.test_referencedBeforeDeclaration_hideInBlock_subBlock();
  }

  @override
  @failingTest
  test_referencedBeforeDeclaration_inInitializer_closure() async {
    // Bad state: No type information for v at 15
    await super.test_referencedBeforeDeclaration_inInitializer_closure();
  }

  @override
  @failingTest
  test_referencedBeforeDeclaration_inInitializer_directly() async {
    // Bad state: No type information for v at 15
    await super.test_referencedBeforeDeclaration_inInitializer_directly();
  }

  @override
  @failingTest
  test_referencedBeforeDeclaration_type_localVariable() async {
    // Bad state: No type information for String at 44
    await super.test_referencedBeforeDeclaration_type_localVariable();
  }

  @override
  @failingTest
  test_rethrowOutsideCatch() async {
    // Bad state: No type information for rethrow at 8
    await super.test_rethrowOutsideCatch();
  }

  @override
  @failingTest
  test_returnInGenerativeConstructor() async {
    // Bad state: No type information for 0 at 25
    await super.test_returnInGenerativeConstructor();
  }

  @override
  @failingTest
  test_returnInGenerativeConstructor_expressionFunctionBody() async {
    // Bad state: No type information for null at 19
    await super.test_returnInGenerativeConstructor_expressionFunctionBody();
  }

  @override
  @failingTest
  test_returnInGenerator_asyncStar() async {
    // AnalysisException: Element mismatch in /test.dart at /test.dart
    await super.test_returnInGenerator_asyncStar();
  }

  @override
  @failingTest
  test_returnInGenerator_syncStar() async {
    // AnalysisException: Element mismatch in /test.dart at /test.dart
    await super.test_returnInGenerator_syncStar();
  }

  @override
  @failingTest
  test_sharedDeferredPrefix() async {
    // Bad state: Expected element reference for analyzer offset 86; got one for kernel offset 90
    await super.test_sharedDeferredPrefix();
  }

  @override
  @failingTest
  test_superInInvalidContext_binaryExpression() async {
    // Expected 1 errors of type CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT, found 0
    await super.test_superInInvalidContext_binaryExpression();
  }

  @override
  @failingTest
  test_superInInvalidContext_constructorFieldInitializer() async {
    // Expected 1 errors of type CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT, found 0
    await super.test_superInInvalidContext_constructorFieldInitializer();
  }

  @override
  @failingTest
  test_superInInvalidContext_factoryConstructor() async {
    // Bad state: No reference information for m at 67
    await super.test_superInInvalidContext_factoryConstructor();
  }

  @override
  @failingTest
  test_superInInvalidContext_instanceVariableInitializer() async {
    // Expected 1 errors of type CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT, found 0
    await super.test_superInInvalidContext_instanceVariableInitializer();
  }

  @override
  @failingTest
  test_superInInvalidContext_staticMethod() async {
    // Bad state: No reference information for m at 76
    await super.test_superInInvalidContext_staticMethod();
  }

  @override
  @failingTest
  test_superInInvalidContext_staticVariableInitializer() async {
    // Bad state: No reference information for a at 75
    await super.test_superInInvalidContext_staticVariableInitializer();
  }

  @override
  @failingTest
  test_superInInvalidContext_topLevelFunction() async {
    // Bad state: No reference information for f at 14
    await super.test_superInInvalidContext_topLevelFunction();
  }

  @override
  @failingTest
  test_superInInvalidContext_topLevelVariableInitializer() async {
    // Bad state: No reference information for y at 14
    await super.test_superInInvalidContext_topLevelVariableInitializer();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/30982')
  test_superInRedirectingConstructor_redirectionSuper() async {
    return super.test_superInRedirectingConstructor_redirectionSuper();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/30982')
  test_superInRedirectingConstructor_superRedirection() async {
    return super.test_superInRedirectingConstructor_superRedirection();
  }

  @override
  @failingTest
  test_symbol_constructor_badArgs() async {
    // Bad state: No type information for Symbol at 69
    await super.test_symbol_constructor_badArgs();
  }

  @override
  @failingTest
  test_test_fieldInitializerOutsideConstructor_topLevelFunction() async {
    // Expected 1 errors of type ParserErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, found 0;
    //          1 errors of type CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, found 0
    await super.test_test_fieldInitializerOutsideConstructor_topLevelFunction();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/31007')
  test_typeAliasCannotReferenceItself_11987() async {
    return super.test_typeAliasCannotReferenceItself_11987();
  }

  @override
  @failingTest
  test_typeAliasCannotReferenceItself_functionTypedParameter_returnType() async {
    // Expected 1 errors of type CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, found 0
    await super
        .test_typeAliasCannotReferenceItself_functionTypedParameter_returnType();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/31007')
  test_typeAliasCannotReferenceItself_generic() async {
    return super.test_typeAliasCannotReferenceItself_generic();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/31007')
  test_typeAliasCannotReferenceItself_parameterType_named() async {
    return super.test_typeAliasCannotReferenceItself_parameterType_named();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/31007')
  test_typeAliasCannotReferenceItself_parameterType_positional() async {
    return super.test_typeAliasCannotReferenceItself_parameterType_positional();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/31007')
  test_typeAliasCannotReferenceItself_parameterType_required() async {
    return super.test_typeAliasCannotReferenceItself_parameterType_required();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/31007')
  test_typeAliasCannotReferenceItself_parameterType_typeArgument() async {
    return super
        .test_typeAliasCannotReferenceItself_parameterType_typeArgument();
  }

  @override
  @failingTest
  test_typeAliasCannotReferenceItself_returnType() async {
    // Expected 1 errors of type CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, found 0
    await super.test_typeAliasCannotReferenceItself_returnType();
  }

  @override
  @failingTest
  test_typeAliasCannotReferenceItself_returnType_indirect() async {
    // Expected 2 errors of type CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, found 0
    await super.test_typeAliasCannotReferenceItself_returnType_indirect();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/31007')
  test_typeAliasCannotReferenceItself_typeVariableBounds() async {
    return super.test_typeAliasCannotReferenceItself_typeVariableBounds();
  }

  @override
  @failingTest
  test_typeArgumentNotMatchingBounds_const() async {
    // Expected 1 errors of type CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, found 0
    await super.test_typeArgumentNotMatchingBounds_const();
  }

  @override
  @failingTest
  test_undefinedAnnotation_unresolved_identifier() {
    return super.test_undefinedAnnotation_unresolved_identifier();
  }

  @override
  @failingTest
  test_undefinedAnnotation_unresolved_invocation() async {
    // Bad state: No reference information for Unresolved at 1
    await super.test_undefinedAnnotation_unresolved_invocation();
  }

  @override
  @failingTest
  test_undefinedAnnotation_unresolved_prefixedIdentifier() {
    return super.test_undefinedAnnotation_unresolved_prefixedIdentifier();
  }

  @override
  @failingTest
  test_undefinedAnnotation_useLibraryScope() {
    return super.test_undefinedAnnotation_useLibraryScope();
  }

  @override
  @failingTest
  test_undefinedClass_const() async {
    // Bad state: No type information for A at 21
    await super.test_undefinedClass_const();
  }

  @override
  @failingTest
  test_undefinedConstructorInInitializer_explicit_named() async {
    // Expected 1 errors of type CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER, found 0
    await super.test_undefinedConstructorInInitializer_explicit_named();
  }

  @override
  @failingTest
  test_undefinedConstructorInInitializer_explicit_unnamed() async {
    // Expected 1 errors of type CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, found 0
    await super.test_undefinedConstructorInInitializer_explicit_unnamed();
  }

  @override
  @failingTest
  test_undefinedConstructorInInitializer_implicit() async {
    // Expected 1 errors of type CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, found 0
    await super.test_undefinedConstructorInInitializer_implicit();
  }

  @override
  @failingTest
  test_undefinedNamedParameter() async {
    // Bad state: No type information for A at 42
    await super.test_undefinedNamedParameter();
  }

  @override
  @failingTest
  test_uriDoesNotExist_export() async {
    // Expected 1 errors of type CompileTimeErrorCode.URI_DOES_NOT_EXIST, found 0
    await super.test_uriDoesNotExist_export();
  }

  @override
  @failingTest
  test_uriDoesNotExist_import() async {
    // Expected 1 errors of type CompileTimeErrorCode.URI_DOES_NOT_EXIST, found 0
    await super.test_uriDoesNotExist_import();
  }

  @override
  @failingTest
  test_uriDoesNotExist_import_appears_after_deleting_target() async {
    // Expected 1 errors of type CompileTimeErrorCode.URI_DOES_NOT_EXIST, found 0
    await super.test_uriDoesNotExist_import_appears_after_deleting_target();
  }

  @override
  @failingTest
  test_uriDoesNotExist_import_disappears_when_fixed() async {
    // Expected 1 errors of type CompileTimeErrorCode.URI_DOES_NOT_EXIST, found 0
    await super.test_uriDoesNotExist_import_disappears_when_fixed();
  }

  @override
  @failingTest
  test_uriDoesNotExist_part() async {
    // Expected 1 errors of type CompileTimeErrorCode.URI_DOES_NOT_EXIST, found 0
    await super.test_uriDoesNotExist_part();
  }

  @override
  @failingTest
  test_uriWithInterpolation_constant() async {
    // Expected 1 errors of type StaticWarningCode.UNDEFINED_IDENTIFIER, found 0
    await super.test_uriWithInterpolation_constant();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/30984')
  test_uriWithInterpolation_nonConstant() async {
    return super.test_uriWithInterpolation_nonConstant();
  }

  @override
  @failingTest
  test_wrongNumberOfParametersForOperator1() async {
    // Expected 1 errors of type CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR, found 0
    await super.test_wrongNumberOfParametersForOperator1();
  }

  @override
  @failingTest
  test_wrongNumberOfParametersForOperator_minus() async {
    // Expected 1 errors of type CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS, found 0
    await super.test_wrongNumberOfParametersForOperator_minus();
  }

  @override
  @failingTest
  test_wrongNumberOfParametersForOperator_tilde() async {
    // Expected 1 errors of type CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR, found 0
    await super.test_wrongNumberOfParametersForOperator_tilde();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/31096')
  test_wrongNumberOfParametersForSetter_function_tooFew() async {
    return super.test_wrongNumberOfParametersForSetter_function_tooFew();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/31096')
  test_wrongNumberOfParametersForSetter_function_tooMany() async {
    return super.test_wrongNumberOfParametersForSetter_function_tooMany();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/31096')
  test_wrongNumberOfParametersForSetter_method_tooFew() async {
    return super.test_wrongNumberOfParametersForSetter_method_tooFew();
  }

  @override
  @failingTest
  @FastaProblem('https://github.com/dart-lang/sdk/issues/31096')
  test_wrongNumberOfParametersForSetter_method_tooMany() async {
    return super.test_wrongNumberOfParametersForSetter_method_tooMany();
  }

  @override
  test_yieldInNonGenerator_async() async {
    // Test passes, even though if fails in the superclass
    await super.test_yieldInNonGenerator_async();
  }
}

/// Tests marked with this annotation fail because of a Fasta problem.
class FastaProblem {
  const FastaProblem(String issueUri);
}
