Refactor compiler source root duplicate check

This commit is contained in:
Alexander Udalov
2015-01-27 18:37:20 +03:00
parent 93f02aeead
commit 7e988b04b4
7 changed files with 39 additions and 43 deletions
@@ -45,10 +45,10 @@ import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity;
import org.jetbrains.kotlin.cli.common.messages.MessageCollector;
import org.jetbrains.kotlin.cli.common.output.outputUtils.OutputUtilsPackage;
import org.jetbrains.kotlin.cli.jvm.JVMConfigurationKeys;
import org.jetbrains.kotlin.cli.jvm.compiler.CompileEnvironmentUtil;
import org.jetbrains.kotlin.cli.jvm.compiler.CompilerJarLocator;
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles;
import org.jetbrains.kotlin.cli.jvm.compiler.JetCoreEnvironment;
import org.jetbrains.kotlin.config.CommonConfigurationKeys;
import org.jetbrains.kotlin.config.CompilerConfiguration;
import org.jetbrains.kotlin.config.Services;
import org.jetbrains.kotlin.js.analyze.TopDownAnalyzerFacadeForJS;
@@ -103,7 +103,7 @@ public class K2JSCompiler extends CLICompiler<K2JSCompilerArguments> {
configuration.put(JVMConfigurationKeys.COMPILER_JAR_LOCATOR, locator);
}
CompileEnvironmentUtil.addSourceFilesCheckingForDuplicates(configuration, arguments.freeArgs);
configuration.addAll(CommonConfigurationKeys.SOURCE_ROOTS_KEY, arguments.freeArgs);
JetCoreEnvironment environmentForJS =
JetCoreEnvironment.createForProduction(rootDisposable, configuration, EnvironmentConfigFiles.JS_CONFIG_FILES);
@@ -99,7 +99,7 @@ public class K2JVMCompiler extends CLICompiler<K2JVMCompilerArguments> {
configuration.add(CommonConfigurationKeys.SOURCE_ROOTS_KEY, arguments.freeArgs.get(0));
}
else if (arguments.module == null) {
CompileEnvironmentUtil.addSourceFilesCheckingForDuplicates(configuration, arguments.freeArgs);
configuration.addAll(CommonConfigurationKeys.SOURCE_ROOTS_KEY, arguments.freeArgs);
// Adding all directory sources to classpath to resolve Java symbols from Kotlin
for (String source : arguments.freeArgs) {
@@ -64,6 +64,7 @@ import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.jar.*;
@@ -271,7 +272,7 @@ public class CompileEnvironmentUtil {
@NotNull
public static List<JetFile> getJetFiles(
@NotNull final Project project,
@NotNull List<String> sourceRoots,
@NotNull Collection<String> sourceRoots,
@NotNull Function1<String, Unit> reportError
) {
final VirtualFileSystem localFileSystem = VirtualFileManager.getInstance().getFileSystem(StandardFileSystems.FILE_PROTOCOL);
@@ -314,23 +315,4 @@ public class CompileEnvironmentUtil {
return result;
}
public static void addSourceFilesCheckingForDuplicates(@NotNull CompilerConfiguration configuration, @NotNull List<String> sourceRoots) {
MessageCollector messageCollector = configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY);
assert messageCollector != null : "messageCollector should be set: " + configuration;
Set<String> uniqueSourceRoots = Sets.newLinkedHashSet();
for (String sourceRoot : sourceRoots) {
if (!uniqueSourceRoots.add(sourceRoot)) {
messageCollector.report(
CompilerMessageSeverity.WARNING,
"Duplicate source roots: " + sourceRoot,
NO_LOCATION
);
}
}
configuration.put(CommonConfigurationKeys.SOURCE_ROOTS_KEY, new ArrayList<String>(uniqueSourceRoots));
}
}
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.cli.jvm.compiler;
import com.google.common.collect.Sets;
import com.intellij.codeInsight.ExternalAnnotationsManager;
import com.intellij.core.CoreApplicationEnvironment;
import com.intellij.core.CoreJavaFileManager;
@@ -62,9 +63,7 @@ import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProviderFactory
import org.jetbrains.kotlin.utils.PathUtil;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.*;
import static org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.ERROR;
import static org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.WARNING;
@@ -231,17 +230,22 @@ public class JetCoreEnvironment {
addExternalAnnotationsRoot(path);
}
sourceFiles.addAll(
CompileEnvironmentUtil
.getJetFiles(getProject(), configuration.getList(CommonConfigurationKeys.SOURCE_ROOTS_KEY),
new Function1<String, Unit>() {
@Override
public Unit invoke(String s) {
report(ERROR, s);
return Unit.INSTANCE$;
}
}));
CompileEnvironmentUtil.getJetFiles(
getProject(),
getSourceRootsCheckingForDuplicates(),
new Function1<String, Unit>() {
@Override
public Unit invoke(String s) {
report(ERROR, s);
return Unit.INSTANCE$;
}
}
)
);
JetScriptDefinitionProvider.getInstance(project).addScriptDefinitions(
configuration.getList(CommonConfigurationKeys.SCRIPT_DEFINITIONS_KEY));
configuration.getList(CommonConfigurationKeys.SCRIPT_DEFINITIONS_KEY)
);
project.registerService(VirtualFileFinderFactory.class, new CliVirtualFileFinderFactory(classPath));
}
@@ -315,6 +319,19 @@ public class JetCoreEnvironment {
}
}
@NotNull
private Collection<String> getSourceRootsCheckingForDuplicates() {
Set<String> uniqueSourceRoots = Sets.newLinkedHashSet();
for (String sourceRoot : configuration.getList(CommonConfigurationKeys.SOURCE_ROOTS_KEY)) {
if (!uniqueSourceRoots.add(sourceRoot)) {
report(WARNING, "Duplicate source root: " + sourceRoot);
}
}
return uniqueSourceRoots;
}
@NotNull
public List<JetFile> getSourceFiles() {
return sourceFiles;
@@ -41,6 +41,7 @@ import org.jetbrains.kotlin.cli.jvm.JVMConfigurationKeys;
import org.jetbrains.kotlin.codegen.*;
import org.jetbrains.kotlin.codegen.state.GenerationState;
import org.jetbrains.kotlin.codegen.state.Progress;
import org.jetbrains.kotlin.config.CommonConfigurationKeys;
import org.jetbrains.kotlin.config.CompilerConfiguration;
import org.jetbrains.kotlin.context.ContextPackage;
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl;
@@ -161,10 +162,8 @@ public class KotlinToJVMBytecodeCompiler {
) {
CompilerConfiguration configuration = base.copy();
List<String> sourceRoots = Lists.newArrayList();
for (Module module : chunk) {
sourceRoots.addAll(getAbsolutePaths(directory, module));
configuration.addAll(CommonConfigurationKeys.SOURCE_ROOTS_KEY, getAbsolutePaths(directory, module));
for (String classpathRoot : module.getClasspathRoots()) {
configuration.add(JVMConfigurationKeys.CLASSPATH_KEY, new File(classpathRoot));
@@ -177,8 +176,6 @@ public class KotlinToJVMBytecodeCompiler {
configuration.add(JVMConfigurationKeys.MODULE_IDS, module.getModuleName());
}
CompileEnvironmentUtil.addSourceFilesCheckingForDuplicates(configuration, sourceRoots);
return configuration;
}