Skip to content

Commit 2a3d6bf

Browse files
committed
feat: support activity types
1 parent 7a10283 commit 2a3d6bf

File tree

2 files changed

+79
-15
lines changed

2 files changed

+79
-15
lines changed
Lines changed: 78 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,97 @@
11
package com.github.xepozz.temporal.languages.php
22

3+
import com.intellij.openapi.project.DumbService
34
import com.intellij.openapi.project.Project
45
import com.intellij.psi.PsiElement
6+
import com.intellij.psi.util.CachedValueProvider
7+
import com.intellij.psi.util.CachedValuesManager
8+
import com.jetbrains.php.lang.psi.elements.Method
9+
import com.jetbrains.php.lang.psi.elements.MethodReference
510
import com.jetbrains.php.lang.psi.elements.PhpNamedElement
11+
import com.jetbrains.php.lang.psi.elements.PhpReference
12+
import com.jetbrains.php.lang.psi.elements.PhpYield
613
import com.jetbrains.php.lang.psi.resolve.types.PhpType
714
import com.jetbrains.php.lang.psi.resolve.types.PhpTypeProvider4
15+
import com.jetbrains.php.lang.psi.resolve.types.PhpTypeSignatureKey
816

917
class TemporalTypeProvider : PhpTypeProvider4 {
1018
override fun getKey() = '\uBEB1'
11-
override fun getType(p0: PsiElement?): PhpType? {
12-
TODO("Not yet implemented")
19+
20+
override fun getType(element: PsiElement) = when {
21+
DumbService.isDumb(element.project) -> null
22+
element is MethodReference -> getMethodUsageType(element)
23+
element is PhpYield -> getYieldType(element)
24+
else -> null
25+
}
26+
27+
private fun getMethodUsageType(element: MethodReference): PhpType? {
28+
val targetMethods = CachedValuesManager.getCachedValue(element) {
29+
CachedValueProvider.Result.create(
30+
element.resolveGlobal(true)
31+
.mapNotNull { it as? Method }
32+
.mapNotNull {
33+
val containingClass = it.containingClass ?: return@mapNotNull null
34+
35+
return@mapNotNull when {
36+
containingClass.hasAttribute(TemporalClasses.ACTIVITY) -> it
37+
containingClass.hasAttribute(TemporalClasses.WORKFLOW) -> it
38+
else -> null
39+
}
40+
},
41+
element.containingFile,
42+
)
43+
}
44+
if (targetMethods.isEmpty()) return null
45+
46+
val newType = PhpType.PhpTypeBuilder()
47+
48+
targetMethods.map { method ->
49+
val signed = PhpTypeSignatureKey.getSignature(method)
50+
println("signed: $signed")
51+
val parametrized = PhpType.createParametrized(
52+
PhpTypeSignatureKey.CLASS.sign(UtilClasses.REACT_PROMISE),
53+
signed
54+
)
55+
println("parametrized $parametrized ${parametrized.typesWithParametrisedParts} ${parametrized.isComplete}")
56+
newType.add(parametrized)
57+
}
58+
return newType.build()
59+
}
60+
61+
private fun getYieldType(element: PhpYield): PhpType? {
62+
val argument = element.argument as? PhpReference ?: return null
63+
64+
val newType = PhpType.PhpTypeBuilder()
65+
val signatureTypes = PhpType().add(argument.signature.substring(2))
66+
.typesWithParametrisedParts
67+
.mapNotNull {
68+
val lBraceIndex = it.indexOf("<")
69+
val rBraceIndex = it.indexOf(">")
70+
71+
when {
72+
rBraceIndex > lBraceIndex -> it.substring(lBraceIndex + 1, rBraceIndex)
73+
else -> null
74+
}
75+
}
76+
77+
signatureTypes.forEach { newType.add(it) }
78+
79+
return newType.build()
1380
}
1481

1582
override fun complete(
16-
p0: String?,
17-
p1: Project?
83+
signature: String,
84+
project: Project,
1885
): PhpType? {
19-
TODO("Not yet implemented")
86+
return null
2087
}
2188

2289
override fun getBySignature(
23-
p0: String?,
24-
p1: Set<String?>?,
25-
p2: Int,
26-
p3: Project?
27-
): Collection<PhpNamedElement?>? {
28-
TODO("Not yet implemented")
90+
expression: String,
91+
visited: Set<String>,
92+
depth: Int,
93+
project: Project,
94+
): Collection<PhpNamedElement>? {
95+
return null
2996
}
30-
31-
override fun interceptsNativeSignature() = true
32-
33-
3497
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<idea-plugin>
22
<extensions defaultExtensionNs="com.jetbrains.php">
33
<typeProvider4
4+
order="first"
45
implementation="com.github.xepozz.temporal.languages.php.TemporalTypeProvider"/>
56
</extensions>
67
</idea-plugin>

0 commit comments

Comments
 (0)