JPS plugin: refactoring:

- extract utility methods from KotlinBuilder;
- use StringUtil#join instead for iteration;
- add private constructor to LibraryUtils.
This commit is contained in:
Zalim Bashorov
2013-10-03 15:50:38 +04:00
parent 9d7968457f
commit dd553ef671
6 changed files with 113 additions and 81 deletions
@@ -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
@@ -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<File, String>() {
@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<File> 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,
@@ -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<String> getLibraryFilesAndDependencies(@NotNull ModuleBuildTarget target) {
Set<String> result = new HashSet<String>();
getLibraryFiles(target, result);
getDependencyModulesAndSources(target, result);
return result;
}
static void getLibraryFiles(@NotNull ModuleBuildTarget target, @NotNull Set<String> result) {
Set<JpsLibrary> 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<String> result) {
JpsUtils.getAllDependencies(target).processModules(new Consumer<JpsModule>() {
@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()));
}
}
});
}
}
@@ -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<JpsLibrary> 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;
}
}
@@ -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<String> getCompilableFileExtensions() {
return COMPILABLE_FILE_EXTENSIONS;
}
private static boolean isJsKotlinModule(@NotNull ModuleBuildTarget target) {
Set<JpsLibrary> 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<String> getLibraryFilesAndDependencies(@NotNull ModuleBuildTarget target) {
Set<String> result = new HashSet<String>();
getLibraryPaths(target, result);
getDependencyModulesAndSources(target, result);
return result;
}
private static void getLibraryPaths(@NotNull ModuleBuildTarget target, Set<String> result) {
Set<JpsLibrary> 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<String> result) {
JpsUtil.getAllDependencies(target).processModules(new Consumer<JpsModule>() {
@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()));
}
}
});
}
}
@@ -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 {