From 5ee5c841cb675821318774b6aa458ef28a6fcc51 Mon Sep 17 00:00:00 2001 From: Leonid Shalupov Date: Thu, 28 Mar 2013 20:34:37 +0400 Subject: [PATCH] generators: don't write to files if content is not changed --- .../jvm/GenerateJavaToKotlinMethodMap.java | 10 ++-- .../jet/di/DependencyInjectorGenerator.java | 26 +-------- .../jetbrains/jet/di/GeneratorsFileUtil.java | 54 +++++++++++++++++++ 3 files changed, 58 insertions(+), 32 deletions(-) create mode 100644 injector-generator/src/org/jetbrains/jet/di/GeneratorsFileUtil.java diff --git a/generators/org/jetbrains/jet/generators/jvm/GenerateJavaToKotlinMethodMap.java b/generators/org/jetbrains/jet/generators/jvm/GenerateJavaToKotlinMethodMap.java index b4080750d68..933ef159530 100644 --- a/generators/org/jetbrains/jet/generators/jvm/GenerateJavaToKotlinMethodMap.java +++ b/generators/org/jetbrains/jet/generators/jvm/GenerateJavaToKotlinMethodMap.java @@ -30,6 +30,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.cli.jvm.compiler.CompileEnvironmentUtil; import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment; import org.jetbrains.jet.config.CompilerConfiguration; +import org.jetbrains.jet.di.GeneratorsFileUtil; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; @@ -41,7 +42,6 @@ import org.jetbrains.jet.utils.PathUtil; import org.jetbrains.jet.utils.Printer; import java.io.File; -import java.io.FileWriter; import java.io.IOException; import java.util.Collections; import java.util.Comparator; @@ -88,12 +88,8 @@ public class GenerateJavaToKotlinMethodMap { printer.popIndent().println("}"); printer.popIndent().println("}"); - //noinspection IOResourceOpenedButNotSafelyClosed - FileWriter out = - new FileWriter("compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaToKotlinMethodMapGenerated.java"); - - out.write(buf.toString()); - out.close(); + File file = new File("compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaToKotlinMethodMapGenerated.java"); + GeneratorsFileUtil.writeFileIfContentChanged(file, buf.toString()); } private static class MyMapBuilder extends JavaToKotlinClassMapBuilder { diff --git a/injector-generator/src/org/jetbrains/jet/di/DependencyInjectorGenerator.java b/injector-generator/src/org/jetbrains/jet/di/DependencyInjectorGenerator.java index 4ab2e68edcf..9167b759ed7 100644 --- a/injector-generator/src/org/jetbrains/jet/di/DependencyInjectorGenerator.java +++ b/injector-generator/src/org/jetbrains/jet/di/DependencyInjectorGenerator.java @@ -19,7 +19,6 @@ package org.jetbrains.jet.di; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; -import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -53,21 +52,6 @@ public class DependencyInjectorGenerator { File file = new File(outputFileName); - // Windows prohibits rename of open files by default. - // http://teamcity.jetbrains.com/viewLog.html?buildId=62376&buildTypeId=bt345&tab=buildLog - boolean useTmpfile = !SystemInfo.isWindows; - - File tmpfile = useTmpfile ? new File(outputFileName + ".tmp") : file; - File parentFile = file.getParentFile(); - if (!parentFile.exists()) { - if (parentFile.mkdirs()) { - System.out.println("Directory created: " + parentFile.getAbsolutePath()); - } - else { - throw new IllegalStateException("Cannot create directory: " + parentFile); - } - } - fields.addAll(dependencies.satisfyDependencies()); @@ -105,15 +89,7 @@ public class DependencyInjectorGenerator { text.append(imports); text.append(body); - FileUtil.writeToFile(tmpfile, text.toString()); - System.out.println("File written: " + tmpfile.getAbsolutePath()); - if (useTmpfile) { - if (!tmpfile.renameTo(file)) { - throw new RuntimeException("failed to rename " + tmpfile + " to " + file); - } - System.out.println("Renamed " + tmpfile + " to " + file); - } - System.out.println(); + GeneratorsFileUtil.writeFileIfContentChanged(file, text.toString()); } private void generatePreamble(String injectorPackageName, Printer p) throws IOException { diff --git a/injector-generator/src/org/jetbrains/jet/di/GeneratorsFileUtil.java b/injector-generator/src/org/jetbrains/jet/di/GeneratorsFileUtil.java new file mode 100644 index 00000000000..c55ceb259a6 --- /dev/null +++ b/injector-generator/src/org/jetbrains/jet/di/GeneratorsFileUtil.java @@ -0,0 +1,54 @@ +package org.jetbrains.jet.di; + +import com.intellij.openapi.util.SystemInfo; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.util.text.StringUtil; + +import java.io.File; +import java.io.IOException; + +public class GeneratorsFileUtil { + @SuppressWarnings("UseOfSystemOutOrSystemErr") + public static void writeFileIfContentChanged(File file, String newText) throws IOException { + File parentFile = file.getParentFile(); + if (!parentFile.exists()) { + if (parentFile.mkdirs()) { + System.out.println("Directory created: " + parentFile.getAbsolutePath()); + } + else { + throw new IllegalStateException("Cannot create directory: " + parentFile); + } + } + + if (checkFileIgnoringLineSeparators(file, newText)) { + System.out.println("Not changed: " + file.getAbsolutePath()); + return; + } + + boolean useTmpfile = !SystemInfo.isWindows; + + File tmpfile = useTmpfile ? new File(file.getName() + ".tmp") : file; + + FileUtil.writeToFile(tmpfile, newText); + System.out.println("File written: " + tmpfile.getAbsolutePath()); + if (useTmpfile) { + if (!tmpfile.renameTo(file)) { + throw new RuntimeException("failed to rename " + tmpfile + " to " + file); + } + System.out.println("Renamed " + tmpfile + " to " + file); + } + System.out.println(); + } + + private static boolean checkFileIgnoringLineSeparators(File file, String content) { + String currentContent; + try { + currentContent = FileUtil.loadFile(file, true); + } + catch (Throwable ignored) { + return false; + } + + return StringUtil.convertLineSeparators(content).equals(currentContent); + } +}