fix KT-9441 Unable to Access Internal Classes from Test Code within Same Module

#KT-9441 Fixed
This commit is contained in:
Michael Nedzelsky
2015-10-23 12:48:11 +03:00
parent 395c0f12b1
commit 190bab099c
16 changed files with 325 additions and 12 deletions
@@ -47,7 +47,12 @@ class ModuleVisibilityHelperImpl : ModuleVisibilityHelper {
val whatSource = getSourceElement(what)
if (whatSource is KotlinSourceElement) return true
val modules = moduleVisibilityManager.chunk.toList()
moduleVisibilityManager.friendPaths.forEach {
if (isContainedByCompiledPartOfOurModule(what, File(it))) return true
}
val modules = moduleVisibilityManager.chunk
val outputDirectories = modules.map { File(it.getOutputDirectory()) }
if (outputDirectories.isEmpty()) return isContainedByCompiledPartOfOurModule(what, null)
@@ -56,7 +61,7 @@ class ModuleVisibilityHelperImpl : ModuleVisibilityHelper {
}
// Hack in order to allow access to internal elements in production code from tests
if (modules.size() == 1 && modules[0].getModuleType() == ModuleXmlParser.TYPE_TEST) return true
if (modules.singleOrNull()?.getModuleType() == ModuleXmlParser.TYPE_TEST) return true
return false
}
@@ -68,11 +73,16 @@ class ModuleVisibilityHelperImpl : ModuleVisibilityHelper {
*/
class CliModuleVisibilityManagerImpl() : ModuleVisibilityManager, Disposable {
override val chunk: MutableList<Module> = arrayListOf()
override val friendPaths: MutableList <String> = arrayListOf()
override fun addModule(module: Module) {
chunk.add(module)
}
override fun addFriendPath(path: String) {
friendPaths.add(path)
}
override fun dispose() {
chunk.clear()
}
@@ -21,9 +21,7 @@ import com.intellij.openapi.Disposable
import org.jetbrains.kotlin.cli.common.CLICompiler
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
import org.jetbrains.kotlin.cli.common.ExitCode
import org.jetbrains.kotlin.cli.common.ExitCode.COMPILATION_ERROR
import org.jetbrains.kotlin.cli.common.ExitCode.INTERNAL_ERROR
import org.jetbrains.kotlin.cli.common.ExitCode.OK
import org.jetbrains.kotlin.cli.common.ExitCode.*
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
import org.jetbrains.kotlin.cli.common.messages.*
import org.jetbrains.kotlin.cli.jvm.compiler.*
@@ -154,6 +152,8 @@ public open class K2JVMCompiler : CLICompiler<K2JVMCompilerArguments>() {
}
val environment: KotlinCoreEnvironment
val friendPaths = arguments.friendPaths?.toList() ?: emptyList<String>()
if (arguments.module != null) {
val sanitizedCollector = FilteringMessageCollector(messageSeverityCollector, `in`(CompilerMessageSeverity.VERBOSE))
val moduleScript = CompileEnvironmentUtil.loadModuleDescriptions(arguments.module, sanitizedCollector)
@@ -169,7 +169,7 @@ public open class K2JVMCompiler : CLICompiler<K2JVMCompilerArguments>() {
if (messageSeverityCollector.anyReported(CompilerMessageSeverity.ERROR)) return COMPILATION_ERROR
KotlinToJVMBytecodeCompiler.compileModules(environment, configuration, moduleScript.getModules(), directory, jar, arguments.includeRuntime)
KotlinToJVMBytecodeCompiler.compileModules(environment, configuration, moduleScript.getModules(), directory, jar, friendPaths, arguments.includeRuntime)
}
else if (arguments.script) {
val scriptArgs = arguments.freeArgs.subList(1, arguments.freeArgs.size())
@@ -189,7 +189,7 @@ public open class K2JVMCompiler : CLICompiler<K2JVMCompilerArguments>() {
return COMPILATION_ERROR
}
KotlinToJVMBytecodeCompiler.compileBunchOfSources(environment, jar, outputDir, arguments.includeRuntime)
KotlinToJVMBytecodeCompiler.compileBunchOfSources(environment, jar, outputDir, friendPaths, arguments.includeRuntime)
}
if (arguments.reportPerf) {
@@ -114,14 +114,21 @@ public class KotlinToJVMBytecodeCompiler {
@NotNull List<Module> chunk,
@NotNull File directory,
@Nullable File jarPath,
@NotNull List<String> friendPaths,
boolean jarRuntime
) {
Map<Module, ClassFileFactory> outputFiles = Maps.newHashMap();
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled();
ModuleVisibilityManager moduleVisibilityManager = ModuleVisibilityManager.SERVICE.getInstance(environment.getProject());
for (Module module: chunk) {
ModuleVisibilityManager.SERVICE.getInstance(environment.getProject()).addModule(module);
moduleVisibilityManager.addModule(module);
}
for (String path : friendPaths) {
moduleVisibilityManager.addFriendPath(path);
}
String targetDescription = "in targets [" + Joiner.on(", ").join(Collections2.transform(chunk, new Function<Module, String>() {
@@ -215,9 +222,16 @@ public class KotlinToJVMBytecodeCompiler {
@NotNull KotlinCoreEnvironment environment,
@Nullable File jar,
@Nullable File outputDir,
@NotNull List<String> friendPaths,
boolean includeRuntime
) {
ModuleVisibilityManager moduleVisibilityManager = ModuleVisibilityManager.SERVICE.getInstance(environment.getProject());
for (String path : friendPaths) {
moduleVisibilityManager.addFriendPath(path);
}
GenerationState generationState = analyzeAndGenerate(environment);
if (generationState == null) {
return false;