diff --git a/pkg/dev_compiler/lib/src/compiler/code_generator.dart b/pkg/dev_compiler/lib/src/compiler/code_generator.dart index 48379069525..4938b1a2d5b 100644 --- a/pkg/dev_compiler/lib/src/compiler/code_generator.dart +++ b/pkg/dev_compiler/lib/src/compiler/code_generator.dart @@ -217,7 +217,10 @@ class CodeGenerator extends GeneralizingAstVisitor true) .forEach(assembler.addLinkedLibrary); - return assembler.assemble().toBuffer(); + var bundle = assembler.assemble(); + // Preserve only API-level information in the summary. + bundle.flushInformative(); + return bundle.toBuffer(); } JS.Program _emitModule(List compilationUnits) { diff --git a/pkg/dev_compiler/lib/src/compiler/command.dart b/pkg/dev_compiler/lib/src/compiler/command.dart index eff733c6e4a..352fb0880cb 100644 --- a/pkg/dev_compiler/lib/src/compiler/command.dart +++ b/pkg/dev_compiler/lib/src/compiler/command.dart @@ -81,6 +81,15 @@ $stackTrace } } +bool _changed(List list1, List list2) { + var length = list1.length; + if (length != list2.length) return true; + for (var i = 0; i < length; ++i) { + if (list1[i] != list2[i]) return true; + } + return false; +} + void _compile(ArgResults argResults, void printFn(Object obj)) { var compiler = new ModuleCompiler(new AnalyzerOptions.fromArguments(argResults)); @@ -150,7 +159,13 @@ void _compile(ArgResults argResults, void printFn(Object obj)) { if (module.summaryBytes != null) { var summaryPath = path.withoutExtension(outPath) + '.${compilerOpts.summaryExtension}'; - new File(summaryPath).writeAsBytesSync(module.summaryBytes); + // Only overwrite if summary changed. This plays better with timestamp + // based build systems. + var file = new File(summaryPath); + if (!file.existsSync() || + _changed(file.readAsBytesSync(), module.summaryBytes)) { + file.writeAsBytesSync(module.summaryBytes); + } } } }