src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java

changeset 1562
2154ed9ff6c8
parent 1551
8cdd96f2fdb9
child 1581
4ff468de829d
equal deleted inserted replaced
1561:073696f59241 1562:2154ed9ff6c8
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
380 } 387 }
381 } 388 }
382 if (!progress) { 389 if (!progress) {
383 //remove all variables that have already been instantiated 390 //remove all variables that have already been instantiated
384 //from the list of stuck variables 391 //from the list of stuck variables
385 inferenceContext.solveAny(inferenceContext.freeVarsIn(List.from(stuckVars))); 392 inferenceContext.solveAny(List.from(stuckVars), warn);
386 inferenceContext.notifyChange(); 393 inferenceContext.notifyChange();
387 } 394 }
388 } 395 }
389 } 396 }
390 } 397 }
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:

mercurial