11package com.github.xepozz.temporal.languages.php
22
3+ import com.intellij.openapi.project.DumbService
34import com.intellij.openapi.project.Project
45import 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
510import 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
613import com.jetbrains.php.lang.psi.resolve.types.PhpType
714import com.jetbrains.php.lang.psi.resolve.types.PhpTypeProvider4
15+ import com.jetbrains.php.lang.psi.resolve.types.PhpTypeSignatureKey
816
917class 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}
0 commit comments