1
1
package org .klesun .deep_js_completion .resolvers
2
2
3
3
import java .util
4
+ import java .util .Objects
4
5
6
+ import com .intellij .lang .javascript .dialects .JSDialectSpecificHandlersFactory
5
7
import com .intellij .lang .javascript .psi .impl .{JSDefinitionExpressionImpl , JSFunctionImpl , JSReferenceExpressionImpl }
6
8
import com .intellij .lang .javascript .psi ._
9
+ import com .intellij .lang .javascript .psi .resolve .JSResolveUtil
7
10
import com .intellij .lang .javascript .psi .types ._
11
+ import com .intellij .psi .impl .source .resolve .ResolveCache .PolyVariantResolver
8
12
import com .intellij .psi .{PsiElement , PsiFile }
9
13
import com .intellij .psi .impl .source .resolve .reference .impl .providers .{FileReference , FileReferenceSet }
10
14
import com .intellij .psi .util .PsiTreeUtil
11
15
import org .klesun .deep_js_completion .entry .PathStrGoToDecl
12
16
import org .klesun .deep_js_completion .helpers .{ICtx , MultiType }
17
+ import org .klesun .lang .Lang
13
18
14
19
import scala .collection .JavaConverters ._
15
20
import org .klesun .lang .Lang ._
@@ -87,6 +92,17 @@ case class VarRes(ctx: ICtx) {
87
92
.take(1 ).toList.lift(0 )
88
93
}
89
94
95
+ def findUsages (ref : JSReferenceExpression ): List [JSReferenceExpression ] = {
96
+ Option (ref.resolve()).toList.flatMap(decl => {
97
+ val scope : PsiElement = Lang .findParent[JSFunctionExpression ](decl)
98
+ .getOrElse(decl.getContainingFile)
99
+ Lang .findChildren[JSReferenceExpression ](scope)
100
+ .filter(usage => Objects .equals(usage.getReferenceName, ref.getReferenceName))
101
+ .filter(usage => ! Objects .equals(usage, ref))
102
+ .filter(usage => Objects .equals(decl, usage.resolve()))
103
+ })
104
+ }
105
+
90
106
def resolve (ref : JSReferenceExpression ): Option [JSType ] = {
91
107
// TODO: manually support re-assignment, like
92
108
// var someVar = null;
@@ -100,6 +116,17 @@ case class VarRes(ctx: ICtx) {
100
116
MultiType .getKey(qualT, keyTOpt)
101
117
})
102
118
119
+ val pushRef = findUsages(ref)
120
+ .flatMap(usage => Option (usage.getParent))
121
+ .flatMap(cast[JSReferenceExpression ](_))
122
+ .filter(superRef => " push" .equals(superRef.getReferenceName))
123
+ .flatMap(psi => Option (psi.getParent))
124
+ .flatMap(cast[JSCallExpression ](_))
125
+ .flatMap(call => call.getArguments.lift(0 ))
126
+ .filter(arg => Lang .log(" arg " + arg.getText + " " + arg.getClass))
127
+ .flatMap(value => ctx.findExprType(value))
128
+ .map(elT => new JSArrayTypeImpl (elT, JSTypeSource .EMPTY ))
129
+
103
130
val briefRef = Option (ref.resolve())
104
131
.flatMap(psi => psi match {
105
132
case para : JSParameter => resolveArg(para)
@@ -128,6 +155,6 @@ case class VarRes(ctx: ICtx) {
128
155
println(" Unsupported var declaration - " + psi.getClass + " " + psi.getText)
129
156
None
130
157
})
131
- MultiType .mergeTypes(deepRef ++ briefRef)
158
+ MultiType .mergeTypes(deepRef ++ pushRef ++ briefRef)
132
159
}
133
160
}
0 commit comments