| Index: runtime/vm/parser.cc
|
| ===================================================================
|
| --- runtime/vm/parser.cc (revision 30381)
|
| +++ runtime/vm/parser.cc (working copy)
|
| @@ -3882,12 +3882,14 @@
|
| ConsumeToken(); // extends or =
|
| const intptr_t type_pos = TokenPos();
|
| super_type = ParseType(ClassFinalizer::kResolveTypeParameters);
|
| - if (super_type.IsMalformed() || super_type.IsDynamicType()) {
|
| + if (super_type.IsMalformedOrMalbounded()) {
|
| + ErrorMsg(Error::Handle(super_type.error()));
|
| + }
|
| + if (super_type.IsDynamicType()) {
|
| // Unlikely here, since super type is not resolved yet.
|
| ErrorMsg(type_pos,
|
| - "class '%s' may not extend %s",
|
| - class_name.ToCString(),
|
| - super_type.IsMalformed() ? "a malformed type" : "'dynamic'");
|
| + "class '%s' may not extend 'dynamic'",
|
| + class_name.ToCString());
|
| }
|
| if (super_type.IsTypeParameter()) {
|
| ErrorMsg(type_pos,
|
| @@ -7424,13 +7426,8 @@
|
| // Dst name argument.
|
| arguments->Add(new LiteralNode(type_pos, Symbols::Empty()));
|
| // Malformed type error or malbounded type error.
|
| - Error& error = Error::Handle();
|
| - if (type.IsMalformed()) {
|
| - error = type.malformed_error();
|
| - } else {
|
| - const bool is_malbounded = type.IsMalboundedWithError(&error);
|
| - ASSERT(is_malbounded);
|
| - }
|
| + const Error& error = Error::Handle(type.error());
|
| + ASSERT(!error.IsNull());
|
| arguments->Add(new LiteralNode(type_pos, String::ZoneHandle(
|
| Symbols::New(error.ToErrorCString()))));
|
| return MakeStaticCall(Symbols::TypeError(),
|
| @@ -7554,7 +7551,7 @@
|
| // In checked mode, the type may be malformed or malbounded.
|
| if (((op_kind == Token::kIS) || (op_kind == Token::kISNOT) ||
|
| (op_kind == Token::kAS)) &&
|
| - (type.IsMalformed() || type.IsMalbounded())) {
|
| + type.IsMalformedOrMalbounded()) {
|
| // Note that a type error is thrown even if the tested value is null
|
| // in a type test or in a type cast.
|
| return ThrowTypeError(type_pos, type);
|
| @@ -9790,29 +9787,16 @@
|
| ParseType(ClassFinalizer::kCanonicalizeWellFormed));
|
| // In case the type is malformed, throw a dynamic type error after finishing
|
| // parsing the instance creation expression.
|
| - if (!type.IsMalformed()) {
|
| - if (type.IsTypeParameter() || type.IsDynamicType()) {
|
| - // Replace the type with a malformed type.
|
| - type = ClassFinalizer::NewFinalizedMalformedType(
|
| - Error::Handle(), // No previous error.
|
| - script_,
|
| - type_pos,
|
| - "%s'%s' cannot be instantiated",
|
| - type.IsTypeParameter() ? "type parameter " : "",
|
| - type.IsTypeParameter() ?
|
| - String::Handle(type.UserVisibleName()).ToCString() : "dynamic");
|
| - } else if (FLAG_enable_type_checks || FLAG_error_on_bad_type) {
|
| - Error& bound_error = Error::Handle();
|
| - if (type.IsMalboundedWithError(&bound_error)) {
|
| - // Replace the type with a malformed type.
|
| - type = ClassFinalizer::NewFinalizedMalformedType(
|
| - bound_error,
|
| - script_,
|
| - type_pos,
|
| - "malbounded type '%s' cannot be instantiated",
|
| - String::Handle(type.UserVisibleName()).ToCString());
|
| - }
|
| - }
|
| + if (!type.IsMalformed() && (type.IsTypeParameter() || type.IsDynamicType())) {
|
| + // Replace the type with a malformed type.
|
| + type = ClassFinalizer::NewFinalizedMalformedType(
|
| + Error::Handle(), // No previous error.
|
| + script_,
|
| + type_pos,
|
| + "%s'%s' cannot be instantiated",
|
| + type.IsTypeParameter() ? "type parameter " : "",
|
| + type.IsTypeParameter() ?
|
| + String::Handle(type.UserVisibleName()).ToCString() : "dynamic");
|
| }
|
|
|
| // The grammar allows for an optional ('.' identifier)? after the type, which
|
| @@ -9830,11 +9814,11 @@
|
| intptr_t call_pos = TokenPos();
|
| ArgumentListNode* arguments = ParseActualParameters(NULL, is_const);
|
|
|
| - // Parsing is complete, so we can return a throw in case of a malformed type
|
| - // or report a compile-time error if the constructor is const.
|
| - if (type.IsMalformed()) {
|
| + // Parsing is complete, so we can return a throw in case of a malformed or
|
| + // malbounded type or report a compile-time error if the constructor is const.
|
| + if (type.IsMalformedOrMalbounded()) {
|
| if (is_const) {
|
| - const Error& error = Error::Handle(type.malformed_error());
|
| + const Error& error = Error::Handle(type.error());
|
| ErrorMsg(error);
|
| }
|
| return ThrowTypeError(type_pos, type);
|
| @@ -9875,8 +9859,7 @@
|
| "class '%s' has no constructor or factory named '%s'",
|
| String::Handle(type_class.Name()).ToCString(),
|
| external_constructor_name.ToCString());
|
| - const Error& error = Error::Handle(type.malformed_error());
|
| - ErrorMsg(error);
|
| + ErrorMsg(Error::Handle(type.error()));
|
| }
|
| return ThrowNoSuchMethodError(call_pos,
|
| type_class,
|
| @@ -9888,11 +9871,11 @@
|
| } else if (constructor.IsRedirectingFactory()) {
|
| ClassFinalizer::ResolveRedirectingFactory(type_class, constructor);
|
| Type& redirect_type = Type::Handle(constructor.RedirectionType());
|
| - Error& error = Error::Handle();
|
| - if (!redirect_type.IsMalformed() && !redirect_type.IsMalbounded() &&
|
| + if (!redirect_type.IsMalformedOrMalbounded() &&
|
| !redirect_type.IsInstantiated()) {
|
| // The type arguments of the redirection type are instantiated from the
|
| // type arguments of the parsed type of the 'new' or 'const' expression.
|
| + Error& error = Error::Handle();
|
| redirect_type ^= redirect_type.InstantiateFrom(type_arguments, &error);
|
| if (!error.IsNull()) {
|
| redirect_type = ClassFinalizer::NewFinalizedMalformedType(
|
| @@ -9901,16 +9884,11 @@
|
| call_pos,
|
| "redirecting factory type '%s' cannot be instantiated",
|
| String::Handle(redirect_type.UserVisibleName()).ToCString());
|
| - error = Error::null();
|
| }
|
| }
|
| - if (redirect_type.IsMalformed() ||
|
| - redirect_type.IsMalboundedWithError(&error)) {
|
| + if (redirect_type.IsMalformedOrMalbounded()) {
|
| if (is_const) {
|
| - if (redirect_type.IsMalformed()) {
|
| - error = type.malformed_error();
|
| - }
|
| - ErrorMsg(error);
|
| + ErrorMsg(Error::Handle(redirect_type.error()));
|
| }
|
| return ThrowTypeError(redirect_type.token_pos(), redirect_type);
|
| }
|
| @@ -9975,15 +9953,11 @@
|
| &constructor);
|
| }
|
|
|
| - // Return a throw in case of a malformed type or report a compile-time error
|
| - // if the constructor is const.
|
| - Error& error = Error::Handle();
|
| - if (type.IsMalformed() || type.IsMalboundedWithError(&error)) {
|
| + // Return a throw in case of a malformed or malbounded type or report a
|
| + // compile-time error if the constructor is const.
|
| + if (type.IsMalformedOrMalbounded()) {
|
| if (is_const) {
|
| - if (type.IsMalformed()) {
|
| - error = type.malformed_error();
|
| - }
|
| - ErrorMsg(error);
|
| + ErrorMsg(Error::Handle(type.error()));
|
| }
|
| return ThrowTypeError(type_pos, type);
|
| }
|
|
|