@@ -210,12 +210,12 @@ case class VarRes(ctx: ICtx) {
210
210
Mt .mergeTypes(types)
211
211
}
212
212
213
- def first [T ](suppliers : (() => Option [T ])* ): Option [T ] = {
213
+ private def first [T ](suppliers : (() => Option [T ])* ): Option [T ] = {
214
214
suppliers.iterator.flatMap(s => s())
215
215
.take(1 ).toList.lift(0 )
216
216
}
217
217
218
- def findUsages (ref : JSReferenceExpression ): List [JSReferenceExpression ] = {
218
+ private def findUsages (ref : JSReferenceExpression ): List [JSReferenceExpression ] = {
219
219
Option (ref.resolve()).toList.flatMap(decl => {
220
220
val scope : PsiElement = Lang .findParent[JSFunctionExpression ](decl)
221
221
.getOrElse(decl.getContainingFile)
@@ -227,10 +227,6 @@ case class VarRes(ctx: ICtx) {
227
227
}
228
228
229
229
def resolve (ref : JSReferenceExpression ): Option [JSType ] = {
230
- // TODO: manually support re-assignment, like
231
- // var someVar = null;
232
- // ... code
233
- // someVar = initializeSomething()
234
230
val deepRef = Option (ref.getQualifier)
235
231
.flatMap(qual => ctx.findExprType(qual))
236
232
.flatMap(qualT => {
@@ -239,17 +235,30 @@ case class VarRes(ctx: ICtx) {
239
235
Mt .getKey(qualT, keyTOpt)
240
236
})
241
237
242
- val pushRef = findUsages(ref)
238
+ val refs = findUsages(ref)
239
+
240
+ val pushRef = refs
243
241
.flatMap(usage => Option (usage.getParent))
244
242
.flatMap(cast[JSReferenceExpression ](_))
245
- .filter(superRef => " push" .equals(superRef.getReferenceName))
243
+ .filter(superRef => List (" push" , " unshift" )
244
+ .contains(superRef.getReferenceName))
246
245
.flatMap(psi => Option (psi.getParent))
247
246
.flatMap(cast[JSCallExpression ](_))
248
247
.flatMap(call => call.getArguments.lift(0 ))
249
- .filter(arg => Lang .log(" arg " + arg.getText + " " + arg.getClass))
250
248
.flatMap(value => ctx.findExprType(value))
251
249
.map(elT => new JSArrayTypeImpl (elT, JSTypeSource .EMPTY ))
252
250
251
+ // var someVar = null;
252
+ // ... code
253
+ // someVar = initializeSomething()
254
+ val assRef = refs
255
+ .flatMap(usage => Option (usage.getParent))
256
+ .flatMap(cast[JSDefinitionExpression ](_))
257
+ .flatMap(usage => Option (usage.getParent))
258
+ .flatMap(cast[JSAssignmentExpression ](_))
259
+ .flatMap(defi => Option (defi.getROperand))
260
+ .flatMap(expr => ctx.findExprType(expr))
261
+
253
262
val briefRef = Option (ref.resolve())
254
263
.flatMap(psi => psi match {
255
264
case para : JSParameter => resolveArg(para)
@@ -278,6 +287,6 @@ case class VarRes(ctx: ICtx) {
278
287
// println("Unsupported var declaration - " + psi.getClass + " " + psi.getText)
279
288
None
280
289
})
281
- Mt .mergeTypes(deepRef ++ pushRef ++ briefRef)
290
+ Mt .mergeTypes(deepRef ++ assRef ++ pushRef ++ briefRef)
282
291
}
283
292
}
0 commit comments