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.CliOptionProcessingException
import org.jetbrains.kotlin.compiler.plugin.PluginCliOptionProcessingException import org.jetbrains.kotlin.compiler.plugin.PluginCliOptionProcessingException
import org.jetbrains.kotlin.compiler.plugin.cliPluginUsageString import org.jetbrains.kotlin.compiler.plugin.cliPluginUsageString
import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.*
import org.jetbrains.kotlin.config.IncrementalCompilation
import org.jetbrains.kotlin.config.Services
import org.jetbrains.kotlin.config.addKotlinSourceRoot
import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.load.java.JvmAbi
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents 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.util.PerformanceCounter
import org.jetbrains.kotlin.utils.KotlinPaths import org.jetbrains.kotlin.utils.KotlinPaths
import org.jetbrains.kotlin.utils.KotlinPathsFromHomeDir import org.jetbrains.kotlin.utils.KotlinPathsFromHomeDir
@@ -126,10 +123,9 @@ public open class K2JVMCompiler : CLICompiler<K2JVMCompilerArguments>() {
return ExitCode.OK return ExitCode.OK
} }
configuration.put<List<ScriptParameter>>(JVMConfigurationKeys.SCRIPT_PARAMETERS, if (arguments.script) if (arguments.script) {
CommandLineScriptUtils.scriptParameters() configuration.add(CommonConfigurationKeys.SCRIPT_DEFINITIONS_KEY, StandardScriptDefinition)
else }
emptyList<ScriptParameter>())
putAdvancedOptions(configuration, arguments) 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)) 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.BindingTrace;
import org.jetbrains.kotlin.resolve.jvm.JvmClassName; import org.jetbrains.kotlin.resolve.jvm.JvmClassName;
import org.jetbrains.kotlin.resolve.jvm.TopDownAnalyzerFacadeForJVM; 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.util.PerformanceCounter;
import org.jetbrains.kotlin.utils.KotlinPaths; import org.jetbrains.kotlin.utils.KotlinPaths;
@@ -274,12 +271,6 @@ public class KotlinToJVMBytecodeCompiler {
@NotNull KotlinPaths paths, @NotNull KotlinPaths paths,
@NotNull KotlinCoreEnvironment environment @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); GenerationState state = analyzeAndGenerate(environment);
if (state == null) { if (state == null) {
return 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.config.CompilerConfigurationKey;
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents; import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents;
import org.jetbrains.kotlin.modules.Module; import org.jetbrains.kotlin.modules.Module;
import org.jetbrains.kotlin.script.ScriptParameter;
import java.util.List; import java.util.List;
@@ -28,9 +27,6 @@ public class JVMConfigurationKeys {
private JVMConfigurationKeys() { private JVMConfigurationKeys() {
} }
public static final CompilerConfigurationKey<List<ScriptParameter>> SCRIPT_PARAMETERS =
CompilerConfigurationKey.create("script");
public static final CompilerConfigurationKey<Boolean> DISABLE_CALL_ASSERTIONS = public static final CompilerConfigurationKey<Boolean> DISABLE_CALL_ASSERTIONS =
CompilerConfigurationKey.create("disable not-null call assertions"); CompilerConfigurationKey.create("disable not-null call assertions");
public static final CompilerConfigurationKey<Boolean> DISABLE_PARAM_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.Disposable;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.CharsetToolkit; import com.intellij.openapi.vfs.CharsetToolkit;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiFileFactory; import com.intellij.psi.PsiFileFactory;
import com.intellij.psi.impl.PsiFileFactoryImpl; import com.intellij.psi.impl.PsiFileFactoryImpl;
import com.intellij.psi.search.ProjectScope; 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.CompilationErrorHandler;
import org.jetbrains.kotlin.codegen.KotlinCodegenFacade; import org.jetbrains.kotlin.codegen.KotlinCodegenFacade;
import org.jetbrains.kotlin.codegen.state.GenerationState; import org.jetbrains.kotlin.codegen.state.GenerationState;
import org.jetbrains.kotlin.config.CommonConfigurationKeys;
import org.jetbrains.kotlin.config.CompilerConfiguration; import org.jetbrains.kotlin.config.CompilerConfiguration;
import org.jetbrains.kotlin.context.MutableModuleContext; import org.jetbrains.kotlin.context.MutableModuleContext;
import org.jetbrains.kotlin.descriptors.ScriptDescriptor; 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.descriptors.impl.ModuleDescriptorImpl;
import org.jetbrains.kotlin.idea.KotlinLanguage; import org.jetbrains.kotlin.idea.KotlinLanguage;
import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.parsing.KotlinParserDefinition; import org.jetbrains.kotlin.parsing.KotlinParserDefinition;
import org.jetbrains.kotlin.psi.KtFile; import org.jetbrains.kotlin.psi.KtFile;
import org.jetbrains.kotlin.psi.KtScript; 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.declarations.*;
import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyScriptDescriptor; import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyScriptDescriptor;
import org.jetbrains.kotlin.resolve.scopes.LexicalScope; 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 org.jetbrains.kotlin.utils.ExceptionUtilsKt;
import java.io.File; import java.io.File;
@@ -103,6 +106,24 @@ public class ReplInterpreter {
private final boolean ideMode; private final boolean ideMode;
private final ReplSystemInWrapper replReader; 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( public ReplInterpreter(
@NotNull Disposable disposable, @NotNull Disposable disposable,
@@ -110,9 +131,12 @@ public class ReplInterpreter {
boolean ideMode, boolean ideMode,
@Nullable ReplSystemInWrapper replReader @Nullable ReplSystemInWrapper replReader
) { ) {
configuration.add(CommonConfigurationKeys.SCRIPT_DEFINITIONS_KEY, REPL_LINE_AS_SCRIPT_DEFINITION);
KotlinCoreEnvironment environment = KotlinCoreEnvironment environment =
KotlinCoreEnvironment.createForProduction(disposable, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES); KotlinCoreEnvironment.createForProduction(disposable, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES);
Project project = environment.getProject(); Project project = environment.getProject();
this.psiFileFactory = (PsiFileFactoryImpl) PsiFileFactory.getInstance(project); this.psiFileFactory = (PsiFileFactoryImpl) PsiFileFactory.getInstance(project);
this.trace = new CliLightClassGenerationSupport.NoScopeRecordCliBindingTrace(); this.trace = new CliLightClassGenerationSupport.NoScopeRecordCliBindingTrace();
MutableModuleContext moduleContext = TopDownAnalyzerFacadeForJVM.createContextWithSealedModule(project, ModuleNameKt MutableModuleContext moduleContext = TopDownAnalyzerFacadeForJVM.createContextWithSealedModule(project, ModuleNameKt
@@ -20,9 +20,11 @@ import com.intellij.lang.ASTNode;
import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiTreeUtil;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.name.FqName; 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.KotlinScriptStub;
import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes; 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; import java.util.List;
@@ -43,7 +45,11 @@ public class KtScript extends KtNamedDeclarationStub<KotlinScriptStub> implement
if (stub != null) { if (stub != null) {
return stub.getFqName(); 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 @Override
@@ -52,7 +52,7 @@ public abstract class AbstractPsiBasedDeclarationProvider(storageManager: Storag
} }
else if (declaration is KtScript) { else if (declaration is KtScript) {
val scriptInfo = JetScriptInfo(declaration) 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) { else if (declaration is KtParameter || declaration is KtTypedef || declaration is KtMultiDeclaration) {
// Do nothing, just put it into allDeclarations is enough // Do nothing, just put it into allDeclarations is enough
@@ -55,7 +55,7 @@ public class LazyScriptClassMemberScope(
private fun createScriptParameters(constructor: ConstructorDescriptorImpl): List<ValueParameterDescriptor> { private fun createScriptParameters(constructor: ConstructorDescriptorImpl): List<ValueParameterDescriptor> {
val file = scriptDescriptor.scriptInfo.script.getContainingKtFile() val file = scriptDescriptor.scriptInfo.script.getContainingKtFile()
val scriptDefinition = KotlinScriptDefinitionProvider.getInstance(file.project).findScriptDefinition(file) val scriptDefinition = KotlinScriptDefinitionProvider.getInstance(file.project).findScriptDefinition(file)
return scriptDefinition.scriptParameters.mapIndexed { index, scriptParameter -> return scriptDefinition.getScriptParameters(scriptDescriptor).mapIndexed { index, scriptParameter ->
ValueParameterDescriptorImpl( ValueParameterDescriptorImpl(
constructor, null, index, Annotations.EMPTY, scriptParameter.name, scriptParameter.type, constructor, null, index, Annotations.EMPTY, scriptParameter.name, scriptParameter.type,
/* declaresDefaultValue = */ false, /* declaresDefaultValue = */ false,
@@ -16,9 +16,40 @@
package org.jetbrains.kotlin.script 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.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.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.openapi.project.Project;
import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFile;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.parsing.KotlinParserDefinition; import org.jetbrains.annotations.TestOnly;
import org.jetbrains.kotlin.psi.KtFile;
import java.util.*; import java.util.ArrayList;
import java.util.List;
public class KotlinScriptDefinitionProvider { public class KotlinScriptDefinitionProvider {
private final Map<String, KotlinScriptDefinition> scripts = new HashMap<String, KotlinScriptDefinition>(); private final List<KotlinScriptDefinition> definitions = new ArrayList<KotlinScriptDefinition>();
private final Set<PsiFile> scriptsFiles = new HashSet<PsiFile>();
private static final KotlinScriptDefinition
standardScript = new KotlinScriptDefinition(KotlinParserDefinition.STD_SCRIPT_EXT, Collections.<ScriptParameter>emptyList());
public static KotlinScriptDefinitionProvider getInstance(Project project) { public static KotlinScriptDefinitionProvider getInstance(Project project) {
return ServiceManager.getService(project, KotlinScriptDefinitionProvider.class); return ServiceManager.getService(project, KotlinScriptDefinitionProvider.class);
} }
public KotlinScriptDefinitionProvider() { public KotlinScriptDefinitionProvider() {
// .kts will take analyzer parameters explicitly specified on compilation definitions.add(StandardScriptDefinition.INSTANCE);
addScriptDefinition(standardScript);
}
public void markFileAsScript(KtFile file) {
scriptsFiles.add(file);
} }
public KotlinScriptDefinition findScriptDefinition(PsiFile psiFile) { public KotlinScriptDefinition findScriptDefinition(PsiFile psiFile) {
boolean force = scriptsFiles.contains(psiFile); for (KotlinScriptDefinition definition : definitions) {
if (definition.isScript(psiFile)) {
String name = psiFile.getName(); return definition;
for (Map.Entry<String, KotlinScriptDefinition> e : scripts.entrySet()) {
if (name.endsWith(e.getKey())) {
return e.getValue();
} }
} }
if(force)
return standardScript;
return null; return null;
} }
@@ -64,13 +50,13 @@ public class KotlinScriptDefinitionProvider {
return findScriptDefinition(psiFile) != null; return findScriptDefinition(psiFile) != null;
} }
@TestOnly
public void addScriptDefinition(@NotNull KotlinScriptDefinition scriptDefinition) { public void addScriptDefinition(@NotNull KotlinScriptDefinition scriptDefinition) {
scripts.put(scriptDefinition.getExtension(), scriptDefinition); definitions.add(0, scriptDefinition);
} }
public void addScriptDefinitions(List<KotlinScriptDefinition> definitions) { public void setScriptDefinitions(@NotNull List<KotlinScriptDefinition> definitions) {
for (KotlinScriptDefinition definition : definitions) { this.definitions.clear();
addScriptDefinition(definition); this.definitions.addAll(definitions);
}
} }
} }
@@ -17,9 +17,8 @@
package org.jetbrains.kotlin.script; package org.jetbrains.kotlin.script;
import org.jetbrains.annotations.NotNull; 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.KtFile;
import org.jetbrains.kotlin.psi.KtPackageDirective;
import org.jetbrains.kotlin.psi.KtScript; import org.jetbrains.kotlin.psi.KtScript;
public class ScriptNameUtil { public class ScriptNameUtil {
@@ -27,27 +26,24 @@ public class ScriptNameUtil {
} }
@NotNull @NotNull
public static FqName classNameForScript(KtScript script) { public static Name fileNameWithExtensionStripped(@NotNull KtScript script, @NotNull String extension) {
KtFile file = script.getContainingKtFile(); KtFile file = script.getContainingKtFile();
KotlinScriptDefinition scriptDefinition = KotlinScriptDefinitionProvider.getInstance(file.getProject()).findScriptDefinition(file);
String name = file.getName(); String name = file.getName();
int index = name.lastIndexOf('/'); int index = name.lastIndexOf('/');
if(index != -1) if (index != -1) {
name = name.substring(index+1); name = name.substring(index + 1);
if(name.endsWith(scriptDefinition.getExtension())) }
name = name.substring(0, name.length()-scriptDefinition.getExtension().length()); if (name.endsWith(extension)) {
name = name.substring(0, name.length() - extension.length());
}
else { else {
index = name.indexOf('.'); index = name.indexOf('.');
if(index != -1) if (index != -1) {
name = name.substring(0,index); name = name.substring(0, index);
}
} }
name = Character.toUpperCase(name.charAt(0)) + (name.length() == 0 ? "" : name.substring(1)); name = Character.toUpperCase(name.charAt(0)) + (name.length() == 0 ? "" : name.substring(1));
name = name.replace('.', '_'); name = name.replace('.', '_');
KtPackageDirective directive = file.getPackageDirective(); return Name.identifier(name);
if(directive != null && directive.getQualifiedName().length() > 0) {
name = directive.getQualifiedName() + "." + name;
}
return new FqName(name);
} }
} }
@@ -1,7 +1,8 @@
package package
public final class Script { 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 equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
@@ -4,6 +4,14 @@ package test {
public final class A { public final class A {
public constructor 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 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 equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int 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 final class F1 {
public constructor F1() public constructor F1()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@@ -1,7 +1,8 @@
package package
public final class AccessForwardDeclarationInScript { 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 x: kotlin.Int = 2
public final val y: kotlin.Int = 2 public final val y: kotlin.Int = 2
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@@ -1,7 +1,8 @@
package package
public final class ComplexScript { 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 final val y: kotlin.Int = 2
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public final fun foo(/*0*/ x: kotlin.Int): kotlin.Int public final fun foo(/*0*/ x: kotlin.Int): kotlin.Int
@@ -1,7 +1,8 @@
package package
public final class NestedInnerClass { 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 final val property: kotlin.String = ""
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public final fun function(): kotlin.Int public final fun function(): kotlin.Int
@@ -1,7 +1,8 @@
package package
public final class SimpleScript { 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 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 equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
+2 -1
View File
@@ -1,8 +1,9 @@
package package
public final class Imports { 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 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 equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
+2 -1
View File
@@ -1,7 +1,8 @@
package package
public final class Script { 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 equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public final fun main(): kotlin.Boolean public final fun main(): kotlin.Boolean
@@ -23,8 +23,10 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles; import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles;
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment; 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.CompilerConfiguration;
import org.jetbrains.kotlin.config.ContentRootsKt; import org.jetbrains.kotlin.config.ContentRootsKt;
import org.jetbrains.kotlin.script.StandardScriptDefinition;
import org.jetbrains.kotlin.test.ConfigurationKind; import org.jetbrains.kotlin.test.ConfigurationKind;
import org.jetbrains.kotlin.test.KotlinLiteFixture; import org.jetbrains.kotlin.test.KotlinLiteFixture;
import org.jetbrains.kotlin.test.KotlinTestUtils; import org.jetbrains.kotlin.test.KotlinTestUtils;
@@ -66,6 +68,7 @@ public abstract class KotlinMultiFileTestWithWithJava<M, F> extends KotlinLiteFi
protected KotlinCoreEnvironment createEnvironment() { protected KotlinCoreEnvironment createEnvironment() {
File javaFilesDir = createJavaFilesDir(); File javaFilesDir = createJavaFilesDir();
CompilerConfiguration configuration = createCompilerConfiguration(javaFilesDir); CompilerConfiguration configuration = createCompilerConfiguration(javaFilesDir);
configuration.add(CommonConfigurationKeys.SCRIPT_DEFINITIONS_KEY, StandardScriptDefinition.INSTANCE);
File kotlinSourceRoot = getKotlinSourceRoot(); File kotlinSourceRoot = getKotlinSourceRoot();
if (kotlinSourceRoot != null) { if (kotlinSourceRoot != null) {
ContentRootsKt.addKotlinSourceRoot(configuration, kotlinSourceRoot.getPath()); 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.psi.KtFile;
import org.jetbrains.kotlin.resolve.AnalyzingUtils; import org.jetbrains.kotlin.resolve.AnalyzingUtils;
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform; 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.KotlinScriptDefinitionProvider;
import org.jetbrains.kotlin.script.ScriptParameter;
import org.jetbrains.kotlin.scripts.TestScriptDefinition;
import org.jetbrains.kotlin.test.KotlinTestUtils; import org.jetbrains.kotlin.test.KotlinTestUtils;
import org.jetbrains.kotlin.types.KotlinType; import org.jetbrains.kotlin.types.KotlinType;
import org.jetbrains.kotlin.types.Variance; import org.jetbrains.kotlin.types.Variance;
@@ -156,8 +156,9 @@ public class CodegenTestFiles {
scriptParameterValues.add(value); scriptParameterValues.add(value);
} }
KotlinScriptDefinitionProvider.getInstance(project).addScriptDefinition( KotlinScriptDefinitionProvider definitionProvider = KotlinScriptDefinitionProvider.getInstance(project);
new KotlinScriptDefinition( definitionProvider.addScriptDefinition(
new TestScriptDefinition(
".kts", ".kts",
scriptParameterTypes scriptParameterTypes
) )
@@ -18,30 +18,40 @@ package org.jetbrains.kotlin.codegen;
import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform; 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.KotlinScriptDefinition;
import org.jetbrains.kotlin.script.KotlinScriptDefinitionProvider; 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.kotlin.test.ConfigurationKind;
import org.jetbrains.org.objectweb.asm.Opcodes; import org.jetbrains.org.objectweb.asm.Opcodes;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Collections;
import static java.util.Collections.singletonList; import static java.util.Collections.singletonList;
public class ScriptGenTest extends CodegenTestCase { public class ScriptGenTest extends CodegenTestCase {
private static final KotlinScriptDefinition FIB_SCRIPT_DEFINITION = private static final KotlinScriptDefinition FIB_SCRIPT_DEFINITION =
new KotlinScriptDefinition( new TestScriptDefinition(
".lang.kt", ".lang.kt",
singletonList(new ScriptParameter(Name.identifier("num"), JvmPlatform.INSTANCE$.getBuiltIns().getIntType())) 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 @Override
protected void setUp() throws Exception { protected void setUp() throws Exception {
super.setUp(); super.setUp();
createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); 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 { 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.EnvironmentConfigFiles;
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment; import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment;
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler; 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.codegen.CompilationException;
import org.jetbrains.kotlin.config.CommonConfigurationKeys; import org.jetbrains.kotlin.config.CommonConfigurationKeys;
import org.jetbrains.kotlin.config.CompilerConfiguration; import org.jetbrains.kotlin.config.CompilerConfiguration;
import org.jetbrains.kotlin.config.ContentRootsKt; import org.jetbrains.kotlin.config.ContentRootsKt;
import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform; 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.KotlinScriptDefinition;
import org.jetbrains.kotlin.script.KotlinScriptDefinitionProvider; import org.jetbrains.kotlin.script.KotlinScriptDefinitionProvider;
import org.jetbrains.kotlin.script.ScriptParameter;
import org.jetbrains.kotlin.test.ConfigurationKind; import org.jetbrains.kotlin.test.ConfigurationKind;
import org.jetbrains.kotlin.test.KotlinTestUtils; import org.jetbrains.kotlin.test.KotlinTestUtils;
import org.jetbrains.kotlin.test.TestJdkKind; import org.jetbrains.kotlin.test.TestJdkKind;
@@ -49,22 +48,21 @@ import java.util.List;
public class ScriptTest { public class ScriptTest {
@Test @Test
public void testScript() throws Exception { 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); Assert.assertNotNull(aClass);
aClass.getConstructor(int.class).newInstance(4); aClass.getConstructor(int.class).newInstance(4);
} }
@Test @Test
public void testScriptWithPackage() throws Exception { 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); Assert.assertNotNull(aClass);
aClass.getConstructor(int.class).newInstance(4); aClass.getConstructor(int.class).newInstance(4);
} }
@Test @Test
public void testScriptWithScriptDefinition() throws Exception { public void testScriptWithScriptDefinition() throws Exception {
Class<?> aClass = compileScript("fib.fib.kt", null, Class<?> aClass = compileScript("fib.fib.kt", new TestScriptDefinition(".fib.kt", numIntParam()));
Collections.singletonList(new KotlinScriptDefinition(".fib.kt", numIntParam())));
Assert.assertNotNull(aClass); Assert.assertNotNull(aClass);
aClass.getConstructor(int.class).newInstance(4); aClass.getConstructor(int.class).newInstance(4);
} }
@@ -72,8 +70,7 @@ public class ScriptTest {
@Nullable @Nullable
private static Class<?> compileScript( private static Class<?> compileScript(
@NotNull String scriptPath, @NotNull String scriptPath,
@Nullable List<ScriptParameter> scriptParameters, @NotNull KotlinScriptDefinition scriptDefinition
@NotNull List<KotlinScriptDefinition> scriptDefinitions
) { ) {
KotlinPaths paths = PathUtil.getKotlinPathsForDistDirectory(); KotlinPaths paths = PathUtil.getKotlinPathsForDistDirectory();
MessageCollector messageCollector = PrintingMessageCollector.PLAIN_TEXT_TO_SYSTEM_ERR; MessageCollector messageCollector = PrintingMessageCollector.PLAIN_TEXT_TO_SYSTEM_ERR;
@@ -84,14 +81,12 @@ public class ScriptTest {
KotlinTestUtils.compilerConfigurationForTests(ConfigurationKind.JDK_ONLY, TestJdkKind.FULL_JDK); KotlinTestUtils.compilerConfigurationForTests(ConfigurationKind.JDK_ONLY, TestJdkKind.FULL_JDK);
configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, messageCollector); configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, messageCollector);
ContentRootsKt.addKotlinSourceRoot(configuration, "compiler/testData/script/" + scriptPath); ContentRootsKt.addKotlinSourceRoot(configuration, "compiler/testData/script/" + scriptPath);
configuration.addAll(CommonConfigurationKeys.SCRIPT_DEFINITIONS_KEY, scriptDefinitions); configuration.add(CommonConfigurationKeys.SCRIPT_DEFINITIONS_KEY, scriptDefinition);
configuration.put(JVMConfigurationKeys.SCRIPT_PARAMETERS, scriptParameters);
KotlinCoreEnvironment environment = KotlinCoreEnvironment environment =
KotlinCoreEnvironment.createForProduction(rootDisposable, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES); KotlinCoreEnvironment.createForProduction(rootDisposable, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES);
try { try {
KotlinScriptDefinitionProvider.getInstance(environment.getProject()).markFileAsScript(environment.getSourceFiles().get(0));
return KotlinToJVMBytecodeCompiler.compileScript(configuration, paths, environment); return KotlinToJVMBytecodeCompiler.compileScript(configuration, paths, environment);
} }
catch (CompilationException e) { catch (CompilationException e) {
@@ -111,6 +106,6 @@ public class ScriptTest {
@NotNull @NotNull
private static List<ScriptParameter> numIntParam() { 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)
}