Skip to content

Commit 5962f6c

Browse files
committed
Add support for referencing shiftop* scripts
1 parent 5a2488c commit 5962f6c

File tree

6 files changed

+74
-12
lines changed

6 files changed

+74
-12
lines changed

src/main/kotlin/io/runescript/plugin/lang/psi/refs/RsDynamicExpressionReference.kt

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@ import io.runescript.plugin.lang.psi.scope.RsResolveMode
1212
import io.runescript.plugin.lang.psi.scope.RsScopesUtil
1313
import io.runescript.plugin.lang.psi.type.RsPrimitiveType
1414
import io.runescript.plugin.lang.psi.type.RsType
15+
import io.runescript.plugin.lang.psi.type.trigger.RsTriggerType
1516
import io.runescript.plugin.lang.psi.type.type
1617
import io.runescript.plugin.lang.stubs.index.RsCommandScriptIndex
17-
import io.runescript.plugin.lang.stubs.index.RsProcScriptIndex
18+
import io.runescript.plugin.lang.stubs.index.RsScriptIndex
1819
import io.runescript.plugin.symbollang.psi.index.RsSymbolIndex
1920

20-
class RsDynamicExpressionReference(element: RsDynamicExpression) : PsiPolyVariantReferenceBase<RsDynamicExpression>(element, element.nameLiteral.textRangeInParent) {
21+
class RsDynamicExpressionReference(element: RsDynamicExpression) :
22+
PsiPolyVariantReferenceBase<RsDynamicExpression>(element, element.nameLiteral.textRangeInParent) {
2123

2224
override fun multiResolve(incompleteCode: Boolean): Array<ResolveResult> {
2325
return resolveElement(element, element.type)
@@ -41,6 +43,21 @@ class RsDynamicExpressionReference(element: RsDynamicExpression) : PsiPolyVarian
4143
return arrayOf(PsiElementResolveResult(localArray))
4244
}
4345

46+
// Try to resolve the element as a script reference.
47+
val triggerType = getScriptTriggerForType(type)
48+
if (triggerType != null) {
49+
val project = element.project
50+
val module = ModuleUtil.findModuleForPsiElement(element) ?: return emptyArray()
51+
val searchScope = GlobalSearchScope.moduleScope(module)
52+
return StubIndex.getElements(
53+
RsScriptIndex.KEY,
54+
"[${triggerType.literal},$elementName]",
55+
project,
56+
searchScope,
57+
RsScript::class.java
58+
).map { PsiElementResolveResult(it) }.toTypedArray()
59+
}
60+
4461
// Try to resolve the element as a config reference.
4562
val project = element.project
4663
if (type is RsPrimitiveType) {
@@ -54,9 +71,24 @@ class RsDynamicExpressionReference(element: RsDynamicExpression) : PsiPolyVarian
5471
val module = ModuleUtil.findModuleForPsiElement(element) ?: return emptyArray()
5572
val searchScope = GlobalSearchScope.moduleScope(module)
5673

57-
return StubIndex.getElements(RsCommandScriptIndex.KEY, elementName, project, searchScope, RsScript::class.java)
58-
.map { PsiElementResolveResult(it) }
59-
.toTypedArray()
74+
return StubIndex.getElements(
75+
RsCommandScriptIndex.KEY,
76+
elementName,
77+
project,
78+
searchScope,
79+
RsScript::class.java
80+
).map { PsiElementResolveResult(it) }.toTypedArray()
81+
}
82+
83+
private fun getScriptTriggerForType(type: RsType): RsTriggerType? {
84+
return when (type) {
85+
RsPrimitiveType.SHIFTOPNPC -> RsTriggerType.SHIFTOPNPC
86+
RsPrimitiveType.SHIFTOPLOC -> RsTriggerType.SHIFTOPLOC
87+
RsPrimitiveType.SHIFTOPOBJ -> RsTriggerType.SHIFTOPOBJ
88+
RsPrimitiveType.SHIFTOPPLAYER -> RsTriggerType.SHIFTOPPLAYER
89+
RsPrimitiveType.SHIFTOPTILE -> RsTriggerType.SHIFTOPTILE
90+
else -> null
91+
}
6092
}
6193
}
6294
}

