Wrap lazy compilation errors when parsing metadata. Addresses the poor error reporting in issue 12027.

R=asiva@google.com

Review URL: https://codereview.chromium.org//20458002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@25498 260f80e4-7a28-3924-810f-c04153c831b5
This commit is contained in:
rmacnak@google.com 2013-07-25 20:49:59 +00:00
parent 3600e1b644
commit 670a0345ca
2 changed files with 34 additions and 28 deletions

View file

@ -981,34 +981,6 @@ void NATIVE_ENTRY_FUNCTION(Mirrors_makeLocalClassMirror)(
}
DEFINE_NATIVE_ENTRY(DeclarationMirror_metadata, 1) {
const MirrorReference& decl_ref =
MirrorReference::CheckedHandle(arguments->NativeArgAt(0));
const Object& decl = Object::Handle(decl_ref.referent());
Class& klass = Class::Handle();
if (decl.IsClass()) {
klass ^= decl.raw();
} else if (decl.IsFunction()) {
klass = Function::Cast(decl).origin();
} else if (decl.IsField()) {
klass = Field::Cast(decl).origin();
} else {
return Object::empty_array().raw();
}
const Library& library = Library::Handle(klass.library());
return library.GetMetadata(decl);
}
void HandleMirrorsMessage(Isolate* isolate,
Dart_Port reply_port,
const Instance& message) {
UNIMPLEMENTED();
}
static void ThrowMirroredCompilationError(const String& message) {
Array& args = Array::Handle(Array::New(1));
args.SetAt(0, message);
@ -1031,6 +1003,38 @@ static void ThrowInvokeError(const Error& error) {
}
DEFINE_NATIVE_ENTRY(DeclarationMirror_metadata, 1) {
const MirrorReference& decl_ref =
MirrorReference::CheckedHandle(arguments->NativeArgAt(0));
const Object& decl = Object::Handle(decl_ref.referent());
Class& klass = Class::Handle();
if (decl.IsClass()) {
klass ^= decl.raw();
} else if (decl.IsFunction()) {
klass = Function::Cast(decl).origin();
} else if (decl.IsField()) {
klass = Field::Cast(decl).origin();
} else {
return Object::empty_array().raw();
}
const Library& library = Library::Handle(klass.library());
const Object& metadata = Object::Handle(library.GetMetadata(decl));
if (metadata.IsError()) {
ThrowInvokeError(Error::Cast(metadata));
}
return metadata.raw();
}
void HandleMirrorsMessage(Isolate* isolate,
Dart_Port reply_port,
const Instance& message) {
UNIMPLEMENTED();
}
static bool FieldIsUninitialized(const Field& field) {
ASSERT(!field.IsNull());

View file

@ -407,6 +407,7 @@ class MySuperClass {
class MyInterface {
}
@notDefined
class MyClass extends MySuperClass implements MyInterface {
MyClass(this.value) {}
MyClass.named() {}
@ -445,6 +446,7 @@ void testCustomInstanceMirror(InstanceMirror mirror) {
Expect.equals(const Symbol('isolate_mirror_local_test'), cls.owner.simpleName);
Expect.isTrue(cls.isClass);
Expect.equals(const Symbol('MyInterface'), cls.superinterfaces[0].simpleName);
Expect.throws(() => cls.metadata, (e) => e is MirroredCompilationError, 'Bad metadata');
// TODO(ahe): toString() test disabled for now as Symbols are 100% opaque.
// Expect.equals("ClassMirror on 'MyClass'", cls.toString());