Index: runtime/vm/parser.cc |
=================================================================== |
--- runtime/vm/parser.cc (revision 44751) |
+++ runtime/vm/parser.cc (working copy) |
@@ -11910,15 +11910,28 @@ |
"using '%s' in this context is invalid", |
type_name.ToCString()); |
} |
- if (!prefix.IsNull() && prefix.is_deferred_load() && !allow_deferred_type) { |
- ParseTypeArguments(ClassFinalizer::kIgnore); |
- return ClassFinalizer::NewFinalizedMalformedType( |
- Error::Handle(Z), // No previous error. |
- script_, |
- ident_pos, |
- "using deferred type '%s.%s' is invalid", |
- String::Handle(Z, prefix.name()).ToCString(), |
- type_name.ToCString()); |
+ if (!prefix.IsNull() && prefix.is_deferred_load()) { |
+ // If deferred prefixes are allowed but it is not yet loaded, |
+ // remember that this function depends on the prefix. |
+ if (allow_deferred_type && !prefix.is_loaded()) { |
+ ASSERT(parsed_function() != NULL); |
+ parsed_function()->AddDeferredPrefix(prefix); |
+ } |
+ // If the deferred prefixes are not allowed, or if the prefix |
+ // is not yet loaded, return a malformed type. Otherwise, handle |
+ // resolution below, as needed. |
+ if (!prefix.is_loaded() || !allow_deferred_type) { |
+ ParseTypeArguments(ClassFinalizer::kIgnore); |
+ return ClassFinalizer::NewFinalizedMalformedType( |
+ Error::Handle(Z), // No previous error. |
+ script_, |
+ ident_pos, |
+ !prefix.is_loaded() |
+ ? "deferred type '%s.%s' is not yet loaded" |
+ : "using deferred type '%s.%s' is invalid", |
+ String::Handle(Z, prefix.name()).ToCString(), |
+ type_name.ToCString()); |
+ } |
} |
} |
Object& type_class = Object::Handle(Z); |