// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'package:analyzer/dart/analysis/features.dart'; import 'package:analyzer/dart/ast/ast.dart'; import 'package:analyzer/dart/ast/token.dart'; import 'package:analyzer/dart/ast/visitor.dart'; import 'package:analyzer/src/dart/ast/ast_factory.dart'; import 'package:analyzer/src/dart/ast/token.dart'; import 'package:analyzer/src/dart/ast/utilities.dart'; import 'package:analyzer/src/dart/scanner/reader.dart'; import 'package:analyzer/src/dart/scanner/scanner.dart'; import 'package:analyzer/src/generated/java_engine.dart'; import 'package:analyzer/src/generated/parser.dart'; import 'package:analyzer/src/generated/source.dart'; import 'package:analyzer/src/generated/testing/ast_test_factory.dart'; import 'package:analyzer/src/generated/testing/token_factory.dart'; import 'package:analyzer/src/generated/utilities_collection.dart'; import 'package:test/test.dart'; import 'package:test_reflective_loader/test_reflective_loader.dart'; import 'test_support.dart'; main() { defineReflectiveSuite(() { defineReflectiveTests(AstClonerTest); defineReflectiveTests(BooleanArrayTest); defineReflectiveTests(ExceptionHandlingDelegatingAstVisitorTest); defineReflectiveTests(LineInfoTest); defineReflectiveTests(NodeReplacerTest); defineReflectiveTests(SourceRangeTest); defineReflectiveTests(StringUtilitiesTest); }); } class AstCloneComparator extends AstComparator { final bool expectTokensCopied; AstCloneComparator(this.expectTokensCopied); @override bool isEqualNodes(AstNode? first, AstNode? second) { if (first != null && identical(first, second)) { fail('Failed to copy node: $first (${first.offset})'); } return super.isEqualNodes(first, second); } @override bool isEqualTokens(Token? first, Token? second) { if (expectTokensCopied && first != null && identical(first, second)) { fail('Failed to copy token: ${first.lexeme} (${first.offset})'); } var firstComment = first?.precedingComments; if (firstComment != null) { if (firstComment.parent != first) { fail( 'Failed to link the comment "$firstComment" with the token "$first".'); } } return super.isEqualTokens(first, second); } } @reflectiveTest class AstClonerTest { void test_visitAdjacentStrings() { _assertCloneExpression("'a' 'b'"); } void test_visitAnnotation_constant() { _assertCloneUnitMember('@A main() {}'); } void test_visitAnnotation_constructor() { _assertCloneUnitMember('@A.c() main() {}'); } void test_visitAnnotation_constructor_generic() { _assertCloneUnitMember('@A.c() main() {}', featureSet: FeatureSet.forTesting( sdkVersion: '2.12', additionalFeatures: [Feature.generic_metadata])); } void test_visitAnnotation_withComment() { CompilationUnitMember clazz = _parseUnitMember('/** comment */ @deprecated class A {}'); Annotation annotation = clazz.metadata.single; _assertClone(annotation); } void test_visitArgumentList() { _assertCloneExpression('m(a, b)'); } void test_visitAsExpression() { _assertCloneExpression('e as T'); } void test_visitAssertStatement() { _assertCloneStatement('assert(a);'); } void test_visitAssignmentExpression() { _assertCloneStatement('a = b;'); } void test_visitAwaitExpression() { _assertCloneStatement('await a;'); } void test_visitBinaryExpression() { _assertCloneExpression('a + b'); } void test_visitBlock_empty() { _assertCloneStatement('{}'); } void test_visitBlock_nonEmpty() { _assertCloneStatement('{ print(1); print(2); }'); } void test_visitBlockFunctionBody() { _assertCloneUnitMember('main() {}'); } void test_visitBooleanLiteral_false() { _assertCloneExpression('false'); } void test_visitBooleanLiteral_true() { _assertCloneExpression('true'); } void test_visitBreakStatement_label() { _assertCloneStatement('l: while(true) { break l; }'); } void test_visitBreakStatement_noLabel() { _assertCloneStatement('while(true) { break; }'); } void test_visitCascadeExpression_field() { _assertCloneExpression('a..b..c'); } void test_visitCascadeExpression_index() { _assertCloneExpression('a..[0]..[1]'); } void test_visitCascadeExpression_method() { _assertCloneExpression('a..b()..c()'); } void test_visitCatchClause_catch_noStack() { _assertCloneStatement('try {} catch (e) {}'); } void test_visitCatchClause_catch_stack() { _assertCloneStatement('try {} catch (e, s) {}'); } void test_visitCatchClause_on() { _assertCloneStatement('try {} on E {}'); } void test_visitCatchClause_on_catch() { _assertCloneStatement('try {} on E catch (e) {}'); } void test_visitClassDeclaration_abstract() { _assertCloneUnitMember('abstract class C {}'); } void test_visitClassDeclaration_empty() { _assertCloneUnitMember('class C {}'); } void test_visitClassDeclaration_extends() { _assertCloneUnitMember('class C extends A {}'); } void test_visitClassDeclaration_extends_implements() { _assertCloneUnitMember('class C extends A implements B {}'); } void test_visitClassDeclaration_extends_with() { _assertCloneUnitMember('class C extends A with M {}'); } void test_visitClassDeclaration_extends_with_implements() { _assertCloneUnitMember('class C extends A with M implements B {}'); } void test_visitClassDeclaration_implements() { _assertCloneUnitMember('class C implements B {}'); } void test_visitClassDeclaration_multipleMember() { _assertCloneUnitMember('class C { var a; var b; }'); } void test_visitClassDeclaration_parameters() { _assertCloneUnitMember('class C {}'); } void test_visitClassDeclaration_parameters_extends() { _assertCloneUnitMember('class C extends A {}'); } void test_visitClassDeclaration_parameters_extends_implements() { _assertCloneUnitMember('class C extends A implements B {}'); } void test_visitClassDeclaration_parameters_extends_with() { _assertCloneUnitMember('class C extends A with M {}'); } void test_visitClassDeclaration_parameters_extends_with_implements() { _assertCloneUnitMember('class C extends A with M implements B {}'); } void test_visitClassDeclaration_parameters_implements() { _assertCloneUnitMember('class C implements B {}'); } void test_visitClassDeclaration_singleMember() { _assertCloneUnitMember('class C { var a; }'); } void test_visitClassDeclaration_withMetadata() { _assertCloneUnitMember('@deprecated class C {}'); } void test_visitClassTypeAlias_abstract() { _assertCloneUnitMember('abstract class C = S with M1;'); } void test_visitClassTypeAlias_abstract_implements() { _assertCloneUnitMember('abstract class C = S with M1 implements I;'); } void test_visitClassTypeAlias_generic() { _assertCloneUnitMember('class C = S with M1;'); } void test_visitClassTypeAlias_implements() { _assertCloneUnitMember('class C = S with M1 implements I;'); } void test_visitClassTypeAlias_minimal() { _assertCloneUnitMember('class C = S with M1;'); } void test_visitClassTypeAlias_parameters_abstract() { _assertCloneUnitMember('abstract class C = S with M1;'); } void test_visitClassTypeAlias_parameters_abstract_implements() { _assertCloneUnitMember('abstract class C = S with M1 implements I;'); } void test_visitClassTypeAlias_parameters_implements() { _assertCloneUnitMember('class C = S with M1 implements I;'); } void test_visitClassTypeAlias_withMetadata() { _assertCloneUnitMember('@deprecated class C = S with M;'); } void test_visitComment() { _assertCloneUnitMember('main() { print(1); /* comment */ print(2); }'); } void test_visitComment_beginToken() { _assertCloneUnitMember('/** comment */ main() {}'); } void test_visitCommentReference() { _assertCloneUnitMember('/** ref [a]. */ main(a) {}'); } void test_visitCompilationUnit_declaration() { _assertCloneUnitMember('var a;'); } void test_visitCompilationUnit_directive() { _assertCloneUnit('library l;'); } void test_visitCompilationUnit_directive_declaration() { _assertCloneUnit('library l; var a;'); } void test_visitCompilationUnit_directive_withComment() { _assertCloneUnit(r''' /// aaa /// bbb library l;'''); } void test_visitCompilationUnit_empty() { _assertCloneUnit(''); } void test_visitCompilationUnit_script() { _assertCloneUnit('#!/bin/dartvm'); } void test_visitCompilationUnit_script_declaration() { _assertCloneUnit('#!/bin/dartvm \n var a;'); } void test_visitCompilationUnit_script_directive() { _assertCloneUnit('#!/bin/dartvm \n library l;'); } void test_visitCompilationUnit_script_directives_declarations() { _assertCloneUnit('#!/bin/dartvm \n library l; var a;'); } void test_visitConditionalExpression() { _assertCloneExpression('a ? b : c'); } void test_visitConstructorDeclaration_const() { _assertCloneUnitMember('class C { const C(); }'); } void test_visitConstructorDeclaration_external() { _assertCloneUnitMember('class C { external C(); }'); } void test_visitConstructorDeclaration_minimal() { _assertCloneUnitMember('class C { C() {} }'); } void test_visitConstructorDeclaration_multipleInitializers() { _assertCloneUnitMember('class C { C() : a = b, c = d {} }'); } void test_visitConstructorDeclaration_multipleParameters() { _assertCloneUnitMember('class C { C(var a, var b) {} }'); } void test_visitConstructorDeclaration_named() { _assertCloneUnitMember('class C { C.m() {} }'); } void test_visitConstructorDeclaration_singleInitializer() { _assertCloneUnitMember('class C { C() : a = b {} }'); } void test_visitConstructorDeclaration_withMetadata() { _assertCloneUnitMember('class C { @deprecated C() {} }'); } void test_visitConstructorFieldInitializer_withoutThis() { _assertCloneUnitMember('class C { C() : a = b {} }'); } void test_visitConstructorFieldInitializer_withThis() { _assertCloneUnitMember('class C { C() : this.a = b {} }'); } void test_visitConstructorName_named_prefix() { _assertCloneExpression('new p.C.n()'); } void test_visitConstructorName_unnamed_noPrefix() { _assertCloneExpression('new C()'); } void test_visitConstructorName_unnamed_prefix() { _assertCloneExpression('new p.C()'); } void test_visitContinueStatement_label() { _assertCloneStatement('l: while (true) { continue l; }'); } void test_visitContinueStatement_noLabel() { _assertCloneStatement('while (true) { continue; }'); } void test_visitDefaultFormalParameter_named_noValue() { _assertCloneUnitMember('main({p}) {}'); } void test_visitDefaultFormalParameter_named_value() { _assertCloneUnitMember('main({p: 0}) {}'); } void test_visitDefaultFormalParameter_positional_noValue() { _assertCloneUnitMember('main([p]) {}'); } void test_visitDefaultFormalParameter_positional_value() { _assertCloneUnitMember('main([p = 0]) {}'); } void test_visitDoStatement() { _assertCloneStatement('do {} while (c);'); } void test_visitDoubleLiteral() { _assertCloneExpression('4.2'); } void test_visitEmptyFunctionBody() { _assertCloneUnitMember('main() {}'); } void test_visitEmptyStatement() { _assertCloneUnitMember('main() { ; }'); } void test_visitExportDirective_combinator() { _assertCloneUnit('export "a.dart" show A;'); } void test_visitExportDirective_combinators() { _assertCloneUnit('export "a.dart" show A hide B;'); } void test_visitExportDirective_minimal() { _assertCloneUnit('export "a.dart";'); } void test_visitExportDirective_withMetadata() { _assertCloneUnit('@deprecated export "a.dart";'); } void test_visitExpressionFunctionBody() { _assertCloneUnitMember('main() => a;'); } void test_visitExpressionStatement() { _assertCloneStatement('a;'); } void test_visitExtendsClause() { _assertCloneUnitMember('class A extends B {}'); } void test_visitFieldDeclaration_instance() { _assertCloneUnitMember('class C { var a; }'); } void test_visitFieldDeclaration_static() { _assertCloneUnitMember('class C { static var a; }'); } void test_visitFieldDeclaration_withMetadata() { _assertCloneUnitMember('class C { @deprecated var a; }'); } void test_visitFieldFormalParameter_functionTyped() { _assertCloneUnitMember('class C { C(A this.a(b)); }'); } void test_visitFieldFormalParameter_keyword() { _assertCloneUnitMember('class C { C(var this.a); }'); } void test_visitFieldFormalParameter_keywordAndType() { _assertCloneUnitMember('class C { C(final A this.a); }'); } void test_visitFieldFormalParameter_type() { _assertCloneUnitMember('class C { C(A this.a); }'); } void test_visitForEachStatement_await() { _assertCloneStatement('await for (var a in b) {}'); } void test_visitForEachStatement_declared() { _assertCloneStatement('for (var a in b) {}'); } void test_visitForEachStatement_variable() { _assertCloneStatement('for (a in b) {}'); } void test_visitForEachStatement_variable_await() { _assertCloneUnitMember('main(s) async { await for (a in s) {} }'); } void test_visitFormalParameterList_empty() { _assertCloneUnitMember('main() {}'); } void test_visitFormalParameterList_n() { _assertCloneUnitMember('main({a: 0}) {}'); } void test_visitFormalParameterList_nn() { _assertCloneUnitMember('main({a: 0, b: 1}) {}'); } void test_visitFormalParameterList_p() { _assertCloneUnitMember('main([a = 0]) {}'); } void test_visitFormalParameterList_pp() { _assertCloneUnitMember('main([a = 0, b = 1]) {}'); } void test_visitFormalParameterList_r() { _assertCloneUnitMember('main(a) {}'); } void test_visitFormalParameterList_rn() { _assertCloneUnitMember('main(a, {b: 1}) {}'); } void test_visitFormalParameterList_rnn() { _assertCloneUnitMember('main(a, {b: 1, c: 2}) {}'); } void test_visitFormalParameterList_rp() { _assertCloneUnitMember('main(a, [b = 1]) {}'); } void test_visitFormalParameterList_rpp() { _assertCloneUnitMember('main(a, [b = 1, c = 2]) {}'); } void test_visitFormalParameterList_rr() { _assertCloneUnitMember('main(a, b) {}'); } void test_visitFormalParameterList_rrn() { _assertCloneUnitMember('main(a, b, {c: 3}) {}'); } void test_visitFormalParameterList_rrnn() { _assertCloneUnitMember('main(a, b, {c: 3, d: 4}) {}'); } void test_visitFormalParameterList_rrp() { _assertCloneUnitMember('main(a, b, [c = 3]) {}'); } void test_visitFormalParameterList_rrpp() { _assertCloneUnitMember('main(a, b, [c = 3, d = 4]) {}'); } void test_visitForStatement_c() { _assertCloneStatement('for (; c;) {}'); } void test_visitForStatement_cu() { _assertCloneStatement('for (; c; u) {}'); } void test_visitForStatement_e() { _assertCloneStatement('for (e; ;) {}'); } void test_visitForStatement_ec() { _assertCloneStatement('for (e; c;) {}'); } void test_visitForStatement_ecu() { _assertCloneStatement('for (e; c; u) {}'); } void test_visitForStatement_eu() { _assertCloneStatement('for (e; ; u) {}'); } void test_visitForStatement_i() { _assertCloneStatement('for (var i; ;) {}'); } void test_visitForStatement_ic() { _assertCloneStatement('for (var i; c;) {}'); } void test_visitForStatement_icu() { _assertCloneStatement('for (var i; c; u) {}'); } void test_visitForStatement_iu() { _assertCloneStatement('for (var i; ; u) {}'); } void test_visitForStatement_u() { _assertCloneStatement('for (; ; u) {}'); } void test_visitFunctionDeclaration_getter() { _assertCloneUnitMember('get f {}'); } void test_visitFunctionDeclaration_normal() { _assertCloneUnitMember('f() {}'); } void test_visitFunctionDeclaration_setter() { _assertCloneUnitMember('set f(x) {}'); } void test_visitFunctionDeclaration_withMetadata() { _assertCloneUnitMember('@deprecated f() {}'); } void test_visitFunctionDeclarationStatement() { _assertCloneStatement('f() {}'); } void test_visitFunctionExpressionInvocation() { _assertCloneStatement('{ () {}(); }'); } void test_visitFunctionTypeAlias_generic() { _assertCloneUnitMember('typedef A F();'); } void test_visitFunctionTypeAlias_nonGeneric() { _assertCloneUnitMember('typedef A F();'); } void test_visitFunctionTypeAlias_withMetadata() { _assertCloneUnitMember('@deprecated typedef A F();'); } void test_visitFunctionTypedFormalParameter_noType() { _assertCloneUnitMember('main( f() ) {}'); } void test_visitFunctionTypedFormalParameter_type() { _assertCloneUnitMember('main( T f() ) {}'); } void test_visitIfStatement_withElse() { _assertCloneStatement('if (c) {} else {}'); } void test_visitIfStatement_withoutElse() { _assertCloneStatement('if (c) {}'); } void test_visitImplementsClause_multiple() { _assertCloneUnitMember('class A implements B, C {}'); } void test_visitImplementsClause_single() { _assertCloneUnitMember('class A implements B {}'); } void test_visitImportDirective_combinator() { _assertCloneUnit('import "a.dart" show A;'); } void test_visitImportDirective_combinators() { _assertCloneUnit('import "a.dart" show A hide B;'); } void test_visitImportDirective_minimal() { _assertCloneUnit('import "a.dart";'); } void test_visitImportDirective_prefix() { _assertCloneUnit('import "a.dart" as p;'); } void test_visitImportDirective_prefix_combinator() { _assertCloneUnit('import "a.dart" as p show A;'); } void test_visitImportDirective_prefix_combinators() { _assertCloneUnit('import "a.dart" as p show A hide B;'); } void test_visitImportDirective_withMetadata() { _assertCloneUnit('@deprecated import "a.dart";'); } void test_visitImportHideCombinator_multiple() { _assertCloneUnit('import "a.dart" hide a, b;'); } void test_visitImportHideCombinator_single() { _assertCloneUnit('import "a.dart" hide a;'); } void test_visitImportShowCombinator_multiple() { _assertCloneUnit('import "a.dart" show a, b;'); } void test_visitImportShowCombinator_single() { _assertCloneUnit('import "a.dart" show a;'); } void test_visitIndexExpression() { _assertCloneExpression('a[i]'); } void test_visitInstanceCreationExpression_const() { _assertCloneExpression('const C()'); } void test_visitInstanceCreationExpression_named() { _assertCloneExpression('new C.c()'); } void test_visitInstanceCreationExpression_unnamed() { _assertCloneExpression('new C()'); } void test_visitIntegerLiteral() { _assertCloneExpression('42'); } void test_visitInterpolationExpression_expression() { _assertCloneExpression(r'"${c}"'); } void test_visitInterpolationExpression_identifier() { _assertCloneExpression(r'"$c"'); } void test_visitIsExpression_negated() { _assertCloneExpression('a is! C'); } void test_visitIsExpression_normal() { _assertCloneExpression('a is C'); } void test_visitLabel() { _assertCloneStatement('a: return;'); } void test_visitLabeledStatement_multiple() { _assertCloneStatement('a: b: return;'); } void test_visitLabeledStatement_single() { _assertCloneStatement('a: return;'); } void test_visitLibraryDirective() { _assertCloneUnit('library l;'); } void test_visitLibraryDirective_withMetadata() { _assertCloneUnit('@deprecated library l;'); } void test_visitLibraryIdentifier_multiple() { _assertCloneUnit('library a.b.c;'); } void test_visitLibraryIdentifier_single() { _assertCloneUnit('library a;'); } void test_visitListLiteral_const() { _assertCloneExpression('const []'); } void test_visitListLiteral_empty() { _assertCloneExpression('[]'); } void test_visitListLiteral_nonEmpty() { _assertCloneExpression('[a, b, c]'); } void test_visitMapLiteral_const() { _assertCloneExpression('const {}'); } void test_visitMapLiteral_empty() { _assertCloneExpression('{}'); } void test_visitMapLiteral_nonEmpty() { _assertCloneExpression('{a: a, b: b, c: c}'); } void test_visitMethodDeclaration_external() { _assertCloneUnitMember('class C { external m(); }'); } void test_visitMethodDeclaration_external_returnType() { _assertCloneUnitMember('class C { T m(); }'); } void test_visitMethodDeclaration_getter() { _assertCloneUnitMember('class C { get m {} }'); } void test_visitMethodDeclaration_getter_returnType() { _assertCloneUnitMember('class C { T get m {} }'); } void test_visitMethodDeclaration_minimal() { _assertCloneUnitMember('class C { m() {} }'); } void test_visitMethodDeclaration_multipleParameters() { _assertCloneUnitMember('class C { m(var a, var b) {} }'); } void test_visitMethodDeclaration_operator() { _assertCloneUnitMember('class C { operator+() {} }'); } void test_visitMethodDeclaration_operator_returnType() { _assertCloneUnitMember('class C { T operator+() {} }'); } void test_visitMethodDeclaration_returnType() { _assertCloneUnitMember('class C { T m() {} }'); } void test_visitMethodDeclaration_setter() { _assertCloneUnitMember('class C { set m(var v) {} }'); } void test_visitMethodDeclaration_setter_returnType() { _assertCloneUnitMember('class C { T set m(v) {} }'); } void test_visitMethodDeclaration_static() { _assertCloneUnitMember('class C { static m() {} }'); } void test_visitMethodDeclaration_static_returnType() { _assertCloneUnitMember('class C { static T m() {} }'); } void test_visitMethodDeclaration_withMetadata() { _assertCloneUnitMember('class C { @deprecated m() {} }'); } void test_visitMethodInvocation_noTarget() { _assertCloneExpression('m()'); } void test_visitMethodInvocation_target() { _assertCloneExpression('t.m()'); } void test_visitNamedExpression() { _assertCloneExpression('m(a: b)'); } void test_visitNativeClause() { _assertCloneUnitMember('f() native "code";'); } void test_visitNativeFunctionBody() { _assertCloneUnitMember('f() native "str";'); } void test_visitNullLiteral() { _assertCloneExpression('null'); } void test_visitParenthesizedExpression() { _assertCloneExpression('(a)'); } void test_visitPartDirective() { _assertCloneUnit('part "a.dart";'); } void test_visitPartDirective_withMetadata() { _assertCloneUnit('@deprecated part "a.dart";'); } void test_visitPartOfDirective() { _assertCloneUnit('part of l;'); } void test_visitPartOfDirective_withMetadata() { _assertCloneUnit('@deprecated part of l;'); } void test_visitPositionalFormalParameter() { _assertCloneUnitMember('main([var p = 0]) {}'); } void test_visitPostfixExpression() { _assertCloneExpression('a++'); } void test_visitPrefixedIdentifier() { _assertCloneExpression('a.b'); } void test_visitPrefixExpression() { _assertCloneExpression('-a'); } void test_visitPropertyAccess() { _assertCloneExpression('a.b.c'); } void test_visitRedirectingConstructorInvocation_named() { _assertCloneUnitMember('class A { factory A() = B.b; }'); } void test_visitRedirectingConstructorInvocation_unnamed() { _assertCloneUnitMember('class A { factory A() = B; }'); } void test_visitRethrowExpression() { _assertCloneStatement('rethrow;'); } void test_visitReturnStatement_expression() { _assertCloneStatement('return a;'); } void test_visitReturnStatement_noExpression() { _assertCloneStatement('return;'); } void test_visitScriptTag() { _assertCloneUnit('#!/bin/dart.exe'); } void test_visitSimpleFormalParameter_keyword() { _assertCloneUnitMember('main(var a) {}'); } void test_visitSimpleFormalParameter_keyword_type() { _assertCloneUnitMember('main(final A a) {}'); } void test_visitSimpleFormalParameter_type() { _assertCloneUnitMember('main(A a) {}'); } void test_visitSimpleIdentifier() { _assertCloneExpression('a'); } void test_visitSimpleStringLiteral() { _assertCloneExpression("'a'"); } void test_visitStringInterpolation() { _assertCloneExpression(r"'a${e}b'"); } void test_visitSuperConstructorInvocation() { _assertCloneUnitMember('class C { C() : super(); }'); } void test_visitSuperConstructorInvocation_named() { _assertCloneUnitMember('class C { C() : super.c(); }'); } void test_visitSuperExpression() { _assertCloneUnitMember('class C { m() { super.m(); } }'); } void test_visitSwitchCase_multipleLabels() { _assertCloneStatement('switch (v) {l1: l2: case a: {} }'); } void test_visitSwitchCase_multipleStatements() { _assertCloneStatement('switch (v) { case a: {} {} }'); } void test_visitSwitchCase_noLabels() { _assertCloneStatement('switch (v) { case a: {} }'); } void test_visitSwitchCase_singleLabel() { _assertCloneStatement('switch (v) { l1: case a: {} }'); } void test_visitSwitchDefault_multipleLabels() { _assertCloneStatement('switch (v) { l1: l2: default: {} }'); } void test_visitSwitchDefault_multipleStatements() { _assertCloneStatement('switch (v) { default: {} {} }'); } void test_visitSwitchDefault_noLabels() { _assertCloneStatement('switch (v) { default: {} }'); } void test_visitSwitchDefault_singleLabel() { _assertCloneStatement('switch (v) { l1: default: {} }'); } void test_visitSwitchStatement() { _assertCloneStatement('switch (a) { case b: {} default: {} }'); } void test_visitSymbolLiteral_multiple() { _assertCloneExpression('#a.b.c'); } void test_visitSymbolLiteral_single() { _assertCloneExpression('#a'); } void test_visitThisExpression() { _assertCloneExpression('this'); } void test_visitThrowStatement() { _assertCloneStatement('throw e;'); } void test_visitTopLevelVariableDeclaration_multiple() { _assertCloneUnitMember('var a;'); } void test_visitTopLevelVariableDeclaration_single() { _assertCloneUnitMember('var a, b;'); } void test_visitTryStatement_catch() { _assertCloneStatement('try {} on E {}'); } void test_visitTryStatement_catches() { _assertCloneStatement('try {} on E {} on F {}'); } void test_visitTryStatement_catchFinally() { _assertCloneStatement('try {} on E {} finally {}'); } void test_visitTryStatement_finally() { _assertCloneStatement('try {} finally {}'); } void test_visitTypeName_multipleArgs() { _assertCloneExpression('new C()'); } void test_visitTypeName_nestedArg() { _assertCloneExpression('new C>()'); } void test_visitTypeName_noArgs() { _assertCloneExpression('new C()'); } void test_visitTypeName_singleArg() { _assertCloneExpression('new C()'); } void test_visitTypeParameter_withExtends() { _assertCloneUnitMember('class A {}'); } void test_visitTypeParameter_withMetadata() { _assertCloneUnitMember('class A<@deprecated E> {}'); } void test_visitTypeParameter_withoutExtends() { _assertCloneUnitMember('class A {}'); } void test_visitTypeParameterList_multiple() { _assertCloneUnitMember('class A {}'); } void test_visitTypeParameterList_single() { _assertCloneUnitMember('class A {}'); } void test_visitVariableDeclaration_initialized() { _assertCloneStatement('var a = b;'); } void test_visitVariableDeclaration_uninitialized() { _assertCloneStatement('var a;'); } void test_visitVariableDeclarationList_const_type() { _assertCloneStatement('const C a, b;'); } void test_visitVariableDeclarationList_final_noType() { _assertCloneStatement('final a, b;'); } void test_visitVariableDeclarationList_final_withMetadata() { _assertCloneStatement('@deprecated final a, b;'); } void test_visitVariableDeclarationList_type() { _assertCloneStatement('C a, b;'); } void test_visitVariableDeclarationList_var() { _assertCloneStatement('var a, b;'); } void test_visitVariableDeclarationStatement() { _assertCloneStatement('C c;'); } void test_visitWhileStatement() { _assertCloneStatement('while (c) {}'); } void test_visitWithClause_multiple() { _assertCloneUnitMember('class X extends Y with A, B, C {}'); } void test_visitWithClause_single() { _assertCloneUnitMember('class X extends Y with A {}'); } void test_visitYieldStatement() { _assertCloneUnitMember('main() async* { yield 42; }'); } /// Assert that an `AstCloner` will produce the expected AST structure when /// visiting the given [node]. /// /// @param node the AST node being visited to produce the cloned structure /// @throws AFE if the visitor does not produce the expected source for the /// given node void _assertClone(AstNode node) { { AstNode clone = node.accept(AstCloner())!; AstCloneComparator comparator = AstCloneComparator(false); if (!comparator.isEqualNodes(node, clone)) { fail("Failed to clone ${node.runtimeType.toString()}"); } _assertEqualTokens(clone, node); } { AstNode clone = node.accept(AstCloner(true))!; AstCloneComparator comparator = AstCloneComparator(true); if (!comparator.isEqualNodes(node, clone)) { fail("Failed to clone ${node.runtimeType.toString()}"); } _assertEqualTokens(clone, node); } } void _assertCloneExpression(String code) { AstNode node = _parseExpression(code); _assertClone(node); } void _assertCloneStatement(String code) { AstNode node = _parseStatement(code); _assertClone(node); } void _assertCloneUnit(String code) { AstNode node = _parseUnit(code); _assertClone(node); } void _assertCloneUnitMember(String code, {FeatureSet? featureSet}) { AstNode node = _parseUnitMember(code, featureSet: featureSet); _assertClone(node); } Expression _parseExpression(String code) { CompilationUnit unit = _parseUnit('var v = $code;'); var decl = unit.declarations.single as TopLevelVariableDeclaration; return decl.variables.variables.single.initializer!; } Statement _parseStatement(String code) { CompilationUnit unit = _parseUnit('main() async { $code }'); var main = unit.declarations.single as FunctionDeclaration; var body = main.functionExpression.body as BlockFunctionBody; return body.block.statements.single; } CompilationUnit _parseUnit(String code, {FeatureSet? featureSet}) { GatheringErrorListener listener = GatheringErrorListener(); CharSequenceReader reader = CharSequenceReader(code); featureSet ??= FeatureSet.forTesting(sdkVersion: '2.2.2'); Scanner scanner = Scanner(TestSource(), reader, listener) ..configureFeatures( featureSetForOverriding: featureSet, featureSet: featureSet, ); Token token = scanner.tokenize(); Parser parser = Parser( NonExistingSource.unknown, listener, featureSet: featureSet, ); CompilationUnit unit = parser.parseCompilationUnit(token); expect(unit, isNotNull); listener.assertNoErrors(); return unit; } CompilationUnitMember _parseUnitMember(String code, {FeatureSet? featureSet}) { CompilationUnit unit = _parseUnit(code, featureSet: featureSet); return unit.declarations.single; } static void _assertEqualToken(Token clone, Token original) { expect(clone.type, original.type); expect(clone.offset, original.offset); expect(clone.length, original.length); expect(clone.lexeme, original.lexeme); } static void _assertEqualTokens(AstNode cloneNode, AstNode originalNode) { Token clone = cloneNode.beginToken; Token original = originalNode.beginToken; if (original is! CommentToken) { _assertHasPrevious(original); _assertHasPrevious(clone); } Token stopOriginalToken = originalNode.endToken.next!; Token? skipCloneComment; Token? skipOriginalComment; while (original != stopOriginalToken) { expect(clone, isNotNull); _assertEqualToken(clone, original); // comments { var cloneComment = clone.precedingComments; var originalComment = original.precedingComments; if (cloneComment != skipCloneComment && originalComment != skipOriginalComment) { while (true) { if (originalComment == null) { expect(cloneComment, isNull); break; } expect(cloneComment, isNotNull); _assertEqualToken(cloneComment!, originalComment); cloneComment = cloneComment.next as CommentToken?; originalComment = originalComment.next as CommentToken?; } } } // next tokens if (original is CommentToken) { expect(clone, TypeMatcher()); skipOriginalComment = original; skipCloneComment = clone; original = original.parent!; clone = (clone as CommentToken).parent!; } else { clone = clone.next!; original = original.next!; } } } /// Assert that the [token] has `previous` set, and if it `EOF`, then it /// points itself. static void _assertHasPrevious(Token? token) { if (token == null) { fail('Expected not null'); } if (token.type == TokenType.EOF) { return; } while (token != null) { var previous = token.previous; expect(previous, isNotNull); if (token.type == TokenType.EOF) { expect(previous, same(token)); break; } token = previous; } } } @reflectiveTest class BooleanArrayTest { void test_get_negative() { try { BooleanArray.get(0, -1); fail("Expected "); } on RangeError { // Expected } } void test_get_tooBig() { try { BooleanArray.get(0, 31); fail("Expected "); } on RangeError { // Expected } } void test_get_valid() { expect(BooleanArray.get(0, 0), false); expect(BooleanArray.get(1, 0), true); expect(BooleanArray.get(0, 30), false); expect(BooleanArray.get(1 << 30, 30), true); } void test_set_negative() { try { BooleanArray.set(0, -1, true); fail("Expected "); } on RangeError { // Expected } } void test_set_tooBig() { try { BooleanArray.set(0, 32, true); fail("Expected "); } on RangeError { // Expected } } void test_set_valueChanging() { expect(BooleanArray.set(0, 0, true), 1); expect(BooleanArray.set(1, 0, false), 0); expect(BooleanArray.set(0, 30, true), 1 << 30); expect(BooleanArray.set(1 << 30, 30, false), 0); } void test_set_valuePreserving() { expect(BooleanArray.set(0, 0, false), 0); expect(BooleanArray.set(1, 0, true), 1); expect(BooleanArray.set(0, 30, false), 0); expect(BooleanArray.set(1 << 30, 30, true), 1 << 30); } } @reflectiveTest class ExceptionHandlingDelegatingAstVisitorTest { void test_handlerIsCalled() { AstVisitor exceptionThrowingVisitor = _ExceptionThrowingVisitor(); bool handlerInvoked = false; AstVisitor visitor = ExceptionHandlingDelegatingAstVisitor( [exceptionThrowingVisitor], (AstNode node, AstVisitor visitor, dynamic exception, StackTrace stackTrace) { handlerInvoked = true; }); astFactory .nullLiteral(TokenFactory.tokenFromKeyword(Keyword.NULL)) .accept(visitor); expect(handlerInvoked, isTrue); } } class Getter_NodeReplacerTest_test_annotation implements NodeReplacerTest_Getter { @override ArgumentList? get(Annotation node) => node.arguments; } class Getter_NodeReplacerTest_test_annotation_2 implements NodeReplacerTest_Getter { @override Identifier get(Annotation node) => node.name; } class Getter_NodeReplacerTest_test_annotation_3 implements NodeReplacerTest_Getter { @override SimpleIdentifier? get(Annotation node) => node.constructorName; } class Getter_NodeReplacerTest_test_annotation_4 implements NodeReplacerTest_Getter { @override TypeArgumentList? get(Annotation node) => node.typeArguments; } class Getter_NodeReplacerTest_test_asExpression implements NodeReplacerTest_Getter { @override TypeAnnotation? get(AsExpression node) => node.type; } class Getter_NodeReplacerTest_test_asExpression_2 implements NodeReplacerTest_Getter { @override Expression get(AsExpression node) => node.expression; } class Getter_NodeReplacerTest_test_assertStatement implements NodeReplacerTest_Getter { @override Expression get(AssertStatement node) => node.condition; } class Getter_NodeReplacerTest_test_assertStatement_2 implements NodeReplacerTest_Getter { @override Expression? get(AssertStatement node) => node.message; } class Getter_NodeReplacerTest_test_assignmentExpression implements NodeReplacerTest_Getter { @override Expression get(AssignmentExpression node) => node.rightHandSide; } class Getter_NodeReplacerTest_test_assignmentExpression_2 implements NodeReplacerTest_Getter { @override Expression get(AssignmentExpression node) => node.leftHandSide; } class Getter_NodeReplacerTest_test_awaitExpression implements NodeReplacerTest_Getter { @override Expression get(AwaitExpression node) => node.expression; } class Getter_NodeReplacerTest_test_binaryExpression implements NodeReplacerTest_Getter { @override Expression get(BinaryExpression node) => node.leftOperand; } class Getter_NodeReplacerTest_test_binaryExpression_2 implements NodeReplacerTest_Getter { @override Expression get(BinaryExpression node) => node.rightOperand; } class Getter_NodeReplacerTest_test_blockFunctionBody implements NodeReplacerTest_Getter { @override Block get(BlockFunctionBody node) => node.block; } class Getter_NodeReplacerTest_test_breakStatement implements NodeReplacerTest_Getter { @override SimpleIdentifier? get(BreakStatement node) => node.label; } class Getter_NodeReplacerTest_test_cascadeExpression implements NodeReplacerTest_Getter { @override Expression get(CascadeExpression node) => node.target; } class Getter_NodeReplacerTest_test_catchClause implements NodeReplacerTest_Getter { @override SimpleIdentifier? get(CatchClause node) => node.stackTraceParameter; } class Getter_NodeReplacerTest_test_catchClause_2 implements NodeReplacerTest_Getter { @override SimpleIdentifier? get(CatchClause node) => node.exceptionParameter; } class Getter_NodeReplacerTest_test_catchClause_3 implements NodeReplacerTest_Getter { @override TypeAnnotation? get(CatchClause node) => node.exceptionType; } class Getter_NodeReplacerTest_test_classDeclaration implements NodeReplacerTest_Getter { @override ImplementsClause? get(ClassDeclaration node) => node.implementsClause; } class Getter_NodeReplacerTest_test_classDeclaration_2 implements NodeReplacerTest_Getter { @override WithClause? get(ClassDeclaration node) => node.withClause; } class Getter_NodeReplacerTest_test_classDeclaration_3 implements NodeReplacerTest_Getter { @override NativeClause? get(ClassDeclaration node) => node.nativeClause; } class Getter_NodeReplacerTest_test_classDeclaration_4 implements NodeReplacerTest_Getter { @override ExtendsClause? get(ClassDeclaration node) => node.extendsClause; } class Getter_NodeReplacerTest_test_classDeclaration_5 implements NodeReplacerTest_Getter { @override TypeParameterList? get(ClassDeclaration node) => node.typeParameters; } class Getter_NodeReplacerTest_test_classDeclaration_6 implements NodeReplacerTest_Getter { @override SimpleIdentifier get(ClassDeclaration node) => node.name; } class Getter_NodeReplacerTest_test_classTypeAlias implements NodeReplacerTest_Getter { @override TypeName get(ClassTypeAlias node) => node.superclass; } class Getter_NodeReplacerTest_test_classTypeAlias_2 implements NodeReplacerTest_Getter { @override ImplementsClause? get(ClassTypeAlias node) => node.implementsClause; } class Getter_NodeReplacerTest_test_classTypeAlias_3 implements NodeReplacerTest_Getter { @override WithClause get(ClassTypeAlias node) => node.withClause; } class Getter_NodeReplacerTest_test_classTypeAlias_4 implements NodeReplacerTest_Getter { @override SimpleIdentifier get(ClassTypeAlias node) => node.name; } class Getter_NodeReplacerTest_test_classTypeAlias_5 implements NodeReplacerTest_Getter { @override TypeParameterList? get(ClassTypeAlias node) => node.typeParameters; } class Getter_NodeReplacerTest_test_commentReference implements NodeReplacerTest_Getter { @override Identifier get(CommentReference node) => node.identifier; } class Getter_NodeReplacerTest_test_compilationUnit implements NodeReplacerTest_Getter { @override ScriptTag? get(CompilationUnit node) => node.scriptTag; } class Getter_NodeReplacerTest_test_conditionalExpression implements NodeReplacerTest_Getter { @override Expression get(ConditionalExpression node) => node.elseExpression; } class Getter_NodeReplacerTest_test_conditionalExpression_2 implements NodeReplacerTest_Getter { @override Expression get(ConditionalExpression node) => node.thenExpression; } class Getter_NodeReplacerTest_test_conditionalExpression_3 implements NodeReplacerTest_Getter { @override Expression get(ConditionalExpression node) => node.condition; } class Getter_NodeReplacerTest_test_constructorDeclaration implements NodeReplacerTest_Getter { @override ConstructorName? get(ConstructorDeclaration node) => node.redirectedConstructor; } class Getter_NodeReplacerTest_test_constructorDeclaration_2 implements NodeReplacerTest_Getter { @override SimpleIdentifier? get(ConstructorDeclaration node) => node.name; } class Getter_NodeReplacerTest_test_constructorDeclaration_3 implements NodeReplacerTest_Getter { @override Identifier get(ConstructorDeclaration node) => node.returnType; } class Getter_NodeReplacerTest_test_constructorDeclaration_4 implements NodeReplacerTest_Getter { @override FormalParameterList get(ConstructorDeclaration node) => node.parameters; } class Getter_NodeReplacerTest_test_constructorDeclaration_5 implements NodeReplacerTest_Getter { @override FunctionBody? get(ConstructorDeclaration node) => node.body; } class Getter_NodeReplacerTest_test_constructorFieldInitializer implements NodeReplacerTest_Getter { @override SimpleIdentifier get(ConstructorFieldInitializer node) => node.fieldName; } class Getter_NodeReplacerTest_test_constructorFieldInitializer_2 implements NodeReplacerTest_Getter { @override Expression get(ConstructorFieldInitializer node) => node.expression; } class Getter_NodeReplacerTest_test_constructorName implements NodeReplacerTest_Getter { @override TypeName get(ConstructorName node) => node.type; } class Getter_NodeReplacerTest_test_constructorName_2 implements NodeReplacerTest_Getter { @override SimpleIdentifier? get(ConstructorName node) => node.name; } class Getter_NodeReplacerTest_test_continueStatement implements NodeReplacerTest_Getter { @override SimpleIdentifier? get(ContinueStatement node) => node.label; } class Getter_NodeReplacerTest_test_declaredIdentifier implements NodeReplacerTest_Getter { @override TypeAnnotation? get(DeclaredIdentifier node) => node.type; } class Getter_NodeReplacerTest_test_declaredIdentifier_2 implements NodeReplacerTest_Getter { @override SimpleIdentifier get(DeclaredIdentifier node) => node.identifier; } class Getter_NodeReplacerTest_test_defaultFormalParameter implements NodeReplacerTest_Getter { @override NormalFormalParameter get(DefaultFormalParameter node) => node.parameter; } class Getter_NodeReplacerTest_test_defaultFormalParameter_2 implements NodeReplacerTest_Getter { @override Expression? get(DefaultFormalParameter node) => node.defaultValue; } class Getter_NodeReplacerTest_test_doStatement implements NodeReplacerTest_Getter { @override Expression get(DoStatement node) => node.condition; } class Getter_NodeReplacerTest_test_doStatement_2 implements NodeReplacerTest_Getter { @override Statement get(DoStatement node) => node.body; } class Getter_NodeReplacerTest_test_enumConstantDeclaration implements NodeReplacerTest_Getter { @override SimpleIdentifier get(EnumConstantDeclaration node) => node.name; } class Getter_NodeReplacerTest_test_enumDeclaration implements NodeReplacerTest_Getter { @override SimpleIdentifier get(EnumDeclaration node) => node.name; } class Getter_NodeReplacerTest_test_expressionFunctionBody implements NodeReplacerTest_Getter { @override Expression get(ExpressionFunctionBody node) => node.expression; } class Getter_NodeReplacerTest_test_expressionStatement implements NodeReplacerTest_Getter { @override Expression get(ExpressionStatement node) => node.expression; } class Getter_NodeReplacerTest_test_extendsClause implements NodeReplacerTest_Getter { @override TypeName get(ExtendsClause node) => node.superclass; } class Getter_NodeReplacerTest_test_fieldDeclaration implements NodeReplacerTest_Getter { @override VariableDeclarationList get(FieldDeclaration node) => node.fields; } class Getter_NodeReplacerTest_test_fieldFormalParameter implements NodeReplacerTest_Getter { @override FormalParameterList? get(FieldFormalParameter node) => node.parameters; } class Getter_NodeReplacerTest_test_fieldFormalParameter_2 implements NodeReplacerTest_Getter { @override TypeAnnotation? get(FieldFormalParameter node) => node.type; } class Getter_NodeReplacerTest_test_forEachStatement_withIdentifier implements NodeReplacerTest_Getter { @override Statement get(ForStatement node) => node.body; } class Getter_NodeReplacerTest_test_forEachStatement_withIdentifier_2 implements NodeReplacerTest_Getter { @override SimpleIdentifier get(ForStatement node) => (node.forLoopParts as ForEachPartsWithIdentifier).identifier; } class Getter_NodeReplacerTest_test_forEachStatement_withIdentifier_3 implements NodeReplacerTest_Getter { @override Expression get(ForStatement node) => (node.forLoopParts as ForEachParts).iterable; } class Getter_NodeReplacerTest_test_forEachStatement_withLoopVariable implements NodeReplacerTest_Getter { @override Expression get(ForStatement node) => (node.forLoopParts as ForEachParts).iterable; } class Getter_NodeReplacerTest_test_forEachStatement_withLoopVariable_2 implements NodeReplacerTest_Getter { @override DeclaredIdentifier get(ForStatement node) => (node.forLoopParts as ForEachPartsWithDeclaration).loopVariable; } class Getter_NodeReplacerTest_test_forEachStatement_withLoopVariable_3 implements NodeReplacerTest_Getter { @override Statement get(ForStatement node) => node.body; } class Getter_NodeReplacerTest_test_forStatement_withInitialization implements NodeReplacerTest_Getter { @override Statement get(ForStatement node) => node.body; } class Getter_NodeReplacerTest_test_forStatement_withInitialization_2 implements NodeReplacerTest_Getter { @override Expression? get(ForStatement node) => (node.forLoopParts as ForParts).condition; } class Getter_NodeReplacerTest_test_forStatement_withInitialization_3 implements NodeReplacerTest_Getter { @override Expression? get(ForStatement node) => (node.forLoopParts as ForPartsWithExpression).initialization; } class Getter_NodeReplacerTest_test_forStatement_withVariables implements NodeReplacerTest_Getter { @override Statement get(ForStatement node) => node.body; } class Getter_NodeReplacerTest_test_forStatement_withVariables_2 implements NodeReplacerTest_Getter { @override VariableDeclarationList get(ForStatement node) => (node.forLoopParts as ForPartsWithDeclarations).variables; } class Getter_NodeReplacerTest_test_forStatement_withVariables_3 implements NodeReplacerTest_Getter { @override Expression? get(ForStatement node) => (node.forLoopParts as ForParts).condition; } class Getter_NodeReplacerTest_test_functionDeclaration implements NodeReplacerTest_Getter { @override TypeAnnotation? get(FunctionDeclaration node) => node.returnType; } class Getter_NodeReplacerTest_test_functionDeclaration_2 implements NodeReplacerTest_Getter { @override FunctionExpression get(FunctionDeclaration node) => node.functionExpression; } class Getter_NodeReplacerTest_test_functionDeclaration_3 implements NodeReplacerTest_Getter { @override SimpleIdentifier get(FunctionDeclaration node) => node.name; } class Getter_NodeReplacerTest_test_functionDeclarationStatement implements NodeReplacerTest_Getter { @override FunctionDeclaration get(FunctionDeclarationStatement node) => node.functionDeclaration; } class Getter_NodeReplacerTest_test_functionExpression implements NodeReplacerTest_Getter { @override FormalParameterList? get(FunctionExpression node) => node.parameters; } class Getter_NodeReplacerTest_test_functionExpression_2 implements NodeReplacerTest_Getter { @override FunctionBody? get(FunctionExpression node) => node.body; } class Getter_NodeReplacerTest_test_functionExpressionInvocation implements NodeReplacerTest_Getter { @override Expression get(FunctionExpressionInvocation node) => node.function; } class Getter_NodeReplacerTest_test_functionExpressionInvocation_2 implements NodeReplacerTest_Getter { @override ArgumentList get(FunctionExpressionInvocation node) => node.argumentList; } class Getter_NodeReplacerTest_test_functionTypeAlias implements NodeReplacerTest_Getter { @override TypeParameterList? get(FunctionTypeAlias node) => node.typeParameters; } class Getter_NodeReplacerTest_test_functionTypeAlias_2 implements NodeReplacerTest_Getter { @override FormalParameterList get(FunctionTypeAlias node) => node.parameters; } class Getter_NodeReplacerTest_test_functionTypeAlias_3 implements NodeReplacerTest_Getter { @override TypeAnnotation? get(FunctionTypeAlias node) => node.returnType; } class Getter_NodeReplacerTest_test_functionTypeAlias_4 implements NodeReplacerTest_Getter { @override SimpleIdentifier get(FunctionTypeAlias node) => node.name; } class Getter_NodeReplacerTest_test_functionTypedFormalParameter implements NodeReplacerTest_Getter { @override TypeAnnotation? get(FunctionTypedFormalParameter node) => node.returnType; } class Getter_NodeReplacerTest_test_functionTypedFormalParameter_2 implements NodeReplacerTest_Getter { @override FormalParameterList get(FunctionTypedFormalParameter node) => node.parameters; } class Getter_NodeReplacerTest_test_ifStatement implements NodeReplacerTest_Getter { @override Expression get(IfStatement node) => node.condition; } class Getter_NodeReplacerTest_test_ifStatement_2 implements NodeReplacerTest_Getter { @override Statement? get(IfStatement node) => node.elseStatement; } class Getter_NodeReplacerTest_test_ifStatement_3 implements NodeReplacerTest_Getter { @override Statement get(IfStatement node) => node.thenStatement; } class Getter_NodeReplacerTest_test_importDirective implements NodeReplacerTest_Getter { @override SimpleIdentifier? get(ImportDirective node) => node.prefix; } class Getter_NodeReplacerTest_test_indexExpression implements NodeReplacerTest_Getter { @override Expression? get(IndexExpression node) => node.target; } class Getter_NodeReplacerTest_test_indexExpression_2 implements NodeReplacerTest_Getter { @override Expression get(IndexExpression node) => node.index; } class Getter_NodeReplacerTest_test_instanceCreationExpression implements NodeReplacerTest_Getter { @override ArgumentList get(InstanceCreationExpression node) => node.argumentList; } class Getter_NodeReplacerTest_test_instanceCreationExpression_2 implements NodeReplacerTest_Getter { @override ConstructorName get(InstanceCreationExpression node) => node.constructorName; } class Getter_NodeReplacerTest_test_interpolationExpression implements NodeReplacerTest_Getter { @override Expression get(InterpolationExpression node) => node.expression; } class Getter_NodeReplacerTest_test_isExpression implements NodeReplacerTest_Getter { @override Expression get(IsExpression node) => node.expression; } class Getter_NodeReplacerTest_test_isExpression_2 implements NodeReplacerTest_Getter { @override TypeAnnotation? get(IsExpression node) => node.type; } class Getter_NodeReplacerTest_test_label implements NodeReplacerTest_Getter { @override SimpleIdentifier get(Label node) => node.label; } class Getter_NodeReplacerTest_test_labeledStatement implements NodeReplacerTest_Getter { @override Statement get(LabeledStatement node) => node.statement; } class Getter_NodeReplacerTest_test_libraryDirective implements NodeReplacerTest_Getter { @override LibraryIdentifier get(LibraryDirective node) => node.name; } class Getter_NodeReplacerTest_test_mapLiteralEntry implements NodeReplacerTest_Getter { @override Expression get(MapLiteralEntry node) => node.value; } class Getter_NodeReplacerTest_test_mapLiteralEntry_2 implements NodeReplacerTest_Getter { @override Expression get(MapLiteralEntry node) => node.key; } class Getter_NodeReplacerTest_test_methodDeclaration implements NodeReplacerTest_Getter { @override TypeAnnotation? get(MethodDeclaration node) => node.returnType; } class Getter_NodeReplacerTest_test_methodDeclaration_2 implements NodeReplacerTest_Getter { @override FunctionBody get(MethodDeclaration node) => node.body; } class Getter_NodeReplacerTest_test_methodDeclaration_3 implements NodeReplacerTest_Getter { @override SimpleIdentifier get(MethodDeclaration node) => node.name; } class Getter_NodeReplacerTest_test_methodDeclaration_4 implements NodeReplacerTest_Getter { @override FormalParameterList? get(MethodDeclaration node) => node.parameters; } class Getter_NodeReplacerTest_test_methodInvocation implements NodeReplacerTest_Getter { @override ArgumentList get(MethodInvocation node) => node.argumentList; } class Getter_NodeReplacerTest_test_methodInvocation_2 implements NodeReplacerTest_Getter { @override Expression? get(MethodInvocation node) => node.target; } class Getter_NodeReplacerTest_test_methodInvocation_3 implements NodeReplacerTest_Getter { @override SimpleIdentifier get(MethodInvocation node) => node.methodName; } class Getter_NodeReplacerTest_test_namedExpression implements NodeReplacerTest_Getter { @override Label get(NamedExpression node) => node.name; } class Getter_NodeReplacerTest_test_namedExpression_2 implements NodeReplacerTest_Getter { @override Expression get(NamedExpression node) => node.expression; } class Getter_NodeReplacerTest_test_nativeClause implements NodeReplacerTest_Getter { @override StringLiteral? get(NativeClause node) => node.name; } class Getter_NodeReplacerTest_test_nativeFunctionBody implements NodeReplacerTest_Getter { @override StringLiteral? get(NativeFunctionBody node) => node.stringLiteral; } class Getter_NodeReplacerTest_test_parenthesizedExpression implements NodeReplacerTest_Getter { @override Expression get(ParenthesizedExpression node) => node.expression; } class Getter_NodeReplacerTest_test_partOfDirective implements NodeReplacerTest_Getter { @override LibraryIdentifier? get(PartOfDirective node) => node.libraryName; } class Getter_NodeReplacerTest_test_postfixExpression implements NodeReplacerTest_Getter { @override Expression get(PostfixExpression node) => node.operand; } class Getter_NodeReplacerTest_test_prefixedIdentifier implements NodeReplacerTest_Getter { @override SimpleIdentifier get(PrefixedIdentifier node) => node.identifier; } class Getter_NodeReplacerTest_test_prefixedIdentifier_2 implements NodeReplacerTest_Getter { @override SimpleIdentifier get(PrefixedIdentifier node) => node.prefix; } class Getter_NodeReplacerTest_test_prefixExpression implements NodeReplacerTest_Getter { @override Expression get(PrefixExpression node) => node.operand; } class Getter_NodeReplacerTest_test_propertyAccess implements NodeReplacerTest_Getter { @override Expression? get(PropertyAccess node) => node.target; } class Getter_NodeReplacerTest_test_propertyAccess_2 implements NodeReplacerTest_Getter { @override SimpleIdentifier get(PropertyAccess node) => node.propertyName; } class Getter_NodeReplacerTest_test_redirectingConstructorInvocation implements NodeReplacerTest_Getter { @override SimpleIdentifier? get(RedirectingConstructorInvocation node) => node.constructorName; } class Getter_NodeReplacerTest_test_redirectingConstructorInvocation_2 implements NodeReplacerTest_Getter { @override ArgumentList get(RedirectingConstructorInvocation node) => node.argumentList; } class Getter_NodeReplacerTest_test_returnStatement implements NodeReplacerTest_Getter { @override Expression? get(ReturnStatement node) => node.expression; } class Getter_NodeReplacerTest_test_simpleFormalParameter implements NodeReplacerTest_Getter { @override TypeAnnotation? get(SimpleFormalParameter node) => node.type; } class Getter_NodeReplacerTest_test_superConstructorInvocation implements NodeReplacerTest_Getter { @override SimpleIdentifier? get(SuperConstructorInvocation node) => node.constructorName; } class Getter_NodeReplacerTest_test_superConstructorInvocation_2 implements NodeReplacerTest_Getter { @override ArgumentList get(SuperConstructorInvocation node) => node.argumentList; } class Getter_NodeReplacerTest_test_switchCase implements NodeReplacerTest_Getter { @override Expression get(SwitchCase node) => node.expression; } class Getter_NodeReplacerTest_test_switchStatement implements NodeReplacerTest_Getter { @override Expression get(SwitchStatement node) => node.expression; } class Getter_NodeReplacerTest_test_throwExpression implements NodeReplacerTest_Getter { @override Expression get(ThrowExpression node) => node.expression; } class Getter_NodeReplacerTest_test_topLevelVariableDeclaration implements NodeReplacerTest_Getter { @override VariableDeclarationList get(TopLevelVariableDeclaration node) => node.variables; } class Getter_NodeReplacerTest_test_tryStatement implements NodeReplacerTest_Getter { @override Block? get(TryStatement node) => node.finallyBlock; } class Getter_NodeReplacerTest_test_tryStatement_2 implements NodeReplacerTest_Getter { @override Block get(TryStatement node) => node.body; } class Getter_NodeReplacerTest_test_typeName implements NodeReplacerTest_Getter { @override TypeArgumentList? get(TypeName node) => node.typeArguments; } class Getter_NodeReplacerTest_test_typeName_2 implements NodeReplacerTest_Getter { @override Identifier get(TypeName node) => node.name; } class Getter_NodeReplacerTest_test_typeParameter implements NodeReplacerTest_Getter { @override TypeAnnotation? get(TypeParameter node) => node.bound; } class Getter_NodeReplacerTest_test_typeParameter_2 implements NodeReplacerTest_Getter { @override SimpleIdentifier get(TypeParameter node) => node.name; } class Getter_NodeReplacerTest_test_variableDeclaration implements NodeReplacerTest_Getter { @override SimpleIdentifier get(VariableDeclaration node) => node.name; } class Getter_NodeReplacerTest_test_variableDeclaration_2 implements NodeReplacerTest_Getter { @override Expression? get(VariableDeclaration node) => node.initializer; } class Getter_NodeReplacerTest_test_variableDeclarationList implements NodeReplacerTest_Getter { @override TypeAnnotation? get(VariableDeclarationList node) => node.type; } class Getter_NodeReplacerTest_test_variableDeclarationStatement implements NodeReplacerTest_Getter { @override VariableDeclarationList get(VariableDeclarationStatement node) => node.variables; } class Getter_NodeReplacerTest_test_whileStatement implements NodeReplacerTest_Getter { @override Expression get(WhileStatement node) => node.condition; } class Getter_NodeReplacerTest_test_whileStatement_2 implements NodeReplacerTest_Getter { @override Statement get(WhileStatement node) => node.body; } class Getter_NodeReplacerTest_test_yieldStatement implements NodeReplacerTest_Getter { @override Expression get(YieldStatement node) => node.expression; } class Getter_NodeReplacerTest_testAnnotatedNode implements NodeReplacerTest_Getter { @override Comment? get(AnnotatedNode node) => node.documentationComment; } class Getter_NodeReplacerTest_testNormalFormalParameter implements NodeReplacerTest_Getter { @override SimpleIdentifier? get(NormalFormalParameter node) => node.identifier; } class Getter_NodeReplacerTest_testNormalFormalParameter_2 implements NodeReplacerTest_Getter { @override Comment? get(NormalFormalParameter node) => node.documentationComment; } class Getter_NodeReplacerTest_testTypedLiteral implements NodeReplacerTest_Getter { @override TypeArgumentList? get(TypedLiteral node) => node.typeArguments; } class Getter_NodeReplacerTest_testUriBasedDirective implements NodeReplacerTest_Getter { @override StringLiteral get(UriBasedDirective node) => node.uri; } @reflectiveTest class LineInfoTest { void test_creation() { expect(LineInfo([0]), isNotNull); } void test_creation_empty() { expect(() { LineInfo([]); }, throwsArgumentError); } void test_getLocation_firstLine() { LineInfo info = LineInfo([0, 12, 34]); var location = info.getLocation(4); expect(location.lineNumber, 1); expect(location.columnNumber, 5); } void test_getLocation_lastLine() { LineInfo info = LineInfo([0, 12, 34]); var location = info.getLocation(36); expect(location.lineNumber, 3); expect(location.columnNumber, 3); } void test_getLocation_middleLine() { LineInfo info = LineInfo([0, 12, 34]); var location = info.getLocation(12); expect(location.lineNumber, 2); expect(location.columnNumber, 1); } void test_getOffsetOfLine() { LineInfo info = LineInfo([0, 12, 34]); expect(0, info.getOffsetOfLine(0)); expect(12, info.getOffsetOfLine(1)); expect(34, info.getOffsetOfLine(2)); } void test_getOffsetOfLineAfter() { LineInfo info = LineInfo([0, 12, 34]); expect(info.getOffsetOfLineAfter(0), 12); expect(info.getOffsetOfLineAfter(11), 12); expect(info.getOffsetOfLineAfter(12), 34); expect(info.getOffsetOfLineAfter(33), 34); } } class ListGetter_NodeReplacerTest_test_adjacentStrings extends NodeReplacerTest_ListGetter { ListGetter_NodeReplacerTest_test_adjacentStrings(int arg0) : super(arg0); @override NodeList getList(AdjacentStrings node) => node.strings; } class ListGetter_NodeReplacerTest_test_adjacentStrings_2 extends NodeReplacerTest_ListGetter { ListGetter_NodeReplacerTest_test_adjacentStrings_2(int arg0) : super(arg0); @override NodeList getList(AdjacentStrings node) => node.strings; } class ListGetter_NodeReplacerTest_test_argumentList extends NodeReplacerTest_ListGetter { ListGetter_NodeReplacerTest_test_argumentList(int arg0) : super(arg0); @override NodeList getList(ArgumentList node) => node.arguments; } class ListGetter_NodeReplacerTest_test_block extends NodeReplacerTest_ListGetter { ListGetter_NodeReplacerTest_test_block(int arg0) : super(arg0); @override NodeList getList(Block node) => node.statements; } class ListGetter_NodeReplacerTest_test_cascadeExpression extends NodeReplacerTest_ListGetter { ListGetter_NodeReplacerTest_test_cascadeExpression(int arg0) : super(arg0); @override NodeList getList(CascadeExpression node) => node.cascadeSections; } class ListGetter_NodeReplacerTest_test_classDeclaration extends NodeReplacerTest_ListGetter { ListGetter_NodeReplacerTest_test_classDeclaration(int arg0) : super(arg0); @override NodeList getList(ClassDeclaration node) => node.members; } class ListGetter_NodeReplacerTest_test_comment extends NodeReplacerTest_ListGetter { ListGetter_NodeReplacerTest_test_comment(int arg0) : super(arg0); @override NodeList getList(Comment node) => node.references; } class ListGetter_NodeReplacerTest_test_compilationUnit extends NodeReplacerTest_ListGetter { ListGetter_NodeReplacerTest_test_compilationUnit(int arg0) : super(arg0); @override NodeList getList(CompilationUnit node) => node.directives; } class ListGetter_NodeReplacerTest_test_compilationUnit_2 extends NodeReplacerTest_ListGetter { ListGetter_NodeReplacerTest_test_compilationUnit_2(int arg0) : super(arg0); @override NodeList getList(CompilationUnit node) => node.declarations; } class ListGetter_NodeReplacerTest_test_constructorDeclaration extends NodeReplacerTest_ListGetter { ListGetter_NodeReplacerTest_test_constructorDeclaration(int arg0) : super(arg0); @override NodeList getList(ConstructorDeclaration node) => node.initializers; } class ListGetter_NodeReplacerTest_test_formalParameterList extends NodeReplacerTest_ListGetter { ListGetter_NodeReplacerTest_test_formalParameterList(int arg0) : super(arg0); @override NodeList getList(FormalParameterList node) => node.parameters; } class ListGetter_NodeReplacerTest_test_forStatement_withInitialization extends NodeReplacerTest_ListGetter { ListGetter_NodeReplacerTest_test_forStatement_withInitialization(int arg0) : super(arg0); @override NodeList getList(ForStatement node) => (node.forLoopParts as ForParts).updaters; } class ListGetter_NodeReplacerTest_test_forStatement_withVariables extends NodeReplacerTest_ListGetter { ListGetter_NodeReplacerTest_test_forStatement_withVariables(int arg0) : super(arg0); @override NodeList getList(ForStatement node) => (node.forLoopParts as ForParts).updaters; } class ListGetter_NodeReplacerTest_test_hideCombinator extends NodeReplacerTest_ListGetter { ListGetter_NodeReplacerTest_test_hideCombinator(int arg0) : super(arg0); @override NodeList getList(HideCombinator node) => node.hiddenNames; } class ListGetter_NodeReplacerTest_test_implementsClause extends NodeReplacerTest_ListGetter { ListGetter_NodeReplacerTest_test_implementsClause(int arg0) : super(arg0); @override NodeList getList(ImplementsClause node) => node.interfaces; } class ListGetter_NodeReplacerTest_test_labeledStatement extends NodeReplacerTest_ListGetter { ListGetter_NodeReplacerTest_test_labeledStatement(int arg0) : super(arg0); @override NodeList