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 8fa3a139f39..05b91ec5db0 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt @@ -33,13 +33,10 @@ import org.jetbrains.kotlin.codegen.CompilationException import org.jetbrains.kotlin.compiler.plugin.CliOptionProcessingException import org.jetbrains.kotlin.compiler.plugin.PluginCliOptionProcessingException import org.jetbrains.kotlin.compiler.plugin.cliPluginUsageString -import org.jetbrains.kotlin.config.CompilerConfiguration -import org.jetbrains.kotlin.config.IncrementalCompilation -import org.jetbrains.kotlin.config.Services -import org.jetbrains.kotlin.config.addKotlinSourceRoot +import org.jetbrains.kotlin.config.* import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents -import org.jetbrains.kotlin.script.ScriptParameter +import org.jetbrains.kotlin.script.StandardScriptDefinition import org.jetbrains.kotlin.util.PerformanceCounter import org.jetbrains.kotlin.utils.KotlinPaths import org.jetbrains.kotlin.utils.KotlinPathsFromHomeDir @@ -126,10 +123,9 @@ public open class K2JVMCompiler : CLICompiler() { return ExitCode.OK } - configuration.put>(JVMConfigurationKeys.SCRIPT_PARAMETERS, if (arguments.script) - CommandLineScriptUtils.scriptParameters() - else - emptyList()) + if (arguments.script) { + configuration.add(CommonConfigurationKeys.SCRIPT_DEFINITIONS_KEY, StandardScriptDefinition) + } putAdvancedOptions(configuration, arguments) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CommandLineScriptUtils.java b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CommandLineScriptUtils.java deleted file mode 100644 index d55663fc35b..00000000000 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/CommandLineScriptUtils.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2010-2015 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.kotlin.cli.jvm.compiler; - -import org.jetbrains.kotlin.builtins.KotlinBuiltIns; -import org.jetbrains.kotlin.name.Name; -import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform; -import org.jetbrains.kotlin.script.ScriptParameter; -import org.jetbrains.kotlin.types.KotlinType; - -import java.util.Collections; -import java.util.List; - -import static org.jetbrains.kotlin.types.Variance.INVARIANT; - -public class CommandLineScriptUtils { - private static final Name ARGS_NAME = Name.identifier("args"); - - private CommandLineScriptUtils() { - } - - public static List scriptParameters() { - KotlinBuiltIns builtIns = JvmPlatform.INSTANCE$.getBuiltIns(); - KotlinType arrayOfStrings = builtIns.getArrayType(INVARIANT, builtIns.getStringType()); - ScriptParameter argsParameter = new ScriptParameter(ARGS_NAME, arrayOfStrings); - return Collections.singletonList(argsParameter); - } -} diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt index 2da710bc7dc..680e7384cef 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt @@ -133,7 +133,7 @@ public class KotlinCoreEnvironment private constructor( } }) - KotlinScriptDefinitionProvider.getInstance(project).addScriptDefinitions(configuration.getList(CommonConfigurationKeys.SCRIPT_DEFINITIONS_KEY)) + KotlinScriptDefinitionProvider.getInstance(project).setScriptDefinitions(configuration.getList(CommonConfigurationKeys.SCRIPT_DEFINITIONS_KEY)) project.registerService(javaClass(), JvmCliVirtualFileFinderFactory(index)) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java index 81b1cd51c01..f267a92753e 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java @@ -60,9 +60,6 @@ import org.jetbrains.kotlin.psi.KtScript; import org.jetbrains.kotlin.resolve.BindingTrace; import org.jetbrains.kotlin.resolve.jvm.JvmClassName; import org.jetbrains.kotlin.resolve.jvm.TopDownAnalyzerFacadeForJVM; -import org.jetbrains.kotlin.script.ScriptParameter; -import org.jetbrains.kotlin.script.KotlinScriptDefinition; -import org.jetbrains.kotlin.script.KotlinScriptDefinitionProvider; import org.jetbrains.kotlin.util.PerformanceCounter; import org.jetbrains.kotlin.utils.KotlinPaths; @@ -274,12 +271,6 @@ public class KotlinToJVMBytecodeCompiler { @NotNull KotlinPaths paths, @NotNull KotlinCoreEnvironment environment ) { - List scriptParameters = environment.getConfiguration().getList(JVMConfigurationKeys.SCRIPT_PARAMETERS); - if (!scriptParameters.isEmpty()) { - KotlinScriptDefinitionProvider.getInstance(environment.getProject()).addScriptDefinition( - new KotlinScriptDefinition(".kts", scriptParameters) - ); - } GenerationState state = analyzeAndGenerate(environment); if (state == null) { return null; diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/config/JVMConfigurationKeys.java b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/config/JVMConfigurationKeys.java index 840156cda8a..fe62938e683 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/config/JVMConfigurationKeys.java +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/config/JVMConfigurationKeys.java @@ -20,7 +20,6 @@ import org.jetbrains.kotlin.cli.jvm.compiler.CompilerJarLocator; import org.jetbrains.kotlin.config.CompilerConfigurationKey; import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents; import org.jetbrains.kotlin.modules.Module; -import org.jetbrains.kotlin.script.ScriptParameter; import java.util.List; @@ -28,9 +27,6 @@ public class JVMConfigurationKeys { private JVMConfigurationKeys() { } - public static final CompilerConfigurationKey> SCRIPT_PARAMETERS = - CompilerConfigurationKey.create("script"); - public static final CompilerConfigurationKey DISABLE_CALL_ASSERTIONS = CompilerConfigurationKey.create("disable not-null call assertions"); public static final CompilerConfigurationKey DISABLE_PARAM_ASSERTIONS = diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/ReplInterpreter.java b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/ReplInterpreter.java index 3af846169b3..69c2c1b688a 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/ReplInterpreter.java +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/ReplInterpreter.java @@ -21,6 +21,7 @@ import com.google.common.collect.Lists; import com.intellij.openapi.Disposable; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.CharsetToolkit; +import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFileFactory; import com.intellij.psi.impl.PsiFileFactoryImpl; import com.intellij.psi.search.ProjectScope; @@ -47,6 +48,7 @@ import org.jetbrains.kotlin.codegen.ClassBuilderFactories; import org.jetbrains.kotlin.codegen.CompilationErrorHandler; import org.jetbrains.kotlin.codegen.KotlinCodegenFacade; import org.jetbrains.kotlin.codegen.state.GenerationState; +import org.jetbrains.kotlin.config.CommonConfigurationKeys; import org.jetbrains.kotlin.config.CompilerConfiguration; import org.jetbrains.kotlin.context.MutableModuleContext; import org.jetbrains.kotlin.descriptors.ScriptDescriptor; @@ -54,6 +56,7 @@ import org.jetbrains.kotlin.descriptors.impl.CompositePackageFragmentProvider; import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl; import org.jetbrains.kotlin.idea.KotlinLanguage; import org.jetbrains.kotlin.name.FqName; +import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.parsing.KotlinParserDefinition; import org.jetbrains.kotlin.psi.KtFile; import org.jetbrains.kotlin.psi.KtScript; @@ -66,7 +69,7 @@ import org.jetbrains.kotlin.resolve.lazy.data.JetClassLikeInfo; import org.jetbrains.kotlin.resolve.lazy.declarations.*; import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyScriptDescriptor; import org.jetbrains.kotlin.resolve.scopes.LexicalScope; -import org.jetbrains.kotlin.script.ScriptPriorities; +import org.jetbrains.kotlin.script.*; import org.jetbrains.kotlin.utils.ExceptionUtilsKt; import java.io.File; @@ -103,6 +106,24 @@ public class ReplInterpreter { private final boolean ideMode; private final ReplSystemInWrapper replReader; + private final static KotlinScriptDefinition REPL_LINE_AS_SCRIPT_DEFINITION = new KotlinScriptDefinition() { + @NotNull + @Override + public List getScriptParameters(@NotNull ScriptDescriptor scriptDescriptor) { + return Collections.emptyList(); + } + + @Override + public boolean isScript(@NotNull PsiFile file) { + return StandardScriptDefinition.INSTANCE.isScript(file); + } + + @NotNull + @Override + public Name getScriptName(@NotNull KtScript script) { + return StandardScriptDefinition.INSTANCE.getScriptName(script); + } + }; public ReplInterpreter( @NotNull Disposable disposable, @@ -110,9 +131,12 @@ public class ReplInterpreter { boolean ideMode, @Nullable ReplSystemInWrapper replReader ) { + configuration.add(CommonConfigurationKeys.SCRIPT_DEFINITIONS_KEY, REPL_LINE_AS_SCRIPT_DEFINITION); + KotlinCoreEnvironment environment = KotlinCoreEnvironment.createForProduction(disposable, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES); Project project = environment.getProject(); + this.psiFileFactory = (PsiFileFactoryImpl) PsiFileFactory.getInstance(project); this.trace = new CliLightClassGenerationSupport.NoScopeRecordCliBindingTrace(); MutableModuleContext moduleContext = TopDownAnalyzerFacadeForJVM.createContextWithSealedModule(project, ModuleNameKt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtScript.java b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtScript.java index c5846e08133..da2bd9318e5 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtScript.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtScript.java @@ -20,9 +20,11 @@ import com.intellij.lang.ASTNode; import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.name.FqName; +import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.psi.stubs.KotlinScriptStub; import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes; -import org.jetbrains.kotlin.script.ScriptNameUtil; +import org.jetbrains.kotlin.script.KotlinScriptDefinition; +import org.jetbrains.kotlin.script.KotlinScriptDefinitionProvider; import java.util.List; @@ -43,7 +45,11 @@ public class KtScript extends KtNamedDeclarationStub implement if (stub != null) { return stub.getFqName(); } - return ScriptNameUtil.classNameForScript(this); + KtFile containingKtFile = getContainingKtFile(); + KotlinScriptDefinition kotlinScriptDefinition = + KotlinScriptDefinitionProvider.getInstance(getProject()).findScriptDefinition(containingKtFile); + assert kotlinScriptDefinition != null : "Should not parse a script without definition"; + return containingKtFile.getPackageFqName().child(kotlinScriptDefinition.getScriptName(this)); } @Override diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/AbstractPsiBasedDeclarationProvider.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/AbstractPsiBasedDeclarationProvider.kt index 20be6b3aa57..7e8311565af 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/AbstractPsiBasedDeclarationProvider.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/AbstractPsiBasedDeclarationProvider.kt @@ -52,7 +52,7 @@ public abstract class AbstractPsiBasedDeclarationProvider(storageManager: Storag } else if (declaration is KtScript) { val scriptInfo = JetScriptInfo(declaration) - classesAndObjects.put(scriptInfo.script.nameAsSafeName, scriptInfo) + classesAndObjects.put(scriptInfo.script.nameAsName, scriptInfo) } else if (declaration is KtParameter || declaration is KtTypedef || declaration is KtMultiDeclaration) { // Do nothing, just put it into allDeclarations is enough diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptClassMemberScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptClassMemberScope.kt index 5e01fc7df34..3a2182de649 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptClassMemberScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptClassMemberScope.kt @@ -55,7 +55,7 @@ public class LazyScriptClassMemberScope( private fun createScriptParameters(constructor: ConstructorDescriptorImpl): List { val file = scriptDescriptor.scriptInfo.script.getContainingKtFile() val scriptDefinition = KotlinScriptDefinitionProvider.getInstance(file.project).findScriptDefinition(file) - return scriptDefinition.scriptParameters.mapIndexed { index, scriptParameter -> + return scriptDefinition.getScriptParameters(scriptDescriptor).mapIndexed { index, scriptParameter -> ValueParameterDescriptorImpl( constructor, null, index, Annotations.EMPTY, scriptParameter.name, scriptParameter.type, /* declaresDefaultValue = */ false, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinition.kt b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinition.kt index ae108918409..cf8d8fe9f35 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinition.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinition.kt @@ -16,9 +16,40 @@ package org.jetbrains.kotlin.script +import com.intellij.psi.PsiFile +import com.intellij.util.PathUtil +import org.jetbrains.kotlin.descriptors.ScriptDescriptor import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.parsing.KotlinParserDefinition +import org.jetbrains.kotlin.psi.KtScript +import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.types.KotlinType +import org.jetbrains.kotlin.types.Variance -class KotlinScriptDefinition(val extension: String, val scriptParameters: List) +interface KotlinScriptDefinition { + fun getScriptParameters(scriptDescriptor: ScriptDescriptor): List + fun isScript(file: PsiFile): Boolean + fun getScriptName(script: KtScript): Name +} -class ScriptParameter(val name: Name, val type: KotlinType) \ No newline at end of file +class ScriptParameter(val name: Name, val type: KotlinType) + +object StandardScriptDefinition : KotlinScriptDefinition { + private val ARGS_NAME = Name.identifier("args") + + override fun getScriptName(script: KtScript): Name { + return ScriptNameUtil.fileNameWithExtensionStripped(script, KotlinParserDefinition.STD_SCRIPT_EXT) + } + + override fun isScript(file: PsiFile): Boolean { + return PathUtil.getFileExtension(file.name) == KotlinParserDefinition.STD_SCRIPT_SUFFIX + } + + // NOTE: for now we treat .kts files as if they have 'args: Array' parameter + // this is not supposed to be final design + override fun getScriptParameters(scriptDescriptor: ScriptDescriptor): List { + val builtIns = scriptDescriptor.builtIns + val arrayOfStrings = builtIns.getArrayType(Variance.INVARIANT, builtIns.stringType) + return listOf(ScriptParameter(ARGS_NAME, arrayOfStrings)) + } +} diff --git a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.java b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.java index 29ddeced266..fbb5fd5e3f2 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.java @@ -20,42 +20,28 @@ import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiFile; import org.jetbrains.annotations.NotNull; -import org.jetbrains.kotlin.parsing.KotlinParserDefinition; -import org.jetbrains.kotlin.psi.KtFile; +import org.jetbrains.annotations.TestOnly; -import java.util.*; +import java.util.ArrayList; +import java.util.List; public class KotlinScriptDefinitionProvider { - private final Map scripts = new HashMap(); - private final Set scriptsFiles = new HashSet(); - - private static final KotlinScriptDefinition - standardScript = new KotlinScriptDefinition(KotlinParserDefinition.STD_SCRIPT_EXT, Collections.emptyList()); + private final List definitions = new ArrayList(); public static KotlinScriptDefinitionProvider getInstance(Project project) { return ServiceManager.getService(project, KotlinScriptDefinitionProvider.class); } public KotlinScriptDefinitionProvider() { - // .kts will take analyzer parameters explicitly specified on compilation - addScriptDefinition(standardScript); - } - - public void markFileAsScript(KtFile file) { - scriptsFiles.add(file); + definitions.add(StandardScriptDefinition.INSTANCE); } public KotlinScriptDefinition findScriptDefinition(PsiFile psiFile) { - boolean force = scriptsFiles.contains(psiFile); - - String name = psiFile.getName(); - for (Map.Entry e : scripts.entrySet()) { - if (name.endsWith(e.getKey())) { - return e.getValue(); + for (KotlinScriptDefinition definition : definitions) { + if (definition.isScript(psiFile)) { + return definition; } } - if(force) - return standardScript; return null; } @@ -64,13 +50,13 @@ public class KotlinScriptDefinitionProvider { return findScriptDefinition(psiFile) != null; } + @TestOnly public void addScriptDefinition(@NotNull KotlinScriptDefinition scriptDefinition) { - scripts.put(scriptDefinition.getExtension(), scriptDefinition); + definitions.add(0, scriptDefinition); } - public void addScriptDefinitions(List definitions) { - for (KotlinScriptDefinition definition : definitions) { - addScriptDefinition(definition); - } + public void setScriptDefinitions(@NotNull List definitions) { + this.definitions.clear(); + this.definitions.addAll(definitions); } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/script/ScriptNameUtil.java b/compiler/frontend/src/org/jetbrains/kotlin/script/ScriptNameUtil.java index 66c7eda3adf..ebbfe9d8902 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/script/ScriptNameUtil.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/script/ScriptNameUtil.java @@ -17,9 +17,8 @@ package org.jetbrains.kotlin.script; import org.jetbrains.annotations.NotNull; -import org.jetbrains.kotlin.name.FqName; +import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.psi.KtFile; -import org.jetbrains.kotlin.psi.KtPackageDirective; import org.jetbrains.kotlin.psi.KtScript; public class ScriptNameUtil { @@ -27,27 +26,24 @@ public class ScriptNameUtil { } @NotNull - public static FqName classNameForScript(KtScript script) { + public static Name fileNameWithExtensionStripped(@NotNull KtScript script, @NotNull String extension) { KtFile file = script.getContainingKtFile(); - KotlinScriptDefinition scriptDefinition = KotlinScriptDefinitionProvider.getInstance(file.getProject()).findScriptDefinition(file); - String name = file.getName(); int index = name.lastIndexOf('/'); - if(index != -1) - name = name.substring(index+1); - if(name.endsWith(scriptDefinition.getExtension())) - name = name.substring(0, name.length()-scriptDefinition.getExtension().length()); + if (index != -1) { + name = name.substring(index + 1); + } + if (name.endsWith(extension)) { + name = name.substring(0, name.length() - extension.length()); + } else { index = name.indexOf('.'); - if(index != -1) - name = name.substring(0,index); + if (index != -1) { + name = name.substring(0, index); + } } name = Character.toUpperCase(name.charAt(0)) + (name.length() == 0 ? "" : name.substring(1)); name = name.replace('.', '_'); - KtPackageDirective directive = file.getPackageDirective(); - if(directive != null && directive.getQualifiedName().length() > 0) { - name = directive.getQualifiedName() + "." + name; - } - return new FqName(name); + return Name.identifier(name); } } diff --git a/compiler/testData/diagnostics/tests/annotations/DanglingInScript.txt b/compiler/testData/diagnostics/tests/annotations/DanglingInScript.txt index caa2674a3e8..f248055728b 100644 --- a/compiler/testData/diagnostics/tests/annotations/DanglingInScript.txt +++ b/compiler/testData/diagnostics/tests/annotations/DanglingInScript.txt @@ -1,7 +1,8 @@ package public final class Script { - public constructor Script() + public constructor Script(/*0*/ args: kotlin.Array) + public final val args: kotlin.Array public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String diff --git a/compiler/testData/diagnostics/tests/redeclarations/ScriptAndClassConflict.txt b/compiler/testData/diagnostics/tests/redeclarations/ScriptAndClassConflict.txt index 5665f6255c9..53e253c43c2 100644 --- a/compiler/testData/diagnostics/tests/redeclarations/ScriptAndClassConflict.txt +++ b/compiler/testData/diagnostics/tests/redeclarations/ScriptAndClassConflict.txt @@ -4,6 +4,14 @@ package test { public final class A { public constructor A() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + public final class A { + public constructor A(/*0*/ args: kotlin.Array) + public final val args: kotlin.Array public final val x: kotlin.Int = 1 public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int @@ -17,13 +25,6 @@ package test { } } - public final class A { - public constructor A() - public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean - public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int - public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String - } - public final class F1 { public constructor F1() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean diff --git a/compiler/testData/diagnostics/tests/script/AccessForwardDeclarationInScript.txt b/compiler/testData/diagnostics/tests/script/AccessForwardDeclarationInScript.txt index 51754b8d7d8..b7bce89d5ae 100644 --- a/compiler/testData/diagnostics/tests/script/AccessForwardDeclarationInScript.txt +++ b/compiler/testData/diagnostics/tests/script/AccessForwardDeclarationInScript.txt @@ -1,7 +1,8 @@ package public final class AccessForwardDeclarationInScript { - public constructor AccessForwardDeclarationInScript() + public constructor AccessForwardDeclarationInScript(/*0*/ args: kotlin.Array) + public final val args: kotlin.Array public final val x: kotlin.Int = 2 public final val y: kotlin.Int = 2 public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean diff --git a/compiler/testData/diagnostics/tests/script/ComplexScript.txt b/compiler/testData/diagnostics/tests/script/ComplexScript.txt index 99142f3b05f..b3b5543995a 100644 --- a/compiler/testData/diagnostics/tests/script/ComplexScript.txt +++ b/compiler/testData/diagnostics/tests/script/ComplexScript.txt @@ -1,7 +1,8 @@ package public final class ComplexScript { - public constructor ComplexScript() + public constructor ComplexScript(/*0*/ args: kotlin.Array) + public final val args: kotlin.Array public final val y: kotlin.Int = 2 public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public final fun foo(/*0*/ x: kotlin.Int): kotlin.Int diff --git a/compiler/testData/diagnostics/tests/script/NestedInnerClass.txt b/compiler/testData/diagnostics/tests/script/NestedInnerClass.txt index c70a0ca4f62..3a904b5db74 100644 --- a/compiler/testData/diagnostics/tests/script/NestedInnerClass.txt +++ b/compiler/testData/diagnostics/tests/script/NestedInnerClass.txt @@ -1,7 +1,8 @@ package public final class NestedInnerClass { - public constructor NestedInnerClass() + public constructor NestedInnerClass(/*0*/ args: kotlin.Array) + public final val args: kotlin.Array public final val property: kotlin.String = "" public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public final fun function(): kotlin.Int diff --git a/compiler/testData/diagnostics/tests/script/SimpleScript.txt b/compiler/testData/diagnostics/tests/script/SimpleScript.txt index aaf703414cf..9ff6d104abf 100644 --- a/compiler/testData/diagnostics/tests/script/SimpleScript.txt +++ b/compiler/testData/diagnostics/tests/script/SimpleScript.txt @@ -1,7 +1,8 @@ package public final class SimpleScript { - public constructor SimpleScript() + public constructor SimpleScript(/*0*/ args: kotlin.Array) + public final val args: kotlin.Array public final val x: kotlin.Int = 1 public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/tests/script/imports.txt b/compiler/testData/diagnostics/tests/script/imports.txt index ed70eb6ce01..938564139fa 100644 --- a/compiler/testData/diagnostics/tests/script/imports.txt +++ b/compiler/testData/diagnostics/tests/script/imports.txt @@ -1,8 +1,9 @@ package public final class Imports { - public constructor Imports() + public constructor Imports(/*0*/ args: kotlin.Array) public final val al: java.util.ArrayList? = null + public final val args: kotlin.Array public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String diff --git a/compiler/testData/diagnostics/tests/script/varInScript.txt b/compiler/testData/diagnostics/tests/script/varInScript.txt index 7c1db6db9a2..2f6f9757a83 100644 --- a/compiler/testData/diagnostics/tests/script/varInScript.txt +++ b/compiler/testData/diagnostics/tests/script/varInScript.txt @@ -1,7 +1,8 @@ package public final class Script { - public constructor Script() + public constructor Script(/*0*/ args: kotlin.Array) + public final val args: kotlin.Array public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public final fun main(): kotlin.Boolean diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/KotlinMultiFileTestWithWithJava.java b/compiler/tests/org/jetbrains/kotlin/checkers/KotlinMultiFileTestWithWithJava.java index fc1398a1652..cbc7a286eab 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/KotlinMultiFileTestWithWithJava.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/KotlinMultiFileTestWithWithJava.java @@ -23,8 +23,10 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles; import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment; +import org.jetbrains.kotlin.config.CommonConfigurationKeys; import org.jetbrains.kotlin.config.CompilerConfiguration; import org.jetbrains.kotlin.config.ContentRootsKt; +import org.jetbrains.kotlin.script.StandardScriptDefinition; import org.jetbrains.kotlin.test.ConfigurationKind; import org.jetbrains.kotlin.test.KotlinLiteFixture; import org.jetbrains.kotlin.test.KotlinTestUtils; @@ -66,6 +68,7 @@ public abstract class KotlinMultiFileTestWithWithJava extends KotlinLiteFi protected KotlinCoreEnvironment createEnvironment() { File javaFilesDir = createJavaFilesDir(); CompilerConfiguration configuration = createCompilerConfiguration(javaFilesDir); + configuration.add(CommonConfigurationKeys.SCRIPT_DEFINITIONS_KEY, StandardScriptDefinition.INSTANCE); File kotlinSourceRoot = getKotlinSourceRoot(); if (kotlinSourceRoot != null) { ContentRootsKt.addKotlinSourceRoot(configuration, kotlinSourceRoot.getPath()); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/CodegenTestFiles.java b/compiler/tests/org/jetbrains/kotlin/codegen/CodegenTestFiles.java index 9588f5d9045..861d4d6e5bd 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/CodegenTestFiles.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/CodegenTestFiles.java @@ -27,9 +27,9 @@ import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.psi.KtFile; import org.jetbrains.kotlin.resolve.AnalyzingUtils; import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform; -import org.jetbrains.kotlin.script.ScriptParameter; -import org.jetbrains.kotlin.script.KotlinScriptDefinition; import org.jetbrains.kotlin.script.KotlinScriptDefinitionProvider; +import org.jetbrains.kotlin.script.ScriptParameter; +import org.jetbrains.kotlin.scripts.TestScriptDefinition; import org.jetbrains.kotlin.test.KotlinTestUtils; import org.jetbrains.kotlin.types.KotlinType; import org.jetbrains.kotlin.types.Variance; @@ -156,8 +156,9 @@ public class CodegenTestFiles { scriptParameterValues.add(value); } - KotlinScriptDefinitionProvider.getInstance(project).addScriptDefinition( - new KotlinScriptDefinition( + KotlinScriptDefinitionProvider definitionProvider = KotlinScriptDefinitionProvider.getInstance(project); + definitionProvider.addScriptDefinition( + new TestScriptDefinition( ".kts", scriptParameterTypes ) diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ScriptGenTest.java b/compiler/tests/org/jetbrains/kotlin/codegen/ScriptGenTest.java index d247ea90483..7b78b065ad5 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ScriptGenTest.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ScriptGenTest.java @@ -18,30 +18,40 @@ package org.jetbrains.kotlin.codegen; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform; -import org.jetbrains.kotlin.script.ScriptParameter; import org.jetbrains.kotlin.script.KotlinScriptDefinition; import org.jetbrains.kotlin.script.KotlinScriptDefinitionProvider; +import org.jetbrains.kotlin.script.ScriptParameter; +import org.jetbrains.kotlin.scripts.TestScriptDefinition; import org.jetbrains.kotlin.test.ConfigurationKind; import org.jetbrains.org.objectweb.asm.Opcodes; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.Collections; import static java.util.Collections.singletonList; public class ScriptGenTest extends CodegenTestCase { private static final KotlinScriptDefinition FIB_SCRIPT_DEFINITION = - new KotlinScriptDefinition( + new TestScriptDefinition( ".lang.kt", singletonList(new ScriptParameter(Name.identifier("num"), JvmPlatform.INSTANCE$.getBuiltIns().getIntType())) ); + private static final KotlinScriptDefinition NO_PARAM_SCRIPT_DEFINITION = + new TestScriptDefinition( + ".kts", + Collections.emptyList() + ); @Override protected void setUp() throws Exception { super.setUp(); createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); - KotlinScriptDefinitionProvider.getInstance(myEnvironment.getProject()).addScriptDefinition(FIB_SCRIPT_DEFINITION); + KotlinScriptDefinitionProvider.getInstance(myEnvironment.getProject()).setScriptDefinitions( + Arrays.asList(FIB_SCRIPT_DEFINITION, NO_PARAM_SCRIPT_DEFINITION) + ); } public void testLanguage() throws Exception { diff --git a/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTest.java b/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTest.java index 13734f125e2..fd2862e6d72 100644 --- a/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTest.java +++ b/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTest.java @@ -25,16 +25,15 @@ import org.jetbrains.kotlin.cli.common.messages.*; import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles; import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment; import org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler; -import org.jetbrains.kotlin.cli.jvm.config.JVMConfigurationKeys; import org.jetbrains.kotlin.codegen.CompilationException; import org.jetbrains.kotlin.config.CommonConfigurationKeys; import org.jetbrains.kotlin.config.CompilerConfiguration; import org.jetbrains.kotlin.config.ContentRootsKt; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform; -import org.jetbrains.kotlin.script.ScriptParameter; import org.jetbrains.kotlin.script.KotlinScriptDefinition; import org.jetbrains.kotlin.script.KotlinScriptDefinitionProvider; +import org.jetbrains.kotlin.script.ScriptParameter; import org.jetbrains.kotlin.test.ConfigurationKind; import org.jetbrains.kotlin.test.KotlinTestUtils; import org.jetbrains.kotlin.test.TestJdkKind; @@ -49,22 +48,21 @@ import java.util.List; public class ScriptTest { @Test public void testScript() throws Exception { - Class aClass = compileScript("fib.kts", numIntParam(), Collections.emptyList()); + Class aClass = compileScript("fib.kts", new TestScriptDefinition(".kts", numIntParam())); Assert.assertNotNull(aClass); aClass.getConstructor(int.class).newInstance(4); } @Test public void testScriptWithPackage() throws Exception { - Class aClass = compileScript("fib.pkg.kts", numIntParam(), Collections.emptyList()); + Class aClass = compileScript("fib.pkg.kts", new TestScriptDefinition(".kts", numIntParam())); Assert.assertNotNull(aClass); aClass.getConstructor(int.class).newInstance(4); } @Test public void testScriptWithScriptDefinition() throws Exception { - Class aClass = compileScript("fib.fib.kt", null, - Collections.singletonList(new KotlinScriptDefinition(".fib.kt", numIntParam()))); + Class aClass = compileScript("fib.fib.kt", new TestScriptDefinition(".fib.kt", numIntParam())); Assert.assertNotNull(aClass); aClass.getConstructor(int.class).newInstance(4); } @@ -72,8 +70,7 @@ public class ScriptTest { @Nullable private static Class compileScript( @NotNull String scriptPath, - @Nullable List scriptParameters, - @NotNull List scriptDefinitions + @NotNull KotlinScriptDefinition scriptDefinition ) { KotlinPaths paths = PathUtil.getKotlinPathsForDistDirectory(); MessageCollector messageCollector = PrintingMessageCollector.PLAIN_TEXT_TO_SYSTEM_ERR; @@ -84,14 +81,12 @@ public class ScriptTest { KotlinTestUtils.compilerConfigurationForTests(ConfigurationKind.JDK_ONLY, TestJdkKind.FULL_JDK); configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, messageCollector); ContentRootsKt.addKotlinSourceRoot(configuration, "compiler/testData/script/" + scriptPath); - configuration.addAll(CommonConfigurationKeys.SCRIPT_DEFINITIONS_KEY, scriptDefinitions); - configuration.put(JVMConfigurationKeys.SCRIPT_PARAMETERS, scriptParameters); + configuration.add(CommonConfigurationKeys.SCRIPT_DEFINITIONS_KEY, scriptDefinition); KotlinCoreEnvironment environment = KotlinCoreEnvironment.createForProduction(rootDisposable, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES); try { - KotlinScriptDefinitionProvider.getInstance(environment.getProject()).markFileAsScript(environment.getSourceFiles().get(0)); return KotlinToJVMBytecodeCompiler.compileScript(configuration, paths, environment); } catch (CompilationException e) { @@ -111,6 +106,6 @@ public class ScriptTest { @NotNull private static List numIntParam() { - return Collections.singletonList(new ScriptParameter(Name.identifier("num"), JvmPlatform.INSTANCE$.getBuiltIns().getIntType())); + return Collections.singletonList(new ScriptParameter(Name.identifier("num"), JvmPlatform.INSTANCE.getBuiltIns().getIntType())); } } diff --git a/compiler/tests/org/jetbrains/kotlin/scripts/TestScriptDefinition.kt b/compiler/tests/org/jetbrains/kotlin/scripts/TestScriptDefinition.kt new file mode 100644 index 00000000000..dd7018ccda3 --- /dev/null +++ b/compiler/tests/org/jetbrains/kotlin/scripts/TestScriptDefinition.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2010-2015 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.kotlin.scripts + +import com.intellij.psi.PsiFile +import org.jetbrains.kotlin.descriptors.ScriptDescriptor +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.psi.KtScript +import org.jetbrains.kotlin.script.KotlinScriptDefinition +import org.jetbrains.kotlin.script.ScriptNameUtil +import org.jetbrains.kotlin.script.ScriptParameter + +class TestScriptDefinition( + val extension: String, + val parameters: List +) : KotlinScriptDefinition { + override fun getScriptParameters(scriptDescriptor: ScriptDescriptor) = parameters + override fun isScript(file: PsiFile): Boolean = file.getName().endsWith(extension) + override fun getScriptName(script: KtScript): Name = ScriptNameUtil.fileNameWithExtensionStripped(script, extension) +} \ No newline at end of file