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

Side by Side Diff: pkg/compiler/lib/src/resolution/enum_creator.dart

Issue 2865693002: Create closed world for hello world using .dill file (Closed)
Patch Set: Update and fix. Created 3 years, 7 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) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, 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.resolution.enum_creator; 5 library dart2js.resolution.enum_creator;
6 6
7 import '../common.dart'; 7 import '../common.dart';
8 import '../common_elements.dart' show CommonElements; 8 import '../common_elements.dart' show CommonElements;
9 import '../elements/resolution_types.dart'; 9 import '../elements/resolution_types.dart';
10 import '../elements/elements.dart'; 10 import '../elements/elements.dart';
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 /// 192 ///
193 // TODO(johnniwinther): Avoid creating synthesized ASTs for enums when SSA is 193 // TODO(johnniwinther): Avoid creating synthesized ASTs for enums when SSA is
194 // removed. 194 // removed.
195 class EnumCreator { 195 class EnumCreator {
196 final DiagnosticReporter reporter; 196 final DiagnosticReporter reporter;
197 final CommonElements commonElements; 197 final CommonElements commonElements;
198 final EnumClassElementX enumClass; 198 final EnumClassElementX enumClass;
199 199
200 EnumCreator(this.reporter, this.commonElements, this.enumClass); 200 EnumCreator(this.reporter, this.commonElements, this.enumClass);
201 201
202 /// Flag to re-enable the spec-based encoding of the `toString` method. This
203 /// is used for equivalence testing with kernel based input.
204 static bool USE_CONSTANT_MAP_IN_TO_STRING = false;
Siggi Cherem (dart-lang) 2017/05/15 17:05:50 a few nits: - just use the common camelCaseNotatio
Johnni Winther 2017/05/16 08:29:54 Done.
205
202 void createMembers() { 206 void createMembers() {
203 Enum node = enumClass.node; 207 Enum node = enumClass.node;
204 ResolutionInterfaceType enumType = enumClass.thisType; 208 ResolutionInterfaceType enumType = enumClass.thisType;
205 AstBuilder builder = new AstBuilder(enumClass.position.charOffset); 209 AstBuilder builder = new AstBuilder(enumClass.position.charOffset);
206 210
207 ResolutionInterfaceType intType = commonElements.intType; 211 ResolutionInterfaceType intType = commonElements.intType;
208 ResolutionInterfaceType stringType = commonElements.stringType; 212 ResolutionInterfaceType stringType = commonElements.stringType;
209 213
210 EnumFieldElementX addInstanceMember( 214 EnumFieldElementX addInstanceMember(
211 String name, ResolutionInterfaceType type) { 215 String name, ResolutionInterfaceType type) {
212 Identifier identifier = builder.identifier(name); 216 Identifier identifier = builder.identifier(name);
213 VariableList variableList = 217 VariableList variableList =
214 new VariableList(builder.modifiers(isFinal: true)); 218 new VariableList(builder.modifiers(isFinal: true));
215 variableList.type = type; 219 variableList.type = type;
216 EnumFieldElementX variable = new EnumFieldElementX( 220 EnumFieldElementX variable = new EnumFieldElementX(
217 identifier, enumClass, variableList, identifier); 221 identifier, enumClass, variableList, identifier);
218 enumClass.addMember(variable, reporter); 222 enumClass.addMember(variable, reporter);
219 return variable; 223 return variable;
220 } 224 }
221 225
222 EnumFieldElementX indexVariable = addInstanceMember('index', intType); 226 EnumFieldElementX indexVariable = addInstanceMember('index', intType);
223 EnumFieldElementX nameVariable = addInstanceMember('_name', stringType); 227 EnumFieldElementX nameVariable;
224 228
225 VariableDefinitions indexDefinition = builder.initializingFormal('index'); 229 VariableDefinitions indexDefinition = builder.initializingFormal('index');
226 VariableDefinitions nameDefinition = builder.initializingFormal('_name'); 230 VariableDefinitions nameDefinition;
227 231
232 List<Node> constructorInitializers = <Node>[indexDefinition];
233 if (!USE_CONSTANT_MAP_IN_TO_STRING) {
234 nameVariable = addInstanceMember('_name', stringType);
235 nameDefinition = builder.initializingFormal('_name');
236 constructorInitializers.add(nameDefinition);
237 }
228 FunctionExpression constructorNode = builder.functionExpression( 238 FunctionExpression constructorNode = builder.functionExpression(
229 builder.modifiers(isConst: true), 239 builder.modifiers(isConst: true),
230 enumClass.name, 240 enumClass.name,
231 null, // typeVariables 241 null, // typeVariables
232 builder.argumentList([indexDefinition, nameDefinition]), 242 builder.argumentList(constructorInitializers),
233 builder.emptyStatement()); 243 builder.emptyStatement());
234 244
235 EnumConstructorElementX constructor = new EnumConstructorElementX( 245 EnumConstructorElementX constructor = new EnumConstructorElementX(
236 enumClass, builder.modifiers(isConst: true), constructorNode); 246 enumClass, builder.modifiers(isConst: true), constructorNode);
237 247
238 EnumFormalElementX indexFormal = new EnumFormalElementX(constructor, 248 EnumFormalElementX indexFormal = new EnumFormalElementX(constructor,
239 indexDefinition, builder.identifier('index'), indexVariable); 249 indexDefinition, builder.identifier('index'), indexVariable);
240 250
241 EnumFormalElementX nameFormal = new EnumFormalElementX( 251 EnumFormalElementX nameFormal;
242 constructor, nameDefinition, builder.identifier('_name'), nameVariable);
243 252
253 List<Element> parameters = <Element>[indexFormal];
254 List<ResolutionDartType> parameterTypes = <ResolutionDartType>[intType];
255 if (!USE_CONSTANT_MAP_IN_TO_STRING) {
256 nameFormal = new EnumFormalElementX(constructor, nameDefinition,
257 builder.identifier('_name'), nameVariable);
258 parameters.add(nameFormal);
259 parameterTypes.add(stringType);
260 }
244 FunctionSignatureX constructorSignature = new FunctionSignatureX( 261 FunctionSignatureX constructorSignature = new FunctionSignatureX(
245 requiredParameters: [indexFormal, nameFormal], 262 requiredParameters: parameters,
246 requiredParameterCount: 2, 263 requiredParameterCount: parameters.length,
247 type: new ResolutionFunctionType( 264 type: new ResolutionFunctionType(
248 constructor, 265 constructor, const ResolutionDynamicType(), parameterTypes));
249 const ResolutionDynamicType(),
250 <ResolutionDartType>[intType, stringType]));
251 constructor.functionSignature = constructorSignature; 266 constructor.functionSignature = constructorSignature;
252 enumClass.addMember(constructor, reporter); 267 enumClass.addMember(constructor, reporter);
253 268
254 List<EnumConstantElement> enumValues = <EnumConstantElement>[]; 269 List<EnumConstantElement> enumValues = <EnumConstantElement>[];
255 int index = 0; 270 int index = 0;
256 List<Node> valueReferences = <Node>[]; 271 List<Node> valueReferences = <Node>[];
272 List<LiteralMapEntry> mapEntries;
273 if (USE_CONSTANT_MAP_IN_TO_STRING) {
274 mapEntries = <LiteralMapEntry>[];
275 }
257 for (Link<Node> link = node.names.nodes; !link.isEmpty; link = link.tail) { 276 for (Link<Node> link = node.names.nodes; !link.isEmpty; link = link.tail) {
258 Identifier name = link.head; 277 Identifier name = link.head;
259 AstBuilder valueBuilder = new AstBuilder(name.token.charOffset); 278 AstBuilder valueBuilder = new AstBuilder(name.token.charOffset);
260 VariableList variableList = new VariableList( 279 VariableList variableList = new VariableList(
261 valueBuilder.modifiers(isStatic: true, isConst: true)); 280 valueBuilder.modifiers(isStatic: true, isConst: true));
262 variableList.type = enumType; 281 variableList.type = enumType;
263 282
264 // Add reference for the `values` field. 283 // Add reference for the `values` field.
265 valueReferences.add(valueBuilder.reference(name)); 284 valueReferences.add(valueBuilder.reference(name));
266 285
267 Expression initializer = valueBuilder.newExpression( 286 Node indexValue = valueBuilder.literalInt(index);
268 enumClass.name, 287 Node nameValue =
269 valueBuilder.argumentList([ 288 valueBuilder.literalString('${enumClass.name}.${name.source}');
270 valueBuilder.literalInt(index), 289 Expression initializer;
271 valueBuilder.literalString('${enumClass.name}.${name.source}') 290 if (USE_CONSTANT_MAP_IN_TO_STRING) {
272 ]), 291 // Add map entry for `toString` implementation.
273 isConst: true); 292 mapEntries.add(valueBuilder.mapLiteralEntry(indexValue, nameValue));
293
294 initializer = valueBuilder.newExpression(enumClass.name,
295 valueBuilder.argumentList([valueBuilder.literalInt(index)]),
Siggi Cherem (dart-lang) 2017/05/15 17:05:50 reuse indexValue
Johnni Winther 2017/05/16 08:29:54 Done.
296 isConst: true);
297 } else {
298 initializer = valueBuilder.newExpression(
299 enumClass.name, valueBuilder.argumentList([indexValue, nameValue]),
300 isConst: true);
301 }
274 SendSet definition = valueBuilder.createDefinition(name, initializer); 302 SendSet definition = valueBuilder.createDefinition(name, initializer);
275 303
276 EnumConstantElementX field = new EnumConstantElementX( 304 EnumConstantElementX field = new EnumConstantElementX(
277 name, enumClass, variableList, definition, initializer, index); 305 name, enumClass, variableList, definition, initializer, index);
278 enumValues.add(field); 306 enumValues.add(field);
279 enumClass.addMember(field, reporter); 307 enumClass.addMember(field, reporter);
280 index++; 308 index++;
281 } 309 }
282 310
283 VariableList valuesVariableList = 311 VariableList valuesVariableList =
284 new VariableList(builder.modifiers(isStatic: true, isConst: true)); 312 new VariableList(builder.modifiers(isStatic: true, isConst: true));
285 ResolutionInterfaceType valuesType = commonElements.listType(enumType); 313 ResolutionInterfaceType valuesType = commonElements.listType(enumType);
286 valuesVariableList.type = valuesType; 314 valuesVariableList.type = valuesType;
287 315
288 Identifier valuesIdentifier = builder.identifier('values'); 316 Identifier valuesIdentifier = builder.identifier('values');
289 // TODO(28340): Add type argument. 317 // TODO(28340): Add type argument.
290 Expression initializer = 318 Expression initializer =
291 builder.listLiteral(valueReferences, isConst: true); 319 builder.listLiteral(valueReferences, isConst: true);
292 320
293 Node definition = builder.createDefinition(valuesIdentifier, initializer); 321 Node definition = builder.createDefinition(valuesIdentifier, initializer);
294 322
295 EnumFieldElementX valuesVariable = new EnumFieldElementX(valuesIdentifier, 323 EnumFieldElementX valuesVariable = new EnumFieldElementX(valuesIdentifier,
296 enumClass, valuesVariableList, definition, initializer); 324 enumClass, valuesVariableList, definition, initializer);
297 325
298 enumClass.addMember(valuesVariable, reporter); 326 enumClass.addMember(valuesVariable, reporter);
299 327
328 Node toStringValue;
329 if (USE_CONSTANT_MAP_IN_TO_STRING) {
330 toStringValue = builder.indexGet(
331 builder.mapLiteral(mapEntries, isConst: true),
332 builder.reference(builder.identifier('index')));
333 } else {
334 toStringValue = builder.reference(builder.identifier('_name'));
335 }
300 FunctionExpression toStringNode = builder.functionExpression( 336 FunctionExpression toStringNode = builder.functionExpression(
301 Modifiers.EMPTY, 337 Modifiers.EMPTY,
302 'toString', 338 'toString',
303 null, // typeVariables 339 null, // typeVariables
304 builder.argumentList([]), 340 builder.argumentList([]),
305 builder 341 builder.returnStatement(toStringValue));
306 .returnStatement(builder.reference(builder.identifier('_name'))));
307 342
308 EnumMethodElementX toString = new EnumMethodElementX( 343 EnumMethodElementX toString = new EnumMethodElementX(
309 'toString', enumClass, Modifiers.EMPTY, toStringNode); 344 'toString', enumClass, Modifiers.EMPTY, toStringNode);
310 FunctionSignatureX toStringSignature = new FunctionSignatureX( 345 FunctionSignatureX toStringSignature = new FunctionSignatureX(
311 type: new ResolutionFunctionType(toString, stringType)); 346 type: new ResolutionFunctionType(toString, stringType));
312 toString.functionSignature = toStringSignature; 347 toString.functionSignature = toStringSignature;
313 enumClass.addMember(toString, reporter); 348 enumClass.addMember(toString, reporter);
314 349
315 enumClass.enumValues = enumValues; 350 enumClass.enumValues = enumValues;
316 } 351 }
317 } 352 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698