Skip to content

Commit

Permalink
Fix a couple crashes (#25)
Browse files Browse the repository at this point in the history
  • Loading branch information
eskatos authored Aug 6, 2024
2 parents 0b2c9b0 + 4a251cd commit 62df0bb
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 38 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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.single() as ElementNode
val DeclarativeDocument.singleSoftwareTypeNode: ElementNode?
get() = content.filterIsInstance<ElementNode>().singleOrNull()

fun ElementNode.childElementNode(
name: String
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ fun AnalysisSchema.dataClassFor(typeRef: DataTypeRef.Name): DataClass =
val AnalysisSchema.softwareTypes: List<SchemaMemberFunction>
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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -68,8 +69,8 @@ class GetDeclarativeDocuments : GetModelAction.GetCompositeModelAction<ResolvedD

fun readBuildFile() = selectedBuildFile.value.takeIf { it.canRead() }?.readText().orEmpty()
fun readSettingsFile() = model.settingsFile.takeIf { it.canRead() }?.readText().orEmpty()
val buildFileContent = remember(selectedBuildFile.value) {

val buildFileContent = remember(selectedBuildFile.value) {
mutableStateOf(readBuildFile())
}
val settingsFileContent = remember(selectedBuildFile.value, model.settingsFile) {
Expand Down Expand Up @@ -104,7 +105,7 @@ class GetDeclarativeDocuments : GetModelAction.GetCompositeModelAction<ResolvedD
}
}


val analyzer = analyzer(model)
val projectResult by remember {
derivedStateOf {
Expand Down Expand Up @@ -149,40 +150,27 @@ class GetDeclarativeDocuments : GetModelAction.GetCompositeModelAction<ResolvedD
)

val softwareTypeNode = domWithDefaults.document.singleSoftwareTypeNode
val softwareTypeSchema = projectAnalysisSchema.softwareTypeNamed(softwareTypeNode.name)
val softwareTypeType =
projectAnalysisSchema.configuredTypeOf(softwareTypeSchema.softwareTypeSemantics)

Column {
with(
ModelTreeRendering(
domWithDefaults.overlayResolutionContainer,
if (softwareTypeNode == null) {
Text("No software type")
} else {
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,
onRunMutation = { mutationDefinition, mutationArgumentsContainer ->
MutationUtils.runMutation(
selectedBuildFile.value,
domWithDefaults.inputOverlay,
projectEvaluationSchema,
mutationDefinition,
mutationArgumentsContainer
)
// Trigger recomposition:
updateFileContents()
}
::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)
}
}
}
Expand All @@ -199,6 +187,54 @@ class GetDeclarativeDocuments : GetModelAction.GetCompositeModelAction<ResolvedD
)
}

@Composable
@Suppress("LongParameterList")
private fun ModelView(
selectedBuildFile: MutableState<File>,
highlightingContext: HighlightingContext,
projectEvaluationSchema: EvaluationSchema,
domWithDefaults: DocumentOverlayResult,
softwareTypeNode: DeclarativeDocument.DocumentNode.ElementNode,
softwareTypeType: DataClass,
mutationApplicability: NodeData<List<ApplicableMutation>>,
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,
Expand Down

0 comments on commit 62df0bb

Please sign in to comment.