Refactor script registering in frontend and jvm backend
This commit is contained in:
@@ -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))
|
||||
|
||||
|
||||
-9
@@ -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
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+1
-1
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
+13
-27
@@ -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
|
||||
|
||||
+8
-7
@@ -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
|
||||
|
||||
+2
-1
@@ -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
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
Reference in New Issue
Block a user