Chromium Code Reviews| Index: pkg/analyzer/lib/src/dart/element/type.dart |
| diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart |
| index 1cfdbf8d15b30aee62cbbe56cb56e53a8437e83d..adb40bd96769adb4c784052628953aa5cf79bde9 100644 |
| --- a/pkg/analyzer/lib/src/dart/element/type.dart |
| +++ b/pkg/analyzer/lib/src/dart/element/type.dart |
| @@ -454,13 +454,41 @@ class FunctionTypeImpl extends TypeImpl implements FunctionType { |
| @override |
| String get displayName { |
| String name = this.name; |
| + |
| + // Function types have an empty name when they are defined implicitly by |
| + // either a closure or as part of a parameter declaration. |
| if (name == null || name.length == 0) { |
| - // Function types have an empty name when they are defined implicitly by |
| - // either a closure or as part of a parameter declaration. |
| StringBuffer buffer = new StringBuffer(); |
| appendTo(buffer, new Set.identity()); |
| + return buffer.toString(); |
| + } |
| + |
| + List<DartType> typeArguments = this.typeArguments; |
| + |
| + bool allDynamic = true; |
|
Brian Wilkerson
2017/03/20 20:13:47
Just an idea: this block of code would make a nice
|
| + for (DartType type in typeArguments) { |
| + if (type != null && !type.isDynamic) { |
| + allDynamic = false; |
| + break; |
| + } |
| + } |
| + |
| + // If there is at least one non-dynamic type, then list them out. |
| + if (!allDynamic) { |
| + StringBuffer buffer = new StringBuffer(); |
| + buffer.write(name); |
| + buffer.write("<"); |
| + for (int i = 0; i < typeArguments.length; i++) { |
| + if (i != 0) { |
| + buffer.write(", "); |
| + } |
| + DartType typeArg = typeArguments[i]; |
| + buffer.write(typeArg.displayName); |
| + } |
| + buffer.write(">"); |
| name = buffer.toString(); |
| } |
| + |
| return name; |
| } |