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

Side by Side Diff: pkg/compiler/lib/src/js_emitter/metadata_collector.dart

Issue 2992863002: Support forEachClassMember on closure classes (Closed)
Patch Set: Created 3 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library dart2js.js_emitter.metadata_collector; 5 library dart2js.js_emitter.metadata_collector;
6 6
7 import 'package:js_ast/src/precedence.dart' as js_precedence; 7 import 'package:js_ast/src/precedence.dart' as js_precedence;
8 8
9 import '../common.dart'; 9 import '../common.dart';
10 import '../constants/values.dart'; 10 import '../constants/values.dart';
11 import '../deferred_load.dart' show DeferredLoadTask, OutputUnit; 11 import '../deferred_load.dart' show DeferredLoadTask, OutputUnit;
12 import '../elements/elements.dart' 12 import '../elements/elements.dart'
13 show 13 show
14 ClassElement, 14 ClassElement,
15 ConstructorElement, 15 ConstructorElement,
16 Element, 16 Element,
17 FieldElement, 17 FieldElement,
18 FunctionSignature, 18 FunctionSignature,
19 LibraryElement, 19 LibraryElement,
20 MemberElement, 20 MemberElement,
21 MethodElement, 21 MethodElement,
22 MetadataAnnotation, 22 MetadataAnnotation,
23 ParameterElement; 23 ParameterElement;
24 import '../elements/entities.dart'; 24 import '../elements/entities.dart';
25 import '../elements/resolution_types.dart' 25 import '../elements/resolution_types.dart'
26 show ResolutionDartType, ResolutionTypedefType; 26 show ResolutionDartType, ResolutionTypedefType;
Emily Fortuna 2017/08/02 17:49:55 you can remove ResolutionDartType here then.
Johnni Winther 2017/08/03 08:58:34 Done.
27 import '../elements/types.dart'; 27 import '../elements/types.dart';
28 import '../js/js.dart' as jsAst; 28 import '../js/js.dart' as jsAst;
29 import '../js/js.dart' show js; 29 import '../js/js.dart' show js;
30 import '../js_backend/constant_handler_javascript.dart'; 30 import '../js_backend/constant_handler_javascript.dart';
31 import '../js_backend/mirrors_data.dart'; 31 import '../js_backend/mirrors_data.dart';
32 import '../js_backend/runtime_types.dart' show RuntimeTypesEncoder; 32 import '../js_backend/runtime_types.dart' show RuntimeTypesEncoder;
33 import '../js_backend/type_variable_handler.dart' 33 import '../js_backend/type_variable_handler.dart'
34 show TypeVariableCodegenAnalysis; 34 show TypeVariableCodegenAnalysis;
35 import '../options.dart'; 35 import '../options.dart';
36 36
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 /// output unit. Once finalized, the entries represent types including 160 /// output unit. Once finalized, the entries represent types including
161 /// function types and typedefs. 161 /// function types and typedefs.
162 Map<OutputUnit, _MetadataList> _typesTokens = 162 Map<OutputUnit, _MetadataList> _typesTokens =
163 new Map<OutputUnit, _MetadataList>(); 163 new Map<OutputUnit, _MetadataList>();
164 164
165 jsAst.Expression getTypesForOutputUnit(OutputUnit outputUnit) { 165 jsAst.Expression getTypesForOutputUnit(OutputUnit outputUnit) {
166 return _typesTokens.putIfAbsent(outputUnit, () => new _MetadataList()); 166 return _typesTokens.putIfAbsent(outputUnit, () => new _MetadataList());
167 } 167 }
168 168
169 /// A map used to canonicalize the entries of types. 169 /// A map used to canonicalize the entries of types.
170 Map<OutputUnit, Map<ResolutionDartType, _BoundMetadataEntry>> _typesMap = 170 Map<OutputUnit, Map<DartType, _BoundMetadataEntry>> _typesMap =
171 <OutputUnit, Map<ResolutionDartType, _BoundMetadataEntry>>{}; 171 <OutputUnit, Map<DartType, _BoundMetadataEntry>>{};
172 172
173 MetadataCollector( 173 MetadataCollector(
174 this._options, 174 this._options,
175 this.reporter, 175 this.reporter,
176 this._deferredLoadTask, 176 this._deferredLoadTask,
177 this._emitter, 177 this._emitter,
178 this._constants, 178 this._constants,
179 this._typeVariableCodegenAnalysis, 179 this._typeVariableCodegenAnalysis,
180 this._mirrorsData, 180 this._mirrorsData,
181 this._rtiEncoder) { 181 this._rtiEncoder) {
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
326 return null; 326 return null;
327 } 327 }
328 return _addGlobalMetadata(_emitter.constantReference(constant)); 328 return _addGlobalMetadata(_emitter.constantReference(constant));
329 } 329 }
330 330
331 jsAst.Expression reifyType(DartType type, {ignoreTypeVariables: false}) { 331 jsAst.Expression reifyType(DartType type, {ignoreTypeVariables: false}) {
332 return reifyTypeForOutputUnit(type, _deferredLoadTask.mainOutputUnit, 332 return reifyTypeForOutputUnit(type, _deferredLoadTask.mainOutputUnit,
333 ignoreTypeVariables: ignoreTypeVariables); 333 ignoreTypeVariables: ignoreTypeVariables);
334 } 334 }
335 335
336 jsAst.Expression reifyTypeForOutputUnit( 336 jsAst.Expression reifyTypeForOutputUnit(DartType type, OutputUnit outputUnit,
337 ResolutionDartType type, OutputUnit outputUnit,
338 {ignoreTypeVariables: false}) { 337 {ignoreTypeVariables: false}) {
339 return addTypeInOutputUnit(type, outputUnit, 338 return addTypeInOutputUnit(type, outputUnit,
340 ignoreTypeVariables: ignoreTypeVariables); 339 ignoreTypeVariables: ignoreTypeVariables);
341 } 340 }
342 341
343 jsAst.Expression reifyName(String name) { 342 jsAst.Expression reifyName(String name) {
344 return _addGlobalMetadata(js.string(name)); 343 return _addGlobalMetadata(js.string(name));
345 } 344 }
346 345
347 jsAst.Expression reifyExpression(jsAst.Expression expression) { 346 jsAst.Expression reifyExpression(jsAst.Expression expression) {
348 return _addGlobalMetadata(expression); 347 return _addGlobalMetadata(expression);
349 } 348 }
350 349
351 Placeholder getMetadataPlaceholder([debug]) { 350 Placeholder getMetadataPlaceholder([debug]) {
352 return new _ForwardingMetadataEntry(debug); 351 return new _ForwardingMetadataEntry(debug);
353 } 352 }
354 353
355 _MetadataEntry _addGlobalMetadata(jsAst.Node node) { 354 _MetadataEntry _addGlobalMetadata(jsAst.Node node) {
356 String nameToKey(jsAst.Name name) => "${name.key}"; 355 String nameToKey(jsAst.Name name) => "${name.key}";
357 String printed = 356 String printed =
358 jsAst.prettyPrint(node, _options, renamerForNames: nameToKey); 357 jsAst.prettyPrint(node, _options, renamerForNames: nameToKey);
359 return _globalMetadataMap.putIfAbsent(printed, () { 358 return _globalMetadataMap.putIfAbsent(printed, () {
360 return new _BoundMetadataEntry(node); 359 return new _BoundMetadataEntry(node);
361 }); 360 });
362 } 361 }
363 362
364 jsAst.Expression _computeTypeRepresentation(ResolutionDartType type, 363 jsAst.Expression _computeTypeRepresentation(DartType type,
365 {ignoreTypeVariables: false}) { 364 {ignoreTypeVariables: false}) {
366 jsAst.Expression representation = 365 jsAst.Expression representation =
367 _rtiEncoder.getTypeRepresentation(_emitter, type, (variable) { 366 _rtiEncoder.getTypeRepresentation(_emitter, type, (variable) {
368 if (ignoreTypeVariables) return new jsAst.LiteralNull(); 367 if (ignoreTypeVariables) return new jsAst.LiteralNull();
369 return _typeVariableCodegenAnalysis.reifyTypeVariable(variable.element); 368 return _typeVariableCodegenAnalysis.reifyTypeVariable(variable.element);
370 }, (ResolutionTypedefType typedef) { 369 }, (ResolutionTypedefType typedef) {
371 return _mirrorsData.isTypedefAccessibleByReflection(typedef.element); 370 return _mirrorsData.isTypedefAccessibleByReflection(typedef.element);
372 }); 371 });
373 372
374 if (representation is jsAst.LiteralString) { 373 if (representation is jsAst.LiteralString) {
375 // We don't want the representation to be a string, since we use 374 // We don't want the representation to be a string, since we use
376 // strings as indicator for non-initialized types in the lazy emitter. 375 // strings as indicator for non-initialized types in the lazy emitter.
377 reporter.internalError( 376 reporter.internalError(
378 NO_LOCATION_SPANNABLE, 'reified types should not be strings.'); 377 NO_LOCATION_SPANNABLE, 'reified types should not be strings.');
379 } 378 }
380 379
381 return representation; 380 return representation;
382 } 381 }
383 382
384 jsAst.Expression addTypeInOutputUnit( 383 jsAst.Expression addTypeInOutputUnit(DartType type, OutputUnit outputUnit,
385 ResolutionDartType type, OutputUnit outputUnit,
386 {ignoreTypeVariables: false}) { 384 {ignoreTypeVariables: false}) {
387 if (_typesMap[outputUnit] == null) { 385 if (_typesMap[outputUnit] == null) {
388 _typesMap[outputUnit] = 386 _typesMap[outputUnit] = new Map<DartType, _BoundMetadataEntry>();
389 new Map<ResolutionDartType, _BoundMetadataEntry>();
390 } 387 }
391 return _typesMap[outputUnit].putIfAbsent(type, () { 388 return _typesMap[outputUnit].putIfAbsent(type, () {
392 return new _BoundMetadataEntry(_computeTypeRepresentation(type, 389 return new _BoundMetadataEntry(_computeTypeRepresentation(type,
393 ignoreTypeVariables: ignoreTypeVariables)); 390 ignoreTypeVariables: ignoreTypeVariables));
394 }); 391 });
395 } 392 }
396 393
397 List<jsAst.DeferredNumber> computeMetadata(MethodElement element) { 394 List<jsAst.DeferredNumber> computeMetadata(MethodElement element) {
398 return reporter.withCurrentElement(element, () { 395 return reporter.withCurrentElement(element, () {
399 if (!_mustEmitMetadataForMember(element)) 396 if (!_mustEmitMetadataForMember(element))
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
471 if (token is _ForwardingMetadataEntry && !token.isBound) { 468 if (token is _ForwardingMetadataEntry && !token.isBound) {
472 _foundUnboundToken = true; 469 _foundUnboundToken = true;
473 } 470 }
474 } 471 }
475 472
476 bool findUnboundPlaceholders(jsAst.Node node) { 473 bool findUnboundPlaceholders(jsAst.Node node) {
477 node.accept(this); 474 node.accept(this);
478 return _foundUnboundToken; 475 return _foundUnboundToken;
479 } 476 }
480 } 477 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/js_backend/impact_transformer.dart ('k') | pkg/compiler/lib/src/js_model/closure.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698