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

Unified Diff: dart/lib/compiler/implementation/resolver.dart

Issue 10870010: Evaluate compile-time constants of metadata. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Rebased and use const instead of final Created 8 years, 4 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
Index: dart/lib/compiler/implementation/resolver.dart
diff --git a/dart/lib/compiler/implementation/resolver.dart b/dart/lib/compiler/implementation/resolver.dart
index fe7e42d66844b125e97ed666464f8674c5cb90c3..496b2a2a0140023e76d87ab83820e8bd16a95bef 100644
--- a/dart/lib/compiler/implementation/resolver.dart
+++ b/dart/lib/compiler/implementation/resolver.dart
@@ -153,8 +153,8 @@ class ResolverTask extends CompilerTask {
}
ClassElement defaultClass = defaultType.element;
defaultClass.ensureResolved(compiler);
- assert(defaultClass.resolutionState == ClassElement.STATE_DONE);
- assert(defaultClass.supertypeLoadState == ClassElement.STATE_DONE);
+ assert(defaultClass.resolutionState == STATE_DONE);
+ assert(defaultClass.supertypeLoadState == STATE_DONE);
if (defaultClass.isInterface()) {
error(node, MessageKind.CANNOT_INSTANTIATE_INTERFACE,
[defaultClass.name]);
@@ -220,26 +220,26 @@ class ResolverTask extends CompilerTask {
*/
void loadSupertypes(ClassElement cls, Node from) {
compiler.withCurrentElement(cls, () => measure(() {
- if (cls.supertypeLoadState == ClassElement.STATE_DONE) return;
- if (cls.supertypeLoadState == ClassElement.STATE_STARTED) {
+ if (cls.supertypeLoadState == STATE_DONE) return;
+ if (cls.supertypeLoadState == STATE_STARTED) {
compiler.reportMessage(
compiler.spanFromNode(from),
MessageKind.CYCLIC_CLASS_HIERARCHY.error([cls.name]),
api.Diagnostic.ERROR);
- cls.supertypeLoadState = ClassElement.STATE_DONE;
+ cls.supertypeLoadState = STATE_DONE;
cls.allSupertypes = const EmptyLink<Type>().prepend(
compiler.objectClass.computeType(compiler));
// TODO(ahe): We should also set cls.supertype here to avoid
// creating a malformed class hierarchy.
return;
}
- cls.supertypeLoadState = ClassElement.STATE_STARTED;
+ cls.supertypeLoadState = STATE_STARTED;
compiler.withCurrentElement(cls, () {
// TODO(ahe): Cache the node in cls.
cls.parseNode(compiler).accept(new ClassSupertypeResolver(compiler,
cls));
- if (cls.supertypeLoadState != ClassElement.STATE_DONE) {
- cls.supertypeLoadState = ClassElement.STATE_DONE;
+ if (cls.supertypeLoadState != STATE_DONE) {
+ cls.supertypeLoadState = STATE_DONE;
}
});
}));
@@ -257,16 +257,16 @@ class ResolverTask extends CompilerTask {
* [:element.ensureResolved(compiler):].
*/
void resolveClass(ClassElement element) {
- assert(element.resolutionState == ClassElement.STATE_NOT_STARTED);
- element.resolutionState = ClassElement.STATE_STARTED;
compiler.withCurrentElement(element, () => measure(() {
+ assert(element.resolutionState == STATE_NOT_STARTED);
+ element.resolutionState = STATE_STARTED;
ClassNode tree = element.parseNode(compiler);
loadSupertypes(element, tree);
ClassResolverVisitor visitor =
new ClassResolverVisitor(compiler, element);
visitor.visit(tree);
- element.resolutionState = ClassElement.STATE_DONE;
+ element.resolutionState = STATE_DONE;
}));
}
@@ -415,6 +415,22 @@ class ResolverTask extends CompilerTask {
element);
}
+ void resolveMetadataAnnotation(MetadataAnnotation annotation) {
+ compiler.withCurrentElement(annotation.annotatedElement, () => measure(() {
+ assert(annotation.resolutionState == STATE_NOT_STARTED);
+ annotation.resolutionState = STATE_STARTED;
+
+ Node node = annotation.parseNode(compiler);
+ ResolverVisitor visitor =
+ new ResolverVisitor(compiler, annotation.annotatedElement);
+ node.accept(visitor);
+ annotation.value = compiler.constantHandler.compileNodeWithDefinitions(
+ node, visitor.mapping);
+
+ annotation.resolutionState = STATE_DONE;
+ }));
+ }
+
error(Node node, MessageKind kind, [arguments = const []]) {
ResolutionError message = new ResolutionError(kind, arguments);
compiler.reportError(node, message);
@@ -505,7 +521,7 @@ class InitializerResolver {
ClassElement superClass = classElement.superclass;
if (classElement != visitor.compiler.objectClass) {
assert(superClass !== null);
- assert(superClass.resolutionState == ClassElement.STATE_DONE);
+ assert(superClass.resolutionState == STATE_DONE);
SourceString name = const SourceString('');
Selector call = new Selector.call(name, classElement.getLibrary(), 0);
var element = resolveSuperOrThis(constructor, true, true,
@@ -1876,7 +1892,7 @@ class ClassResolverVisitor extends TypeDefinitionVisitor {
Type visitClassNode(ClassNode node) {
compiler.ensure(element !== null);
- compiler.ensure(element.resolutionState == ClassElement.STATE_STARTED);
+ compiler.ensure(element.resolutionState == STATE_STARTED);
InterfaceType type = element.computeType(compiler);
scope = new TypeDeclarationScope(scope, element);

Powered by Google App Engine
This is Rietveld 408576698