Skip to content

Commit

Permalink
GML: Lookup properties in inherited components
Browse files Browse the repository at this point in the history
  • Loading branch information
mattco98 committed Jan 27, 2024
1 parent 24a7586 commit d90755d
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@ class GMLErrorAnnotator : DSLAnnotator() {
}
is GMLPropertyIdentifier -> {
val parentWidget = element.ancestorOfType<GMLComponent>() ?: return@with
val component = element.project.service<GMLService>().lookupComponent(parentWidget.identWithoutAt)
?: return@with
if (component.properties.none { it.name == element.identifier.text })
val gmlService = element.project.service<GMLService>()
val component = gmlService.lookupComponent(parentWidget.identWithoutAt) ?: return@with
if (component.getProperty(element.identifier.text, gmlService) == null)
element.highlightError("Unknown property")
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ object GMLPropertyCompletion : GMLCompletion() {
val parentComponentName =
parameters.position.ancestorOfType<GMLComponent>()?.identWithoutAt ?: return
val parentComponent = gmlService.lookupComponent(parentComponentName) ?: return
val elements = parentComponent.properties.map { property ->
val elements = parentComponent.getAllProperties(gmlService).map { property ->
LookupElementBuilder.create(property.name)
.withTypeText(property.type.presentation())
.withInsertHandler { context, _ ->
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package me.mattco.serenityos.gml.psi.mixins

import com.intellij.lang.ASTNode
import com.intellij.openapi.components.service
import me.mattco.serenityos.common.ancestorOfType
import me.mattco.serenityos.gml.Property
import me.mattco.serenityos.gml.psi.GMLNamedElement
Expand All @@ -9,7 +10,7 @@ import me.mattco.serenityos.gml.psi.api.GMLProperty

abstract class GMLPropertyMixin(node: ASTNode) : GMLNamedElement(node), GMLProperty {
override val gmlProperty: Property?
get() = ancestorOfType<GMLComponent>()?.gmlComponent?.properties?.find {
it.name == propertyIdentifier.identifier.text
}
get() = ancestorOfType<GMLComponent>()
?.gmlComponent
?.getProperty(propertyIdentifier.identifier.text, project.service())
}
14 changes: 13 additions & 1 deletion src/main/kotlin/me/mattco/serenityos/gml/typing.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,19 @@ data class Component(
val inherits: String? = null,
val description: String? = null,
val properties: List<Property> = emptyList(),
)
) {
fun getSuper(service: GMLService): Component? {
return inherits?.let(service::lookupComponent)
}

fun getProperty(name: String, service: GMLService): Property? {
return properties.find { it.name == name } ?: getSuper(service)?.getProperty(name, service)
}

fun getAllProperties(service: GMLService): List<Property> {
return properties + getSuper(service)?.getAllProperties(service).orEmpty()
}
}

@Serializable
data class Property(
Expand Down

0 comments on commit d90755d

Please sign in to comment.