diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt index 0762f6bfee2..be25751ee3d 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt @@ -139,6 +139,10 @@ class K2JVMCompiler : CLICompiler() { ?: return COMPILATION_ERROR val scriptDefinitionProvider = ScriptDefinitionProvider.getInstance(environment.project) + if (scriptDefinitionProvider == null) { + messageCollector.report(ERROR, "Unable to process the script, scripting plugin is not configured") + return COMPILATION_ERROR + } val scriptFile = File(sourcePath) if (scriptFile.isDirectory || !scriptDefinitionProvider.isScript(scriptFile.name)) { val extensionHint = diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/ScriptsCompilationDependencies.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/ScriptsCompilationDependencies.kt index 43134535df1..1e39e20cf45 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/ScriptsCompilationDependencies.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/ScriptsCompilationDependencies.kt @@ -36,37 +36,39 @@ fun collectScriptsCompilationDependencies( var remainingSources = initialSources val knownSourcePaths = initialSources.mapNotNullTo(HashSet()) { it.virtualFile?.path } val importsProvider = ScriptDependenciesProvider.getInstance(project) - while (true) { - val newRemainingSources = ArrayList() - for (source in remainingSources) { - val dependencies = importsProvider.getScriptDependencies(source) - if (dependencies != null) { - collectedClassPath.addAll(dependencies.classpath) + if (importsProvider != null) { + while (true) { + val newRemainingSources = ArrayList() + for (source in remainingSources) { + val dependencies = importsProvider.getScriptDependencies(source) + if (dependencies != null) { + collectedClassPath.addAll(dependencies.classpath) - val sourceDependenciesRoots = dependencies.scripts.map { - KotlinSourceRoot(it.path, false) - } - val sourceDependencies = - KotlinCoreEnvironment.createSourceFilesFromSourceRoots( - configuration, project, sourceDependenciesRoots, - // TODO: consider receiving and using precise location from the resolver in the future - source.virtualFile?.path?.let { CompilerMessageLocation.create(it) } - ) - if (sourceDependencies.isNotEmpty()) { - collectedSourceDependencies.add(ScriptsCompilationDependencies.SourceDependencies(source, sourceDependencies)) + val sourceDependenciesRoots = dependencies.scripts.map { + KotlinSourceRoot(it.path, false) + } + val sourceDependencies = + KotlinCoreEnvironment.createSourceFilesFromSourceRoots( + configuration, project, sourceDependenciesRoots, + // TODO: consider receiving and using precise location from the resolver in the future + source.virtualFile?.path?.let { CompilerMessageLocation.create(it) } + ) + if (sourceDependencies.isNotEmpty()) { + collectedSourceDependencies.add(ScriptsCompilationDependencies.SourceDependencies(source, sourceDependencies)) - val newSources = sourceDependencies.filterNot { knownSourcePaths.contains(it.virtualFile.path) } - for (newSource in newSources) { - collectedSources.add(newSource) - newRemainingSources.add(newSource) - knownSourcePaths.add(newSource.virtualFile.path) + val newSources = sourceDependencies.filterNot { knownSourcePaths.contains(it.virtualFile.path) } + for (newSource in newSources) { + collectedSources.add(newSource) + newRemainingSources.add(newSource) + knownSourcePaths.add(newSource.virtualFile.path) + } } } } - } - if (newRemainingSources.isEmpty()) break - else { - remainingSources = newRemainingSources + if (newRemainingSources.isEmpty()) break + else { + remainingSources = newRemainingSources + } } } return ScriptsCompilationDependencies( diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/GenericReplCompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/GenericReplCompiler.kt index ae98c44a53a..70199072f78 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/GenericReplCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/GenericReplCompiler.kt @@ -73,7 +73,7 @@ open class GenericReplCompiler( Pair(compilerState.lastLineState!!.psiFile, compilerState.lastLineState!!.errorHolder) } - val newDependencies = ScriptDependenciesProvider.getInstance(checker.environment.project).getScriptDependencies(psiFile) + val newDependencies = ScriptDependenciesProvider.getInstance(checker.environment.project)?.getScriptDependencies(psiFile) var classpathAddendum: List? = null if (compilerState.lastDependencies != newDependencies) { compilerState.lastDependencies = newDependencies diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt index 63d910ac03c..9c10ac9e0aa 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt @@ -179,7 +179,7 @@ class FileScopeFactory( private fun createDefaultImportResolversForFile(): DefaultImportResolvers { val extraImports = file.takeIf { it.isScript() }?.let { ktFile -> - val scriptDependencies = ScriptDependenciesProvider.getInstance(ktFile.project).getScriptDependencies(ktFile.originalFile) + val scriptDependencies = ScriptDependenciesProvider.getInstance(ktFile.project)?.getScriptDependencies(ktFile.originalFile) scriptDependencies?.imports?.map { DefaultImportImpl(ImportPath.fromString(it)) } }.orEmpty() diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptDescriptor.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptDescriptor.kt index a93c8ddcc58..ac9f50d1280 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptDescriptor.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptDescriptor.kt @@ -178,7 +178,7 @@ class LazyScriptDescriptor( val res = ArrayList() val importedScriptsFiles = ScriptDependenciesProvider.getInstance(scriptInfo.script.project) - .getScriptDependencies(scriptInfo.script.containingKtFile)?.scripts + ?.getScriptDependencies(scriptInfo.script.containingKtFile)?.scripts if (importedScriptsFiles != null) { val findImportedScriptDescriptor = ImportedScriptDescriptorsFinder() importedScriptsFiles.mapNotNullTo(res) { diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/KtScript.java b/compiler/psi/src/org/jetbrains/kotlin/psi/KtScript.java index 079e93cf8bb..9c2e7e403e9 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/psi/KtScript.java +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/KtScript.java @@ -30,6 +30,9 @@ import java.util.List; public class KtScript extends KtNamedDeclarationStub implements KtDeclarationContainer { public KotlinScriptDefinition getKotlinScriptDefinition() { ScriptDefinitionProvider definitionsProvider = ScriptDefinitionProvider.Companion.getInstance(getProject()); + if (definitionsProvider == null) { + throw new IllegalStateException("Unable to use KtScript: ScriptDefinitionProvider is not configured."); + } KotlinScriptDefinition definition = definitionsProvider.findScriptDefinition(getContainingKtFile().getName()); return definition != null ? definition : definitionsProvider.getDefaultScriptDefinition(); } diff --git a/compiler/psi/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt b/compiler/psi/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt index 55696e8b715..0a84c71deab 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt +++ b/compiler/psi/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt @@ -37,7 +37,7 @@ interface ScriptDefinitionProvider { fun getKnownFilenameExtensions(): Sequence companion object { - fun getInstance(project: Project): ScriptDefinitionProvider = + fun getInstance(project: Project): ScriptDefinitionProvider? = ServiceManager.getService(project, ScriptDefinitionProvider::class.java) } } @@ -51,7 +51,7 @@ fun findScriptDefinition(file: VirtualFile, project: Project): KotlinScriptDefin return null } - val scriptDefinitionProvider = ScriptDefinitionProvider.getInstance(project) + val scriptDefinitionProvider = ScriptDefinitionProvider.getInstance(project) ?: return null val psiFile = PsiManager.getInstance(project).findFile(file) if (psiFile != null) { if (psiFile !is KtFile) return null diff --git a/compiler/psi/src/org/jetbrains/kotlin/script/ScriptDependenciesProvider.kt b/compiler/psi/src/org/jetbrains/kotlin/script/ScriptDependenciesProvider.kt index 471a95b0fa7..19e94d17616 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/script/ScriptDependenciesProvider.kt +++ b/compiler/psi/src/org/jetbrains/kotlin/script/ScriptDependenciesProvider.kt @@ -27,7 +27,7 @@ interface ScriptDependenciesProvider { fun getScriptDependencies(file: PsiFile) = getScriptDependencies(file.virtualFile ?: file.originalFile.virtualFile) companion object { - fun getInstance(project: Project): ScriptDependenciesProvider = + fun getInstance(project: Project): ScriptDependenciesProvider? = ServiceManager.getService(project, ScriptDependenciesProvider::class.java) } } diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/CodegenTestCase.java b/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/CodegenTestCase.java index f0f31f7c68d..33474aab44b 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/CodegenTestCase.java +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/CodegenTestCase.java @@ -439,14 +439,16 @@ public abstract class CodegenTestCase extends KtUsefulTestCase { ScriptDependenciesProvider externalImportsProvider = ScriptDependenciesProvider.Companion.getInstance(myEnvironment.getProject()); - myEnvironment.getSourceFiles().forEach( - file -> { - ScriptDependencies dependencies = externalImportsProvider.getScriptDependencies(file); - if (dependencies != null) { - files.addAll(dependencies.getClasspath()); + if (externalImportsProvider != null) { + myEnvironment.getSourceFiles().forEach( + file -> { + ScriptDependencies dependencies = externalImportsProvider.getScriptDependencies(file); + if (dependencies != null) { + files.addAll(dependencies.getClasspath()); + } } - } - ); + ); + } try { URL[] result = new URL[files.size()]; diff --git a/idea/src/org/jetbrains/kotlin/idea/util/ImportInsertHelperImpl.kt b/idea/src/org/jetbrains/kotlin/idea/util/ImportInsertHelperImpl.kt index 5db43dc63cf..79d2805933d 100644 --- a/idea/src/org/jetbrains/kotlin/idea/util/ImportInsertHelperImpl.kt +++ b/idea/src/org/jetbrains/kotlin/idea/util/ImportInsertHelperImpl.kt @@ -65,7 +65,7 @@ class ImportInsertHelperImpl(private val project: Project) : ImportInsertHelper( val allDefaultImports = platform.getDefaultImports(languageVersionSettings, includeLowPriorityImports = true) val scriptExtraImports = contextFile.takeIf { it.isScript() }?.let { ktFile -> - val scriptDependencies = ScriptDependenciesProvider.getInstance(ktFile.project).getScriptDependencies(ktFile.originalFile) + val scriptDependencies = ScriptDependenciesProvider.getInstance(ktFile.project)?.getScriptDependencies(ktFile.originalFile) scriptDependencies?.imports?.map { ImportPath.fromString(it) } }.orEmpty()