 Chromium Code Reviews
 Chromium Code Reviews Issue 15861028:
  Implement MethodMirror.metadata.  (Closed) 
  Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
    
  
    Issue 15861028:
  Implement MethodMirror.metadata.  (Closed) 
  Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge| Index: dart/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart | 
| diff --git a/dart/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart b/dart/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart | 
| index 417dca932d2030a87bbb16b2dfc317f37986eded..7eb9d6bcd1448a4b91d5b95c6068c029b893e85d 100644 | 
| --- a/dart/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart | 
| +++ b/dart/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart | 
| @@ -1161,7 +1161,8 @@ class CodeEmitterTask extends CompilerTask { | 
| if (member.isAbstract(compiler)) return; | 
| jsAst.Expression code = backend.generatedCode[member]; | 
| if (code == null) return; | 
| - builder.addProperty(namer.getName(member), code); | 
| + String name = namer.getName(member); | 
| + builder.addProperty(name, code); | 
| code = backend.generatedBailoutCode[member]; | 
| if (code != null) { | 
| builder.addProperty(namer.getBailoutName(member), code); | 
| @@ -1171,6 +1172,10 @@ class CodeEmitterTask extends CompilerTask { | 
| if (!parameters.optionalParameters.isEmpty) { | 
| addParameterStubs(member, builder.addProperty); | 
| } | 
| + var metadata = buildMetadataFunction(member); | 
| + if (metadata != null) { | 
| + builder.addProperty('@$name', metadata); | 
| + } | 
| } else if (!member.isField()) { | 
| compiler.internalError('unexpected kind: "${member.kind}"', | 
| element: member); | 
| @@ -1796,7 +1801,13 @@ class CodeEmitterTask extends CompilerTask { | 
| for (Element element in Elements.sortedByPosition(elements)) { | 
| CodeBuffer buffer = bufferForElement(element, eagerBuffer); | 
| jsAst.Expression code = backend.generatedCode[element]; | 
| - emitStaticFunction(buffer, namer.getName(element), code); | 
| + String name = namer.getName(element); | 
| + emitStaticFunction(buffer, name, code); | 
| + var metadata = buildMetadataFunction(element); | 
| + if (metadata != null) { | 
| + buffer.write(',$n$n"@$name":$_'); | 
| + buffer.write(jsAst.prettyPrint(metadata, compiler)); | 
| + } | 
| jsAst.Expression bailoutCode = backend.generatedBailoutCode[element]; | 
| if (bailoutCode != null) { | 
| pendingElementsWithBailouts.remove(element); | 
| @@ -3252,11 +3263,23 @@ if (typeof document !== "undefined" && document.readyState !== "complete") { | 
| for (var property in descriptor) { | 
| if (!hasOwnProperty.call(descriptor, property)) continue; | 
| var element = descriptor[property]; | 
| - if (typeof element === "function") { | 
| + if (property.substring(0, 1) == "@") { | 
| + property = property.substring(1); | 
| + ${namer.CURRENT_ISOLATE}[property].\$metadata = element; | 
| 
ngeoffray
2013/06/03 06:51:55
Move '\$metadata' to a helper getter ?
 
ahe
2013/06/03 09:13:54
Done.
 | 
| + } else if (typeof element === "function") { | 
| ${namer.CURRENT_ISOLATE}[property] = element; | 
| functions.push(property); | 
| } else { | 
| - $classesCollector[property] = element; | 
| + var newDesc = {} | 
| + for (var prop in element) { | 
| + if (!hasOwnProperty.call(element, prop)) continue; | 
| + if (prop.substring(0, 1) == "@" && prop != "@") { | 
| + newDesc[prop.substring(1)].\$metadata = element[prop]; | 
| + } else { | 
| + newDesc[prop] = element[prop]; | 
| + } | 
| + } | 
| + $classesCollector[property] = newDesc; | 
| classes.push(property); | 
| classes.push(element[""]); | 
| } |