From 234fb1b0c438be4fef86160029ae01829053b94e Mon Sep 17 00:00:00 2001 From: Julian Krings Date: Sat, 8 Nov 2025 00:58:12 +0100 Subject: [PATCH] also include parent class for schema generation --- .../iris/core/project/SchemaBuilder.java | 76 +++++++++---------- .../scripting/kotlin/runner/ScriptRunner.kt | 1 + .../core/scripting/kotlin/runner/Utils.kt | 28 +++++-- 3 files changed, 57 insertions(+), 48 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java b/core/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java index 7e61233f3..5c4373452 100644 --- a/core/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java +++ b/core/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java @@ -38,6 +38,7 @@ import org.jetbrains.annotations.NotNull; import java.awt.*; import java.lang.reflect.Field; +import java.lang.reflect.InaccessibleObjectException; import java.lang.reflect.Modifier; import java.util.List; import java.util.Map; @@ -117,49 +118,13 @@ public class SchemaBuilder { JSONArray required = new JSONArray(); JSONArray extended = new JSONArray(); - if (c.isAssignableFrom(IrisRegistrant.class) || IrisRegistrant.class.isAssignableFrom(c)) { - for (Field k : IrisRegistrant.class.getDeclaredFields()) { - k.setAccessible(true); - - if (Modifier.isStatic(k.getModifiers()) || Modifier.isFinal(k.getModifiers()) || Modifier.isTransient(k.getModifiers())) { - continue; - } - - JSONObject property = buildProperty(k, c); - - if (Boolean.TRUE == property.remove("!required")) { - required.put(k.getName()); - } - - if (Boolean.TRUE == property.remove("!top")) { - extended.put(property); - continue; - } - - properties.put(k.getName(), property); - } + var parent = c.getSuperclass(); + while (parent != null && IrisRegistrant.class.isAssignableFrom(parent)) { + buildProperties(properties, required, extended, parent); + parent = parent.getSuperclass(); } - for (Field k : c.getDeclaredFields()) { - k.setAccessible(true); - - if (Modifier.isStatic(k.getModifiers()) || Modifier.isFinal(k.getModifiers()) || Modifier.isTransient(k.getModifiers())) { - continue; - } - - JSONObject property = buildProperty(k, c); - - if (Boolean.TRUE == property.remove("!required")) { - required.put(k.getName()); - } - - if (Boolean.TRUE == property.remove("!top")) { - extended.put(property); - continue; - } - - properties.put(k.getName(), property); - } + buildProperties(properties, required, extended, c); if (required.length() > 0) { o.put("required", required); @@ -174,6 +139,33 @@ public class SchemaBuilder { return buildSnippet(o, c); } + private void buildProperties(JSONObject properties, JSONArray required, JSONArray extended, Class c) { + for (Field k : c.getDeclaredFields()) { + if (Modifier.isStatic(k.getModifiers()) || Modifier.isFinal(k.getModifiers()) || Modifier.isTransient(k.getModifiers())) { + continue; + } + + try { + k.setAccessible(true); + } catch (InaccessibleObjectException e) { + continue; + } + + JSONObject property = buildProperty(k, c); + + if (Boolean.TRUE == property.remove("!top")) { + extended.put(property); + continue; + } + + if (Boolean.TRUE == property.remove("!required")) { + required.put(k.getName()); + } + + properties.put(k.getName(), property); + } + } + private JSONObject buildProperty(Field k, Class cl) { JSONObject prop = new JSONObject(); String type = getType(k.getType()); @@ -616,7 +608,7 @@ public class SchemaBuilder { if (present) d.add(" "); if (value instanceof List) { d.add(SYMBOL_LIMIT__N + " Default Value is an empty list"); - } else if (!cl.isPrimitive() && !(value instanceof Number) && !(value instanceof String) && !(cl.isEnum()) && !KeyedType.isKeyed(cl)) { + } else if (!k.getType().isPrimitive() && !(value instanceof Number) && !(value instanceof String) && !(value instanceof Enum) && !KeyedType.isKeyed(k.getType())) { d.add(SYMBOL_LIMIT__N + " Default Value is a default object (create this object to see default properties)"); } else { d.add(SYMBOL_LIMIT__N + " Default Value is " + value); diff --git a/core/src/main/kotlin/com/volmit/iris/core/scripting/kotlin/runner/ScriptRunner.kt b/core/src/main/kotlin/com/volmit/iris/core/scripting/kotlin/runner/ScriptRunner.kt index 9683e440d..2b5bb3099 100644 --- a/core/src/main/kotlin/com/volmit/iris/core/scripting/kotlin/runner/ScriptRunner.kt +++ b/core/src/main/kotlin/com/volmit/iris/core/scripting/kotlin/runner/ScriptRunner.kt @@ -47,6 +47,7 @@ class ScriptRunner( dependencyResolver(resolver) packDirectory(baseDir) sharedClassloader(sharedClassLoader) + server(true) if (SimpleScript::class.java.isAssignableFrom(type.java)) return@createCompilationConfigurationFromTemplate diff --git a/core/src/main/kotlin/com/volmit/iris/core/scripting/kotlin/runner/Utils.kt b/core/src/main/kotlin/com/volmit/iris/core/scripting/kotlin/runner/Utils.kt index 0252ce39e..0b6c7fbaf 100644 --- a/core/src/main/kotlin/com/volmit/iris/core/scripting/kotlin/runner/Utils.kt +++ b/core/src/main/kotlin/com/volmit/iris/core/scripting/kotlin/runner/Utils.kt @@ -12,6 +12,7 @@ import kotlin.script.experimental.dependencies.addRepository import kotlin.script.experimental.dependencies.impl.SimpleExternalDependenciesResolverOptionsParser import kotlin.script.experimental.jvm.JvmDependency import kotlin.script.experimental.jvm.JvmDependencyFromClassLoader +import kotlin.script.experimental.jvm.updateClasspath import kotlin.script.experimental.jvm.util.classpathFromClassloader import kotlin.script.experimental.util.PropertiesCollection import kotlin.script.experimental.util.filterByAnnotationType @@ -67,8 +68,9 @@ private fun configureMavenDepsOnAnnotations(context: ScriptConfigurationRefineme ?: return context.compilationConfiguration.asSuccess() val reports = mutableListOf() - val loader = context.compilationConfiguration[ScriptCompilationConfiguration.sharedClassloader] ?: loader + val loader = context.compilationConfiguration[ScriptCompilationConfiguration.sharedClassloader] val resolver = context.compilationConfiguration[ScriptCompilationConfiguration.dependencyResolver] ?: resolver + val server = context.compilationConfiguration[ScriptCompilationConfiguration.server] ?: false context.compilationConfiguration[ScriptCompilationConfiguration.packDirectory] ?.addPack(resolver) ?: context.script.locationId @@ -93,13 +95,18 @@ private fun configureMavenDepsOnAnnotations(context: ScriptConfigurationRefineme } return runBlocking { - resolver.resolveDependencies(annotations) + resolver.resolveDependencies(annotations, server) }.onSuccess { classpath -> context.compilationConfiguration.with { + if (!server) { + updateClasspath(classpath.map { it.first }) + return@with + } + val newClasspath = classpath.filterNewClasspath(this[ScriptCompilationConfiguration.dependencies]) ?: return@with val shared = classpath.mapNotNull { p -> p.first.takeIf { p.second } } - if (shared.isNotEmpty()) loader.addFiles(shared) + if (shared.isNotEmpty()) loader!!.addFiles(shared) val regular = newClasspath .map { p -> p.first } @@ -120,7 +127,8 @@ private fun Collection>.filterNewClasspath(known: Collection } private suspend fun ExternalDependenciesResolver.resolveDependencies( - annotations: Iterable> + annotations: Iterable>, + server: Boolean ): ResultWithDiagnostics>> { val reports = mutableListOf() annotations.forEach { (annotation, locationWithId) -> @@ -152,6 +160,10 @@ private suspend fun ExternalDependenciesResolver.resolveDependencies( *annotation.options, locationWithId = locationWithId ).onSuccess { options -> + if (!server && true == options.server) { + return@onSuccess listOf>().asSuccess() + } + annotation.artifactsCoordinates.asIterable().flatMapSuccess { artifactCoordinates -> resolve(artifactCoordinates, options, locationWithId) }.map { files -> files.map { it to (options.shared ?: false) } } @@ -160,6 +172,7 @@ private suspend fun ExternalDependenciesResolver.resolveDependencies( } private val ExternalDependenciesResolver.Options.shared get() = flag("shared") +private val ExternalDependenciesResolver.Options.server get() = flag("server") internal val ClassLoader.classpath get() = classpathFromClassloader(this) ?: emptyList() internal fun ResultWithDiagnostics.valueOrThrow(message: CharSequence): R = valueOr { @@ -168,7 +181,8 @@ internal fun ResultWithDiagnostics.valueOrThrow(message: CharSequence): R internal val ScriptCompilationConfigurationKeys.dependencyResolver by PropertiesCollection.key(resolver, true) internal val ScriptCompilationConfigurationKeys.packDirectory by PropertiesCollection.key(null, true) -internal val ScriptCompilationConfigurationKeys.sharedClassloader by PropertiesCollection.key(loader, true) +internal val ScriptCompilationConfigurationKeys.sharedClassloader by PropertiesCollection.key(null, true) +internal val ScriptCompilationConfigurationKeys.server by PropertiesCollection.key(false, isTransient = true) private fun File.addPack(resolver: CompoundDependenciesResolver) = resolver.addPack(this) private fun ResultWithDiagnostics.appendReports(reports : Collection) = @@ -190,7 +204,9 @@ internal fun ScriptCompilationConfiguration.Builder.configure() { refineConfiguration { beforeParsing { context -> try { context.compilationConfiguration.with { - ScriptCompilationConfiguration.dependencies.append((this[ScriptCompilationConfiguration.sharedClassloader] ?: loader).dependency) + if (context.compilationConfiguration[ScriptCompilationConfiguration.server] ?: false) { + ScriptCompilationConfiguration.dependencies.append(this[ScriptCompilationConfiguration.sharedClassloader]!!.dependency) + } }.asSuccess() } catch (e: Throwable) { ResultWithDiagnostics.Failure(e.asDiagnostics())