diff --git a/gradle-client/src/jvmMain/kotlin/org/gradle/client/ui/connected/actions/DeclarativeDomHelpers.kt b/gradle-client/src/jvmMain/kotlin/org/gradle/client/ui/connected/actions/DeclarativeDomHelpers.kt index 9552d67..1597692 100644 --- a/gradle-client/src/jvmMain/kotlin/org/gradle/client/ui/connected/actions/DeclarativeDomHelpers.kt +++ b/gradle-client/src/jvmMain/kotlin/org/gradle/client/ui/connected/actions/DeclarativeDomHelpers.kt @@ -4,8 +4,8 @@ import org.gradle.internal.declarativedsl.dom.DeclarativeDocument import org.gradle.internal.declarativedsl.dom.DeclarativeDocument.DocumentNode.ElementNode import org.gradle.internal.declarativedsl.dom.DeclarativeDocument.DocumentNode.PropertyNode -val DeclarativeDocument.singleSoftwareTypeNode: ElementNode - get() = content.filterIsInstance().single() +val DeclarativeDocument.singleSoftwareTypeNode: ElementNode? + get() = content.filterIsInstance().singleOrNull() fun ElementNode.childElementNode( name: String diff --git a/gradle-client/src/jvmMain/kotlin/org/gradle/client/ui/connected/actions/GetDeclarativeDocuments.kt b/gradle-client/src/jvmMain/kotlin/org/gradle/client/ui/connected/actions/GetDeclarativeDocuments.kt index e032512..d7d7b6c 100644 --- a/gradle-client/src/jvmMain/kotlin/org/gradle/client/ui/connected/actions/GetDeclarativeDocuments.kt +++ b/gradle-client/src/jvmMain/kotlin/org/gradle/client/ui/connected/actions/GetDeclarativeDocuments.kt @@ -29,6 +29,7 @@ import org.gradle.client.ui.composables.* import org.gradle.client.ui.connected.TwoPanes import org.gradle.client.ui.theme.spacing import org.gradle.client.ui.theme.transparency +import org.gradle.declarative.dsl.evaluation.EvaluationSchema import org.gradle.declarative.dsl.schema.DataClass import org.gradle.declarative.dsl.schema.DataProperty import org.gradle.declarative.dsl.schema.SchemaMemberFunction @@ -149,47 +150,27 @@ class GetDeclarativeDocuments : GetModelAction.GetCompositeModelAction - MutationUtils.runMutation( - selectedBuildFile.value, - domWithDefaults.inputOverlay, - projectEvaluationSchema, - mutationDefinition, - mutationArgumentsContainer - ) - // Trigger recomposition: - updateFileContents() - } - ) - ) { - WithDecoration(softwareTypeNode) { - TitleMedium( - text = "Software Type: ${softwareTypeNode.name}", - modifier = Modifier - .pointerHoverIcon( - PointerIcon(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)) - ) - .withClickTextRangeSelection(softwareTypeNode, highlightingContext) - ) - } - MaterialTheme.spacing.VerticalLevel4() - - ElementInfoOrNothingDeclared(softwareTypeType, softwareTypeNode, 0) - } + val softwareTypeSchema = projectAnalysisSchema.softwareTypeNamed(softwareTypeNode.name) + if (softwareTypeSchema == null) { + Text("No software type named '${softwareTypeNode.name}'") + } else { + + val softwareTypeType = + projectAnalysisSchema.configuredTypeOf(softwareTypeSchema.softwareTypeSemantics) + + ModelView( + selectedBuildFile, + highlightingContext, + projectEvaluationSchema, + domWithDefaults, + softwareTypeNode, + softwareTypeType, + mutationApplicability, + ::updateFileContents, + ) } } } @@ -206,6 +187,54 @@ class GetDeclarativeDocuments : GetModelAction.GetCompositeModelAction, + highlightingContext: HighlightingContext, + projectEvaluationSchema: EvaluationSchema, + domWithDefaults: DocumentOverlayResult, + softwareTypeNode: DeclarativeDocument.DocumentNode.ElementNode, + softwareTypeType: DataClass, + mutationApplicability: NodeData>, + updateFileContents: () -> Unit + ) { + Column { + with( + ModelTreeRendering( + domWithDefaults.overlayResolutionContainer, + highlightingContext, + mutationApplicability, + onRunMutation = { mutationDefinition, mutationArgumentsContainer -> + MutationUtils.runMutation( + selectedBuildFile.value, + domWithDefaults.inputOverlay, + projectEvaluationSchema, + mutationDefinition, + mutationArgumentsContainer + ) + // Trigger recomposition: + updateFileContents() + } + ) + ) { + WithDecoration(softwareTypeNode) { + TitleMedium( + text = "Software Type: ${softwareTypeNode.name}", + modifier = Modifier + .pointerHoverIcon( + PointerIcon(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)) + ) + .withClickTextRangeSelection(softwareTypeNode, highlightingContext) + ) + } + MaterialTheme.spacing.VerticalLevel4() + + ElementInfoOrNothingDeclared(softwareTypeType, softwareTypeNode, 0) + } + } + } + @Composable private fun SourcesView( domWithDefaults: DocumentOverlayResult,