| // Copyright (c) 2023, 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/src/error/codes.dart'; |
| import 'package:test_reflective_loader/test_reflective_loader.dart'; |
| |
| import 'context_collection_resolution.dart'; |
| |
| main() { |
| defineReflectiveSuite(() { |
| defineReflectiveTests(FunctionDeclarationStatementResolutionTest); |
| }); |
| } |
| |
| @reflectiveTest |
| class FunctionDeclarationStatementResolutionTest |
| extends PubPackageResolutionTest { |
| test_generic() async { |
| await assertErrorsInCode( |
| r''' |
| void f() { |
| T g<T, U>(T a, U b) => a; |
| } |
| ''', |
| [error(WarningCode.UNUSED_ELEMENT, 15, 1)], |
| ); |
| |
| var node = findNode.singleFunctionDeclarationStatement; |
| assertResolvedNodeText(node, r''' |
| FunctionDeclarationStatement |
| functionDeclaration: FunctionDeclaration |
| returnType: NamedType |
| name: T |
| element2: T@17 |
| type: T |
| name: g |
| functionExpression: FunctionExpression |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: T |
| declaredElement: T@17 |
| defaultType: dynamic |
| TypeParameter |
| name: U |
| declaredElement: U@20 |
| defaultType: dynamic |
| rightBracket: > |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| parameter: SimpleFormalParameter |
| type: NamedType |
| name: T |
| element2: T@17 |
| type: T |
| name: a |
| declaredElement: g@15::@formalParameter::a |
| type: T |
| parameter: SimpleFormalParameter |
| type: NamedType |
| name: U |
| element2: U@20 |
| type: U |
| name: b |
| declaredElement: g@15::@formalParameter::b |
| type: U |
| rightParenthesis: ) |
| body: ExpressionFunctionBody |
| functionDefinition: => |
| expression: SimpleIdentifier |
| token: a |
| element: g@15::@parameter::a#element |
| staticType: T |
| semicolon: ; |
| declaredElement: g@15 |
| type: T Function<T, U>(T, U) |
| staticType: T Function<T, U>(T, U) |
| declaredElement: g@15 |
| type: T Function<T, U>(T, U) |
| '''); |
| } |
| |
| test_generic_fBounded() async { |
| await assertErrorsInCode( |
| r''' |
| void f() { |
| void g<T extends U, U, V extends U>(T x, U y, V z) {} |
| } |
| ''', |
| [error(WarningCode.UNUSED_ELEMENT, 18, 1)], |
| ); |
| |
| var node = findNode.singleFunctionDeclarationStatement; |
| assertResolvedNodeText(node, r''' |
| FunctionDeclarationStatement |
| functionDeclaration: FunctionDeclaration |
| returnType: NamedType |
| name: void |
| element2: <null> |
| type: void |
| name: g |
| functionExpression: FunctionExpression |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: T |
| extendsKeyword: extends |
| bound: NamedType |
| name: U |
| element2: U@33 |
| type: U |
| declaredElement: T@20 |
| defaultType: dynamic |
| TypeParameter |
| name: U |
| declaredElement: U@33 |
| defaultType: dynamic |
| TypeParameter |
| name: V |
| extendsKeyword: extends |
| bound: NamedType |
| name: U |
| element2: U@33 |
| type: U |
| declaredElement: V@36 |
| defaultType: dynamic |
| rightBracket: > |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| parameter: SimpleFormalParameter |
| type: NamedType |
| name: T |
| element2: T@20 |
| type: T |
| name: x |
| declaredElement: g@18::@formalParameter::x |
| type: T |
| parameter: SimpleFormalParameter |
| type: NamedType |
| name: U |
| element2: U@33 |
| type: U |
| name: y |
| declaredElement: g@18::@formalParameter::y |
| type: U |
| parameter: SimpleFormalParameter |
| type: NamedType |
| name: V |
| element2: V@36 |
| type: V |
| name: z |
| declaredElement: g@18::@formalParameter::z |
| type: V |
| rightParenthesis: ) |
| body: BlockFunctionBody |
| block: Block |
| leftBracket: { |
| rightBracket: } |
| declaredElement: g@18 |
| type: void Function<T extends U, U, V extends U>(T, U, V) |
| staticType: void Function<T extends U, U, V extends U>(T, U, V) |
| declaredElement: g@18 |
| type: void Function<T extends U, U, V extends U>(T, U, V) |
| '''); |
| } |
| |
| test_generic_formalParameters_optionalNamed() async { |
| await assertErrorsInCode( |
| r''' |
| void f() { |
| void g<T>({T? a}) {} |
| } |
| ''', |
| [error(WarningCode.UNUSED_ELEMENT, 18, 1)], |
| ); |
| |
| var node = findNode.singleFunctionDeclarationStatement; |
| assertResolvedNodeText(node, r''' |
| FunctionDeclarationStatement |
| functionDeclaration: FunctionDeclaration |
| returnType: NamedType |
| name: void |
| element2: <null> |
| type: void |
| name: g |
| functionExpression: FunctionExpression |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: T |
| declaredElement: T@20 |
| defaultType: dynamic |
| rightBracket: > |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| leftDelimiter: { |
| parameter: DefaultFormalParameter |
| parameter: SimpleFormalParameter |
| type: NamedType |
| name: T |
| question: ? |
| element2: T@20 |
| type: T? |
| name: a |
| declaredElement: g@18::@formalParameter::a |
| type: T? |
| declaredElement: g@18::@formalParameter::a |
| type: T? |
| rightDelimiter: } |
| rightParenthesis: ) |
| body: BlockFunctionBody |
| block: Block |
| leftBracket: { |
| rightBracket: } |
| declaredElement: g@18 |
| type: void Function<T>({T? a}) |
| staticType: void Function<T>({T? a}) |
| declaredElement: g@18 |
| type: void Function<T>({T? a}) |
| '''); |
| } |
| |
| test_generic_formalParameters_optionalPositional() async { |
| await assertErrorsInCode( |
| r''' |
| void f() { |
| void g<T>([T? a]) {} |
| } |
| ''', |
| [error(WarningCode.UNUSED_ELEMENT, 18, 1)], |
| ); |
| |
| var node = findNode.singleFunctionDeclarationStatement; |
| assertResolvedNodeText(node, r''' |
| FunctionDeclarationStatement |
| functionDeclaration: FunctionDeclaration |
| returnType: NamedType |
| name: void |
| element2: <null> |
| type: void |
| name: g |
| functionExpression: FunctionExpression |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: T |
| declaredElement: T@20 |
| defaultType: dynamic |
| rightBracket: > |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| leftDelimiter: [ |
| parameter: DefaultFormalParameter |
| parameter: SimpleFormalParameter |
| type: NamedType |
| name: T |
| question: ? |
| element2: T@20 |
| type: T? |
| name: a |
| declaredElement: g@18::@formalParameter::a |
| type: T? |
| declaredElement: g@18::@formalParameter::a |
| type: T? |
| rightDelimiter: ] |
| rightParenthesis: ) |
| body: BlockFunctionBody |
| block: Block |
| leftBracket: { |
| rightBracket: } |
| declaredElement: g@18 |
| type: void Function<T>([T?]) |
| staticType: void Function<T>([T?]) |
| declaredElement: g@18 |
| type: void Function<T>([T?]) |
| '''); |
| } |
| |
| test_generic_formalParameters_requiredNamed() async { |
| await assertErrorsInCode( |
| r''' |
| void f() { |
| void g<T>({required T? a}) {} |
| } |
| ''', |
| [error(WarningCode.UNUSED_ELEMENT, 18, 1)], |
| ); |
| |
| var node = findNode.singleFunctionDeclarationStatement; |
| assertResolvedNodeText(node, r''' |
| FunctionDeclarationStatement |
| functionDeclaration: FunctionDeclaration |
| returnType: NamedType |
| name: void |
| element2: <null> |
| type: void |
| name: g |
| functionExpression: FunctionExpression |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: T |
| declaredElement: T@20 |
| defaultType: dynamic |
| rightBracket: > |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| leftDelimiter: { |
| parameter: DefaultFormalParameter |
| parameter: SimpleFormalParameter |
| requiredKeyword: required |
| type: NamedType |
| name: T |
| question: ? |
| element2: T@20 |
| type: T? |
| name: a |
| declaredElement: g@18::@formalParameter::a |
| type: T? |
| declaredElement: g@18::@formalParameter::a |
| type: T? |
| rightDelimiter: } |
| rightParenthesis: ) |
| body: BlockFunctionBody |
| block: Block |
| leftBracket: { |
| rightBracket: } |
| declaredElement: g@18 |
| type: void Function<T>({required T? a}) |
| staticType: void Function<T>({required T? a}) |
| declaredElement: g@18 |
| type: void Function<T>({required T? a}) |
| '''); |
| } |
| |
| test_generic_formalParameters_requiredPositional() async { |
| await assertErrorsInCode( |
| r''' |
| void f() { |
| void g<T>(T a) {} |
| } |
| ''', |
| [error(WarningCode.UNUSED_ELEMENT, 18, 1)], |
| ); |
| |
| var node = findNode.singleFunctionDeclarationStatement; |
| assertResolvedNodeText(node, r''' |
| FunctionDeclarationStatement |
| functionDeclaration: FunctionDeclaration |
| returnType: NamedType |
| name: void |
| element2: <null> |
| type: void |
| name: g |
| functionExpression: FunctionExpression |
| typeParameters: TypeParameterList |
| leftBracket: < |
| typeParameters |
| TypeParameter |
| name: T |
| declaredElement: T@20 |
| defaultType: dynamic |
| rightBracket: > |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| parameter: SimpleFormalParameter |
| type: NamedType |
| name: T |
| element2: T@20 |
| type: T |
| name: a |
| declaredElement: g@18::@formalParameter::a |
| type: T |
| rightParenthesis: ) |
| body: BlockFunctionBody |
| block: Block |
| leftBracket: { |
| rightBracket: } |
| declaredElement: g@18 |
| type: void Function<T>(T) |
| staticType: void Function<T>(T) |
| declaredElement: g@18 |
| type: void Function<T>(T) |
| '''); |
| } |
| |
| test_returnType_implicit_blockBody() async { |
| await assertErrorsInCode( |
| r''' |
| void f() { |
| g() {} |
| } |
| ''', |
| [error(WarningCode.UNUSED_ELEMENT, 13, 1)], |
| ); |
| |
| var node = findNode.singleFunctionDeclarationStatement; |
| assertResolvedNodeText(node, r''' |
| FunctionDeclarationStatement |
| functionDeclaration: FunctionDeclaration |
| name: g |
| functionExpression: FunctionExpression |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| body: BlockFunctionBody |
| block: Block |
| leftBracket: { |
| rightBracket: } |
| declaredElement: g@13 |
| type: Null Function() |
| staticType: Null Function() |
| declaredElement: g@13 |
| type: Null Function() |
| '''); |
| } |
| |
| test_returnType_implicit_expressionBody() async { |
| await assertErrorsInCode( |
| r''' |
| void f() { |
| g() => 0; |
| } |
| ''', |
| [error(WarningCode.UNUSED_ELEMENT, 13, 1)], |
| ); |
| |
| var node = findNode.singleFunctionDeclarationStatement; |
| assertResolvedNodeText(node, r''' |
| FunctionDeclarationStatement |
| functionDeclaration: FunctionDeclaration |
| name: g |
| functionExpression: FunctionExpression |
| parameters: FormalParameterList |
| leftParenthesis: ( |
| rightParenthesis: ) |
| body: ExpressionFunctionBody |
| functionDefinition: => |
| expression: IntegerLiteral |
| literal: 0 |
| staticType: int |
| semicolon: ; |
| declaredElement: g@13 |
| type: int Function() |
| staticType: int Function() |
| declaredElement: g@13 |
| type: int Function() |
| '''); |
| } |
| } |