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

changeset 1562
2154ed9ff6c8
parent 1551
8cdd96f2fdb9
child 1581
4ff468de829d
     1.1 --- a/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java	Tue Feb 12 13:36:56 2013 +0000
     1.2 +++ b/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java	Tue Feb 12 19:25:09 2013 +0000
     1.3 @@ -234,7 +234,7 @@
     1.4                      dt.speculativeCache.put(deferredAttrContext.msym, speculativeTree, deferredAttrContext.phase);
     1.5                      return speculativeTree.type;
     1.6                  case CHECK:
     1.7 -                    Assert.check(dt.mode == AttrMode.SPECULATIVE);
     1.8 +                    Assert.check(dt.mode != null);
     1.9                      return attr.attribTree(dt.tree, dt.env, resultInfo);
    1.10              }
    1.11              Assert.error();
    1.12 @@ -242,6 +242,13 @@
    1.13          }
    1.14      };
    1.15  
    1.16 +    DeferredTypeCompleter dummyCompleter = new DeferredTypeCompleter() {
    1.17 +        public Type complete(DeferredType dt, ResultInfo resultInfo, DeferredAttrContext deferredAttrContext) {
    1.18 +            Assert.check(deferredAttrContext.mode == AttrMode.CHECK);
    1.19 +            return dt.tree.type = Type.noType;
    1.20 +        }
    1.21 +    };
    1.22 +
    1.23      /**
    1.24       * The 'mode' in which the deferred type is to be type-checked
    1.25       */
    1.26 @@ -382,7 +389,7 @@
    1.27                  if (!progress) {
    1.28                      //remove all variables that have already been instantiated
    1.29                      //from the list of stuck variables
    1.30 -                    inferenceContext.solveAny(inferenceContext.freeVarsIn(List.from(stuckVars)));
    1.31 +                    inferenceContext.solveAny(List.from(stuckVars), warn);
    1.32                      inferenceContext.notifyChange();
    1.33                  }
    1.34              }
    1.35 @@ -431,7 +438,15 @@
    1.36                      return true;
    1.37                  case CHECK:
    1.38                      if (stuckVars.nonEmpty()) {
    1.39 -                        return false;
    1.40 +                        //stuck expression - see if we can propagate
    1.41 +                        if (deferredAttrContext.parent != emptyDeferredAttrContext &&
    1.42 +                                Type.containsAny(deferredAttrContext.parent.inferenceContext.inferencevars, List.from(stuckVars))) {
    1.43 +                            deferredAttrContext.parent.deferredAttrNodes.add(this);
    1.44 +                            dt.check(resultInfo, List.<Type>nil(), dummyCompleter);
    1.45 +                            return true;
    1.46 +                        } else {
    1.47 +                            return false;
    1.48 +                        }
    1.49                      } else {
    1.50                          dt.check(resultInfo, stuckVars, basicCompleter);
    1.51                          return true;

mercurial