src/main/kotlin/io/runescript/plugin/lang/psi/type/inference/RsTypeInferenceVisitor.kt

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -486,12 +486,21 @@ class RsTypeInferenceVisitor(private val myInferenceData: RsTypeInference) : RsV
486486
when (val reference = RsDynamicExpressionReference.resolveElement(o, type).singleOrNull()?.element) {
487487
null -> o.type = RsErrorType
488488
is RsScript -> {
489-
val returnTypes = reference
490-
.returnList
491-
?.typeNameList
492-
?.map { RsPrimitiveType.lookupReferencable(it.text) }
493-
?: emptyList()
494-
o.type = RsTupleType(returnTypes.flatten())
489+
if (reference.triggerName == "command") {
490+
val returnTypes = reference
491+
.returnList
492+
?.typeNameList
493+
?.map { RsPrimitiveType.lookupReferencable(it.text) }
494+
?: emptyList()
495+
o.type = RsTupleType(returnTypes.flatten())
496+
} else {
497+
check(type == RsPrimitiveType.SHIFTOPNPC || type == RsPrimitiveType.SHIFTOPLOC
498+
|| type == RsPrimitiveType.SHIFTOPOBJ || type == RsPrimitiveType.SHIFTOPPLAYER
499+
|| type == RsPrimitiveType.SHIFTOPTILE) {
500+
"Invalid type for dynamic expression: ${type.representation}"
501+
}
502+
o.type = type
503+
}
495504
}
496505

497506
is RsSymSymbol -> {
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package io.runescript.plugin.lang.stubs.index
2+
3+
import com.intellij.psi.stubs.StringStubIndexExtension
4+
import com.intellij.psi.stubs.StubIndexKey
5+
import io.runescript.plugin.lang.psi.RsScript
6+
import io.runescript.plugin.lang.stubs.types.RsFileStubType
7+
8+
9+
class RsScriptIndex : StringStubIndexExtension<RsScript>() {
10+
11+
override fun getVersion(): Int = RsFileStubType.stubVersion
12+
13+
override fun getKey(): StubIndexKey<String, RsScript> = KEY
14+
15+
companion object {
16+
val KEY = StubIndexKey.createIndexKey<String, RsScript>("io.runescript.plugin.lang.stubs.index.RsScriptIndex")
17+
}
18+
}

src/main/kotlin/io/runescript/plugin/lang/stubs/types/RsFileStubType.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ object RsFileStubType : IStubFileElementType<RsFileStub>(RuneScript) {
3232
return node.firstChildNode
3333
}
3434

35-
override fun getStubVersion() = 2
35+
override fun getStubVersion() = 3
3636

3737
override fun serialize(stub: RsFileStub, dataStream: StubOutputStream) {
3838

src/main/kotlin/io/runescript/plugin/lang/stubs/types/RsScriptStubType.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import io.runescript.plugin.lang.stubs.RsScriptStub
1414
import io.runescript.plugin.lang.stubs.index.RsClientScriptIndex
1515
import io.runescript.plugin.lang.stubs.index.RsCommandScriptIndex
1616
import io.runescript.plugin.lang.stubs.index.RsProcScriptIndex
17+
import io.runescript.plugin.lang.stubs.index.RsScriptIndex
1718

1819
object RsScriptStubType : RsStubType<RsScriptStub, RsScript>("SCRIPT") {
1920

@@ -35,6 +36,7 @@ object RsScriptStubType : RsStubType<RsScriptStub, RsScript>("SCRIPT") {
3536
}
3637

3738
override fun indexStub(stub: RsScriptStub, sink: IndexSink) {
39+
sink.occurrence(RsScriptIndex.KEY, "[${stub.triggerName},${stub.scriptName}]")
3840
when (stub.triggerName) {
3941
"proc" -> sink.occurrence(RsProcScriptIndex.KEY, stub.scriptName)
4042
"clientscript" -> sink.occurrence(RsClientScriptIndex.KEY, stub.scriptName)

src/main/resources/META-INF/plugin.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
<stubIndex implementation="io.runescript.plugin.lang.stubs.index.RsProcScriptIndex"/>
4242
<stubIndex implementation="io.runescript.plugin.lang.stubs.index.RsClientScriptIndex"/>
4343
<stubIndex implementation="io.runescript.plugin.lang.stubs.index.RsCommandScriptIndex"/>
44+
<stubIndex implementation="io.runescript.plugin.lang.stubs.index.RsScriptIndex"/>
4445
<gotoClassContributor implementation="io.runescript.plugin.ide.RsGotoClassContributor"/>
4546
<lang.elementManipulator forClass="io.runescript.plugin.lang.psi.RsGosubExpression" implementationClass="io.runescript.plugin.lang.psi.manipulator.RsGosubExpressionManipulator"/>
4647
<lang.elementManipulator forClass="io.runescript.plugin.lang.psi.RsStringLiteralContent" implementationClass="io.runescript.plugin.lang.psi.manipulator.RsStringLiteralContentManipulator"/>

0 commit comments

Comments
 (0)