[scripting] Move earlierScripts to the frontend descriptor
^KT-20488 fixed
This commit is contained in:
@@ -79,10 +79,7 @@ class ScriptCodegen private constructor(
|
|||||||
classBuilder: ClassBuilder,
|
classBuilder: ClassBuilder,
|
||||||
methodContext: MethodContext
|
methodContext: MethodContext
|
||||||
) {
|
) {
|
||||||
val jvmSignature = typeMapper.mapScriptSignature(
|
val jvmSignature = typeMapper.mapScriptSignature(scriptDescriptor)
|
||||||
scriptDescriptor,
|
|
||||||
scriptContext.earlierScripts
|
|
||||||
)
|
|
||||||
val asmMethod = jvmSignature.asmMethod
|
val asmMethod = jvmSignature.asmMethod
|
||||||
|
|
||||||
scriptContext.resultFieldInfo?.let { resultFieldInfo ->
|
scriptContext.resultFieldInfo?.let { resultFieldInfo ->
|
||||||
@@ -129,7 +126,7 @@ class ScriptCodegen private constructor(
|
|||||||
field.store(value, iv)
|
field.store(value, iv)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!scriptContext.earlierScripts.isEmpty()) {
|
if (scriptContext.scriptDescriptor.isReplScript) {
|
||||||
val scriptsParamIndex = frameMap.enterTemp(AsmUtil.getArrayType(OBJECT_TYPE))
|
val scriptsParamIndex = frameMap.enterTemp(AsmUtil.getArrayType(OBJECT_TYPE))
|
||||||
|
|
||||||
scriptContext.earlierScripts.forEachIndexed { earlierScriptIndex, earlierScript ->
|
scriptContext.earlierScripts.forEachIndexed { earlierScriptIndex, earlierScript ->
|
||||||
|
|||||||
@@ -67,8 +67,10 @@ class ScriptContext(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val ctorExplicitParametersStart = if (scriptDescriptor.earlierScriptsConstructorParameter == null) 0 else 1
|
||||||
|
|
||||||
private val ctorImplicitReceiversParametersStart =
|
private val ctorImplicitReceiversParametersStart =
|
||||||
(scriptDescriptor.getSuperClassNotAny()?.unsubstitutedPrimaryConstructor?.valueParameters?.size ?: 0)
|
ctorExplicitParametersStart + (scriptDescriptor.getSuperClassNotAny()?.unsubstitutedPrimaryConstructor?.valueParameters?.size ?: 0)
|
||||||
|
|
||||||
private val ctorProvidedPropertiesParametersStart =
|
private val ctorProvidedPropertiesParametersStart =
|
||||||
ctorImplicitReceiversParametersStart + scriptDescriptor.implicitReceivers.size
|
ctorImplicitReceiversParametersStart + scriptDescriptor.implicitReceivers.size
|
||||||
|
|||||||
@@ -1204,15 +1204,11 @@ class KotlinTypeMapper @JvmOverloads constructor(
|
|||||||
return Method(name, desc)
|
return Method(name, desc)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun mapScriptSignature(script: ScriptDescriptor, importedScripts: List<ScriptDescriptor>): JvmMethodSignature {
|
fun mapScriptSignature(script: ScriptDescriptor): JvmMethodSignature {
|
||||||
val sw = BothSignatureWriter(BothSignatureWriter.Mode.METHOD)
|
val sw = BothSignatureWriter(BothSignatureWriter.Mode.METHOD)
|
||||||
|
|
||||||
sw.writeParametersStart()
|
sw.writeParametersStart()
|
||||||
|
|
||||||
if (importedScripts.isNotEmpty()) {
|
|
||||||
writeParameter(sw, script.module.builtIns.array.defaultType, null)
|
|
||||||
}
|
|
||||||
|
|
||||||
for (valueParameter in script.unsubstitutedPrimaryConstructor.valueParameters) {
|
for (valueParameter in script.unsubstitutedPrimaryConstructor.valueParameters) {
|
||||||
writeParameter(sw, valueParameter.type, null)/* callableDescriptor = */
|
writeParameter(sw, valueParameter.type, null)/* callableDescriptor = */
|
||||||
}
|
}
|
||||||
|
|||||||
+7
-7
@@ -75,14 +75,14 @@ open class GenericReplEvaluator(
|
|||||||
val useScriptArgs = currentScriptArgs?.scriptArgs
|
val useScriptArgs = currentScriptArgs?.scriptArgs
|
||||||
val useScriptArgsTypes = currentScriptArgs?.scriptArgsTypes?.map { it.java }
|
val useScriptArgsTypes = currentScriptArgs?.scriptArgsTypes?.map { it.java }
|
||||||
|
|
||||||
val hasHistory = historyActor.effectiveHistory.isNotEmpty()
|
val constructorParams: Array<Class<*>> =
|
||||||
|
arrayOf<Class<*>>(Array<Any>::class.java) +
|
||||||
|
(useScriptArgs?.mapIndexed { i, it -> useScriptArgsTypes?.getOrNull(i) ?: it?.javaClass ?: Any::class.java } ?: emptyList())
|
||||||
|
|
||||||
val constructorParams: Array<Class<*>> = (if (hasHistory) arrayOf<Class<*>>(Array<Any>::class.java) else emptyArray<Class<*>>()) +
|
val constructorArgs: Array<out Any?> = arrayOf(
|
||||||
(useScriptArgs?.mapIndexed { i, it -> useScriptArgsTypes?.getOrNull(i) ?: it?.javaClass ?: Any::class.java } ?: emptyList())
|
historyActor.effectiveHistory.map { it.instance }.takeIf { it.isNotEmpty() }?.toTypedArray(),
|
||||||
|
*(useScriptArgs.orEmpty())
|
||||||
val constructorArgs: Array<out Any?> = if (hasHistory) arrayOf(historyActor.effectiveHistory.map { it.instance }.takeIf { it.isNotEmpty() }?.toTypedArray(),
|
)
|
||||||
*(useScriptArgs.orEmpty()))
|
|
||||||
else useScriptArgs.orEmpty()
|
|
||||||
|
|
||||||
// TODO: try/catch ?
|
// TODO: try/catch ?
|
||||||
val scriptInstanceConstructor = scriptClass.getConstructor(*constructorParams)
|
val scriptInstanceConstructor = scriptClass.getConstructor(*constructorParams)
|
||||||
|
|||||||
+7
-12
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.psi2ir.generators
|
|||||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||||
import org.jetbrains.kotlin.descriptors.ParameterDescriptor
|
import org.jetbrains.kotlin.descriptors.ParameterDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ScriptDescriptor
|
import org.jetbrains.kotlin.descriptors.ScriptDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
|
||||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||||
import org.jetbrains.kotlin.ir.assertCast
|
import org.jetbrains.kotlin.ir.assertCast
|
||||||
import org.jetbrains.kotlin.ir.builders.declarations.IrFunctionBuilder
|
import org.jetbrains.kotlin.ir.builders.declarations.IrFunctionBuilder
|
||||||
@@ -86,19 +87,9 @@ class ScriptGenerator(declarationGenerator: DeclarationGenerator) : DeclarationG
|
|||||||
irScript.earlierScripts?.forEach {
|
irScript.earlierScripts?.forEach {
|
||||||
context.symbolTable.introduceValueParameter(it.owner.thisReceiver)
|
context.symbolTable.introduceValueParameter(it.owner.thisReceiver)
|
||||||
}
|
}
|
||||||
irScript.earlierScriptsParameter = irScript.earlierScripts?.takeIf { it.isNotEmpty() }?.let {
|
|
||||||
val baseType = context.irBuiltIns.anyType
|
|
||||||
val arrayType = baseType.toArrayOrPrimitiveArrayType(context.irBuiltIns)
|
|
||||||
context.irFactory.createValueParameter(
|
|
||||||
UNDEFINED_OFFSET, UNDEFINED_OFFSET, IrDeclarationOrigin.SCRIPT_EARLIER_SCRIPTS, IrValueParameterSymbolImpl(),
|
|
||||||
Name.special("<earlierScripts>"), parametersIndex++,
|
|
||||||
arrayType, null,
|
|
||||||
false, false, false, false
|
|
||||||
).also { it.parent = irScript }
|
|
||||||
}
|
|
||||||
|
|
||||||
irScript.explicitCallParameters = descriptor.explicitConstructorParameters.map { valueParameterDescriptor ->
|
fun createValueParameter(valueParameterDescriptor: ValueParameterDescriptor): IrValueParameter {
|
||||||
context.irFactory.createValueParameter(
|
return context.irFactory.createValueParameter(
|
||||||
UNDEFINED_OFFSET, UNDEFINED_OFFSET,
|
UNDEFINED_OFFSET, UNDEFINED_OFFSET,
|
||||||
IrDeclarationOrigin.SCRIPT_CALL_PARAMETER, IrValueParameterSymbolImpl(),
|
IrDeclarationOrigin.SCRIPT_CALL_PARAMETER, IrValueParameterSymbolImpl(),
|
||||||
valueParameterDescriptor.name, parametersIndex++,
|
valueParameterDescriptor.name, parametersIndex++,
|
||||||
@@ -108,6 +99,10 @@ class ScriptGenerator(declarationGenerator: DeclarationGenerator) : DeclarationG
|
|||||||
).also { it.parent = irScript }
|
).also { it.parent = irScript }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
irScript.earlierScriptsParameter = descriptor.earlierScriptsConstructorParameter?.let(::createValueParameter)
|
||||||
|
|
||||||
|
irScript.explicitCallParameters = descriptor.explicitConstructorParameters.map(::createValueParameter)
|
||||||
|
|
||||||
irScript.implicitReceiversParameters = descriptor.implicitReceivers.map {
|
irScript.implicitReceiversParameters = descriptor.implicitReceivers.map {
|
||||||
makeParameter(it.thisAsReceiverParameter, IrDeclarationOrigin.SCRIPT_IMPLICIT_RECEIVER, parametersIndex++)
|
makeParameter(it.thisAsReceiverParameter, IrDeclarationOrigin.SCRIPT_IMPLICIT_RECEIVER, parametersIndex++)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,6 +37,9 @@ public interface ScriptDescriptor extends ClassDescriptor {
|
|||||||
@Nullable
|
@Nullable
|
||||||
PropertyDescriptor getResultValue();
|
PropertyDescriptor getResultValue();
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
ValueParameterDescriptor getEarlierScriptsConstructorParameter();
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
List<ValueParameterDescriptor> getExplicitConstructorParameters();
|
List<ValueParameterDescriptor> getExplicitConstructorParameters();
|
||||||
|
|
||||||
@@ -45,4 +48,6 @@ public interface ScriptDescriptor extends ClassDescriptor {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
List<ValueParameterDescriptor> getScriptProvidedPropertiesParameters();
|
List<ValueParameterDescriptor> getScriptProvidedPropertiesParameters();
|
||||||
|
|
||||||
|
boolean isReplScript();
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-3
@@ -47,9 +47,7 @@ class JvmReplEvaluator(
|
|||||||
val lastSnippetClass = history.peek()?.item?.first
|
val lastSnippetClass = history.peek()?.item?.first
|
||||||
val historyBeforeSnippet = history.previousItems(compileResult.lineId).map { it.second }.toList()
|
val historyBeforeSnippet = history.previousItems(compileResult.lineId).map { it.second }.toList()
|
||||||
val currentConfiguration = ScriptEvaluationConfiguration(baseScriptEvaluationConfiguration) {
|
val currentConfiguration = ScriptEvaluationConfiguration(baseScriptEvaluationConfiguration) {
|
||||||
if (historyBeforeSnippet.isNotEmpty()) {
|
previousSnippets.put(historyBeforeSnippet)
|
||||||
previousSnippets.put(historyBeforeSnippet)
|
|
||||||
}
|
|
||||||
if (lastSnippetClass != null) {
|
if (lastSnippetClass != null) {
|
||||||
jvm {
|
jvm {
|
||||||
baseClassLoader(lastSnippetClass.java.classLoader)
|
baseClassLoader(lastSnippetClass.java.classLoader)
|
||||||
|
|||||||
@@ -37,9 +37,7 @@ class BasicJvmReplEvaluator(val scriptEvaluator: ScriptEvaluator = BasicJvmScrip
|
|||||||
val lastSnippetClass = history.lastItem()?.first
|
val lastSnippetClass = history.lastItem()?.first
|
||||||
val historyBeforeSnippet = history.items.map { it.second }
|
val historyBeforeSnippet = history.items.map { it.second }
|
||||||
val currentConfiguration = ScriptEvaluationConfiguration(configuration) {
|
val currentConfiguration = ScriptEvaluationConfiguration(configuration) {
|
||||||
if (historyBeforeSnippet.isNotEmpty()) {
|
previousSnippets.put(historyBeforeSnippet)
|
||||||
previousSnippets.put(historyBeforeSnippet)
|
|
||||||
}
|
|
||||||
if (lastSnippetClass != null) {
|
if (lastSnippetClass != null) {
|
||||||
jvm {
|
jvm {
|
||||||
lastSnippetClassLoader(lastSnippetClass.java.classLoader)
|
lastSnippetClassLoader(lastSnippetClass.java.classLoader)
|
||||||
|
|||||||
+7
-5
@@ -19,12 +19,16 @@ open class BasicJvmScriptEvaluator : ScriptEvaluator {
|
|||||||
|
|
||||||
// configuration shared between all module scripts
|
// configuration shared between all module scripts
|
||||||
val sharedConfiguration = scriptEvaluationConfiguration.getOrPrepareShared(scriptClass.java.classLoader)
|
val sharedConfiguration = scriptEvaluationConfiguration.getOrPrepareShared(scriptClass.java.classLoader)
|
||||||
|
val configurationForOtherScripts by lazy {
|
||||||
|
sharedConfiguration.with {
|
||||||
|
reset(ScriptEvaluationConfiguration.previousSnippets)
|
||||||
|
}
|
||||||
|
}
|
||||||
val sharedScripts = sharedConfiguration[ScriptEvaluationConfiguration.jvm.scriptsInstancesSharingMap]
|
val sharedScripts = sharedConfiguration[ScriptEvaluationConfiguration.jvm.scriptsInstancesSharingMap]
|
||||||
|
|
||||||
sharedScripts?.get(scriptClass)?.asSuccess()
|
sharedScripts?.get(scriptClass)?.asSuccess()
|
||||||
?: compiledScript.otherScripts.mapSuccess {
|
?: compiledScript.otherScripts.mapSuccess {
|
||||||
invoke(it, sharedConfiguration)
|
invoke(it, configurationForOtherScripts)
|
||||||
}.onSuccess { importedScriptsEvalResults ->
|
}.onSuccess { importedScriptsEvalResults ->
|
||||||
|
|
||||||
val refinedEvalConfiguration =
|
val refinedEvalConfiguration =
|
||||||
@@ -70,9 +74,7 @@ open class BasicJvmScriptEvaluator : ScriptEvaluator {
|
|||||||
val args = ArrayList<Any?>()
|
val args = ArrayList<Any?>()
|
||||||
|
|
||||||
refinedEvalConfiguration[ScriptEvaluationConfiguration.previousSnippets]?.let {
|
refinedEvalConfiguration[ScriptEvaluationConfiguration.previousSnippets]?.let {
|
||||||
if (it.isNotEmpty()) {
|
args.add(it.toTypedArray())
|
||||||
args.add(it.toTypedArray())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
refinedEvalConfiguration[ScriptEvaluationConfiguration.constructorArgs]?.let {
|
refinedEvalConfiguration[ScriptEvaluationConfiguration.constructorArgs]?.let {
|
||||||
|
|||||||
+4
@@ -17,4 +17,8 @@ public class ScriptPriorities {
|
|||||||
Integer priority = script.getUserData(PRIORITY_KEY);
|
Integer priority = script.getUserData(PRIORITY_KEY);
|
||||||
return priority == null ? 0 : priority;
|
return priority == null ? 0 : priority;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isReplScript(@NotNull KtScript script) {
|
||||||
|
return script.getUserData(PRIORITY_KEY) != null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+28
-11
@@ -40,10 +40,7 @@ import org.jetbrains.kotlin.resolve.scopes.LexicalScopeImpl
|
|||||||
import org.jetbrains.kotlin.resolve.scopes.LexicalScopeKind
|
import org.jetbrains.kotlin.resolve.scopes.LexicalScopeKind
|
||||||
import org.jetbrains.kotlin.resolve.scopes.utils.addImportingScope
|
import org.jetbrains.kotlin.resolve.scopes.utils.addImportingScope
|
||||||
import org.jetbrains.kotlin.resolve.source.toSourceElement
|
import org.jetbrains.kotlin.resolve.source.toSourceElement
|
||||||
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
|
import org.jetbrains.kotlin.scripting.definitions.*
|
||||||
import org.jetbrains.kotlin.scripting.definitions.ScriptDependenciesProvider
|
|
||||||
import org.jetbrains.kotlin.scripting.definitions.ScriptPriorities
|
|
||||||
import org.jetbrains.kotlin.scripting.definitions.findScriptCompilationConfiguration
|
|
||||||
import org.jetbrains.kotlin.types.TypeSubstitutor
|
import org.jetbrains.kotlin.types.TypeSubstitutor
|
||||||
import org.jetbrains.kotlin.types.typeUtil.isNothing
|
import org.jetbrains.kotlin.types.typeUtil.isNothing
|
||||||
import org.jetbrains.kotlin.types.typeUtil.isUnit
|
import org.jetbrains.kotlin.types.typeUtil.isUnit
|
||||||
@@ -120,6 +117,7 @@ class LazyScriptDescriptor(
|
|||||||
override fun getSource() = sourceElement
|
override fun getSource() = sourceElement
|
||||||
|
|
||||||
private val priority: Int = ScriptPriorities.getScriptPriority(scriptInfo.script)
|
private val priority: Int = ScriptPriorities.getScriptPriority(scriptInfo.script)
|
||||||
|
private val isReplScript: Boolean = ScriptPriorities.isReplScript(scriptInfo.script)
|
||||||
|
|
||||||
override fun getPriority() = priority
|
override fun getPriority() = priority
|
||||||
|
|
||||||
@@ -290,6 +288,7 @@ class LazyScriptDescriptor(
|
|||||||
|
|
||||||
internal class ConstructorWithParams(
|
internal class ConstructorWithParams(
|
||||||
val constructor: ClassConstructorDescriptorImpl,
|
val constructor: ClassConstructorDescriptorImpl,
|
||||||
|
val earlierScriptsParameter: ValueParameterDescriptor?,
|
||||||
val baseClassConstructorParameters: List<ValueParameterDescriptor>,
|
val baseClassConstructorParameters: List<ValueParameterDescriptor>,
|
||||||
val implicitReceiversParameters: List<ValueParameterDescriptor>,
|
val implicitReceiversParameters: List<ValueParameterDescriptor>,
|
||||||
val scriptProvidedPropertiesParameters: List<ValueParameterDescriptor>
|
val scriptProvidedPropertiesParameters: List<ValueParameterDescriptor>
|
||||||
@@ -305,46 +304,60 @@ class LazyScriptDescriptor(
|
|||||||
val receiverName =
|
val receiverName =
|
||||||
if (receiver is ScriptDescriptor) "${LazyScriptClassMemberScope.IMPORTED_SCRIPT_PARAM_NAME_PREFIX}${receiver.name}"
|
if (receiver is ScriptDescriptor) "${LazyScriptClassMemberScope.IMPORTED_SCRIPT_PARAM_NAME_PREFIX}${receiver.name}"
|
||||||
else "${LazyScriptClassMemberScope.IMPLICIT_RECEIVER_PARAM_NAME_PREFIX}$idx"
|
else "${LazyScriptClassMemberScope.IMPLICIT_RECEIVER_PARAM_NAME_PREFIX}$idx"
|
||||||
receiverName to receiver.defaultType
|
Name.identifier(receiverName) to receiver.defaultType
|
||||||
}
|
}
|
||||||
|
|
||||||
val providedPropertiesParamTypes =
|
val providedPropertiesParamTypes =
|
||||||
scriptProvidedProperties().map {
|
scriptProvidedProperties().map {
|
||||||
it.name.identifier to it.type
|
it.name to it.type
|
||||||
}
|
}
|
||||||
val constructorDescriptor = ClassConstructorDescriptorImpl.create(this, inheritedAnnotations, true, source)
|
val constructorDescriptor = ClassConstructorDescriptorImpl.create(this, inheritedAnnotations, true, source)
|
||||||
|
|
||||||
var paramsIndexBase = baseExplicitParameters.lastIndex + 1
|
var paramsIndexBase = 0
|
||||||
|
|
||||||
fun createValueParameter(param: Pair<String, org.jetbrains.kotlin.types.KotlinType>) =
|
fun createValueParameter(param: Pair<Name, org.jetbrains.kotlin.types.KotlinType>) =
|
||||||
ValueParameterDescriptorImpl(
|
ValueParameterDescriptorImpl(
|
||||||
constructorDescriptor,
|
constructorDescriptor,
|
||||||
null,
|
null,
|
||||||
paramsIndexBase++,
|
paramsIndexBase++,
|
||||||
Annotations.EMPTY,
|
Annotations.EMPTY,
|
||||||
Name.identifier(param.first),
|
param.first,
|
||||||
param.second,
|
param.second,
|
||||||
declaresDefaultValue = false, isCrossinline = false, isNoinline = false, varargElementType = null,
|
declaresDefaultValue = false, isCrossinline = false, isNoinline = false, varargElementType = null,
|
||||||
source = SourceElement.NO_SOURCE
|
source = SourceElement.NO_SOURCE
|
||||||
)
|
)
|
||||||
|
|
||||||
val explicitParameters = baseExplicitParameters.map { it.copy(constructorDescriptor, it.name, it.index) }
|
val earlierScriptsParameter = if (isReplScript) {
|
||||||
|
createValueParameter(Name.special("<earlierScripts>") to builtIns.array.defaultType)
|
||||||
|
} else null
|
||||||
|
|
||||||
|
val explicitParameters = baseExplicitParameters.map { it.copy(constructorDescriptor, it.name, paramsIndexBase++) }
|
||||||
val implicitReceiversParameters = implicitReceiversParamTypes.map(::createValueParameter)
|
val implicitReceiversParameters = implicitReceiversParamTypes.map(::createValueParameter)
|
||||||
val providedPropertiesParameters = providedPropertiesParamTypes.map(::createValueParameter)
|
val providedPropertiesParameters = providedPropertiesParamTypes.map(::createValueParameter)
|
||||||
|
|
||||||
constructorDescriptor.initialize(
|
constructorDescriptor.initialize(
|
||||||
explicitParameters + implicitReceiversParameters + providedPropertiesParameters, DescriptorVisibilities.PUBLIC
|
buildList {
|
||||||
|
earlierScriptsParameter?.let { add(it) }
|
||||||
|
addAll(explicitParameters)
|
||||||
|
addAll(implicitReceiversParameters)
|
||||||
|
addAll(providedPropertiesParameters)
|
||||||
|
},
|
||||||
|
DescriptorVisibilities.PUBLIC
|
||||||
)
|
)
|
||||||
constructorDescriptor.returnType = defaultType()
|
constructorDescriptor.returnType = defaultType()
|
||||||
|
|
||||||
ConstructorWithParams(
|
ConstructorWithParams(
|
||||||
constructorDescriptor,
|
constructorDescriptor,
|
||||||
|
earlierScriptsParameter = earlierScriptsParameter,
|
||||||
baseClassConstructorParameters = explicitParameters,
|
baseClassConstructorParameters = explicitParameters,
|
||||||
implicitReceiversParameters = implicitReceiversParameters,
|
implicitReceiversParameters = implicitReceiversParameters,
|
||||||
scriptProvidedPropertiesParameters = providedPropertiesParameters
|
scriptProvidedPropertiesParameters = providedPropertiesParameters
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getEarlierScriptsConstructorParameter(): ValueParameterDescriptor? =
|
||||||
|
scriptPrimaryConstructorWithParams().earlierScriptsParameter
|
||||||
|
|
||||||
override fun getExplicitConstructorParameters(): List<ValueParameterDescriptor> =
|
override fun getExplicitConstructorParameters(): List<ValueParameterDescriptor> =
|
||||||
scriptPrimaryConstructorWithParams().baseClassConstructorParameters
|
scriptPrimaryConstructorWithParams().baseClassConstructorParameters
|
||||||
|
|
||||||
@@ -384,4 +397,8 @@ class LazyScriptDescriptor(
|
|||||||
|
|
||||||
override val annotations: Annotations
|
override val annotations: Annotations
|
||||||
get() = scriptClassAnnotations()
|
get() = scriptClassAnnotations()
|
||||||
|
|
||||||
|
override fun isReplScript(): Boolean {
|
||||||
|
return isReplScript
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+11
-7
@@ -100,12 +100,20 @@ open class ReplCodeAnalyzerBase(
|
|||||||
|
|
||||||
fun reset(): List<SourceCodeByReplLine> = replState.reset()
|
fun reset(): List<SourceCodeByReplLine> = replState.reset()
|
||||||
|
|
||||||
fun analyzeReplLine(psiFile: KtFile, codeLine: ReplCodeLine): ReplLineAnalysisResult {
|
protected fun prepareForAnalyze(
|
||||||
|
psiFile: KtFile,
|
||||||
|
priority: Int
|
||||||
|
) {
|
||||||
topDownAnalysisContext.scripts.clear()
|
topDownAnalysisContext.scripts.clear()
|
||||||
trace.clearDiagnostics()
|
trace.clearDiagnostics()
|
||||||
|
|
||||||
psiFile.script!!.putUserData(ScriptPriorities.PRIORITY_KEY, codeLine.no)
|
val script = psiFile.script!!
|
||||||
|
|
||||||
|
script.putUserData(ScriptPriorities.PRIORITY_KEY, priority)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun analyzeReplLine(psiFile: KtFile, codeLine: ReplCodeLine): ReplLineAnalysisResult {
|
||||||
|
prepareForAnalyze(psiFile, codeLine.no)
|
||||||
return doAnalyze(psiFile, emptyList(), codeLine.toSourceCode())
|
return doAnalyze(psiFile, emptyList(), codeLine.toSourceCode())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,11 +123,7 @@ open class ReplCodeAnalyzerBase(
|
|||||||
codeLine: SourceCode,
|
codeLine: SourceCode,
|
||||||
priority: Int
|
priority: Int
|
||||||
): ReplLineAnalysisResult {
|
): ReplLineAnalysisResult {
|
||||||
topDownAnalysisContext.scripts.clear()
|
prepareForAnalyze(psiFile, priority)
|
||||||
trace.clearDiagnostics()
|
|
||||||
|
|
||||||
psiFile.script!!.putUserData(ScriptPriorities.PRIORITY_KEY, priority)
|
|
||||||
|
|
||||||
return doAnalyze(psiFile, importedScripts, codeLine.addNo(priority))
|
return doAnalyze(psiFile, importedScripts, codeLine.addNo(priority))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ dependencies {
|
|||||||
|
|
||||||
testImplementation(commonDep("org.jetbrains.kotlinx", "kotlinx-coroutines-core"))
|
testImplementation(commonDep("org.jetbrains.kotlinx", "kotlinx-coroutines-core"))
|
||||||
testImplementation(commonDep("org.jetbrains.kotlinx", "kotlinx-coroutines-core-jvm"))
|
testImplementation(commonDep("org.jetbrains.kotlinx", "kotlinx-coroutines-core-jvm"))
|
||||||
|
testImplementation(project(":kotlin-reflect"))
|
||||||
testRuntimeOnly(project(":kotlin-compiler"))
|
testRuntimeOnly(project(":kotlin-compiler"))
|
||||||
testRuntimeOnly(commonDep("org.jetbrains.intellij.deps", "trove4j"))
|
testRuntimeOnly(commonDep("org.jetbrains.intellij.deps", "trove4j"))
|
||||||
testRuntimeOnly(project(":kotlin-scripting-ide-common")) { isTransitive = false }
|
testRuntimeOnly(project(":kotlin-scripting-ide-common")) { isTransitive = false }
|
||||||
|
|||||||
+15
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.config.Services
|
|||||||
import org.jetbrains.kotlin.scripting.ide_services.test_util.*
|
import org.jetbrains.kotlin.scripting.ide_services.test_util.*
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import kotlin.io.path.*
|
import kotlin.io.path.*
|
||||||
|
import kotlin.reflect.full.isSubclassOf
|
||||||
import kotlin.script.experimental.api.*
|
import kotlin.script.experimental.api.*
|
||||||
import kotlin.script.experimental.jvm.impl.KJvmCompiledScript
|
import kotlin.script.experimental.jvm.impl.KJvmCompiledScript
|
||||||
import kotlin.script.experimental.jvm.jvm
|
import kotlin.script.experimental.jvm.jvm
|
||||||
@@ -325,6 +326,20 @@ class JvmIdeServicesTest : TestCase() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun testAnonymousObjectReflection() {
|
||||||
|
JvmTestRepl()
|
||||||
|
.use { repl ->
|
||||||
|
assertEvalResult(repl, "42", 42)
|
||||||
|
assertEvalUnit(repl, "val sim = object : ArrayList<String>() {}")
|
||||||
|
|
||||||
|
val compiledSnippet = checkCompile(repl, "sim")
|
||||||
|
val evalResult = repl.eval(compiledSnippet!!)
|
||||||
|
|
||||||
|
val a = (evalResult.valueOrThrow().get().result as ResultValue.Value).value!!
|
||||||
|
assertTrue(a::class.isSubclassOf(List::class))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@OptIn(ExperimentalPathApi::class)
|
@OptIn(ExperimentalPathApi::class)
|
||||||
companion object {
|
companion object {
|
||||||
private const val MODULE_PATH = "plugins/scripting/scripting-ide-services-test"
|
private const val MODULE_PATH = "plugins/scripting/scripting-ide-services-test"
|
||||||
|
|||||||
+1
-6
@@ -18,7 +18,6 @@ import org.jetbrains.kotlin.resolve.calls.tower.ImplicitsExtensionsResolutionFil
|
|||||||
import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics
|
import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics
|
||||||
import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory
|
import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory
|
||||||
import org.jetbrains.kotlin.scripting.compiler.plugin.repl.ReplCodeAnalyzerBase
|
import org.jetbrains.kotlin.scripting.compiler.plugin.repl.ReplCodeAnalyzerBase
|
||||||
import org.jetbrains.kotlin.scripting.definitions.ScriptPriorities
|
|
||||||
|
|
||||||
class IdeLikeReplCodeAnalyzer(
|
class IdeLikeReplCodeAnalyzer(
|
||||||
private val environment: KotlinCoreEnvironment,
|
private val environment: KotlinCoreEnvironment,
|
||||||
@@ -44,11 +43,7 @@ class IdeLikeReplCodeAnalyzer(
|
|||||||
importedScripts: List<KtFile>,
|
importedScripts: List<KtFile>,
|
||||||
priority: Int
|
priority: Int
|
||||||
): ReplLineAnalysisResultWithStateless {
|
): ReplLineAnalysisResultWithStateless {
|
||||||
topDownAnalysisContext.scripts.clear()
|
prepareForAnalyze(psiFile, priority)
|
||||||
trace.clearDiagnostics()
|
|
||||||
|
|
||||||
psiFile.script!!.putUserData(ScriptPriorities.PRIORITY_KEY, priority)
|
|
||||||
|
|
||||||
return doStatelessAnalyze(psiFile, importedScripts)
|
return doStatelessAnalyze(psiFile, importedScripts)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user