From dd553ef671f1a17ce1e7dfedb5d6ae5658ff814e Mon Sep 17 00:00:00 2001 From: Zalim Bashorov Date: Thu, 3 Oct 2013 15:50:38 +0400 Subject: [PATCH] JPS plugin: refactoring: - extract utility methods from KotlinBuilder; - use StringUtil#join instead for iteration; - add private constructor to LibraryUtils. --- .../org/jetbrains/jet/utils/LibraryUtils.java | 8 +- .../compiler/runner/KotlinCompilerRunner.java | 28 +++---- .../jet/jps/build/JpsJsModuleUtils.java | 73 +++++++++++++++++++ .../jps/build/{JpsUtil.java => JpsUtils.java} | 24 +++++- .../jet/jps/build/KotlinBuilder.java | 59 +-------------- .../KotlinBuilderModuleScriptGenerator.java | 2 +- 6 files changed, 113 insertions(+), 81 deletions(-) create mode 100644 jps-plugin/src/org/jetbrains/jet/jps/build/JpsJsModuleUtils.java rename jps-plugin/src/org/jetbrains/jet/jps/build/{JpsUtil.java => JpsUtils.java} (56%) diff --git a/compiler/util/src/org/jetbrains/jet/utils/LibraryUtils.java b/compiler/util/src/org/jetbrains/jet/utils/LibraryUtils.java index d07179155fe..971c5ed6221 100644 --- a/compiler/util/src/org/jetbrains/jet/utils/LibraryUtils.java +++ b/compiler/util/src/org/jetbrains/jet/utils/LibraryUtils.java @@ -32,6 +32,8 @@ public class LibraryUtils { public static final String TITLE_KOTLIN_RUNTIME_AND_STDLIB_SOURCES = "Kotlin Compiler Runtime + StdLib Sources"; public static final String TITLE_KOTLIN_JAVASCRIPT_STDLIB = "Kotlin JavaScript StdLib"; + private LibraryUtils() {} + @Nullable public static Manifest getManifestFromJar(@NotNull File library) { if (!library.canRead()) return null; @@ -45,9 +47,9 @@ public class LibraryUtils { jarFile.close(); } } - catch (IOException ignored) { } - - return null; + catch (IOException ignored) { + return null; + } } @Nullable diff --git a/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/KotlinCompilerRunner.java b/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/KotlinCompilerRunner.java index 787572ae457..3174bd34797 100644 --- a/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/KotlinCompilerRunner.java +++ b/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/KotlinCompilerRunner.java @@ -27,9 +27,7 @@ import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.Function; -import com.intellij.util.StringBuilderSpinAllocator; import com.intellij.util.SystemProperties; -import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.cli.common.messages.CompilerMessageLocation; import org.jetbrains.jet.cli.common.messages.CompilerMessageSeverity; import org.jetbrains.jet.cli.common.messages.MessageCollector; @@ -126,32 +124,26 @@ public class KotlinCompilerRunner { Collections.addAll(args, "-tags", "-verbose", "-version", "-sourcemap"); + String separator = ","; + String sourceFilesAsString = StringUtil.join(sourceFiles, new Function() { + @Override + public String fun(File file) { + return file.getPath(); + } + }, separator); + args.add("-sourceFiles"); - args.add(convertSourceFilesListToString(sourceFiles)); + args.add(sourceFilesAsString); args.add("-output"); args.add(outputFile.getPath()); args.add("-libraryFiles"); - args.add(StringUtil.join(libraryFiles, ",")); + args.add(StringUtil.join(libraryFiles, separator)); return ArrayUtil.toStringArray(args); } - @NotNull - private static String convertSourceFilesListToString(@NotNull List sourceFiles) { - StringBuilder sb = StringBuilderSpinAllocator.alloc(); - - for (File file : sourceFiles) { - sb.append(file.getPath()).append(','); - } - String result = sb.substring(0, sb.length() - 1); - - StringBuilderSpinAllocator.dispose(sb); - - return result; - } - private static void runOutOfProcess( String compilerClassName, String[] arguments, diff --git a/jps-plugin/src/org/jetbrains/jet/jps/build/JpsJsModuleUtils.java b/jps-plugin/src/org/jetbrains/jet/jps/build/JpsJsModuleUtils.java new file mode 100644 index 00000000000..e1ece25113a --- /dev/null +++ b/jps-plugin/src/org/jetbrains/jet/jps/build/JpsJsModuleUtils.java @@ -0,0 +1,73 @@ +/* + * Copyright 2010-2013 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.jps.build; + +import com.intellij.util.Consumer; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.utils.LibraryUtils; +import org.jetbrains.jps.incremental.ModuleBuildTarget; +import org.jetbrains.jps.model.java.JavaSourceRootType; +import org.jetbrains.jps.model.java.JpsJavaModuleType; +import org.jetbrains.jps.model.library.JpsLibrary; +import org.jetbrains.jps.model.library.JpsLibraryRoot; +import org.jetbrains.jps.model.library.JpsOrderRootType; +import org.jetbrains.jps.model.module.JpsModule; +import org.jetbrains.jps.model.module.JpsModuleSourceRoot; +import org.jetbrains.jps.util.JpsPathUtil; + +import java.util.HashSet; +import java.util.Set; + +class JpsJsModuleUtils { + private JpsJsModuleUtils() {} + + @NotNull + static Set getLibraryFilesAndDependencies(@NotNull ModuleBuildTarget target) { + Set result = new HashSet(); + getLibraryFiles(target, result); + getDependencyModulesAndSources(target, result); + return result; + } + + static void getLibraryFiles(@NotNull ModuleBuildTarget target, @NotNull Set result) { + Set libraries = JpsUtils.getAllDependencies(target).getLibraries(); + for (JpsLibrary library : libraries) { + for (JpsLibraryRoot root : library.getRoots(JpsOrderRootType.COMPILED)) { + String path = JpsPathUtil.urlToOsPath(root.getUrl()); + // TODO: Do we need to add to dependency all libraries? + if (LibraryUtils.isJsRuntimeLibrary(JpsPathUtil.urlToFile(path))) { + result.add(path); + } + } + } + } + + static void getDependencyModulesAndSources(@NotNull final ModuleBuildTarget target, @NotNull final Set result) { + JpsUtils.getAllDependencies(target).processModules(new Consumer() { + @Override + public void consume(JpsModule module) { + if (module == target.getModule() || module.getModuleType() != JpsJavaModuleType.INSTANCE) return; + + result.add("@" + module.getName()); + + for (JpsModuleSourceRoot root : module.getSourceRoots(JavaSourceRootType.SOURCE)) { + result.add(JpsPathUtil.urlToOsPath(root.getUrl())); + } + } + }); + } +} \ No newline at end of file diff --git a/jps-plugin/src/org/jetbrains/jet/jps/build/JpsUtil.java b/jps-plugin/src/org/jetbrains/jet/jps/build/JpsUtils.java similarity index 56% rename from jps-plugin/src/org/jetbrains/jet/jps/build/JpsUtil.java rename to jps-plugin/src/org/jetbrains/jet/jps/build/JpsUtils.java index 3fa9a5d1947..81b980b07df 100644 --- a/jps-plugin/src/org/jetbrains/jet/jps/build/JpsUtil.java +++ b/jps-plugin/src/org/jetbrains/jet/jps/build/JpsUtils.java @@ -17,15 +17,35 @@ package org.jetbrains.jet.jps.build; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.utils.LibraryUtils; import org.jetbrains.jps.incremental.ModuleBuildTarget; import org.jetbrains.jps.model.java.JpsJavaClasspathKind; import org.jetbrains.jps.model.java.JpsJavaDependenciesEnumerator; import org.jetbrains.jps.model.java.JpsJavaExtensionService; +import org.jetbrains.jps.model.library.JpsLibrary; +import org.jetbrains.jps.model.library.JpsLibraryRoot; +import org.jetbrains.jps.model.library.JpsOrderRootType; +import org.jetbrains.jps.util.JpsPathUtil; + +import java.util.Set; + +class JpsUtils { + private JpsUtils() {} -public class JpsUtil { @NotNull - public static JpsJavaDependenciesEnumerator getAllDependencies(@NotNull ModuleBuildTarget target) { + static JpsJavaDependenciesEnumerator getAllDependencies(@NotNull ModuleBuildTarget target) { return JpsJavaExtensionService.dependencies(target.getModule()).recursively().exportedOnly() .includedIn(JpsJavaClasspathKind.compile(target.isTests())); } + + static boolean isJsKotlinModule(@NotNull ModuleBuildTarget target) { + Set libraries = getAllDependencies(target).getLibraries(); + for (JpsLibrary library : libraries) { + for (JpsLibraryRoot root : library.getRoots(JpsOrderRootType.COMPILED)) { + if (LibraryUtils.isJsRuntimeLibrary(JpsPathUtil.urlToFile(root.getUrl()))) + return true; + } + } + return false; + } } diff --git a/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilder.java b/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilder.java index 4d4680f9ea8..6b8f4db3769 100644 --- a/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilder.java +++ b/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilder.java @@ -17,7 +17,6 @@ package org.jetbrains.jet.jps.build; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.util.Consumer; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; @@ -26,7 +25,6 @@ import org.jetbrains.jet.cli.common.messages.CompilerMessageLocation; import org.jetbrains.jet.cli.common.messages.CompilerMessageSeverity; import org.jetbrains.jet.cli.common.messages.MessageCollector; import org.jetbrains.jet.compiler.runner.*; -import org.jetbrains.jet.utils.LibraryUtils; import org.jetbrains.jet.utils.PathUtil; import org.jetbrains.jps.ModuleChunk; import org.jetbrains.jps.builders.DirtyFilesHolder; @@ -35,14 +33,7 @@ import org.jetbrains.jps.incremental.*; import org.jetbrains.jps.incremental.java.JavaBuilder; import org.jetbrains.jps.incremental.messages.BuildMessage; import org.jetbrains.jps.incremental.messages.CompilerMessage; -import org.jetbrains.jps.model.java.JavaSourceRootType; -import org.jetbrains.jps.model.java.JpsJavaModuleType; -import org.jetbrains.jps.model.library.JpsLibrary; -import org.jetbrains.jps.model.library.JpsLibraryRoot; -import org.jetbrains.jps.model.library.JpsOrderRootType; import org.jetbrains.jps.model.module.JpsModule; -import org.jetbrains.jps.model.module.JpsModuleSourceRoot; -import org.jetbrains.jps.util.JpsPathUtil; import java.io.File; import java.io.IOException; @@ -126,7 +117,7 @@ public class KotlinBuilder extends ModuleLevelBuilder { OutputItemsCollectorImpl outputItemCollector = new OutputItemsCollectorImpl(outputDir); - if (isJsKotlinModule(representativeTarget)) { + if (JpsUtils.isJsKotlinModule(representativeTarget)) { File outputFile = new File(outputDir, representativeTarget.getModule().getName() + ".js"); KotlinCompilerRunner.runK2JsCompiler( @@ -134,7 +125,7 @@ public class KotlinBuilder extends ModuleLevelBuilder { environment, outputItemCollector, sourceFiles, - getLibraryFilesAndDependencies(representativeTarget), + JpsJsModuleUtils.getLibraryFilesAndDependencies(representativeTarget), outputFile); } else { @@ -229,50 +220,4 @@ public class KotlinBuilder extends ModuleLevelBuilder { public List getCompilableFileExtensions() { return COMPILABLE_FILE_EXTENSIONS; } - - private static boolean isJsKotlinModule(@NotNull ModuleBuildTarget target) { - Set libraries = JpsUtil.getAllDependencies(target).getLibraries(); - for (JpsLibrary library : libraries) { - for (JpsLibraryRoot root : library.getRoots(JpsOrderRootType.COMPILED)) { - if (LibraryUtils.isJsRuntimeLibrary(JpsPathUtil.urlToFile(root.getUrl()))) - return true; - } - } - return false; - } - - @NotNull - private static Set getLibraryFilesAndDependencies(@NotNull ModuleBuildTarget target) { - Set result = new HashSet(); - getLibraryPaths(target, result); - getDependencyModulesAndSources(target, result); - return result; - } - - private static void getLibraryPaths(@NotNull ModuleBuildTarget target, Set result) { - Set libraries = JpsUtil.getAllDependencies(target).getLibraries(); - for (JpsLibrary library : libraries) { - for (JpsLibraryRoot root : library.getRoots(JpsOrderRootType.COMPILED)) { - String path = JpsPathUtil.urlToOsPath(root.getUrl()); - if (path.endsWith(PathUtil.JS_LIB_JAR_NAME)) { - result.add(path); - } - } - } - } - - private static void getDependencyModulesAndSources(@NotNull final ModuleBuildTarget target, final Set result) { - JpsUtil.getAllDependencies(target).processModules(new Consumer() { - @Override - public void consume(JpsModule module) { - if (module == target.getModule() || module.getModuleType() != JpsJavaModuleType.INSTANCE) return; - - result.add("@" + module.getName()); - - for (JpsModuleSourceRoot root : module.getSourceRoots(JavaSourceRootType.SOURCE)) { - result.add(JpsPathUtil.urlToOsPath(root.getUrl())); - } - } - }); - } } diff --git a/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilderModuleScriptGenerator.java b/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilderModuleScriptGenerator.java index 34a967fb3c5..f5da7b33997 100644 --- a/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilderModuleScriptGenerator.java +++ b/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilderModuleScriptGenerator.java @@ -43,7 +43,7 @@ import java.util.Collections; import java.util.List; import static org.jetbrains.jet.compiler.runner.KotlinModuleDescriptionGenerator.DependencyProvider; -import static org.jetbrains.jet.jps.build.JpsUtil.getAllDependencies; +import static org.jetbrains.jet.jps.build.JpsUtils.getAllDependencies; public class KotlinBuilderModuleScriptGenerator {