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

Side by Side Diff: pkg/dev_compiler/lib/src/compiler/code_generator.dart

Issue 2488543002: fix #27775, enum declaration where "name" is a property (Closed)
Patch Set: Created 4 years, 1 month 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) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2 2
3 // for details. All rights reserved. Use of this source code is governed by a 3 // for details. All rights reserved. Use of this source code is governed by a
4 // BSD-style license that can be found in the LICENSE file. 4 // BSD-style license that can be found in the LICENSE file.
5 5
6 import 'dart:collection' show HashMap, HashSet; 6 import 'dart:collection' show HashMap, HashSet;
7 import 'dart:math' show min, max; 7 import 'dart:math' show min, max;
8 8
9 import 'package:analyzer/analyzer.dart' hide ConstantEvaluator; 9 import 'package:analyzer/analyzer.dart' hide ConstantEvaluator;
10 import 'package:analyzer/dart/ast/ast.dart'; 10 import 'package:analyzer/dart/ast/ast.dart';
(...skipping 1078 matching lines...) Expand 10 before | Expand all | Expand 10 after
1089 // Generate a class per section 13 of the spec. 1089 // Generate a class per section 13 of the spec.
1090 // TODO(vsm): Generate any accompanying metadata 1090 // TODO(vsm): Generate any accompanying metadata
1091 1091
1092 // Create constructor and initialize index 1092 // Create constructor and initialize index
1093 var constructor = new JS.Method(_propertyName('new'), 1093 var constructor = new JS.Method(_propertyName('new'),
1094 js.call('function(index) { this.index = index; }') as JS.Fun); 1094 js.call('function(index) { this.index = index; }') as JS.Fun);
1095 var fields = new List<FieldElement>.from( 1095 var fields = new List<FieldElement>.from(
1096 element.fields.where((f) => f.type == type)); 1096 element.fields.where((f) => f.type == type));
1097 1097
1098 // Create toString() method 1098 // Create toString() method
1099 var properties = new List<JS.Property>(); 1099 var nameProperties = new List<JS.Property>(fields.length);
1100 for (var i = 0; i < fields.length; ++i) { 1100 for (var i = 0; i < fields.length; ++i) {
1101 properties.add(new JS.Property( 1101 nameProperties[i] = new JS.Property(
1102 js.number(i), js.string('${type.name}.${fields[i].name}'))); 1102 js.number(i), js.string('${type.name}.${fields[i].name}'));
1103 } 1103 }
1104 var nameMap = new JS.ObjectInitializer(properties, multiline: true); 1104 var nameMap = new JS.ObjectInitializer(nameProperties, multiline: true);
1105 var toStringF = new JS.Method(js.string('toString'), 1105 var toStringF = new JS.Method(js.string('toString'),
1106 js.call('function() { return #[this.index]; }', nameMap) as JS.Fun); 1106 js.call('function() { return #[this.index]; }', nameMap) as JS.Fun);
1107 1107
1108 // Create enum class 1108 // Create enum class
1109 var classExpr = new JS.ClassExpression(new JS.Identifier(type.name), 1109 var classExpr = new JS.ClassExpression(new JS.Identifier(type.name),
1110 _emitClassHeritage(element), [constructor, toStringF]); 1110 _emitClassHeritage(element), [constructor, toStringF]);
1111 var id = _emitTopLevelName(element); 1111 var id = _emitTopLevelName(element);
1112 var result = [ 1112 var result = [
1113 js.statement('# = #', [id, classExpr]) 1113 js.statement('# = #', [id, classExpr])
1114 ]; 1114 ];
1115 1115
1116 // Create static fields for each enum value 1116 // defineEnumValues internally depends on dart.constList which uses
1117 for (var i = 0; i < fields.length; ++i) { 1117 // _interceptors.JSArray.
1118 result.add(js.statement('#.# = #.const(new #(#));',
1119 [id, fields[i].name, _runtimeModule, id, js.number(i)]));
1120 }
1121
1122 // Create static values list
1123 var values = new JS.ArrayInitializer(new List<JS.Expression>.from(
1124 fields.map((f) => js.call('#.#', [id, f.name]))));
1125
1126 // dart.constList helper internally depends on _interceptors.JSArray.
1127 _declareBeforeUse(_jsArray); 1118 _declareBeforeUse(_jsArray);
1128 1119
1129 result.add(js.statement('#.values = #.constList(#, #);', 1120 // Create static fields for each enum value, and the "values" getter
1130 [id, _runtimeModule, values, _emitType(type)])); 1121 result.add(_callHelperStatement('defineEnumValues(#, #);', [
1122 id,
1123 new JS.ArrayInitializer(fields.map((f) => _propertyName(f.name)).toList(),
1124 multiline: true)
1125 ]));
1131 1126
1132 return _statement(result); 1127 return _statement(result);
1133 } 1128 }
1134 1129
1135 /// Wraps a possibly generic class in its type arguments. 1130 /// Wraps a possibly generic class in its type arguments.
1136 JS.Statement _defineClassTypeArguments(TypeDefiningElement element, 1131 JS.Statement _defineClassTypeArguments(TypeDefiningElement element,
1137 List<TypeParameterElement> formals, JS.Statement body) { 1132 List<TypeParameterElement> formals, JS.Statement body) {
1138 assert(formals.isNotEmpty); 1133 assert(formals.isNotEmpty);
1139 var genericCall = _callHelper('generic((#) => { #; #; return #; })', [ 1134 var genericCall = _callHelper('generic((#) => { #; #; return #; })', [
1140 _emitTypeFormals(formals), 1135 _emitTypeFormals(formals),
(...skipping 4460 matching lines...) Expand 10 before | Expand all | Expand 10 after
5601 var targetIdentifier = target as SimpleIdentifier; 5596 var targetIdentifier = target as SimpleIdentifier;
5602 5597
5603 if (targetIdentifier.staticElement is! PrefixElement) return false; 5598 if (targetIdentifier.staticElement is! PrefixElement) return false;
5604 var prefix = targetIdentifier.staticElement as PrefixElement; 5599 var prefix = targetIdentifier.staticElement as PrefixElement;
5605 5600
5606 // The library the prefix is referring to must come from a deferred import. 5601 // The library the prefix is referring to must come from a deferred import.
5607 var containingLibrary = (target.root as CompilationUnit).element.library; 5602 var containingLibrary = (target.root as CompilationUnit).element.library;
5608 var imports = containingLibrary.getImportsWithPrefix(prefix); 5603 var imports = containingLibrary.getImportsWithPrefix(prefix);
5609 return imports.length == 1 && imports[0].isDeferred; 5604 return imports.length == 1 && imports[0].isDeferred;
5610 } 5605 }
OLDNEW
« no previous file with comments | « pkg/dev_compiler/lib/sdk/ddc_sdk.sum ('k') | pkg/dev_compiler/test/codegen/language/enum_value_name_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698