Refactor script registering in frontend and jvm backend

This commit is contained in:
Pavel V. Talanov
2015-11-20 21:29:40 +03:00
parent 6520e9aed6
commit 337701670c
25 changed files with 183 additions and 148 deletions
@@ -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<K2JVMCompilerArguments>() {
return ExitCode.OK
}
configuration.put<List<ScriptParameter>>(JVMConfigurationKeys.SCRIPT_PARAMETERS, if (arguments.script)
CommandLineScriptUtils.scriptParameters()
else
emptyList<ScriptParameter>())
if (arguments.script) {
configuration.add(CommonConfigurationKeys.SCRIPT_DEFINITIONS_KEY, StandardScriptDefinition)
}
putAdvancedOptions(configuration, arguments)
@@ -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<ScriptParameter> scriptParameters() {
KotlinBuiltIns builtIns = JvmPlatform.INSTANCE$.getBuiltIns();
KotlinType arrayOfStrings = builtIns.getArrayType(INVARIANT, builtIns.getStringType());
ScriptParameter argsParameter = new ScriptParameter(ARGS_NAME, arrayOfStrings);
return Collections.singletonList(argsParameter);
}
}
@@ -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<JvmVirtualFileFinderFactory>(), JvmCliVirtualFileFinderFactory(index))
@@ -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<ScriptParameter> 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;
@@ -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<List<ScriptParameter>> SCRIPT_PARAMETERS =
CompilerConfigurationKey.create("script");
public static final CompilerConfigurationKey<Boolean> DISABLE_CALL_ASSERTIONS =
CompilerConfigurationKey.create("disable not-null call assertions");
public static final CompilerConfigurationKey<Boolean> DISABLE_PARAM_ASSERTIONS =
@@ -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<ScriptParameter> 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
@@ -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<KotlinScriptStub> 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
@@ -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
@@ -55,7 +55,7 @@ public class LazyScriptClassMemberScope(
private fun createScriptParameters(constructor: ConstructorDescriptorImpl): List<ValueParameterDescriptor> {
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,
@@ -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<ScriptParameter>)
interface KotlinScriptDefinition {
fun getScriptParameters(scriptDescriptor: ScriptDescriptor): List<ScriptParameter>
fun isScript(file: PsiFile): Boolean
fun getScriptName(script: KtScript): Name
}
class ScriptParameter(val name: Name, val type: KotlinType)
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<String>' parameter
// this is not supposed to be final design
override fun getScriptParameters(scriptDescriptor: ScriptDescriptor): List<ScriptParameter> {
val builtIns = scriptDescriptor.builtIns
val arrayOfStrings = builtIns.getArrayType(Variance.INVARIANT, builtIns.stringType)
return listOf(ScriptParameter(ARGS_NAME, arrayOfStrings))
}
}
@@ -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<String, KotlinScriptDefinition> scripts = new HashMap<String, KotlinScriptDefinition>();
private final Set<PsiFile> scriptsFiles = new HashSet<PsiFile>();
private static final KotlinScriptDefinition
standardScript = new KotlinScriptDefinition(KotlinParserDefinition.STD_SCRIPT_EXT, Collections.<ScriptParameter>emptyList());
private final List<KotlinScriptDefinition> definitions = new ArrayList<KotlinScriptDefinition>();
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<String, KotlinScriptDefinition> 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<KotlinScriptDefinition> definitions) {
for (KotlinScriptDefinition definition : definitions) {
addScriptDefinition(definition);
}
public void setScriptDefinitions(@NotNull List<KotlinScriptDefinition> definitions) {
this.definitions.clear();
this.definitions.addAll(definitions);
}
}
@@ -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);
}
}
@@ -1,7 +1,8 @@
package
public final class Script {
public constructor Script()
public constructor Script(/*0*/ args: kotlin.Array<kotlin.String>)
public final val args: kotlin.Array<kotlin.String>
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
@@ -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<kotlin.String>)
public final val args: kotlin.Array<kotlin.String>
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
@@ -1,7 +1,8 @@
package
public final class AccessForwardDeclarationInScript {
public constructor AccessForwardDeclarationInScript()
public constructor AccessForwardDeclarationInScript(/*0*/ args: kotlin.Array<kotlin.String>)
public final val args: kotlin.Array<kotlin.String>
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
@@ -1,7 +1,8 @@
package
public final class ComplexScript {
public constructor ComplexScript()
public constructor ComplexScript(/*0*/ args: kotlin.Array<kotlin.String>)
public final val args: kotlin.Array<kotlin.String>
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
@@ -1,7 +1,8 @@
package
public final class NestedInnerClass {
public constructor NestedInnerClass()
public constructor NestedInnerClass(/*0*/ args: kotlin.Array<kotlin.String>)
public final val args: kotlin.Array<kotlin.String>
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
@@ -1,7 +1,8 @@
package
public final class SimpleScript {
public constructor SimpleScript()
public constructor SimpleScript(/*0*/ args: kotlin.Array<kotlin.String>)
public final val args: kotlin.Array<kotlin.String>
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
+2 -1
View File
@@ -1,8 +1,9 @@
package
public final class Imports {
public constructor Imports()
public constructor Imports(/*0*/ args: kotlin.Array<kotlin.String>)
public final val al: java.util.ArrayList<kotlin.String>? = null
public final val args: kotlin.Array<kotlin.String>
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
+2 -1
View File
@@ -1,7 +1,8 @@
package
public final class Script {
public constructor Script()
public constructor Script(/*0*/ args: kotlin.Array<kotlin.String>)
public final val args: kotlin.Array<kotlin.String>
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
@@ -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<M, F> 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());
@@ -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
)
@@ -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.<ScriptParameter>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 {
@@ -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.<KotlinScriptDefinition>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.<KotlinScriptDefinition>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<ScriptParameter> scriptParameters,
@NotNull List<KotlinScriptDefinition> 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<ScriptParameter> 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()));
}
}
@@ -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<ScriptParameter>
) : 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)
}