232 dt.speculativeType(deferredAttrContext.msym, deferredAttrContext.phase).hasTag(NONE))); |
232 dt.speculativeType(deferredAttrContext.msym, deferredAttrContext.phase).hasTag(NONE))); |
233 JCTree speculativeTree = attribSpeculative(dt.tree, dt.env, resultInfo); |
233 JCTree speculativeTree = attribSpeculative(dt.tree, dt.env, resultInfo); |
234 dt.speculativeCache.put(deferredAttrContext.msym, speculativeTree, deferredAttrContext.phase); |
234 dt.speculativeCache.put(deferredAttrContext.msym, speculativeTree, deferredAttrContext.phase); |
235 return speculativeTree.type; |
235 return speculativeTree.type; |
236 case CHECK: |
236 case CHECK: |
237 Assert.check(dt.mode == AttrMode.SPECULATIVE); |
237 Assert.check(dt.mode != null); |
238 return attr.attribTree(dt.tree, dt.env, resultInfo); |
238 return attr.attribTree(dt.tree, dt.env, resultInfo); |
239 } |
239 } |
240 Assert.error(); |
240 Assert.error(); |
241 return null; |
241 return null; |
|
242 } |
|
243 }; |
|
244 |
|
245 DeferredTypeCompleter dummyCompleter = new DeferredTypeCompleter() { |
|
246 public Type complete(DeferredType dt, ResultInfo resultInfo, DeferredAttrContext deferredAttrContext) { |
|
247 Assert.check(deferredAttrContext.mode == AttrMode.CHECK); |
|
248 return dt.tree.type = Type.noType; |
242 } |
249 } |
243 }; |
250 }; |
244 |
251 |
245 /** |
252 /** |
246 * The 'mode' in which the deferred type is to be type-checked |
253 * The 'mode' in which the deferred type is to be type-checked |
429 case SPECULATIVE: |
436 case SPECULATIVE: |
430 dt.check(resultInfo, List.<Type>nil(), new StructuralStuckChecker()); |
437 dt.check(resultInfo, List.<Type>nil(), new StructuralStuckChecker()); |
431 return true; |
438 return true; |
432 case CHECK: |
439 case CHECK: |
433 if (stuckVars.nonEmpty()) { |
440 if (stuckVars.nonEmpty()) { |
434 return false; |
441 //stuck expression - see if we can propagate |
|
442 if (deferredAttrContext.parent != emptyDeferredAttrContext && |
|
443 Type.containsAny(deferredAttrContext.parent.inferenceContext.inferencevars, List.from(stuckVars))) { |
|
444 deferredAttrContext.parent.deferredAttrNodes.add(this); |
|
445 dt.check(resultInfo, List.<Type>nil(), dummyCompleter); |
|
446 return true; |
|
447 } else { |
|
448 return false; |
|
449 } |
435 } else { |
450 } else { |
436 dt.check(resultInfo, stuckVars, basicCompleter); |
451 dt.check(resultInfo, stuckVars, basicCompleter); |
437 return true; |
452 return true; |
438 } |
453 } |
439 default: |
454 default: |