Skip to content

Commit d5370dd

Browse files
committed
Infer type of variable assigned few lines after declaration
For cases when in "if" it is assigned one value, but in "else" another
1 parent c12e2e6 commit d5370dd

File tree

1 file changed

+19
-10
lines changed

1 file changed

+19
-10
lines changed

src/org/klesun/deep_js_completion/resolvers/VarRes.scala

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -210,12 +210,12 @@ case class VarRes(ctx: ICtx) {
210210
Mt.mergeTypes(types)
211211
}
212212

213-
def first[T](suppliers: (() => Option[T])*): Option[T] = {
213+
private def first[T](suppliers: (() => Option[T])*): Option[T] = {
214214
suppliers.iterator.flatMap(s => s())
215215
.take(1).toList.lift(0)
216216
}
217217

218-
def findUsages(ref: JSReferenceExpression): List[JSReferenceExpression] = {
218+
private def findUsages(ref: JSReferenceExpression): List[JSReferenceExpression] = {
219219
Option(ref.resolve()).toList.flatMap(decl => {
220220
val scope: PsiElement = Lang.findParent[JSFunctionExpression](decl)
221221
.getOrElse(decl.getContainingFile)
@@ -227,10 +227,6 @@ case class VarRes(ctx: ICtx) {
227227
}
228228

229229
def resolve(ref: JSReferenceExpression): Option[JSType] = {
230-
// TODO: manually support re-assignment, like
231-
// var someVar = null;
232-
// ... code
233-
// someVar = initializeSomething()
234230
val deepRef = Option(ref.getQualifier)
235231
.flatMap(qual => ctx.findExprType(qual))
236232
.flatMap(qualT => {
@@ -239,17 +235,30 @@ case class VarRes(ctx: ICtx) {
239235
Mt.getKey(qualT, keyTOpt)
240236
})
241237

242-
val pushRef = findUsages(ref)
238+
val refs = findUsages(ref)
239+
240+
val pushRef = refs
243241
.flatMap(usage => Option(usage.getParent))
244242
.flatMap(cast[JSReferenceExpression](_))
245-
.filter(superRef => "push".equals(superRef.getReferenceName))
243+
.filter(superRef => List("push", "unshift")
244+
.contains(superRef.getReferenceName))
246245
.flatMap(psi => Option(psi.getParent))
247246
.flatMap(cast[JSCallExpression](_))
248247
.flatMap(call => call.getArguments.lift(0))
249-
.filter(arg => Lang.log("arg " + arg.getText + " " + arg.getClass))
250248
.flatMap(value => ctx.findExprType(value))
251249
.map(elT => new JSArrayTypeImpl(elT, JSTypeSource.EMPTY))
252250

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+
253262
val briefRef = Option(ref.resolve())
254263
.flatMap(psi => psi match {
255264
case para: JSParameter => resolveArg(para)
@@ -278,6 +287,6 @@ case class VarRes(ctx: ICtx) {
278287
//println("Unsupported var declaration - " + psi.getClass + " " + psi.getText)
279288
None
280289
})
281-
Mt.mergeTypes(deepRef ++ pushRef ++ briefRef)
290+
Mt.mergeTypes(deepRef ++ assRef ++ pushRef ++ briefRef)
282291
}
283292
}

0 commit comments

Comments
 (0)