Resolve bounds for type parameters of generic type alias.

R=brianwilkerson@google.com

Change-Id: Iff270adcd55d0a8c3a0bfaeed2c0741ccb1a1c77
Reviewed-on: https://dart-review.googlesource.com/76440
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 0a1ff71..069f66e 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -8285,6 +8285,11 @@
             unitMember.typeParameters,
             () => new FunctionTypeScope(
                 libraryScope, unitMember.declaredElement));
+      } else if (unitMember is GenericTypeAlias) {
+        _resolveTypeParameters(
+            unitMember.typeParameters,
+            () => new FunctionTypeScope(
+                libraryScope, unitMember.declaredElement));
       }
     }
   }
diff --git a/pkg/analyzer/test/src/dart/resolution/find_element.dart b/pkg/analyzer/test/src/dart/resolution/find_element.dart
index 1cd1173..dff0500 100644
--- a/pkg/analyzer/test/src/dart/resolution/find_element.dart
+++ b/pkg/analyzer/test/src/dart/resolution/find_element.dart
@@ -99,6 +99,15 @@
     fail('Not found top-level function: $name');
   }
 
+  GenericTypeAliasElement genericTypeAlias(String name) {
+    for (var element in unitElement.functionTypeAliases) {
+      if (element is GenericTypeAliasElement && element.name == name) {
+        return element;
+      }
+    }
+    fail('Not found generic type alias: $name');
+  }
+
   PropertyAccessorElement getter(String name, {String className}) {
     for (var class_ in unitElement.types) {
       if (className != null && class_.name != className) {
diff --git a/pkg/analyzer/test/src/dart/resolution/generic_type_alias_test.dart b/pkg/analyzer/test/src/dart/resolution/generic_type_alias_test.dart
new file mode 100644
index 0000000..7f24421a
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/resolution/generic_type_alias_test.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2018, 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:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'driver_resolution.dart';
+import 'resolution.dart';
+import 'task_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(GenericTypeAliasDriverResolutionTest);
+    defineReflectiveTests(GenericTypeAliasTaskResolutionTest);
+  });
+}
+
+@reflectiveTest
+class GenericTypeAliasDriverResolutionTest extends DriverResolutionTest
+    with GenericTypeAliasResolutionMixin {}
+
+abstract class GenericTypeAliasResolutionMixin implements ResolutionTest {
+  test_typeParameters() async {
+    addTestFile(r'''
+class A {}
+
+class B {}
+
+typedef F<T extends A> = B<T> Function<U extends B>(T a, U b);
+''');
+    await resolveTestFile();
+
+    var f = findElement.genericTypeAlias('F');
+    expect(f.typeParameters, hasLength(1));
+
+    var t = f.typeParameters[0];
+    expect(t.name, 'T');
+    assertElementTypeString(t.bound, 'A');
+
+    var ff = f.function;
+    expect(ff.typeParameters, hasLength(1));
+
+    var u = ff.typeParameters[0];
+    expect(u.name, 'U');
+    assertElementTypeString(u.bound, 'B');
+  }
+}
+
+@reflectiveTest
+class GenericTypeAliasTaskResolutionTest extends TaskResolutionTest
+    with GenericTypeAliasResolutionMixin {}
diff --git a/pkg/analyzer/test/src/dart/resolution/test_all.dart b/pkg/analyzer/test/src/dart/resolution/test_all.dart
index 5c385a3..744c8d9 100644
--- a/pkg/analyzer/test/src/dart/resolution/test_all.dart
+++ b/pkg/analyzer/test/src/dart/resolution/test_all.dart
@@ -8,6 +8,7 @@
 import 'class_test.dart' as class_test;
 import 'enum_test.dart' as enum_test;
 import 'for_in_test.dart' as for_in_test;
+import 'generic_type_alias_test.dart' as generic_type_alias_test;
 import 'import_prefix_test.dart' as import_prefix_test;
 import 'instance_creation_test.dart' as instance_creation_test;
 import 'instance_member_inference_class_test.dart'
@@ -23,6 +24,7 @@
     class_test.main();
     enum_test.main();
     for_in_test.main();
+    generic_type_alias_test.main();
     import_prefix_test.main();
     instance_creation_test.main();
     instance_member_inference_class_test.main();