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

Side by Side Diff: pkg/compiler/lib/src/constants/expressions.dart

Issue 763993002: Extract BuilderContext from ASTEmitter (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Rebased Created 6 years 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | pkg/compiler/lib/src/dart_backend/backend_ast_emitter.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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.constants.expressions; 5 library dart2js.constants.expressions;
6 6
7 import '../dart2jslib.dart' show assertDebugMode; 7 import '../dart2jslib.dart' show assertDebugMode;
8 import '../dart_types.dart'; 8 import '../dart_types.dart';
9 import '../elements/elements.dart' show 9 import '../elements/elements.dart' show
10 Element, 10 Element,
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
249 accept(ConstantExpressionVisitor visitor, [context]) { 249 accept(ConstantExpressionVisitor visitor, [context]) {
250 return visitor.visitConditional(this, context); 250 return visitor.visitConditional(this, context);
251 } 251 }
252 252
253 int get precedence => 3; 253 int get precedence => 3;
254 } 254 }
255 255
256 abstract class ConstantExpressionVisitor<C, R> { 256 abstract class ConstantExpressionVisitor<C, R> {
257 const ConstantExpressionVisitor(); 257 const ConstantExpressionVisitor();
258 258
259 R visit(ConstantExpression constant, [C context]) { 259 R visit(ConstantExpression constant, C context) {
260 return constant.accept(this, context); 260 return constant.accept(this, context);
261 } 261 }
262 262
263 R visitPrimitive(PrimitiveConstantExpression exp, [C context]); 263 R visitPrimitive(PrimitiveConstantExpression exp, C context);
264 R visitList(ListConstantExpression exp, [C context]); 264 R visitList(ListConstantExpression exp, C context);
265 R visitMap(MapConstantExpression exp, [C context]); 265 R visitMap(MapConstantExpression exp, C context);
266 R visitConstructed(ConstructedConstantExpresssion exp, [C context]); 266 R visitConstructed(ConstructedConstantExpresssion exp, C context);
267 R visitConcatenate(ConcatenateConstantExpression exp, [C context]); 267 R visitConcatenate(ConcatenateConstantExpression exp, C context);
268 R visitSymbol(SymbolConstantExpression exp, [C context]); 268 R visitSymbol(SymbolConstantExpression exp, C context);
269 R visitType(TypeConstantExpression exp, [C context]); 269 R visitType(TypeConstantExpression exp, C context);
270 R visitVariable(VariableConstantExpression exp, [C context]); 270 R visitVariable(VariableConstantExpression exp, C context);
271 R visitFunction(FunctionConstantExpression exp, [C context]); 271 R visitFunction(FunctionConstantExpression exp, C context);
272 R visitBinary(BinaryConstantExpression exp, [C context]); 272 R visitBinary(BinaryConstantExpression exp, C context);
273 R visitUnary(UnaryConstantExpression exp, [C context]); 273 R visitUnary(UnaryConstantExpression exp, C context);
274 R visitConditional(ConditionalConstantExpression exp, [C context]); 274 R visitConditional(ConditionalConstantExpression exp, C context);
275 } 275 }
276 276
277 /// Represents the declaration of a constant [element] with value [expression]. 277 /// Represents the declaration of a constant [element] with value [expression].
278 // TODO(johnniwinther): Where does this class belong? 278 // TODO(johnniwinther): Where does this class belong?
279 class ConstDeclaration { 279 class ConstDeclaration {
280 final VariableElement element; 280 final VariableElement element;
281 final ConstantExpression expression; 281 final ConstantExpression expression;
282 282
283 ConstDeclaration(this.element, this.expression); 283 ConstDeclaration(this.element, this.expression);
284 } 284 }
285 285
286 class ConstExpPrinter extends ConstantExpressionVisitor { 286 class ConstExpPrinter extends ConstantExpressionVisitor {
287 final StringBuffer sb = new StringBuffer(); 287 final StringBuffer sb = new StringBuffer();
288 288
289 write(ConstantExpression parent, 289 void write(ConstantExpression parent,
290 ConstantExpression child, 290 ConstantExpression child,
291 {bool leftAssociative: true}) { 291 {bool leftAssociative: true}) {
292 if (child.precedence < parent.precedence || 292 if (child.precedence < parent.precedence ||
293 !leftAssociative && child.precedence == parent.precedence) { 293 !leftAssociative && child.precedence == parent.precedence) {
294 sb.write('('); 294 sb.write('(');
295 child.accept(this); 295 child.accept(this);
296 sb.write(')'); 296 sb.write(')');
297 } else { 297 } else {
298 child.accept(this); 298 child.accept(this);
299 } 299 }
300 } 300 }
301 301
302 writeTypeArguments(InterfaceType type) { 302 void writeTypeArguments(InterfaceType type) {
303 if (type.treatAsRaw) return; 303 if (type.treatAsRaw) return;
304 sb.write('<'); 304 sb.write('<');
305 bool needsComma = false; 305 bool needsComma = false;
306 for (DartType value in type.typeArguments) { 306 for (DartType value in type.typeArguments) {
307 if (needsComma) { 307 if (needsComma) {
308 sb.write(', '); 308 sb.write(', ');
309 } 309 }
310 sb.write(value); 310 sb.write(value);
311 needsComma = true; 311 needsComma = true;
312 } 312 }
313 sb.write('>'); 313 sb.write('>');
314 } 314 }
315 315
316 visitPrimitive(PrimitiveConstantExpression exp, [_]) { 316 @override
317 void visit(ConstantExpression constant, [_]) {
318 return constant.accept(this, null);
319 }
320
321 @override
322 void visitPrimitive(PrimitiveConstantExpression exp, [_]) {
317 sb.write(exp.value.unparse()); 323 sb.write(exp.value.unparse());
318 } 324 }
319 325
320 visitList(ListConstantExpression exp, [_]) { 326 @override
327 void visitList(ListConstantExpression exp, [_]) {
321 sb.write('const '); 328 sb.write('const ');
322 writeTypeArguments(exp.type); 329 writeTypeArguments(exp.type);
323 sb.write('['); 330 sb.write('[');
324 bool needsComma = false; 331 bool needsComma = false;
325 for (ConstantExpression value in exp.values) { 332 for (ConstantExpression value in exp.values) {
326 if (needsComma) { 333 if (needsComma) {
327 sb.write(', '); 334 sb.write(', ');
328 } 335 }
329 visit(value); 336 visit(value);
330 needsComma = true; 337 needsComma = true;
331 } 338 }
332 sb.write(']'); 339 sb.write(']');
333 } 340 }
334 341
335 visitMap(MapConstantExpression exp, [_]) { 342 @override
343 void visitMap(MapConstantExpression exp, [_]) {
336 sb.write('const '); 344 sb.write('const ');
337 writeTypeArguments(exp.type); 345 writeTypeArguments(exp.type);
338 sb.write('{'); 346 sb.write('{');
339 for (int index = 0; index < exp.keys.length; index++) { 347 for (int index = 0; index < exp.keys.length; index++) {
340 if (index > 0) { 348 if (index > 0) {
341 sb.write(', '); 349 sb.write(', ');
342 } 350 }
343 visit(exp.keys[index]); 351 visit(exp.keys[index]);
344 sb.write(': '); 352 sb.write(': ');
345 visit(exp.values[index]); 353 visit(exp.values[index]);
346 } 354 }
347 sb.write('}'); 355 sb.write('}');
348 } 356 }
349 357
350 visitConstructed(ConstructedConstantExpresssion exp, [_]) { 358 @override
359 void visitConstructed(ConstructedConstantExpresssion exp, [_]) {
351 sb.write('const '); 360 sb.write('const ');
352 sb.write(exp.target.enclosingClass.name); 361 sb.write(exp.target.enclosingClass.name);
353 if (exp.target.name != '') { 362 if (exp.target.name != '') {
354 sb.write('.'); 363 sb.write('.');
355 sb.write(exp.target.name); 364 sb.write(exp.target.name);
356 } 365 }
357 writeTypeArguments(exp.type); 366 writeTypeArguments(exp.type);
358 sb.write('('); 367 sb.write('(');
359 bool needsComma = false; 368 bool needsComma = false;
360 369
(...skipping 10 matching lines...) Expand all
371 sb.write(', '); 380 sb.write(', ');
372 } 381 }
373 sb.write(exp.selector.namedArguments[index]); 382 sb.write(exp.selector.namedArguments[index]);
374 sb.write(': '); 383 sb.write(': ');
375 visit(exp.arguments[namedOffset + index]); 384 visit(exp.arguments[namedOffset + index]);
376 needsComma = true; 385 needsComma = true;
377 } 386 }
378 sb.write(')'); 387 sb.write(')');
379 } 388 }
380 389
381 visitConcatenate(ConcatenateConstantExpression exp, [_]) { 390 @override
391 void visitConcatenate(ConcatenateConstantExpression exp, [_]) {
382 sb.write(exp.value.unparse()); 392 sb.write(exp.value.unparse());
383 } 393 }
384 394
385 visitSymbol(SymbolConstantExpression exp, [_]) { 395 @override
396 void visitSymbol(SymbolConstantExpression exp, [_]) {
386 sb.write('#'); 397 sb.write('#');
387 sb.write(exp.name); 398 sb.write(exp.name);
388 } 399 }
389 400
390 visitType(TypeConstantExpression exp, [_]) { 401 @override
402 void visitType(TypeConstantExpression exp, [_]) {
391 sb.write(exp.type.name); 403 sb.write(exp.type.name);
392 } 404 }
393 405
394 visitVariable(VariableConstantExpression exp, [_]) { 406 @override
407 void visitVariable(VariableConstantExpression exp, [_]) {
395 if (exp.element.isStatic) { 408 if (exp.element.isStatic) {
396 sb.write(exp.element.enclosingClass.name); 409 sb.write(exp.element.enclosingClass.name);
397 sb.write('.'); 410 sb.write('.');
398 } 411 }
399 sb.write(exp.element.name); 412 sb.write(exp.element.name);
400 } 413 }
401 414
402 visitFunction(FunctionConstantExpression exp, [_]) { 415 @override
416 void visitFunction(FunctionConstantExpression exp, [_]) {
403 if (exp.element.isStatic) { 417 if (exp.element.isStatic) {
404 sb.write(exp.element.enclosingClass.name); 418 sb.write(exp.element.enclosingClass.name);
405 sb.write('.'); 419 sb.write('.');
406 } 420 }
407 sb.write(exp.element.name); 421 sb.write(exp.element.name);
408 } 422 }
409 423
410 visitBinary(BinaryConstantExpression exp, [_]) { 424 @override
425 void visitBinary(BinaryConstantExpression exp, [_]) {
411 if (exp.operator == 'identical') { 426 if (exp.operator == 'identical') {
412 sb.write('identical('); 427 sb.write('identical(');
413 visit(exp.left); 428 visit(exp.left);
414 sb.write(', '); 429 sb.write(', ');
415 visit(exp.right); 430 visit(exp.right);
416 sb.write(')'); 431 sb.write(')');
417 } else { 432 } else {
418 write(exp, exp.left); 433 write(exp, exp.left);
419 sb.write(' '); 434 sb.write(' ');
420 sb.write(exp.operator); 435 sb.write(exp.operator);
421 sb.write(' '); 436 sb.write(' ');
422 write(exp, exp.right); 437 write(exp, exp.right);
423 } 438 }
424 } 439 }
425 440
426 visitUnary(UnaryConstantExpression exp, [_]) { 441 @override
442 void visitUnary(UnaryConstantExpression exp, [_]) {
427 sb.write(exp.operator); 443 sb.write(exp.operator);
428 write(exp, exp.expression); 444 write(exp, exp.expression);
429 } 445 }
430 446
431 visitConditional(ConditionalConstantExpression exp, [_]) { 447 @override
448 void visitConditional(ConditionalConstantExpression exp, [_]) {
432 write(exp, exp.condition, leftAssociative: false); 449 write(exp, exp.condition, leftAssociative: false);
433 sb.write(' ? '); 450 sb.write(' ? ');
434 write(exp, exp.trueExp); 451 write(exp, exp.trueExp);
435 sb.write(' : '); 452 sb.write(' : ');
436 write(exp, exp.falseExp); 453 write(exp, exp.falseExp);
437 } 454 }
438 455
439 String toString() => sb.toString(); 456 String toString() => sb.toString();
440 } 457 }
OLDNEW
« no previous file with comments | « no previous file | pkg/compiler/lib/src/dart_backend/backend_ast_emitter.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698