Skip to content

Commit

Permalink
Add support for string-based TSCN resource id's
Browse files Browse the repository at this point in the history
  • Loading branch information
exigow committed Jul 25, 2023
1 parent 9f3ef76 commit 0ee50e5
Show file tree
Hide file tree
Showing 9 changed files with 121 additions and 53 deletions.
34 changes: 24 additions & 10 deletions gen/tscn/parser/TscnParser.java

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 9 additions & 3 deletions gen/tscn/psi/TscnExtExpression.java

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 9 additions & 3 deletions gen/tscn/psi/TscnSubExpression.java

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

29 changes: 21 additions & 8 deletions gen/tscn/psi/impl/TscnExtExpressionImpl.java

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

29 changes: 21 additions & 8 deletions gen/tscn/psi/impl/TscnSubExpressionImpl.java

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions grammar/TscnParser.bnf
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,9 @@ list_expression ::= L_BRACKET expression? (COMMA expression)* R_BRACKET
dictionary_expression ::= L_CURLY pair_expression? (COMMA pair_expression)* R_CURLY
pair_expression ::= expression COLON expression
function_expression ::= IDENTIFIER L_PAREN expression? (COMMA expression)* R_PAREN
sub_expression ::= SUB_RESOURCE L_PAREN NUMBER R_PAREN {methods=[getReference]}
ext_expression ::= EXT_RESOURCE L_PAREN NUMBER R_PAREN {methods=[getReference]}
sub_expression ::= SUB_RESOURCE L_PAREN sub_ext_id R_PAREN {methods=[getReference]}
ext_expression ::= EXT_RESOURCE L_PAREN sub_ext_id R_PAREN {methods=[getReference]}
private sub_ext_id ::= NUMBER | string

// primitives
private primitive ::= resource_string
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,14 @@ class TscnResourceExtReference(element: TscnExtExpression) :
PsiReferenceBase<TscnExtExpression>(element, TextRange.from(0, element.textLength)) {

override fun resolve(): PsiElement? {
val id = element.number.text.toIntOrNull()
val id = element.number
?: element.doubleQuotedString
?: element.singleQuotedString
?: return null
val entry = PsiTreeUtil.getChildrenOfType(element.containingFile, TscnExtEntry::class.java).orEmpty()
.flatMap { entry -> PsiTreeUtil.getChildrenOfType(entry, TscnAttribute::class.java).orEmpty().asIterable() }
.filter { attribute -> attribute.key.text == "id" }
.find { attribute -> attribute.value.text.toIntOrNull() == id }
.find { attribute -> attribute.value.text == id.text }
?.parentOfTypes(TscnExtEntry::class)
?: return null
val resourcePath = entry.attributeList.find { it.key.text.equals("path") }?.value?.text
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,15 @@ class TscnResourceSubReference(element: TscnSubExpression) :
PsiReferenceBase<TscnSubExpression>(element, TextRange.from(0, element.textLength)) {

override fun resolve(): PsiElement? {
val id = element.number.text.toIntOrNull()
val id = element.number
?: element.doubleQuotedString
?: element.singleQuotedString
?: return null
return PsiTreeUtil.getChildrenOfType(element.containingFile, TscnSubEntry::class.java).orEmpty()
return PsiTreeUtil.getChildrenOfType(element.containingFile, TscnSubEntry::class.java)
.orEmpty()
.flatMap { entry -> PsiTreeUtil.getChildrenOfType(entry, TscnAttribute::class.java).orEmpty().asIterable() }
.filter { attribute -> attribute.key.text == "id" }
.find { attribute -> attribute.value.text.toIntOrNull() == id }
.find { attribute -> attribute.value.text == id.text }
?.parentOfTypes(TscnSubEntry::class)
}

Expand Down
38 changes: 24 additions & 14 deletions src/test/kotlin/tscn/TscnReferenceContributorTest.kt
Original file line number Diff line number Diff line change
@@ -1,30 +1,40 @@
package tscn

import BaseTest
import com.intellij.psi.PsiElement

class TscnReferenceContributorTest : BaseTest() {

fun `test sub_resource reference`() {
environment.configureByText(
"scene.tscn", """
fun `test sub_resource number reference`() {
val reference = resolveReferenceAtCaret("""
[sub_resource id=1]
[node]
x = SubResource<caret>(1)
""".trimIndent()
)
val ref = environment.getReferenceAtCaretPositionWithAssertion()
assertNotNull(ref.resolve())
x = SubResource<caret>(1)
""")
assertNotNull(reference)
}

fun `test sub_resource string reference`() {
val reference = resolveReferenceAtCaret("""
[sub_resource id="foo"]
[node]
x = SubResource<caret>("foo")
""")
assertNotNull(reference)
}

fun `test sub_resource reference not exists`() {
environment.configureByText(
"scene.tscn", """
val reference = resolveReferenceAtCaret("""
[node]
x = SubResource<caret>(1)
""".trimIndent()
)
val ref = environment.getReferenceAtCaretPositionWithAssertion()
assertNull(ref.resolve())
""")
assertNull(reference)
}

private fun resolveReferenceAtCaret(code: String): PsiElement? {
environment.configureByText("scene.tscn", code)
val reference = environment.getReferenceAtCaretPositionWithAssertion()
return reference.resolve()
}

}

0 comments on commit 0ee50e5

Please sign in to comment.