blob: 7675f7450100920eb4a8d393b52204f4699f3811 [file]
// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../src/diagnostics/parser_diagnostics.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(FormalParameterParserTest);
});
}
/// The class [FormalParameterParserTest] defines parser tests that test
/// the parsing of formal parameters.
@reflectiveTest
class FormalParameterParserTest extends ParserDiagnosticsTest {
void test_fieldFormalParameter_optionalPositional_type_namedType_int() {
var parseResult = parseStringWithErrors(r'''
class A {
int a;
A([int this.a = 0]);
}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: [
parameter: FieldFormalParameter
type: NamedType
name: int
thisKeyword: this
period: .
name: a
defaultClause: FormalParameterDefaultClause
separator: =
value: IntegerLiteral
literal: 0
rightDelimiter: ]
rightParenthesis: )
''');
}
void test_fieldFormalParameter_requiredNamed_noType() {
var parseResult = parseStringWithErrors(r'''
class A {
var a;
A({required this.a});
}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: {
parameter: FieldFormalParameter
requiredKeyword: required
thisKeyword: this
period: .
name: a
rightDelimiter: }
rightParenthesis: )
''');
}
void test_fieldFormalParameter_requiredNamed_type_namedType_int() {
var parseResult = parseStringWithErrors(r'''
class A {
int a;
A({required int this.a});
}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: {
parameter: FieldFormalParameter
requiredKeyword: required
type: NamedType
name: int
thisKeyword: this
period: .
name: a
rightDelimiter: }
rightParenthesis: )
''');
}
void
test_fieldFormalParameter_requiredNamed_type_namedType_int_defaultValue() {
var parseResult = parseStringWithErrors(r'''
class A {
int a;
A({required int this.a = 0});
}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: {
parameter: FieldFormalParameter
requiredKeyword: required
type: NamedType
name: int
thisKeyword: this
period: .
name: a
defaultClause: FormalParameterDefaultClause
separator: =
value: IntegerLiteral
literal: 0
rightDelimiter: }
rightParenthesis: )
''');
}
void test_fieldFormalParameter_requiredPositional_const_noType() {
var parseResult = parseStringWithErrors(r'''
class A {
var a;
A(const this.a);
}
''');
parseResult.assertErrors([error(diag.extraneousModifier, 23, 5)]);
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
FieldFormalParameter
constFinalOrVarKeyword: const
thisKeyword: this
period: .
name: a
''');
}
void test_fieldFormalParameter_requiredPositional_const_type() {
var parseResult = parseStringWithErrors(r'''
class A {
var a;
A(const int this.a);
}
''');
parseResult.assertErrors([error(diag.extraneousModifier, 23, 5)]);
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
FieldFormalParameter
constFinalOrVarKeyword: const
type: NamedType
name: int
thisKeyword: this
period: .
name: a
''');
}
void test_fieldFormalParameter_requiredPositional_covariant_noType() {
var parseResult = parseStringWithErrors(r'''
class A {
var a;
A(covariant this.a);
}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
FieldFormalParameter
covariantKeyword: covariant
thisKeyword: this
period: .
name: a
''');
}
void test_fieldFormalParameter_requiredPositional_covariant_type() {
var parseResult = parseStringWithErrors(r'''
class A {
var a;
A(covariant int this.a);
}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
FieldFormalParameter
covariantKeyword: covariant
type: NamedType
name: int
thisKeyword: this
period: .
name: a
''');
}
void test_fieldFormalParameter_requiredPositional_final_noType() {
var parseResult = parseStringWithErrors(r'''
class A {
var a;
A(final this.a);
}
''');
parseResult.assertErrors([error(diag.extraneousModifier, 23, 5)]);
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
FieldFormalParameter
constFinalOrVarKeyword: final
thisKeyword: this
period: .
name: a
''');
}
void test_fieldFormalParameter_requiredPositional_final_type() {
var parseResult = parseStringWithErrors(r'''
class A {
var a;
A(final int this.a);
}
''');
parseResult.assertErrors([error(diag.extraneousModifier, 23, 5)]);
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
FieldFormalParameter
constFinalOrVarKeyword: final
type: NamedType
name: int
thisKeyword: this
period: .
name: a
''');
}
void test_fieldFormalParameter_requiredPositional_functionTyped_nested() {
var parseResult = parseStringWithErrors(r'''
class A {
var a;
A(this.a(int b));
}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.firstFormalParameter;
assertParsedNodeText(node, r'''
FieldFormalParameter
thisKeyword: this
period: .
name: a
functionTypedSuffix: FunctionTypedFormalParameterSuffix
formalParameters: FormalParameterList
leftParenthesis: (
parameter: RegularFormalParameter
type: NamedType
name: int
name: b
rightParenthesis: )
''');
}
void
test_fieldFormalParameter_requiredPositional_functionTyped_noParameters() {
var parseResult = parseStringWithErrors(r'''
class A {
var a;
A(this.a());
}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
FieldFormalParameter
thisKeyword: this
period: .
name: a
functionTypedSuffix: FunctionTypedFormalParameterSuffix
formalParameters: FormalParameterList
leftParenthesis: (
rightParenthesis: )
''');
}
void test_fieldFormalParameter_requiredPositional_functionTyped_nullable() {
var parseResult = parseStringWithErrors(r'''
class A {
var a;
A(void this.a()?);
}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
FieldFormalParameter
type: NamedType
name: void
thisKeyword: this
period: .
name: a
functionTypedSuffix: FunctionTypedFormalParameterSuffix
formalParameters: FormalParameterList
leftParenthesis: (
rightParenthesis: )
question: ?
''');
}
void
test_fieldFormalParameter_requiredPositional_functionTyped_withDocComment() {
var parseResult = parseStringWithErrors(r'''
class A {
var f;
A(
/// Doc
this.f(),
);
}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
FieldFormalParameter
documentationComment: Comment
tokens
/// Doc
thisKeyword: this
period: .
name: f
functionTypedSuffix: FunctionTypedFormalParameterSuffix
formalParameters: FormalParameterList
leftParenthesis: (
rightParenthesis: )
''');
}
void test_fieldFormalParameter_requiredPositional_noType() {
var parseResult = parseStringWithErrors(r'''
class A {
var a;
A(this.a);
}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
FieldFormalParameter
thisKeyword: this
period: .
name: a
''');
}
void test_fieldFormalParameter_requiredPositional_type() {
var parseResult = parseStringWithErrors(r'''
class A {
var a;
A(int this.a);
}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
FieldFormalParameter
type: NamedType
name: int
thisKeyword: this
period: .
name: a
''');
}
void test_fieldFormalParameter_requiredPositional_type_functionType() {
var parseResult = parseStringWithErrors(r'''
class C {
final Object Function(int, double) field;
C(String Function(num, Object) this.field);
}''');
parseResult.assertNoErrors();
var node = parseResult.findNode.fieldFormalParameter('this.field');
assertParsedNodeText(node, r'''
FieldFormalParameter
type: GenericFunctionType
returnType: NamedType
name: String
functionKeyword: Function
parameters: FormalParameterList
leftParenthesis: (
parameter: RegularFormalParameter
type: NamedType
name: num
parameter: RegularFormalParameter
type: NamedType
name: Object
rightParenthesis: )
thisKeyword: this
period: .
name: field
''');
}
void test_fieldFormalParameter_requiredPositional_var() {
var parseResult = parseStringWithErrors(r'''
class A {
var a;
A(var this.a);
}
''');
parseResult.assertErrors([error(diag.extraneousModifier, 23, 3)]);
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
FieldFormalParameter
constFinalOrVarKeyword: var
thisKeyword: this
period: .
name: a
''');
}
void test_fieldFormalParameter_requiredPositional_withDocComment() {
var parseResult = parseStringWithErrors(r'''
class A {
var a;
A(
/// Doc
this.a,
);
}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
FieldFormalParameter
documentationComment: Comment
tokens
/// Doc
thisKeyword: this
period: .
name: a
''');
}
void test_fieldFormalParameter_topLevelFunction() {
var parseResult = parseStringWithErrors(r'''
void f(this.a) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
FieldFormalParameter
thisKeyword: this
period: .
name: a
''');
}
void
test_formalParameterList_regularFormalParameter_optionalNamed_multiple() {
var parseResult = parseStringWithErrors(r'''
void f({A a : 1, B b, C c : 3}) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: {
parameter: RegularFormalParameter
type: NamedType
name: A
name: a
defaultClause: FormalParameterDefaultClause
separator: :
value: IntegerLiteral
literal: 1
parameter: RegularFormalParameter
type: NamedType
name: B
name: b
parameter: RegularFormalParameter
type: NamedType
name: C
name: c
defaultClause: FormalParameterDefaultClause
separator: :
value: IntegerLiteral
literal: 3
rightDelimiter: }
rightParenthesis: )
''');
}
void
test_formalParameterList_regularFormalParameter_optionalNamed_trailingComma() {
var parseResult = parseStringWithErrors(r'''
void f(A a, {B b,}) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
parameter: RegularFormalParameter
type: NamedType
name: A
name: a
leftDelimiter: {
parameter: RegularFormalParameter
type: NamedType
name: B
name: b
rightDelimiter: }
rightParenthesis: )
''');
}
void
test_formalParameterList_regularFormalParameter_optionalPositional_multiple() {
var parseResult = parseStringWithErrors(r'''
void f([A a = null, B b, C c = null]) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: [
parameter: RegularFormalParameter
type: NamedType
name: A
name: a
defaultClause: FormalParameterDefaultClause
separator: =
value: NullLiteral
literal: null
parameter: RegularFormalParameter
type: NamedType
name: B
name: b
parameter: RegularFormalParameter
type: NamedType
name: C
name: c
defaultClause: FormalParameterDefaultClause
separator: =
value: NullLiteral
literal: null
rightDelimiter: ]
rightParenthesis: )
''');
}
void
test_formalParameterList_regularFormalParameter_optionalPositional_trailingComma() {
var parseResult = parseStringWithErrors(r'''
void f(A a, [B b,]) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
parameter: RegularFormalParameter
type: NamedType
name: A
name: a
leftDelimiter: [
parameter: RegularFormalParameter
type: NamedType
name: B
name: b
rightDelimiter: ]
rightParenthesis: )
''');
}
void
test_formalParameterList_regularFormalParameter_requiredPositional_empty() {
var parseResult = parseStringWithErrors(r'''
void f() {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
rightParenthesis: )
''');
}
void
test_formalParameterList_regularFormalParameter_requiredPositional_multiple() {
var parseResult = parseStringWithErrors(r'''
void f(A a, B b, C c) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
parameter: RegularFormalParameter
type: NamedType
name: A
name: a
parameter: RegularFormalParameter
type: NamedType
name: B
name: b
parameter: RegularFormalParameter
type: NamedType
name: C
name: c
rightParenthesis: )
''');
}
void
test_formalParameterList_regularFormalParameter_requiredPositional_optionalNamed() {
var parseResult = parseStringWithErrors(r'''
void f(A a, {B b}) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
parameter: RegularFormalParameter
type: NamedType
name: A
name: a
leftDelimiter: {
parameter: RegularFormalParameter
type: NamedType
name: B
name: b
rightDelimiter: }
rightParenthesis: )
''');
}
void
test_formalParameterList_regularFormalParameter_requiredPositional_optionalNamed_inFunctionType() {
var parseResult = parseStringWithErrors(r'''
typedef F = void Function(A, {B b});
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
parameter: RegularFormalParameter
type: NamedType
name: A
leftDelimiter: {
parameter: RegularFormalParameter
type: NamedType
name: B
name: b
rightDelimiter: }
rightParenthesis: )
''');
}
void
test_formalParameterList_regularFormalParameter_requiredPositional_optionalPositional() {
var parseResult = parseStringWithErrors(r'''
void f(A a, [B b]) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
parameter: RegularFormalParameter
type: NamedType
name: A
name: a
leftDelimiter: [
parameter: RegularFormalParameter
type: NamedType
name: B
name: b
rightDelimiter: ]
rightParenthesis: )
''');
}
void
test_formalParameterList_regularFormalParameter_requiredPositional_single_trailingComma() {
var parseResult = parseStringWithErrors(r'''
void f(A a,) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
parameter: RegularFormalParameter
type: NamedType
name: A
name: a
rightParenthesis: )
''');
}
void
test_formalParameterList_regularFormalParameter_requiredPositional_type_prefixed_partial_withFollowingParameter() {
var parseResult = parseStringWithErrors(r'''
void f(io.,a) {}
''');
parseResult.assertErrors([
error(diag.expectedTypeName, 10, 1),
error(diag.missingIdentifier, 10, 1),
]);
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
parameter: RegularFormalParameter
type: NamedType
importPrefix: ImportPrefixReference
name: io
period: .
name: <empty> <synthetic>
name: <empty> <synthetic>
parameter: RegularFormalParameter
name: a
rightParenthesis: )
''');
}
void test_formalParameterList_separator_missing_optionalNamed() {
var parseResult = parseStringWithErrors(r'''
void f({int a int b}) {}
''');
parseResult.assertErrors([error(diag.expectedToken, 14, 3)]);
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: {
parameter: RegularFormalParameter
type: NamedType
name: int
name: a
rightDelimiter: }
rightParenthesis: )
''');
}
void test_formalParameterList_separator_missing_requiredPositional() {
var parseResult = parseStringWithErrors(r'''
void f(int a int b) {}
''');
parseResult.assertErrors([error(diag.expectedToken, 13, 3)]);
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
parameter: RegularFormalParameter
type: NamedType
name: int
name: a
parameter: RegularFormalParameter
type: NamedType
name: int
name: b
rightParenthesis: )
''');
}
void test_regularFormalParameter_metadata_noType() {
var parseResult = parseStringWithErrors(r'''
void f(@deprecated a) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
RegularFormalParameter
metadata
Annotation
atSign: @
name: SimpleIdentifier
token: deprecated
name: a
''');
}
void test_regularFormalParameter_metadata_type() {
var parseResult = parseStringWithErrors(r'''
void f(@deprecated int a) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
RegularFormalParameter
metadata
Annotation
atSign: @
name: SimpleIdentifier
token: deprecated
type: NamedType
name: int
name: a
''');
}
void test_regularFormalParameter_optionalNamed_covariant_final() {
var parseResult = parseStringWithErrors(r'''
class C {
void f({covariant final a : null}) {}
}
''');
parseResult.assertErrors([error(diag.extraneousModifier, 30, 5)]);
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: {
parameter: RegularFormalParameter
covariantKeyword: covariant
constFinalOrVarKeyword: final
name: a
defaultClause: FormalParameterDefaultClause
separator: :
value: NullLiteral
literal: null
rightDelimiter: }
rightParenthesis: )
''');
}
void test_regularFormalParameter_optionalNamed_covariant_final_type() {
var parseResult = parseStringWithErrors(r'''
class C {
void f({covariant final A a : null}) {}
}
''');
parseResult.assertErrors([error(diag.extraneousModifier, 30, 5)]);
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: {
parameter: RegularFormalParameter
covariantKeyword: covariant
constFinalOrVarKeyword: final
type: NamedType
name: A
name: a
defaultClause: FormalParameterDefaultClause
separator: :
value: NullLiteral
literal: null
rightDelimiter: }
rightParenthesis: )
''');
}
void test_regularFormalParameter_optionalNamed_covariant_type() {
var parseResult = parseStringWithErrors(r'''
class C {
void f({covariant A a : null}) {}
}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: {
parameter: RegularFormalParameter
covariantKeyword: covariant
type: NamedType
name: A
name: a
defaultClause: FormalParameterDefaultClause
separator: :
value: NullLiteral
literal: null
rightDelimiter: }
rightParenthesis: )
''');
}
void test_regularFormalParameter_optionalNamed_covariant_var() {
var parseResult = parseStringWithErrors(r'''
class C {
void f({covariant var a : null}) {}
}
''');
parseResult.assertErrors([error(diag.extraneousModifier, 30, 3)]);
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: {
parameter: RegularFormalParameter
covariantKeyword: covariant
constFinalOrVarKeyword: var
name: a
defaultClause: FormalParameterDefaultClause
separator: :
value: NullLiteral
literal: null
rightDelimiter: }
rightParenthesis: )
''');
}
void test_regularFormalParameter_optionalNamed_final() {
var parseResult = parseStringWithErrors(r'''
void f({final a : null}) {}
''');
parseResult.assertErrors([error(diag.extraneousModifier, 8, 5)]);
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: {
parameter: RegularFormalParameter
constFinalOrVarKeyword: final
name: a
defaultClause: FormalParameterDefaultClause
separator: :
value: NullLiteral
literal: null
rightDelimiter: }
rightParenthesis: )
''');
}
void test_regularFormalParameter_optionalNamed_final_type() {
var parseResult = parseStringWithErrors(r'''
void f({final A a = null}) {}
''');
parseResult.assertErrors([error(diag.extraneousModifier, 8, 5)]);
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: {
parameter: RegularFormalParameter
constFinalOrVarKeyword: final
type: NamedType
name: A
name: a
defaultClause: FormalParameterDefaultClause
separator: =
value: NullLiteral
literal: null
rightDelimiter: }
rightParenthesis: )
''');
}
void test_regularFormalParameter_optionalNamed_functionTyped() {
var parseResult = parseStringWithErrors(r'''
void f({a() = null}) {}
''');
parseResult.assertNoErrors();
var f = parseResult.findNode.singleFunctionDeclaration;
var node = f.functionExpression.parameters!;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: {
parameter: RegularFormalParameter
name: a
functionTypedSuffix: FunctionTypedFormalParameterSuffix
formalParameters: FormalParameterList
leftParenthesis: (
rightParenthesis: )
defaultClause: FormalParameterDefaultClause
separator: =
value: NullLiteral
literal: null
rightDelimiter: }
rightParenthesis: )
''');
}
void test_regularFormalParameter_optionalNamed_functionTyped_nullable() {
var parseResult = parseStringWithErrors(r'''
void f({a()? : null}) {}
''');
parseResult.assertNoErrors();
var node = parseResult
.findNode
.singleFunctionDeclaration
.functionExpression
.parameters!;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: {
parameter: RegularFormalParameter
name: a
functionTypedSuffix: FunctionTypedFormalParameterSuffix
formalParameters: FormalParameterList
leftParenthesis: (
rightParenthesis: )
question: ?
defaultClause: FormalParameterDefaultClause
separator: :
value: NullLiteral
literal: null
rightDelimiter: }
rightParenthesis: )
''');
}
void
test_regularFormalParameter_optionalNamed_functionTyped_nullable_typeParameters() {
var parseResult = parseStringWithErrors(r'''
void f({a<T>()? : null}) {}
''');
parseResult.assertNoErrors();
var node = parseResult
.findNode
.singleFunctionDeclaration
.functionExpression
.parameters!;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: {
parameter: RegularFormalParameter
name: a
functionTypedSuffix: FunctionTypedFormalParameterSuffix
typeParameters: TypeParameterList
leftBracket: <
typeParameters
TypeParameter
name: T
rightBracket: >
formalParameters: FormalParameterList
leftParenthesis: (
rightParenthesis: )
question: ?
defaultClause: FormalParameterDefaultClause
separator: :
value: NullLiteral
literal: null
rightDelimiter: }
rightParenthesis: )
''');
}
void test_regularFormalParameter_optionalNamed_type() {
var parseResult = parseStringWithErrors(r'''
void f({A a : null}) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: {
parameter: RegularFormalParameter
type: NamedType
name: A
name: a
defaultClause: FormalParameterDefaultClause
separator: :
value: NullLiteral
literal: null
rightDelimiter: }
rightParenthesis: )
''');
}
void test_regularFormalParameter_optionalNamed_type_noDefault() {
var parseResult = parseStringWithErrors(r'''
void f({A a}) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: {
parameter: RegularFormalParameter
type: NamedType
name: A
name: a
rightDelimiter: }
rightParenthesis: )
''');
}
void test_regularFormalParameter_optionalNamed_var() {
var parseResult = parseStringWithErrors(r'''
void f({var a : null}) {}
''');
parseResult.assertErrors([error(diag.extraneousModifier, 8, 3)]);
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: {
parameter: RegularFormalParameter
constFinalOrVarKeyword: var
name: a
defaultClause: FormalParameterDefaultClause
separator: :
value: NullLiteral
literal: null
rightDelimiter: }
rightParenthesis: )
''');
}
void test_regularFormalParameter_optionalPositional_covariant_final() {
var parseResult = parseStringWithErrors(r'''
class C {
void f([covariant final a = null]) {}
}
''');
parseResult.assertErrors([error(diag.extraneousModifier, 30, 5)]);
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: [
parameter: RegularFormalParameter
covariantKeyword: covariant
constFinalOrVarKeyword: final
name: a
defaultClause: FormalParameterDefaultClause
separator: =
value: NullLiteral
literal: null
rightDelimiter: ]
rightParenthesis: )
''');
}
void test_regularFormalParameter_optionalPositional_covariant_final_type() {
var parseResult = parseStringWithErrors(r'''
class C {
void f([covariant final A a = null]) {}
}
''');
parseResult.assertErrors([error(diag.extraneousModifier, 30, 5)]);
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: [
parameter: RegularFormalParameter
covariantKeyword: covariant
constFinalOrVarKeyword: final
type: NamedType
name: A
name: a
defaultClause: FormalParameterDefaultClause
separator: =
value: NullLiteral
literal: null
rightDelimiter: ]
rightParenthesis: )
''');
}
void test_regularFormalParameter_optionalPositional_covariant_type() {
var parseResult = parseStringWithErrors(r'''
class C {
void f([covariant A a = null]) {}
}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: [
parameter: RegularFormalParameter
covariantKeyword: covariant
type: NamedType
name: A
name: a
defaultClause: FormalParameterDefaultClause
separator: =
value: NullLiteral
literal: null
rightDelimiter: ]
rightParenthesis: )
''');
}
void test_regularFormalParameter_optionalPositional_covariant_var() {
var parseResult = parseStringWithErrors(r'''
class C {
void f([covariant var a = null]) {}
}
''');
parseResult.assertErrors([error(diag.extraneousModifier, 30, 3)]);
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: [
parameter: RegularFormalParameter
covariantKeyword: covariant
constFinalOrVarKeyword: var
name: a
defaultClause: FormalParameterDefaultClause
separator: =
value: NullLiteral
literal: null
rightDelimiter: ]
rightParenthesis: )
''');
}
void test_regularFormalParameter_optionalPositional_final() {
var parseResult = parseStringWithErrors(r'''
void f([final a = null]) {}
''');
parseResult.assertErrors([error(diag.extraneousModifier, 8, 5)]);
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: [
parameter: RegularFormalParameter
constFinalOrVarKeyword: final
name: a
defaultClause: FormalParameterDefaultClause
separator: =
value: NullLiteral
literal: null
rightDelimiter: ]
rightParenthesis: )
''');
}
void test_regularFormalParameter_optionalPositional_final_type() {
var parseResult = parseStringWithErrors(r'''
void f([final A a = null]) {}
''');
parseResult.assertErrors([error(diag.extraneousModifier, 8, 5)]);
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: [
parameter: RegularFormalParameter
constFinalOrVarKeyword: final
type: NamedType
name: A
name: a
defaultClause: FormalParameterDefaultClause
separator: =
value: NullLiteral
literal: null
rightDelimiter: ]
rightParenthesis: )
''');
}
void test_regularFormalParameter_optionalPositional_type() {
var parseResult = parseStringWithErrors(r'''
void f([A a = null]) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: [
parameter: RegularFormalParameter
type: NamedType
name: A
name: a
defaultClause: FormalParameterDefaultClause
separator: =
value: NullLiteral
literal: null
rightDelimiter: ]
rightParenthesis: )
''');
}
void test_regularFormalParameter_optionalPositional_type_noDefault() {
var parseResult = parseStringWithErrors(r'''
void f([A a]) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: [
parameter: RegularFormalParameter
type: NamedType
name: A
name: a
rightDelimiter: ]
rightParenthesis: )
''');
}
void test_regularFormalParameter_optionalPositional_var() {
var parseResult = parseStringWithErrors(r'''
void f([var a = null]) {}
''');
parseResult.assertErrors([error(diag.extraneousModifier, 8, 3)]);
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: [
parameter: RegularFormalParameter
constFinalOrVarKeyword: var
name: a
defaultClause: FormalParameterDefaultClause
separator: =
value: NullLiteral
literal: null
rightDelimiter: ]
rightParenthesis: )
''');
}
void test_regularFormalParameter_requiredNamed_covariant_type() {
var parseResult = parseStringWithErrors(r'''
class C {
void f({required covariant A a}) {}
}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: {
parameter: RegularFormalParameter
covariantKeyword: covariant
requiredKeyword: required
type: NamedType
name: A
name: a
rightDelimiter: }
rightParenthesis: )
''');
}
void test_regularFormalParameter_requiredNamed_covariant_type_ordering() {
var parseResult = parseStringWithErrors(r'''
class C {
void f({covariant required A a}) {}
}
''');
parseResult.assertErrors([error(diag.modifierOutOfOrder, 30, 8)]);
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: {
parameter: RegularFormalParameter
covariantKeyword: covariant
requiredKeyword: required
type: NamedType
name: A
name: a
rightDelimiter: }
rightParenthesis: )
''');
}
void test_regularFormalParameter_requiredNamed_final() {
var parseResult = parseStringWithErrors(r'''
void f({required final a}) {}
''');
parseResult.assertErrors([error(diag.extraneousModifier, 17, 5)]);
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: {
parameter: RegularFormalParameter
requiredKeyword: required
constFinalOrVarKeyword: final
name: a
rightDelimiter: }
rightParenthesis: )
''');
}
void test_regularFormalParameter_requiredNamed_final_ordering() {
var parseResult = parseStringWithErrors(r'''
void f({final required a}) {}
''');
parseResult.assertErrors([
error(diag.extraneousModifier, 8, 5),
error(diag.modifierOutOfOrder, 14, 8),
]);
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: {
parameter: RegularFormalParameter
requiredKeyword: required
constFinalOrVarKeyword: final
name: a
rightDelimiter: }
rightParenthesis: )
''');
}
void test_regularFormalParameter_requiredNamed_type() {
var parseResult = parseStringWithErrors(r'''
void f({required A a}) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: {
parameter: RegularFormalParameter
requiredKeyword: required
type: NamedType
name: A
name: a
rightDelimiter: }
rightParenthesis: )
''');
}
void
test_regularFormalParameter_requiredNamed_type_namedType_int_defaultValue() {
var parseResult = parseStringWithErrors(r'''
void f({required int a = 0}) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: {
parameter: RegularFormalParameter
requiredKeyword: required
type: NamedType
name: int
name: a
defaultClause: FormalParameterDefaultClause
separator: =
value: IntegerLiteral
literal: 0
rightDelimiter: }
rightParenthesis: )
''');
}
void
test_regularFormalParameter_requiredNamed_type_namedType_int_noDefault() {
var parseResult = parseStringWithErrors(r'''
void f({required int a}) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: {
parameter: RegularFormalParameter
requiredKeyword: required
type: NamedType
name: int
name: a
rightDelimiter: }
rightParenthesis: )
''');
}
void test_regularFormalParameter_requiredNamed_var() {
var parseResult = parseStringWithErrors(r'''
void f({required var a}) {}
''');
parseResult.assertErrors([error(diag.extraneousModifier, 17, 3)]);
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: {
parameter: RegularFormalParameter
requiredKeyword: required
constFinalOrVarKeyword: var
name: a
rightDelimiter: }
rightParenthesis: )
''');
}
void test_regularFormalParameter_requiredNamed_var_ordering() {
var parseResult = parseStringWithErrors(r'''
void f({var required a}) {}
''');
parseResult.assertErrors([
error(diag.extraneousModifier, 8, 3),
error(diag.modifierOutOfOrder, 12, 8),
]);
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
leftDelimiter: {
parameter: RegularFormalParameter
requiredKeyword: required
constFinalOrVarKeyword: var
name: a
rightDelimiter: }
rightParenthesis: )
''');
}
void test_regularFormalParameter_requiredPositional_const_noType() {
var parseResult = parseStringWithErrors(r'''
void f(const a) {}
''');
parseResult.assertErrors([error(diag.extraneousModifier, 7, 5)]);
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
RegularFormalParameter
constFinalOrVarKeyword: const
name: a
''');
}
void test_regularFormalParameter_requiredPositional_const_type() {
var parseResult = parseStringWithErrors(r'''
void f(const A a) {}
''');
parseResult.assertErrors([error(diag.extraneousModifier, 7, 5)]);
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
RegularFormalParameter
constFinalOrVarKeyword: const
type: NamedType
name: A
name: a
''');
}
void test_regularFormalParameter_requiredPositional_covariant_final() {
var parseResult = parseStringWithErrors(r'''
class C {
void f(covariant final a) {}
}
''');
parseResult.assertErrors([error(diag.extraneousModifier, 29, 5)]);
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
RegularFormalParameter
covariantKeyword: covariant
constFinalOrVarKeyword: final
name: a
''');
}
void test_regularFormalParameter_requiredPositional_covariant_final_type() {
var parseResult = parseStringWithErrors(r'''
class C {
void f(covariant final A a) {}
}
''');
parseResult.assertErrors([error(diag.extraneousModifier, 29, 5)]);
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
RegularFormalParameter
covariantKeyword: covariant
constFinalOrVarKeyword: final
type: NamedType
name: A
name: a
''');
}
void test_regularFormalParameter_requiredPositional_covariant_type() {
var parseResult = parseStringWithErrors(r'''
class C {
void f(covariant A<B<C>> a) {}
}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
RegularFormalParameter
covariantKeyword: covariant
type: NamedType
name: A
typeArguments: TypeArgumentList
leftBracket: <
arguments
NamedType
name: B
typeArguments: TypeArgumentList
leftBracket: <
arguments
NamedType
name: C
rightBracket: >
rightBracket: >
name: a
''');
}
void
test_regularFormalParameter_requiredPositional_covariant_type_functionType() {
var parseResult = parseStringWithErrors(r'''
class C {
void f(covariant String Function(int) a) {}
}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleMethodDeclaration.parameters!;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
parameter: RegularFormalParameter
covariantKeyword: covariant
type: GenericFunctionType
returnType: NamedType
name: String
functionKeyword: Function
parameters: FormalParameterList
leftParenthesis: (
parameter: RegularFormalParameter
type: NamedType
name: int
rightParenthesis: )
name: a
rightParenthesis: )
''');
}
void test_regularFormalParameter_requiredPositional_covariant_var() {
var parseResult = parseStringWithErrors(r'''
class C {
void f(covariant var a) {}
}
''');
parseResult.assertErrors([error(diag.extraneousModifier, 29, 3)]);
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
RegularFormalParameter
covariantKeyword: covariant
constFinalOrVarKeyword: var
name: a
''');
}
void test_regularFormalParameter_requiredPositional_external() {
var parseResult = parseStringWithErrors(r'''
void f(external int i) {}
''');
parseResult.assertErrors([error(diag.extraneousModifier, 7, 8)]);
}
void test_regularFormalParameter_requiredPositional_final_noType() {
var parseResult = parseStringWithErrors(r'''
void f(final a) {}
''');
parseResult.assertErrors([error(diag.extraneousModifier, 7, 5)]);
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
RegularFormalParameter
constFinalOrVarKeyword: final
name: a
''');
}
void test_regularFormalParameter_requiredPositional_final_type() {
var parseResult = parseStringWithErrors(r'''
void f(final A a) {}
''');
parseResult.assertErrors([error(diag.extraneousModifier, 7, 5)]);
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
RegularFormalParameter
constFinalOrVarKeyword: final
type: NamedType
name: A
name: a
''');
}
void test_regularFormalParameter_requiredPositional_functionTyped_noType() {
var parseResult = parseStringWithErrors(r'''
void f(a()) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
RegularFormalParameter
name: a
functionTypedSuffix: FunctionTypedFormalParameterSuffix
formalParameters: FormalParameterList
leftParenthesis: (
rightParenthesis: )
''');
}
void
test_regularFormalParameter_requiredPositional_functionTyped_noType_covariant() {
var parseResult = parseStringWithErrors(r'''
class A {
void f(covariant a()) {}
}
''');
parseResult.assertNoErrors();
var node = parseResult
.findNode
.singleMethodDeclaration
.parameters!
.parameters
.single;
assertParsedNodeText(node, r'''
RegularFormalParameter
covariantKeyword: covariant
name: a
functionTypedSuffix: FunctionTypedFormalParameterSuffix
formalParameters: FormalParameterList
leftParenthesis: (
rightParenthesis: )
''');
}
void
test_regularFormalParameter_requiredPositional_functionTyped_noType_nullable() {
var parseResult = parseStringWithErrors(r'''
void f(a()?) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
RegularFormalParameter
name: a
functionTypedSuffix: FunctionTypedFormalParameterSuffix
formalParameters: FormalParameterList
leftParenthesis: (
rightParenthesis: )
question: ?
''');
}
void
test_regularFormalParameter_requiredPositional_functionTyped_noType_typeParameters() {
var parseResult = parseStringWithErrors(r'''
void f(a<E>()) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
RegularFormalParameter
name: a
functionTypedSuffix: FunctionTypedFormalParameterSuffix
typeParameters: TypeParameterList
leftBracket: <
typeParameters
TypeParameter
name: E
rightBracket: >
formalParameters: FormalParameterList
leftParenthesis: (
rightParenthesis: )
''');
}
void
test_regularFormalParameter_requiredPositional_functionTyped_parameter_covariant() {
var parseResult = parseStringWithErrors(r'''
void f(void g(covariant int a)) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.regularFormalParameter('a)');
assertParsedNodeText(node, r'''
RegularFormalParameter
covariantKeyword: covariant
type: NamedType
name: int
name: a
''');
}
void
test_regularFormalParameter_requiredPositional_functionTyped_parameter_required_covariant() {
var parseResult = parseStringWithErrors(r'''
void f(void g({required covariant int a})) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.regularFormalParameter('a}');
assertParsedNodeText(node, r'''
RegularFormalParameter
covariantKeyword: covariant
requiredKeyword: required
type: NamedType
name: int
name: a
''');
}
void
test_regularFormalParameter_requiredPositional_functionTyped_returnType() {
var parseResult = parseStringWithErrors(r'''
void f(A a()) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
RegularFormalParameter
type: NamedType
name: A
name: a
functionTypedSuffix: FunctionTypedFormalParameterSuffix
formalParameters: FormalParameterList
leftParenthesis: (
rightParenthesis: )
''');
}
void
test_regularFormalParameter_requiredPositional_functionTyped_returnType_typeParameters() {
var parseResult = parseStringWithErrors(r'''
void f(A a<E>()) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
RegularFormalParameter
type: NamedType
name: A
name: a
functionTypedSuffix: FunctionTypedFormalParameterSuffix
typeParameters: TypeParameterList
leftBracket: <
typeParameters
TypeParameter
name: E
rightBracket: >
formalParameters: FormalParameterList
leftParenthesis: (
rightParenthesis: )
''');
}
void
test_regularFormalParameter_requiredPositional_functionTyped_returnType_void() {
var parseResult = parseStringWithErrors(r'''
void f(void a()) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
RegularFormalParameter
type: NamedType
name: void
name: a
functionTypedSuffix: FunctionTypedFormalParameterSuffix
formalParameters: FormalParameterList
leftParenthesis: (
rightParenthesis: )
''');
}
void
test_regularFormalParameter_requiredPositional_functionTyped_returnType_void_covariant() {
var parseResult = parseStringWithErrors(r'''
class A {
void f(covariant void a()) {}
}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
RegularFormalParameter
covariantKeyword: covariant
type: NamedType
name: void
name: a
functionTypedSuffix: FunctionTypedFormalParameterSuffix
formalParameters: FormalParameterList
leftParenthesis: (
rightParenthesis: )
''');
}
void
test_regularFormalParameter_requiredPositional_functionTyped_returnType_void_typeParameters() {
var parseResult = parseStringWithErrors(r'''
void f(void a<E>()) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
RegularFormalParameter
type: NamedType
name: void
name: a
functionTypedSuffix: FunctionTypedFormalParameterSuffix
typeParameters: TypeParameterList
leftBracket: <
typeParameters
TypeParameter
name: E
rightBracket: >
formalParameters: FormalParameterList
leftParenthesis: (
rightParenthesis: )
''');
}
@FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
void
test_regularFormalParameter_requiredPositional_functionTyped_withDocComment() {
var parseResult = parseStringWithErrors(r'''
void f(
/// Doc
g(),
) {}
''');
parseResult.assertNoErrors();
// TODO(scheglov): assert AST
fail('Incomplete');
}
void test_regularFormalParameter_requiredPositional_noType() {
var parseResult = parseStringWithErrors(r'''
void f(a) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
RegularFormalParameter
name: a
''');
}
void test_regularFormalParameter_requiredPositional_noType_inFunctionTyped() {
var parseResult = parseStringWithErrors(r'''
void f(void g(a)) {}
''');
parseResult.assertNoErrors();
var f = parseResult.findNode.functionDeclaration('f');
var g =
f.functionExpression.parameters!.parameters.single
as RegularFormalParameter;
var node = g.functionTypedSuffix!.formalParameters.parameters.single;
assertParsedNodeText(node, r'''
RegularFormalParameter
name: a
''');
}
void test_regularFormalParameter_requiredPositional_noType_nameCovariant() {
var parseResult = parseStringWithErrors(r'''
void f(covariant) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
RegularFormalParameter
name: covariant
''');
}
void test_regularFormalParameter_requiredPositional_noType_nameRequired() {
var parseResult = parseStringWithErrors(r'''
void f(required) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
RegularFormalParameter
name: required
''');
}
void test_regularFormalParameter_requiredPositional_noType_nameUnderscore() {
var parseResult = parseStringWithErrors(r'''
void f(_) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
RegularFormalParameter
name: _
''');
}
void
test_regularFormalParameter_requiredPositional_single_type_namedType_Function() {
var parseResult = parseStringWithErrors(r'''
void f(Function f) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
parameter: RegularFormalParameter
type: NamedType
name: Function
name: f
rightParenthesis: )
''');
}
void test_regularFormalParameter_requiredPositional_single_type_prefixed() {
var parseResult = parseStringWithErrors(r'''
void f(io.File f) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
parameter: RegularFormalParameter
type: NamedType
importPrefix: ImportPrefixReference
name: io
period: .
name: File
name: f
rightParenthesis: )
''');
}
void
test_regularFormalParameter_requiredPositional_single_type_prefixed_missingName() {
var parseResult = parseStringWithErrors(r'''
void f(io.File) {}
''');
parseResult.assertErrors([error(diag.missingIdentifier, 14, 1)]);
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
parameter: RegularFormalParameter
type: NamedType
importPrefix: ImportPrefixReference
name: io
period: .
name: File
name: <empty> <synthetic>
rightParenthesis: )
''');
}
void
test_regularFormalParameter_requiredPositional_single_type_prefixed_partial() {
var parseResult = parseStringWithErrors(r'''
void f(io.) {}
''');
parseResult.assertErrors([
error(diag.expectedTypeName, 10, 1),
error(diag.missingIdentifier, 10, 1),
]);
var node = parseResult.findNode.singleFormalParameterList;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
parameter: RegularFormalParameter
type: NamedType
importPrefix: ImportPrefixReference
name: io
period: .
name: <empty> <synthetic>
name: <empty> <synthetic>
rightParenthesis: )
''');
}
void test_regularFormalParameter_requiredPositional_type() {
var parseResult = parseStringWithErrors(r'''
void f(A a) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
RegularFormalParameter
type: NamedType
name: A
name: a
''');
}
void test_regularFormalParameter_requiredPositional_type_functionType() {
var parseResult = parseStringWithErrors(r'''
void f(String Function(int) a) {}
''');
parseResult.assertNoErrors();
var node = parseResult
.findNode
.singleFunctionDeclaration
.functionExpression
.parameters!;
assertParsedNodeText(node, r'''
FormalParameterList
leftParenthesis: (
parameter: RegularFormalParameter
type: GenericFunctionType
returnType: NamedType
name: String
functionKeyword: Function
parameters: FormalParameterList
leftParenthesis: (
parameter: RegularFormalParameter
type: NamedType
name: int
rightParenthesis: )
name: a
rightParenthesis: )
''');
}
void
test_regularFormalParameter_requiredPositional_type_namedType_int_nameUnderscore() {
var parseResult = parseStringWithErrors(r'''
void f(int _) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
RegularFormalParameter
type: NamedType
name: int
name: _
''');
}
void test_regularFormalParameter_requiredPositional_var() {
var parseResult = parseStringWithErrors(r'''
void f(var a) {}
''');
parseResult.assertErrors([error(diag.extraneousModifier, 7, 3)]);
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
RegularFormalParameter
constFinalOrVarKeyword: var
name: a
''');
}
void
test_superFormalParameter_optionalPositional_type_namedType_int_defaultValue() {
var parseResult = parseStringWithErrors(r'''
class A {
final int a;
A([this.a = 0]);
}
class B extends A {
B([int super.a = 0]);
}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.superFormalParameter('super.a');
assertParsedNodeText(node, r'''
SuperFormalParameter
type: NamedType
name: int
superKeyword: super
period: .
name: a
defaultClause: FormalParameterDefaultClause
separator: =
value: IntegerLiteral
literal: 0
''');
}
void test_superFormalParameter_requiredNamed_type_namedType_int() {
var parseResult = parseStringWithErrors(r'''
class A {
final int a;
A({required this.a});
}
class B extends A {
B({required int super.a});
}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.superFormalParameter('super.a');
assertParsedNodeText(node, r'''
SuperFormalParameter
requiredKeyword: required
type: NamedType
name: int
superKeyword: super
period: .
name: a
''');
}
void
test_superFormalParameter_requiredNamed_type_namedType_int_defaultValue() {
var parseResult = parseStringWithErrors(r'''
class A {
final int a;
A({required this.a});
}
class B extends A {
B({required int super.a = 0});
}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.superFormalParameter('super.a');
assertParsedNodeText(node, r'''
SuperFormalParameter
requiredKeyword: required
type: NamedType
name: int
superKeyword: super
period: .
name: a
defaultClause: FormalParameterDefaultClause
separator: =
value: IntegerLiteral
literal: 0
''');
}
void test_superFormalParameter_requiredPositional_const_noType() {
var parseResult = parseStringWithErrors(r'''
class A {
final int a;
A(this.a);
}
class B extends A {
B(const super.a);
}
''');
parseResult.assertErrors([error(diag.extraneousModifier, 64, 5)]);
var node = parseResult.findNode.superFormalParameter('super.a');
assertParsedNodeText(node, r'''
SuperFormalParameter
constFinalOrVarKeyword: const
superKeyword: super
period: .
name: a
''');
}
void test_superFormalParameter_requiredPositional_covariant_noType() {
var parseResult = parseStringWithErrors(r'''
class A {
final int a;
A(this.a);
}
class B extends A {
B(covariant super.a);
}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.superFormalParameter('super.a');
assertParsedNodeText(node, r'''
SuperFormalParameter
covariantKeyword: covariant
superKeyword: super
period: .
name: a
''');
}
void test_superFormalParameter_requiredPositional_covariant_type() {
var parseResult = parseStringWithErrors(r'''
class A {
final int a;
A(this.a);
}
class B extends A {
B(covariant int super.a);
}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.superFormalParameter('super.a');
assertParsedNodeText(node, r'''
SuperFormalParameter
covariantKeyword: covariant
type: NamedType
name: int
superKeyword: super
period: .
name: a
''');
}
void
test_superFormalParameter_requiredPositional_functionTyped_nullable_typeParameters() {
var parseResult = parseStringWithErrors(r'''
class A {
final dynamic f;
A(this.f);
}
class B extends A {
B(super.f<T>()?);
}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.superFormalParameter('super.f');
assertParsedNodeText(node, r'''
SuperFormalParameter
superKeyword: super
period: .
name: f
functionTypedSuffix: FunctionTypedFormalParameterSuffix
typeParameters: TypeParameterList
leftBracket: <
typeParameters
TypeParameter
name: T
rightBracket: >
formalParameters: FormalParameterList
leftParenthesis: (
rightParenthesis: )
question: ?
''');
}
void
test_superFormalParameter_requiredPositional_functionTyped_returnType_void() {
var parseResult = parseStringWithErrors(r'''
class A {
final void Function() f;
A(this.f);
}
class B extends A {
B(void super.f());
}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.superFormalParameter('super.f');
assertParsedNodeText(node, r'''
SuperFormalParameter
type: NamedType
name: void
superKeyword: super
period: .
name: f
functionTypedSuffix: FunctionTypedFormalParameterSuffix
formalParameters: FormalParameterList
leftParenthesis: (
rightParenthesis: )
''');
}
void test_superFormalParameter_requiredPositional_noType() {
var parseResult = parseStringWithErrors(r'''
class A {
final int a;
A(this.a);
}
class B extends A {
B(super.a);
}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.superFormalParameter('super.a');
assertParsedNodeText(node, r'''
SuperFormalParameter
superKeyword: super
period: .
name: a
''');
}
void test_superFormalParameter_requiredPositional_type_namedType_int() {
var parseResult = parseStringWithErrors(r'''
class A {
final int a;
A(this.a);
}
class B extends A {
B(int super.a);
}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.superFormalParameter('super.a');
assertParsedNodeText(node, r'''
SuperFormalParameter
type: NamedType
name: int
superKeyword: super
period: .
name: a
''');
}
void test_superFormalParameter_topLevelFunction() {
var parseResult = parseStringWithErrors(r'''
void f(super.a) {}
''');
parseResult.assertNoErrors();
var node = parseResult.findNode.singleFormalParameter;
assertParsedNodeText(node, r'''
SuperFormalParameter
superKeyword: super
period: .
name: a
''');
}
}