Index: pkg/analyzer/test/generated/resolver_test.dart |
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart |
index e07053da689a29c39eb0d6bb72d028d2f4538a55..cc66250e2e165eae199f5707287465a0a8334c3f 100644 |
--- a/pkg/analyzer/test/generated/resolver_test.dart |
+++ b/pkg/analyzer/test/generated/resolver_test.dart |
@@ -13376,26 +13376,11 @@ class TypeResolverVisitorTest extends EngineTestCase { |
_listener.assertNoErrors(); |
} |
- void fail_visitFunctionDeclaration() { |
- fail("Not yet tested"); |
- _listener.assertNoErrors(); |
- } |
- |
void fail_visitFunctionTypeAlias() { |
fail("Not yet tested"); |
_listener.assertNoErrors(); |
} |
- void fail_visitFunctionTypedFormalParameter() { |
- fail("Not yet tested"); |
- _listener.assertNoErrors(); |
- } |
- |
- void fail_visitMethodDeclaration() { |
- fail("Not yet tested"); |
- _listener.assertNoErrors(); |
- } |
- |
void fail_visitVariableDeclaration() { |
fail("Not yet tested"); |
ClassElement type = ElementFactory.classElement2("A"); |
@@ -13698,6 +13683,148 @@ class TypeResolverVisitorTest extends EngineTestCase { |
_listener.assertNoErrors(); |
} |
+ void test_visitFunctionDeclaration() { |
+ // R f(P p) {} |
+ // class R {} |
+ // class P {} |
+ ClassElement elementR = ElementFactory.classElement2('R'); |
+ ClassElement elementP = ElementFactory.classElement2('P'); |
+ FunctionElement elementF = ElementFactory.functionElement('f'); |
+ FunctionDeclaration declaration = AstFactory.functionDeclaration( |
+ AstFactory.typeName4('R'), null, 'f', AstFactory.functionExpression2( |
+ AstFactory.formalParameterList([ |
+ AstFactory.simpleFormalParameter4(AstFactory.typeName4('P'), 'p') |
+ ]), null)); |
+ declaration.name.staticElement = elementF; |
+ _resolveNode(declaration, [elementR, elementP]); |
+ expect(declaration.returnType.type, elementR.type); |
+ SimpleFormalParameter parameter = |
+ declaration.functionExpression.parameters.parameters[0]; |
+ expect(parameter.type.type, elementP.type); |
+ _listener.assertNoErrors(); |
+ } |
+ |
+ void test_visitFunctionDeclaration_typeParameter() { |
+ // E f<E>(E e) {} |
+ TypeParameterElement elementE = ElementFactory.typeParameterElement('E'); |
+ FunctionElementImpl elementF = ElementFactory.functionElement('f'); |
+ elementF.typeParameters = <TypeParameterElement>[elementE]; |
+ FunctionDeclaration declaration = AstFactory.functionDeclaration( |
+ AstFactory.typeName4('E'), null, 'f', AstFactory.functionExpression2( |
+ AstFactory.formalParameterList([ |
+ AstFactory.simpleFormalParameter4(AstFactory.typeName4('E'), 'e') |
+ ]), null)); |
+ declaration.name.staticElement = elementF; |
+ _resolveNode(declaration, []); |
+ expect(declaration.returnType.type, elementE.type); |
+ SimpleFormalParameter parameter = |
+ declaration.functionExpression.parameters.parameters[0]; |
+ expect(parameter.type.type, elementE.type); |
+ _listener.assertNoErrors(); |
+ } |
+ |
+ void test_visitFunctionTypedFormalParameter() { |
+ // R f(R g(P p)) {} |
+ // class R {} |
+ // class P {} |
+ ClassElement elementR = ElementFactory.classElement2('R'); |
+ ClassElement elementP = ElementFactory.classElement2('P'); |
+ FunctionElement elementF = ElementFactory.functionElement('f'); |
+ ParameterElementImpl requiredParameter = |
+ ElementFactory.requiredParameter('p'); |
+ FunctionTypedFormalParameter parameterDeclaration = AstFactory |
+ .functionTypedFormalParameter(AstFactory.typeName4('R'), 'g', [ |
+ AstFactory.simpleFormalParameter4(AstFactory.typeName4('P'), 'p') |
+ ]); |
+ parameterDeclaration.identifier.staticElement = requiredParameter; |
+ FunctionDeclaration declaration = AstFactory.functionDeclaration( |
+ AstFactory.typeName4('R'), null, 'f', AstFactory.functionExpression2( |
+ AstFactory.formalParameterList([parameterDeclaration]), null)); |
+ declaration.name.staticElement = elementF; |
+ _resolveNode(declaration, [elementR, elementP]); |
+ expect(declaration.returnType.type, elementR.type); |
+ FunctionTypedFormalParameter parameter = |
+ declaration.functionExpression.parameters.parameters[0]; |
+ expect(parameter.returnType.type, elementR.type); |
+ SimpleFormalParameter innerParameter = parameter.parameters.parameters[0]; |
+ expect(innerParameter.type.type, elementP.type); |
+ _listener.assertNoErrors(); |
+ } |
+ |
+ void test_visitFunctionTypedFormalParameter_typeParameter() { |
+ // R f(R g<E>(E e)) {} |
+ // class R {} |
+ ClassElement elementR = ElementFactory.classElement2('R'); |
+ TypeParameterElement elementE = ElementFactory.typeParameterElement('E'); |
+ FunctionElement elementF = ElementFactory.functionElement('f'); |
+ ParameterElementImpl requiredParameter = |
+ ElementFactory.requiredParameter('g'); |
+ requiredParameter.typeParameters = <TypeParameterElement>[elementE]; |
+ FunctionTypedFormalParameter parameterDeclaration = AstFactory |
+ .functionTypedFormalParameter(AstFactory.typeName4('R'), 'g', [ |
+ AstFactory.simpleFormalParameter4(AstFactory.typeName4('E'), 'e') |
+ ]); |
+ parameterDeclaration.identifier.staticElement = requiredParameter; |
+ FunctionDeclaration declaration = AstFactory.functionDeclaration( |
+ AstFactory.typeName4('R'), null, 'f', AstFactory.functionExpression2( |
+ AstFactory.formalParameterList([parameterDeclaration]), null)); |
+ declaration.name.staticElement = elementF; |
+ _resolveNode(declaration, [elementR]); |
+ expect(declaration.returnType.type, elementR.type); |
+ FunctionTypedFormalParameter parameter = |
+ declaration.functionExpression.parameters.parameters[0]; |
+ expect(parameter.returnType.type, elementR.type); |
+ SimpleFormalParameter innerParameter = parameter.parameters.parameters[0]; |
+ expect(innerParameter.type.type, elementE.type); |
+ _listener.assertNoErrors(); |
+ } |
+ |
+ void test_visitMethodDeclaration() { |
+ // class A { |
+ // R m(P p) {} |
+ // } |
+ // class R {} |
+ // class P {} |
+ ClassElementImpl elementA = ElementFactory.classElement2('A'); |
+ ClassElement elementR = ElementFactory.classElement2('R'); |
+ ClassElement elementP = ElementFactory.classElement2('P'); |
+ MethodElement elementM = ElementFactory.methodElement('m', null); |
+ elementA.methods = <MethodElement>[elementM]; |
+ MethodDeclaration declaration = AstFactory.methodDeclaration(null, |
+ AstFactory.typeName4('R'), null, null, AstFactory.identifier3('m'), |
+ AstFactory.formalParameterList([ |
+ AstFactory.simpleFormalParameter4(AstFactory.typeName4('P'), 'p') |
+ ])); |
+ declaration.name.staticElement = elementM; |
+ _resolveNode(declaration, [elementA, elementR, elementP]); |
+ expect(declaration.returnType.type, elementR.type); |
+ SimpleFormalParameter parameter = declaration.parameters.parameters[0]; |
+ expect(parameter.type.type, elementP.type); |
+ _listener.assertNoErrors(); |
+ } |
+ |
+ void test_visitMethodDeclaration_typeParameter() { |
+ // class A { |
+ // E m<E>(E e) {} |
+ // } |
+ ClassElementImpl elementA = ElementFactory.classElement2('A'); |
+ TypeParameterElement elementE = ElementFactory.typeParameterElement('E'); |
+ MethodElementImpl elementM = ElementFactory.methodElement('m', null); |
+ elementM.typeParameters = <TypeParameterElement>[elementE]; |
+ elementA.methods = <MethodElement>[elementM]; |
+ MethodDeclaration declaration = AstFactory.methodDeclaration(null, |
+ AstFactory.typeName4('E'), null, null, AstFactory.identifier3('m'), |
+ AstFactory.formalParameterList([ |
+ AstFactory.simpleFormalParameter4(AstFactory.typeName4('E'), 'e') |
+ ])); |
+ declaration.name.staticElement = elementM; |
+ _resolveNode(declaration, [elementA]); |
+ expect(declaration.returnType.type, elementE.type); |
+ SimpleFormalParameter parameter = declaration.parameters.parameters[0]; |
+ expect(parameter.type.type, elementE.type); |
+ _listener.assertNoErrors(); |
+ } |
+ |
void test_visitSimpleFormalParameter_noType() { |
// p |
FormalParameter node = AstFactory.simpleFormalParameter3("p"); |