Skip to content

Commit 04ffe77

Browse files
committed
Refactoring properties collection after review
1 parent 74f8a54 commit 04ffe77

File tree

22 files changed

+224
-197
lines changed

22 files changed

+224
-197
lines changed

idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDefinitionsManager.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ fun loadDefinitionsFromTemplates(
208208
)
209209
}
210210
template.annotations.firstIsInstanceOrNull<kotlin.script.experimental.annotations.KotlinScript>() != null -> {
211-
val hostEnvironment = ScriptingEnvironment.create {
211+
val hostEnvironment = ScriptingEnvironment {
212212
include(defaultJvmScriptingEnvironment)
213213
configurationDependencies(JvmDependency(classpath))
214214
}

libraries/examples/scripting/jvm-maven-deps/script/src/org/jetbrains/kotlin/script/examples/jvm/resolve/maven/scriptDef.kt

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import kotlin.script.experimental.jvm.compat.mapLegacyDiagnosticSeverity
1818
import kotlin.script.experimental.jvm.compat.mapLegacyScriptPosition
1919
import kotlin.script.experimental.jvm.dependenciesFromCurrentContext
2020
import kotlin.script.experimental.jvm.jvm
21-
import kotlin.script.experimental.util.getOrNull
2221

2322
@KotlinScript(
2423
extension = "scriptwithdeps.kts",
@@ -28,8 +27,8 @@ abstract class MyScriptWithMavenDeps {
2827
// abstract fun body(vararg args: String): Int
2928
}
3029

31-
object MyScriptDefinition : ScriptDefinition {
32-
override val properties = properties {
30+
object MyScriptDefinition : ScriptDefinition(
31+
{
3332
defaultImports<DependsOn>()
3433
defaultImports(Repository::class)
3534
jvm {
@@ -47,7 +46,7 @@ object MyScriptDefinition : ScriptDefinition {
4746
// other triggers: beforeParsing, onSections
4847
}
4948
}
50-
}
49+
)
5150

5251
class MyConfigurator : RefineScriptCompilationConfigurationHandler {
5352

@@ -59,7 +58,7 @@ class MyConfigurator : RefineScriptCompilationConfigurationHandler {
5958
configuration: ScriptCompileConfiguration?,
6059
processedScriptData: ProcessedScriptData?
6160
): ResultWithDiagnostics<ScriptCompileConfiguration?> {
62-
val annotations = processedScriptData?.getOrNull(ProcessedScriptData.foundAnnotations)?.takeIf { it.isNotEmpty() }
61+
val annotations = processedScriptData?.get(ProcessedScriptData.foundAnnotations)?.takeIf { it.isNotEmpty() }
6362
?: return configuration.asSuccess()
6463
val scriptContents = object : ScriptContents {
6564
override val annotations: Iterable<Annotation> = annotations
@@ -75,7 +74,7 @@ class MyConfigurator : RefineScriptCompilationConfigurationHandler {
7574
?: return configuration.asSuccess(diagnostics)
7675
val resolvedClasspath = newDepsFromResolver.classpath.toList().takeIf { it.isNotEmpty() }
7776
?: return configuration.asSuccess(diagnostics)
78-
ScriptCompileConfiguration.create {
77+
ScriptCompileConfiguration {
7978
dependencies(JvmDependency(resolvedClasspath))
8079
}.asSuccess(diagnostics)
8180
} catch (e: Throwable) {

libraries/examples/scripting/jvm-simple-script/host/src/org/jetbrains/kotlin/script/examples/jvm/simple/host/host.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import kotlin.script.experimental.jvm.jvm
1717
import kotlin.script.experimental.jvmhost.makeBasicHostFromAnnotatedScriptBaseClass
1818

1919
fun evalFile(scriptFile: File): ResultWithDiagnostics<EvaluationResult> {
20-
val additionalCompilationProperties = ScriptCompileConfiguration.create {
20+
val additionalCompilationProperties = ScriptCompileConfiguration {
2121
jvm {
2222
dependenciesFromCurrentContext(
2323
"scripting-jvm-simple-script" /* script library jar name */

libraries/scripting/common/src/kotlin/script/experimental/api/scriptConfiguration.kt

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,45 +9,52 @@ package kotlin.script.experimental.api
99

1010
import kotlin.script.experimental.util.PropertiesCollection
1111

12-
interface ScriptCompileConfiguration : PropertiesCollection {
13-
14-
companion object : ScriptCompileConfiguration {
12+
interface ScriptCompileConfigurationKeys
13+
14+
class ScriptCompileConfiguration(baseConfigurations: Iterable<ScriptCompileConfiguration>, body: Builder.() -> Unit) :
15+
PropertiesCollection(Builder(baseConfigurations).apply(body).data) {
1516

16-
class Builder internal constructor() : PropertiesCollection.Builder(), ScriptCompileConfiguration {
17-
override val properties = data
18-
}
17+
constructor(body: Builder.() -> Unit = {}) : this(emptyList(), body)
18+
constructor(
19+
vararg baseConfigurations: ScriptCompileConfiguration, body: Builder.() -> Unit = {}
20+
) : this(baseConfigurations.asIterable(), body)
1921

20-
fun create(body: Builder.() -> Unit): ScriptCompileConfiguration = Builder().apply(body)
21-
}
22+
class Builder internal constructor(baseConfigurations: Iterable<ScriptCompileConfiguration>) :
23+
ScriptCompileConfigurationKeys,
24+
PropertiesCollection.Builder(baseConfigurations)
25+
26+
companion object : ScriptCompileConfigurationKeys
2227
}
2328

24-
val ScriptCompileConfiguration.sourceFragments by PropertiesCollection.key<List<ScriptSourceNamedFragment>>()
29+
val ScriptCompileConfigurationKeys.sourceFragments by PropertiesCollection.key<List<ScriptSourceNamedFragment>>()
30+
31+
val ScriptCompileConfigurationKeys.scriptBodyTarget by PropertiesCollection.keyCopy(ScriptDefinition.scriptBodyTarget)
2532

26-
val ScriptCompileConfiguration.scriptBodyTarget by PropertiesCollection.keyCopy(ScriptDefinition.scriptBodyTarget)
33+
val ScriptCompileConfigurationKeys.scriptImplicitReceivers by PropertiesCollection.keyCopy(ScriptDefinition.scriptImplicitReceivers)
2734

28-
val ScriptCompileConfiguration.scriptImplicitReceivers by PropertiesCollection.keyCopy(ScriptDefinition.scriptImplicitReceivers)
35+
val ScriptCompileConfigurationKeys.contextVariables by PropertiesCollection.keyCopy(ScriptDefinition.contextVariables)
2936

30-
val ScriptCompileConfiguration.contextVariables by PropertiesCollection.keyCopy(ScriptDefinition.contextVariables)
37+
val ScriptCompileConfigurationKeys.defaultImports by PropertiesCollection.keyCopy(ScriptDefinition.defaultImports)
3138

32-
val ScriptCompileConfiguration.defaultImports by PropertiesCollection.keyCopy(ScriptDefinition.defaultImports)
39+
val ScriptCompileConfigurationKeys.restrictions by PropertiesCollection.keyCopy(ScriptDefinition.restrictions)
3340

34-
val ScriptCompileConfiguration.restrictions by PropertiesCollection.keyCopy(ScriptDefinition.restrictions)
41+
val ScriptCompileConfigurationKeys.importedScripts by PropertiesCollection.keyCopy(ScriptDefinition.importedScripts)
3542

36-
val ScriptCompileConfiguration.importedScripts by PropertiesCollection.keyCopy(ScriptDefinition.importedScripts)
43+
val ScriptCompileConfigurationKeys.dependencies by PropertiesCollection.keyCopy(ScriptDefinition.dependencies)
3744

38-
val ScriptCompileConfiguration.dependencies by PropertiesCollection.keyCopy(ScriptDefinition.dependencies)
45+
val ScriptCompileConfigurationKeys.compilerOptions by PropertiesCollection.keyCopy(ScriptDefinition.compilerOptions)
3946

40-
val ScriptCompileConfiguration.compilerOptions by PropertiesCollection.keyCopy(ScriptDefinition.compilerOptions)
4147

48+
interface ProcessedScriptDataKeys
4249

43-
interface ProcessedScriptData : PropertiesCollection {
50+
class ProcessedScriptData(properties: Map<PropertiesCollection.Key<*>, Any>) : PropertiesCollection(properties) {
4451

45-
companion object : ProcessedScriptData
52+
companion object : ProcessedScriptDataKeys
4653
}
4754

48-
val ProcessedScriptData.foundAnnotations by PropertiesCollection.key<List<Annotation>>()
55+
val ProcessedScriptDataKeys.foundAnnotations by PropertiesCollection.key<List<Annotation>>()
4956

50-
val ProcessedScriptData.foundFragments by PropertiesCollection.key<List<ScriptSourceNamedFragment>>()
57+
val ProcessedScriptDataKeys.foundFragments by PropertiesCollection.key<List<ScriptSourceNamedFragment>>()
5158

5259

5360
interface RefineScriptCompilationConfigurationHandler {

libraries/scripting/common/src/kotlin/script/experimental/api/scriptDefinition.kt

Lines changed: 31 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,57 +10,62 @@ package kotlin.script.experimental.api
1010
import kotlin.reflect.KClass
1111
import kotlin.script.experimental.util.PropertiesCollection
1212

13-
interface ScriptDefinition : PropertiesCollection {
13+
interface ScriptDefinitionKeys
1414

15-
companion object : ScriptDefinition {
15+
open class ScriptDefinition(baseDefinitions: Iterable<ScriptDefinition>, body: Builder.() -> Unit) :
16+
PropertiesCollection(Builder(baseDefinitions).apply(body).data) {
1617

17-
class Builder internal constructor() : PropertiesCollection.Builder(), ScriptDefinition {
18-
override val properties = data
19-
}
18+
constructor(body: Builder.() -> Unit = {}) : this(emptyList(), body)
19+
constructor(vararg baseDefinitions: ScriptDefinition, body: Builder.() -> Unit = {}) : this(baseDefinitions.asIterable(), body)
2020

21-
fun create(body: Builder.() -> Unit): ScriptDefinition = Builder().apply(body)
22-
}
21+
class Builder internal constructor(baseDefinitions: Iterable<ScriptDefinition>) :
22+
ScriptDefinitionKeys,
23+
PropertiesCollection.Builder(baseDefinitions)
24+
25+
// inherited from script definition for using as a keys anchor
26+
companion object : ScriptDefinitionKeys {
2327

24-
object Default : ScriptDefinition
28+
val Default = ScriptDefinition()
29+
}
2530
}
2631

27-
val ScriptDefinition.name by PropertiesCollection.key<String>("Kotlin script") // Name of the script type
32+
val ScriptDefinitionKeys.name by PropertiesCollection.key<String>("Kotlin script") // Name of the script type
2833

29-
val ScriptDefinition.fileExtension by PropertiesCollection.key<String>("kts") // file extension
34+
val ScriptDefinitionKeys.fileExtension by PropertiesCollection.key<String>("kts") // file extension
3035

31-
val ScriptDefinition.baseClass by PropertiesCollection.key<KotlinType>() // script base class
36+
val ScriptDefinitionKeys.baseClass by PropertiesCollection.key<KotlinType>() // script base class
3237

33-
val ScriptDefinition.scriptBodyTarget by PropertiesCollection.key<ScriptBodyTarget>(ScriptBodyTarget.Constructor)
38+
val ScriptDefinitionKeys.scriptBodyTarget by PropertiesCollection.key<ScriptBodyTarget>(ScriptBodyTarget.Constructor)
3439

35-
val ScriptDefinition.scriptImplicitReceivers by PropertiesCollection.key<List<KotlinType>>() // in the order from outer to inner scope
40+
val ScriptDefinitionKeys.scriptImplicitReceivers by PropertiesCollection.key<List<KotlinType>>() // in the order from outer to inner scope
3641

37-
val ScriptDefinition.contextVariables by PropertiesCollection.key<Map<String, KotlinType>>() // external variables
42+
val ScriptDefinitionKeys.contextVariables by PropertiesCollection.key<Map<String, KotlinType>>() // external variables
3843

39-
val ScriptDefinition.defaultImports by PropertiesCollection.key<List<String>>()
44+
val ScriptDefinitionKeys.defaultImports by PropertiesCollection.key<List<String>>()
4045

41-
val ScriptDefinition.restrictions by PropertiesCollection.key<List<ResolvingRestrictionRule>>()
46+
val ScriptDefinitionKeys.restrictions by PropertiesCollection.key<List<ResolvingRestrictionRule>>()
4247

43-
val ScriptDefinition.importedScripts by PropertiesCollection.key<List<ScriptSource>>()
48+
val ScriptDefinitionKeys.importedScripts by PropertiesCollection.key<List<ScriptSource>>()
4449

45-
val ScriptDefinition.dependencies by PropertiesCollection.key<List<ScriptDependency>>()
50+
val ScriptDefinitionKeys.dependencies by PropertiesCollection.key<List<ScriptDependency>>()
4651

47-
val ScriptDefinition.generatedClassAnnotations by PropertiesCollection.key<List<Annotation>>()
52+
val ScriptDefinitionKeys.generatedClassAnnotations by PropertiesCollection.key<List<Annotation>>()
4853

49-
val ScriptDefinition.generatedMethodAnnotations by PropertiesCollection.key<List<Annotation>>()
54+
val ScriptDefinitionKeys.generatedMethodAnnotations by PropertiesCollection.key<List<Annotation>>()
5055

51-
val ScriptDefinition.compilerOptions by PropertiesCollection.key<List<String>>() // Q: CommonCompilerOptions instead?
56+
val ScriptDefinitionKeys.compilerOptions by PropertiesCollection.key<List<String>>() // Q: CommonCompilerOptions instead?
5257

53-
val ScriptDefinition.refineConfigurationHandler by PropertiesCollection.key<RefineScriptCompilationConfigurationHandler>() // dynamic configurator
58+
val ScriptDefinitionKeys.refineConfigurationHandler by PropertiesCollection.key<RefineScriptCompilationConfigurationHandler>() // dynamic configurator
5459

55-
val ScriptDefinition.refineConfigurationBeforeParsing by PropertiesCollection.key<Boolean>() // default: false
60+
val ScriptDefinitionKeys.refineConfigurationBeforeParsing by PropertiesCollection.key<Boolean>() // default: false
5661

57-
val ScriptDefinition.refineConfigurationOnAnnotations by PropertiesCollection.key<List<KotlinType>>()
62+
val ScriptDefinitionKeys.refineConfigurationOnAnnotations by PropertiesCollection.key<List<KotlinType>>()
5863

59-
val ScriptDefinition.refineConfigurationOnSections by PropertiesCollection.key<List<String>>()
64+
val ScriptDefinitionKeys.refineConfigurationOnSections by PropertiesCollection.key<List<String>>()
6065

6166
// DSL:
6267

63-
val ScriptDefinition.refineConfiguration get() = RefineConfigurationBuilder()
68+
val ScriptDefinition.Builder.refineConfiguration get() = RefineConfigurationBuilder()
6469

6570

6671
class RefineConfigurationBuilder : PropertiesCollection.Builder() {

libraries/scripting/common/src/kotlin/script/experimental/api/scriptEvaluation.kt

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,25 +9,30 @@ package kotlin.script.experimental.api
99

1010
import kotlin.script.experimental.util.PropertiesCollection
1111

12-
interface ScriptEvaluationEnvironment : PropertiesCollection {
12+
interface ScriptEvaluationEnvironmentKeys
1313

14-
companion object : ScriptEvaluationEnvironment {
14+
class ScriptEvaluationEnvironment(baseEvaluationEnvironments: Iterable<ScriptEvaluationEnvironment>, body: Builder.() -> Unit) :
15+
PropertiesCollection(Builder(baseEvaluationEnvironments).apply(body).data) {
1516

16-
class Builder internal constructor() : PropertiesCollection.Builder(), ScriptEvaluationEnvironment {
17-
override val properties = data
18-
}
17+
constructor(body: Builder.() -> Unit = {}) : this(emptyList(), body)
18+
constructor(
19+
vararg baseEvaluationEnvironments: ScriptEvaluationEnvironment, body: Builder.() -> Unit = {}
20+
) : this(baseEvaluationEnvironments.asIterable(), body)
1921

20-
fun create(body: Builder.() -> Unit): ScriptEvaluationEnvironment = Builder().apply(body)
21-
}
22+
class Builder internal constructor(baseEvaluationEnvironments: Iterable<ScriptEvaluationEnvironment>) :
23+
ScriptDefinitionKeys,
24+
PropertiesCollection.Builder(baseEvaluationEnvironments)
25+
26+
companion object : ScriptEvaluationEnvironmentKeys
2227
}
2328

24-
val ScriptEvaluationEnvironment.implicitReceivers by PropertiesCollection.key<List<Any>>()
29+
val ScriptEvaluationEnvironmentKeys.implicitReceivers by PropertiesCollection.key<List<Any>>()
2530

26-
val ScriptEvaluationEnvironment.contextVariables by PropertiesCollection.key<Map<String, Any?>>() // external variables
31+
val ScriptEvaluationEnvironmentKeys.contextVariables by PropertiesCollection.key<Map<String, Any?>>() // external variables
2732

28-
val ScriptEvaluationEnvironment.constructorArgs by PropertiesCollection.key<List<Any?>>()
33+
val ScriptEvaluationEnvironmentKeys.constructorArgs by PropertiesCollection.key<List<Any?>>()
2934

30-
val ScriptEvaluationEnvironment.runArgs by PropertiesCollection.key<List<Any?>>()
35+
val ScriptEvaluationEnvironmentKeys.runArgs by PropertiesCollection.key<List<Any?>>()
3136

3237
sealed class ResultValue {
3338
class Value(val name: String, val value: Any?, val type: String) : ResultValue() {

libraries/scripting/common/src/kotlin/script/experimental/api/scriptingEnvironment.kt

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,37 +7,42 @@ package kotlin.script.experimental.api
77

88
import kotlin.reflect.KClass
99
import kotlin.script.experimental.util.PropertiesCollection
10-
import kotlin.script.experimental.util.getOrNull
1110

12-
interface ScriptingEnvironment : PropertiesCollection {
11+
interface ScriptingEnvironmentKeys
1312

14-
companion object : ScriptingEnvironment {
13+
class ScriptingEnvironment(baseScriptingEnvironments: Iterable<ScriptingEnvironment>, body: Builder.() -> Unit) :
14+
PropertiesCollection(Builder(baseScriptingEnvironments).apply(body).data) {
1515

16-
class Builder internal constructor() : PropertiesCollection.Builder(), ScriptingEnvironment {
17-
override val properties = data
18-
}
16+
constructor(body: Builder.() -> Unit = {}) : this(emptyList(), body)
17+
constructor(
18+
vararg baseScriptingEnvironments: ScriptingEnvironment, body: Builder.() -> Unit = {}
19+
) : this(baseScriptingEnvironments.asIterable(), body)
1920

20-
fun create(body: Builder.() -> Unit): ScriptingEnvironment = Builder().apply(body)
21-
}
21+
class Builder internal constructor(baseScriptingEnvironments: Iterable<ScriptingEnvironment>) :
22+
ScriptingEnvironmentKeys,
23+
PropertiesCollection.Builder(baseScriptingEnvironments)
24+
25+
companion object : ScriptingEnvironmentKeys
2226
}
2327

2428
// should contain all dependencies needed for baseClass and compilationConfigurator
25-
val ScriptingEnvironment.configurationDependencies by PropertiesCollection.key<List<ScriptDependency>>()
29+
val ScriptingEnvironmentKeys.configurationDependencies by PropertiesCollection.key<List<ScriptDependency>>()
2630

2731
// do not use configurationDependencies as script dependencies, so only the dependencies defined by compilationConfigurator will be used
2832
// (NOTE: in this case they should include the dependencies for the base class anyway, since this class is needed for script
2933
// compilation and instantiation, but compilationConfigurator could be excluded)
30-
val ScriptingEnvironment.isolatedDependencies by PropertiesCollection.key<Boolean>(false)
34+
val ScriptingEnvironmentKeys.isolatedDependencies by PropertiesCollection.key<Boolean>(false)
3135

3236
// a "class loader" for KotlinTypes
33-
val ScriptingEnvironment.getScriptingClass by PropertiesCollection.key<GetScriptingClass>()
37+
val ScriptingEnvironmentKeys.getScriptingClass by PropertiesCollection.key<GetScriptingClass>()
38+
3439

3540
interface GetScriptingClass {
3641
operator fun invoke(classType: KotlinType, contextClass: KClass<*>, environment: ScriptingEnvironment): KClass<*>
3742
}
3843

3944
fun ScriptingEnvironment.getScriptingClass(type: KotlinType, contextClass: KClass<*>): KClass<*> {
40-
val getClass = getOrNull(ScriptingEnvironment.getScriptingClass)
45+
val getClass = get(ScriptingEnvironment.getScriptingClass)
4146
?: throw IllegalArgumentException("Expecting 'getScriptingClass' property in the scripting environment: unable to load scripting class $type")
4247
return getClass(type, contextClass, this)
4348
}

libraries/scripting/common/src/kotlin/script/experimental/definitions/definitionFromAnnotation.kt

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import kotlin.script.experimental.annotations.KotlinScript
1212
import kotlin.script.experimental.annotations.KotlinScriptFileExtension
1313
import kotlin.script.experimental.annotations.KotlinScriptProperties
1414
import kotlin.script.experimental.api.*
15-
import kotlin.script.experimental.util.getOrNull
1615

1716
private const val ERROR_MSG_PREFIX = "Unable to construct script definition: "
1817

@@ -25,7 +24,7 @@ fun createScriptDefinitionFromAnnotatedBaseClass(
2524
contextClass: KClass<*> = ScriptDefinition::class
2625
): ScriptDefinition {
2726

28-
val getScriptingClass = environment.getOrNull(ScriptingEnvironment.getScriptingClass)
27+
val getScriptingClass = environment[ScriptingEnvironment.getScriptingClass]
2928
?: throw IllegalArgumentException("${ERROR_MSG_PREFIX}Expecting 'getScriptingClass' parameter in the scripting environment")
3029

3130
val baseClass: KClass<*> =
@@ -44,17 +43,15 @@ fun createScriptDefinitionFromAnnotatedBaseClass(
4443
throw IllegalArgumentException(ILLEGAL_CONFIG_ANN_ARG, e)
4544
}
4645

47-
return object : ScriptDefinition {
48-
override val properties = properties {
49-
baseClass(baseClassType)
50-
fileExtension(baseClass.findAnnotation<KotlinScriptFileExtension>()?.extension ?: mainAnnotation.extension)
51-
name(mainAnnotation.name)
46+
return ScriptDefinition {
47+
baseClass(baseClassType)
48+
fileExtension(baseClass.findAnnotation<KotlinScriptFileExtension>()?.extension ?: mainAnnotation.extension)
49+
name(mainAnnotation.name)
5250

53-
include(scriptingPropsInstance(mainAnnotation.definition))
51+
include(scriptingPropsInstance(mainAnnotation.definition))
5452

55-
baseClass.annotations.filterIsInstance(KotlinScriptProperties::class.java).forEach { ann ->
56-
include(scriptingPropsInstance(ann.definition))
57-
}
53+
baseClass.annotations.filterIsInstance(KotlinScriptProperties::class.java).forEach { ann ->
54+
include(scriptingPropsInstance(ann.definition))
5855
}
5956
}
6057
}

0 commit comments

Comments
 (0)