From 7d1568304631263cebbcef8a3f46943375b96f67 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 6 Aug 2024 14:07:13 +0200 Subject: [PATCH 1/3] Fix crash when DCL file references an unknown software type --- .../actions/DeclarativeSchemaHelpers.kt | 4 +- .../actions/GetDeclarativeDocuments.kt | 73 ++++++++++--------- 2 files changed, 42 insertions(+), 35 deletions(-) diff --git a/gradle-client/src/jvmMain/kotlin/org/gradle/client/ui/connected/actions/DeclarativeSchemaHelpers.kt b/gradle-client/src/jvmMain/kotlin/org/gradle/client/ui/connected/actions/DeclarativeSchemaHelpers.kt index 602d9d7..578eccc 100644 --- a/gradle-client/src/jvmMain/kotlin/org/gradle/client/ui/connected/actions/DeclarativeSchemaHelpers.kt +++ b/gradle-client/src/jvmMain/kotlin/org/gradle/client/ui/connected/actions/DeclarativeSchemaHelpers.kt @@ -9,8 +9,8 @@ fun AnalysisSchema.dataClassFor(typeRef: DataTypeRef.Name): DataClass = val AnalysisSchema.softwareTypes: List get() = topLevelReceiverType.memberFunctions -fun AnalysisSchema.softwareTypeNamed(name: String): SchemaMemberFunction = - softwareTypes.single { it.simpleName == name } +fun AnalysisSchema.softwareTypeNamed(name: String): SchemaMemberFunction? = + softwareTypes.singleOrNull { it.simpleName == name } val SchemaMemberFunction.softwareTypeSemantics: FunctionSemantics.AccessAndConfigure get() = semantics as FunctionSemantics.AccessAndConfigure 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 e609604..e032512 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 @@ -68,8 +68,8 @@ class GetDeclarativeDocuments : GetModelAction.GetCompositeModelAction - MutationUtils.runMutation( - selectedBuildFile.value, - domWithDefaults.inputOverlay, - projectEvaluationSchema, - mutationDefinition, - mutationArgumentsContainer + if (softwareTypeSchema == null) { + Text("No software type named '${softwareTypeNode.name}'") + } else { + + val softwareTypeType = + projectAnalysisSchema.configuredTypeOf(softwareTypeSchema.softwareTypeSemantics) + + 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) ) - // 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() + MaterialTheme.spacing.VerticalLevel4() - ElementInfoOrNothingDeclared(softwareTypeType, softwareTypeNode, 0) + ElementInfoOrNothingDeclared(softwareTypeType, softwareTypeNode, 0) + } } } } From 89e2efe0a45541f99a95f4623786e5687a71efa4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 6 Aug 2024 14:14:06 +0200 Subject: [PATCH 2/3] Fix crash when DCL file contains unbalanced blocks --- .../gradle/client/ui/connected/actions/DeclarativeDomHelpers.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 6403d1a..9552d67 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 @@ -5,7 +5,7 @@ import org.gradle.internal.declarativedsl.dom.DeclarativeDocument.DocumentNode.E import org.gradle.internal.declarativedsl.dom.DeclarativeDocument.DocumentNode.PropertyNode val DeclarativeDocument.singleSoftwareTypeNode: ElementNode - get() = content.single() as ElementNode + get() = content.filterIsInstance().single() fun ElementNode.childElementNode( name: String From 4a251cd59927f1ad142cee656496a4dcafc0083c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 6 Aug 2024 14:52:42 +0200 Subject: [PATCH 3/3] Fix another crash when DCL file is empty --- .../actions/DeclarativeDomHelpers.kt | 4 +- .../actions/GetDeclarativeDocuments.kt | 109 +++++++++++------- 2 files changed, 71 insertions(+), 42 deletions(-) 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,