| Index: runtime/vm/object.cc
|
| diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
|
| index faeb61fbabb9ba609f7f020af7b9c4398855e151..11f643c8a9524051de97d2b7dc97cf2b11ef6727 100644
|
| --- a/runtime/vm/object.cc
|
| +++ b/runtime/vm/object.cc
|
| @@ -6154,11 +6154,15 @@ bool Function::HasCompatibleParametersWith(const Function& other,
|
| Report::kError,
|
| Heap::kNew,
|
| "signature type '%s' of function '%s' is not a subtype of signature "
|
| - "type '%s' of function '%s'",
|
| + "type '%s' of function '%s' where\n%s%s",
|
| String::Handle(UserVisibleSignature()).ToCString(),
|
| String::Handle(UserVisibleName()).ToCString(),
|
| String::Handle(other.UserVisibleSignature()).ToCString(),
|
| - String::Handle(other.UserVisibleName()).ToCString());
|
| + String::Handle(other.UserVisibleName()).ToCString(),
|
| + String::Handle(FunctionType::Handle(
|
| + SignatureType()).EnumerateURIs()).ToCString(),
|
| + String::Handle(FunctionType::Handle(
|
| + other.SignatureType()).EnumerateURIs()).ToCString());
|
| return false;
|
| }
|
| // We should also check that if the other function explicitly specifies a
|
| @@ -7966,7 +7970,7 @@ RawString* TokenStream::GenerateSource(TokenPosition start_pos,
|
| }
|
| }
|
| if ((prev != Token::kINTERPOL_VAR) && (prev != Token::kINTERPOL_END)) {
|
| - literals.Add(Symbols::DoubleQuotes());
|
| + literals.Add(Symbols::DoubleQuote());
|
| }
|
| if (escape_characters) {
|
| literal = String::EscapeSpecialCharacters(literal);
|
| @@ -7975,7 +7979,7 @@ RawString* TokenStream::GenerateSource(TokenPosition start_pos,
|
| literals.Add(literal);
|
| }
|
| if ((next != Token::kINTERPOL_VAR) && (next != Token::kINTERPOL_START)) {
|
| - literals.Add(Symbols::DoubleQuotes());
|
| + literals.Add(Symbols::DoubleQuote());
|
| }
|
| } else if (curr == Token::kINTERPOL_VAR) {
|
| literals.Add(Symbols::Dollar());
|
| @@ -15328,8 +15332,10 @@ RawString* AbstractType::UserVisibleNameWithURI() const {
|
| Zone* zone = Thread::Current()->zone();
|
| GrowableHandlePtrArray<const String> pieces(zone, 3);
|
| pieces.Add(String::Handle(zone, BuildName(kUserVisibleName)));
|
| - pieces.Add(Symbols::SpaceWhereNewLine());
|
| - pieces.Add(String::Handle(zone, EnumerateURIs()));
|
| + if (!IsDynamicType() && !IsVoidType()) {
|
| + pieces.Add(Symbols::SpaceWhereNewLine());
|
| + pieces.Add(String::Handle(zone, EnumerateURIs()));
|
| + }
|
| return Symbols::FromConcatAll(pieces);
|
| }
|
|
|
| @@ -16050,7 +16056,7 @@ RawAbstractType* Type::Canonicalize(TrailPtr trail) const {
|
|
|
|
|
| RawString* Type::EnumerateURIs() const {
|
| - if (IsDynamicType()) {
|
| + if (IsDynamicType() || IsVoidType()) {
|
| return Symbols::Empty().raw();
|
| }
|
| Zone* zone = Thread::Current()->zone();
|
| @@ -16540,9 +16546,7 @@ RawString* FunctionType::EnumerateURIs() const {
|
| }
|
| // Handle result type last, since it appears last in the user visible name.
|
| type = sig_fun.result_type();
|
| - if (!type.IsDynamicType() && !type.IsVoidType()) {
|
| - pieces.Add(String::Handle(zone, type.EnumerateURIs()));
|
| - }
|
| + pieces.Add(String::Handle(zone, type.EnumerateURIs()));
|
| return Symbols::FromConcatAll(pieces);
|
| }
|
|
|
| @@ -16751,7 +16755,20 @@ RawAbstractType* TypeRef::Canonicalize(TrailPtr trail) const {
|
|
|
|
|
| RawString* TypeRef::EnumerateURIs() const {
|
| - return Symbols::Empty().raw(); // Break cycle.
|
| + const AbstractType& ref_type = AbstractType::Handle(type());
|
| + ASSERT(!ref_type.IsDynamicType() && !ref_type.IsVoidType());
|
| + Zone* zone = Thread::Current()->zone();
|
| + GrowableHandlePtrArray<const String> pieces(zone, 6);
|
| + const Class& cls = Class::Handle(zone, ref_type.type_class());
|
| + pieces.Add(Symbols::TwoSpaces());
|
| + pieces.Add(String::Handle(zone, cls.UserVisibleName()));
|
| + // Break cycle by not printing type arguments, but '<optimized out>' instead.
|
| + pieces.Add(Symbols::OptimizedOut());
|
| + pieces.Add(Symbols::SpaceIsFromSpace());
|
| + const Library& library = Library::Handle(zone, cls.library());
|
| + pieces.Add(String::Handle(zone, library.url()));
|
| + pieces.Add(Symbols::NewLine());
|
| + return Symbols::FromConcatAll(pieces);
|
| }
|
|
|
|
|
| @@ -16920,12 +16937,14 @@ bool TypeParameter::CheckBound(const AbstractType& bounded_type,
|
| Report::kMalboundedType,
|
| Heap::kNew,
|
| "type parameter '%s' of class '%s' must extend bound '%s', "
|
| - "but type argument '%s' is not a subtype of '%s'\n",
|
| + "but type argument '%s' is not a subtype of '%s' where\n%s%s",
|
| type_param_name.ToCString(),
|
| class_name.ToCString(),
|
| declared_bound_name.ToCString(),
|
| bounded_type_name.ToCString(),
|
| - upper_bound_name.ToCString());
|
| + upper_bound_name.ToCString(),
|
| + String::Handle(bounded_type.EnumerateURIs()).ToCString(),
|
| + String::Handle(upper_bound.EnumerateURIs()).ToCString());
|
| }
|
| }
|
| return false;
|
|
|