Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(235)

Unified Diff: runtime/vm/parser.cc

Issue 9395017: Simplify type resolution in parser. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/parser.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/parser.cc
===================================================================
--- runtime/vm/parser.cc (revision 4232)
+++ runtime/vm/parser.cc (working copy)
@@ -1959,7 +1959,7 @@
ErrorMsg(method->name_pos, "constructor cannot be 'static'");
}
if (method->IsConstructor() && method->has_const) {
- Class& cls = Class::ZoneHandle(LookupClass(members->class_name()));
+ Class& cls = Class::ZoneHandle(library_.LookupClass(members->class_name()));
cls.set_is_const();
}
if (method->has_abstract && members->is_interface()) {
@@ -2328,8 +2328,14 @@
member.name_pos = factory_name.ident_pos;
member.name = factory_name.ident; // Unqualified identifier.
// The class of the factory result type is specified by the factory name.
+ LibraryPrefix& lib_prefix = LibraryPrefix::Handle();
+ if (factory_name.lib_prefix != NULL) {
+ lib_prefix = factory_name.lib_prefix->raw();
+ }
const Object& result_type_class = Object::Handle(
- LookupTypeClass(factory_name, kCanResolve));
+ UnresolvedClass::New(lib_prefix,
+ *factory_name.ident,
+ factory_name.ident_pos));
// The type arguments of the result type are set during finalization.
member.type = &Type::ZoneHandle(Type::New(result_type_class,
TypeArguments::Handle(),
@@ -2690,7 +2696,8 @@
}
ASSERT(signature_function.signature_class() == signature_class.raw());
// Lookup the class by its alias name and report an error if it exists.
- Class& function_type_alias = Class::ZoneHandle(LookupClass(*alias_name));
+ Class& function_type_alias =
+ Class::ZoneHandle(library_.LookupClass(*alias_name));
if (function_type_alias.IsNull()) {
// Create the function type alias, but share the signature function of the
// canonical signature class.
@@ -4533,11 +4540,6 @@
}
-RawClass* Parser::LookupClass(const String& class_name) {
- return library_.LookupClass(class_name);
-}
-
-
// Calling VM-internal helpers, uses implementation core library.
AstNode* Parser::MakeStaticCall(const char* class_name,
const char* function_name,
@@ -6153,19 +6155,18 @@
AbstractType* type) {
ASSERT((type_resolution == kCanResolve) || (type_resolution == kMustResolve));
ASSERT(type != NULL);
+ if (type->IsResolved()) {
+ return;
+ }
// Resolve class.
if (!type->HasResolvedTypeClass()) {
const UnresolvedClass& unresolved_class =
UnresolvedClass::Handle(type->unresolved_class());
const String& unresolved_class_name =
String::Handle(unresolved_class.ident());
- // First resolve library prefix if any.
Library& lib = Library::Handle();
if (unresolved_class.library_prefix() == LibraryPrefix::null()) {
- if (scope_class.IsNull()) {
- lib = library_.raw();
- } else {
- lib = scope_class.library();
+ if (!scope_class.IsNull()) {
// First check if the type is a type parameter of the given scope class.
const TypeParameter& type_parameter = TypeParameter::Handle(
scope_class.LookupTypeParameter(unresolved_class_name,
@@ -6187,21 +6188,25 @@
LibraryPrefix::Handle(unresolved_class.library_prefix());
lib = lib_prefix.library();
}
- if (!lib.IsNull()) {
- const Class& resolved_type_class = Class::Handle(
- lib.LookupLocalClass(unresolved_class_name));
- if (!resolved_type_class.IsNull()) {
- Object& type_class = Object::Handle(resolved_type_class.raw());
- ASSERT(type->IsType());
- // Replace unresolved class with resolved type class.
- Type& parameterized_type = Type::Handle();
- parameterized_type ^= type->raw();
- parameterized_type.set_type_class(type_class);
- } else if (type_resolution == kMustResolve) {
- ErrorMsg(type->token_index(), "type '%s' is not loaded",
- String::Handle(type->Name()).ToCString());
- }
+ Class& resolved_type_class = Class::Handle();
+ if (lib.IsNull()) {
+ // Global lookup in current library.
+ resolved_type_class = library_.LookupClass(unresolved_class_name);
+ } else {
+ // Local lookup in imported library.
+ resolved_type_class = lib.LookupLocalClass(unresolved_class_name);
}
+ if (!resolved_type_class.IsNull()) {
+ Object& type_class = Object::Handle(resolved_type_class.raw());
+ ASSERT(type->IsType());
+ // Replace unresolved class with resolved type class.
+ Type& parameterized_type = Type::Handle();
+ parameterized_type ^= type->raw();
+ parameterized_type.set_type_class(type_class);
+ } else if (type_resolution == kMustResolve) {
+ ErrorMsg(type->token_index(), "type '%s' is not loaded",
+ String::Handle(type->Name()).ToCString());
+ }
}
// Resolve type arguments, if any.
const AbstractTypeArguments& arguments =
@@ -6219,39 +6224,6 @@
}
-// Return class for type name. If the name cannot be resolved (yet), give an
-// error (if type_resolution == kMustResolve) or return the unresolved name.
-RawObject* Parser::LookupTypeClass(const QualIdent& type_name,
- TypeResolution type_resolution) {
- ASSERT(type_name.ident != NULL);
- ASSERT((type_resolution == kCanResolve) || (type_resolution == kMustResolve));
- Class& type_class = Class::Handle();
- if (type_name.lib_prefix != NULL) {
- Library& lib = Library::Handle(type_name.lib_prefix->library());
- type_class = lib.LookupLocalClass(*type_name.ident);
- } else {
- type_class = LookupClass(*type_name.ident);
- }
- if (!type_class.IsNull()) {
- return type_class.raw();
- }
- // Type name could not be resolved (yet).
- if (type_resolution == kMustResolve) {
- ErrorMsg(type_name.ident_pos, "type '%s' is not loaded",
- type_name.ident->ToCString());
- return Object::null_class();
- }
- // We have an unresolved name, create an UnresolvedClass object for this case.
- LibraryPrefix& lib_prefix = LibraryPrefix::Handle();
- if (type_name.lib_prefix != NULL) {
- lib_prefix = type_name.lib_prefix->raw();
- }
- return UnresolvedClass::New(lib_prefix,
- *type_name.ident,
- type_name.ident_pos);
-}
-
-
LocalVariable* Parser::LookupLocalScope(const String& ident) {
if (current_block_ == NULL) {
return NULL;
@@ -6662,10 +6634,8 @@
}
-// Parses type = [ident "."] ident ["<" type { "," type } ">"].
-// Returns the class object if the type can be resolved. Otherwise, either give
-// an error if type resolution was required, or return the unresolved name as a
-// string object.
+// Parses type = [ident "."] ident ["<" type { "," type } ">"] and resolve it
+// according to the given type_resolution.
RawAbstractType* Parser::ParseType(TypeResolution type_resolution) {
if (CurrentToken() != Token::kIDENT) {
ErrorMsg("type name expected");
@@ -6683,11 +6653,9 @@
type_name.ident->ToCString());
}
}
- Class& scope_class = Class::Handle();
Object& type_class = Object::Handle();
- if (type_resolution == kIgnore) {
- // Leave type_class as null.
- } else if (type_resolution == kDoNotResolve) {
+ // Leave type_class as null if type_resolution equals kIgnore.
+ if (type_resolution != kIgnore) {
LibraryPrefix& lib_prefix = LibraryPrefix::Handle();
if (type_name.lib_prefix != NULL) {
lib_prefix = type_name.lib_prefix->raw();
@@ -6695,45 +6663,20 @@
type_class = UnresolvedClass::New(lib_prefix,
*type_name.ident,
type_name.ident_pos);
- } else {
- // TODO(regis): Use ResolveTypeFromClass().
- ASSERT((type_resolution == kCanResolve) ||
- (type_resolution == kMustResolve));
- scope_class = TypeParametersScopeClass();
- if (!scope_class.IsNull()) {
- if (type_name.lib_prefix == NULL) {
- // Check if ident is a type parameter in scope.
- TypeParameter& type_parameter = TypeParameter::Handle(
- scope_class.LookupTypeParameter(*type_name.ident,
- type_name.ident_pos));
- if (!type_parameter.IsNull()) {
- if (CurrentToken() == Token::kLT) {
- // A type parameter cannot be parameterized.
- ErrorMsg(type_parameter.token_index(),
- "type parameter '%s' cannot be parameterized",
- String::Handle(type_parameter.Name()).ToCString());
- }
- if (type_resolution == kMustResolve) {
- type_parameter ^=
- ClassFinalizer::FinalizeType(current_class(), type_parameter);
- }
- return type_parameter.raw();
- }
- }
- }
- // Try to resolve the type class.
- type_class = LookupTypeClass(type_name, type_resolution);
}
AbstractTypeArguments& type_arguments =
AbstractTypeArguments::Handle(ParseTypeArguments(type_resolution));
if (type_resolution == kIgnore) {
return Type::DynamicType();
}
- Type& type = Type::Handle(
+ AbstractType& type = AbstractType::Handle(
Type::New(type_class, type_arguments, type_name.ident_pos));
- if (type_resolution == kMustResolve) {
- ASSERT(type_class.IsClass()); // Must be resolved.
- type ^= ClassFinalizer::FinalizeType(current_class(), type);
+ if ((type_resolution == kCanResolve) || (type_resolution == kMustResolve)) {
+ const Class& scope_class = Class::Handle(TypeParametersScopeClass());
+ ResolveTypeFromClass(scope_class, type_resolution, &type);
+ if (type_resolution == kMustResolve) {
+ type ^= ClassFinalizer::FinalizeType(current_class(), type);
+ }
}
return type.raw();
}
« no previous file with comments | « runtime/vm/parser.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698