| Index: lib/src/codegen/side_effect_analysis.dart | 
| diff --git a/lib/src/codegen/side_effect_analysis.dart b/lib/src/codegen/side_effect_analysis.dart | 
| index cdf8e7939a358a1f9b5c7bb2d7f11865e79376a5..6ae46d83f4fcf0edd531288ecfa359321036ccfa 100644 | 
| --- a/lib/src/codegen/side_effect_analysis.dart | 
| +++ b/lib/src/codegen/side_effect_analysis.dart | 
| @@ -5,7 +5,11 @@ | 
| library dev_compiler.src.codegen.side_effect_analysis; | 
|  | 
| import 'package:analyzer/src/generated/ast.dart'; | 
| +import 'package:analyzer/src/generated/constant.dart'; | 
| import 'package:analyzer/src/generated/element.dart'; | 
| +import 'package:analyzer/src/generated/error.dart' show ErrorReporter; | 
| +import 'package:analyzer/src/generated/engine.dart' show RecordingErrorListener; | 
| +import 'package:analyzer/src/generated/resolver.dart' show TypeProvider; | 
|  | 
| /// True is the expression can be evaluated multiple times without causing | 
| /// code execution. This is true for final fields. This can be true for local | 
| @@ -86,3 +90,34 @@ class _AssignmentFinder extends RecursiveAstVisitor { | 
| } | 
| } | 
| } | 
| + | 
| +class ConstFieldVisitor { | 
| +  final ConstantVisitor _constantVisitor; | 
| + | 
| +  ConstFieldVisitor(TypeProvider types, CompilationUnit unit) | 
| +      : _constantVisitor = new ConstantVisitor.con1(types, | 
| +          new ErrorReporter(new RecordingErrorListener(), unit.element.source)); | 
| + | 
| +  // TODO(jmesserly): this is used to determine if the field initialization is | 
| +  // side effect free. We should make the check more general, as things like | 
| +  // list/map literals/regexp are also side effect free and fairly common | 
| +  // to use as field initializers. | 
| +  bool isFieldInitConstant(VariableDeclaration field) => | 
| +      field.initializer == null || computeConstant(field) != null; | 
| + | 
| +  DartObjectImpl computeConstant(VariableDeclaration field) { | 
| +    // If the constant is already computed by ConstantEvaluator, just return it. | 
| +    VariableElementImpl element = field.element; | 
| +    var result = element.evaluationResult; | 
| +    if (result != null) return result.value; | 
| + | 
| +    // ConstantEvaluator will not compute constants for non-const fields, | 
| +    // so run ConstantVisitor for those to figure out if the initializer is | 
| +    // actually a constant (and therefore side effect free to evaluate). | 
| +    assert(!field.isConst); | 
| + | 
| +    var initializer = field.initializer; | 
| +    if (initializer == null) return null; | 
| +    return initializer.accept(_constantVisitor); | 
| +  } | 
| +} | 
|  |