blob: fe7ab3e6f18010a12ea47edbdcd9f349fff04e06 [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/src/dart/error/syntactic_errors.dart';
import 'package:analyzer/src/error/codes.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'context_collection_resolution.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(FunctionDeclarationResolutionTest);
});
}
@reflectiveTest
class FunctionDeclarationResolutionTest extends PubPackageResolutionTest {
test_asyncGenerator_blockBody_return() async {
await assertErrorsInCode('''
import 'dart:async';
Stream<int> f() async* {
return 0;
}
''', [
error(CompileTimeErrorCode.RETURN_IN_GENERATOR, 49, 6),
]);
final node = findNode.singleFunctionDeclaration;
assertResolvedNodeText(node, r'''
FunctionDeclaration
returnType: NamedType
name: Stream
typeArguments: TypeArgumentList
leftBracket: <
arguments
NamedType
name: int
element: dart:core::@class::int
type: int
rightBracket: >
element: dart:async::@class::Stream
type: Stream<int>
name: f
functionExpression: FunctionExpression
parameters: FormalParameterList
leftParenthesis: (
rightParenthesis: )
body: BlockFunctionBody
keyword: async
star: *
block: Block
leftBracket: {
statements
ReturnStatement
returnKeyword: return
expression: IntegerLiteral
literal: 0
staticType: int
semicolon: ;
rightBracket: }
declaredElement: self::@function::f
type: Stream<int> Function()
staticType: Stream<int> Function()
declaredElement: self::@function::f
type: Stream<int> Function()
''');
}
test_asyncGenerator_expressionBody() async {
await assertErrorsInCode('''
import 'dart:async';
Stream<int> f() async* => 0;
''', [
error(CompileTimeErrorCode.RETURN_IN_GENERATOR, 45, 2),
]);
final node = findNode.singleFunctionDeclaration;
assertResolvedNodeText(node, r'''
FunctionDeclaration
returnType: NamedType
name: Stream
typeArguments: TypeArgumentList
leftBracket: <
arguments
NamedType
name: int
element: dart:core::@class::int
type: int
rightBracket: >
element: dart:async::@class::Stream
type: Stream<int>
name: f
functionExpression: FunctionExpression
parameters: FormalParameterList
leftParenthesis: (
rightParenthesis: )
body: ExpressionFunctionBody
keyword: async
star: *
functionDefinition: =>
expression: IntegerLiteral
literal: 0
staticType: int
semicolon: ;
declaredElement: self::@function::f
type: Stream<int> Function()
staticType: Stream<int> Function()
declaredElement: self::@function::f
type: Stream<int> Function()
''');
}
test_formalParameterScope_defaultValue() async {
await assertNoErrorsInCode('''
const foo = 0;
void bar([int foo = foo + 1]) {
}
''');
assertElement(
findNode.simple('foo + 1'),
findElement.topGet('foo'),
);
}
test_formalParameterScope_type() async {
await assertNoErrorsInCode('''
class a {}
void bar(a a) {
a;
}
''');
assertElement(
findNode.namedType('a a'),
findElement.class_('a'),
);
assertElement(
findNode.simple('a;'),
findElement.parameter('a'),
);
}
test_getter_formalParameters() async {
await assertErrorsInCode('''
int get foo(double a) => 0;
''', [
error(ParserErrorCode.GETTER_WITH_PARAMETERS, 11, 1),
]);
final node = findNode.singleFunctionDeclaration;
assertResolvedNodeText(node, r'''
FunctionDeclaration
returnType: NamedType
name: int
element: dart:core::@class::int
type: int
propertyKeyword: get
name: foo
functionExpression: FunctionExpression
parameters: FormalParameterList
leftParenthesis: (
parameter: SimpleFormalParameter
type: NamedType
name: double
element: dart:core::@class::double
type: double
name: a
declaredElement: self::@getter::foo::@parameter::a
type: double
rightParenthesis: )
body: ExpressionFunctionBody
functionDefinition: =>
expression: IntegerLiteral
literal: 0
staticType: int
semicolon: ;
declaredElement: self::@getter::foo
type: int Function(double)
staticType: int Function(double)
declaredElement: self::@getter::foo
type: int Function(double)
''');
}
test_syncGenerator_blockBody_return() async {
await assertErrorsInCode('''
Iterable<int> f() sync* {
return 0;
}
''', [
error(CompileTimeErrorCode.RETURN_IN_GENERATOR, 28, 6),
]);
final node = findNode.singleFunctionDeclaration;
assertResolvedNodeText(node, r'''
FunctionDeclaration
returnType: NamedType
name: Iterable
typeArguments: TypeArgumentList
leftBracket: <
arguments
NamedType
name: int
element: dart:core::@class::int
type: int
rightBracket: >
element: dart:core::@class::Iterable
type: Iterable<int>
name: f
functionExpression: FunctionExpression
parameters: FormalParameterList
leftParenthesis: (
rightParenthesis: )
body: BlockFunctionBody
keyword: sync
star: *
block: Block
leftBracket: {
statements
ReturnStatement
returnKeyword: return
expression: IntegerLiteral
literal: 0
staticType: int
semicolon: ;
rightBracket: }
declaredElement: self::@function::f
type: Iterable<int> Function()
staticType: Iterable<int> Function()
declaredElement: self::@function::f
type: Iterable<int> Function()
''');
}
test_syncGenerator_expressionBody() async {
await assertErrorsInCode('''
Iterable<int> f() sync* => 0;
''', [
error(CompileTimeErrorCode.RETURN_IN_GENERATOR, 24, 2),
]);
final node = findNode.singleFunctionDeclaration;
assertResolvedNodeText(node, r'''
FunctionDeclaration
returnType: NamedType
name: Iterable
typeArguments: TypeArgumentList
leftBracket: <
arguments
NamedType
name: int
element: dart:core::@class::int
type: int
rightBracket: >
element: dart:core::@class::Iterable
type: Iterable<int>
name: f
functionExpression: FunctionExpression
parameters: FormalParameterList
leftParenthesis: (
rightParenthesis: )
body: ExpressionFunctionBody
keyword: sync
star: *
functionDefinition: =>
expression: IntegerLiteral
literal: 0
staticType: int
semicolon: ;
declaredElement: self::@function::f
type: Iterable<int> Function()
staticType: Iterable<int> Function()
declaredElement: self::@function::f
type: Iterable<int> Function()
''');
}
}