langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/DeferredAttr.java
changeset 45504 ea7475564d07
parent 44393 ce94820fa9d1
equal deleted inserted replaced
45503:d23ae2d67a5d 45504:ea7475564d07
    39 import com.sun.tools.javac.util.GraphUtils.DependencyKind;
    39 import com.sun.tools.javac.util.GraphUtils.DependencyKind;
    40 import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
    40 import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
    41 import com.sun.tools.javac.code.Symbol.*;
    41 import com.sun.tools.javac.code.Symbol.*;
    42 import com.sun.tools.javac.comp.Attr.ResultInfo;
    42 import com.sun.tools.javac.comp.Attr.ResultInfo;
    43 import com.sun.tools.javac.comp.Resolve.MethodResolutionPhase;
    43 import com.sun.tools.javac.comp.Resolve.MethodResolutionPhase;
       
    44 import com.sun.tools.javac.resources.CompilerProperties.Errors;
    44 import com.sun.tools.javac.tree.JCTree.*;
    45 import com.sun.tools.javac.tree.JCTree.*;
    45 import com.sun.tools.javac.util.JCDiagnostic.DiagnosticType;
    46 import com.sun.tools.javac.util.JCDiagnostic.DiagnosticType;
    46 import com.sun.tools.javac.util.Log.DeferredDiagnosticHandler;
    47 import com.sun.tools.javac.util.Log.DeferredDiagnosticHandler;
    47 
    48 
    48 import java.util.ArrayList;
    49 import java.util.ArrayList;
   809                         checkContext.report(null, ex.getDiagnostic());
   810                         checkContext.report(null, ex.getDiagnostic());
   810                     }
   811                     }
   811 
   812 
   812                     if (descriptorType.getParameterTypes().length() != tree.params.length()) {
   813                     if (descriptorType.getParameterTypes().length() != tree.params.length()) {
   813                         checkContext.report(tree,
   814                         checkContext.report(tree,
   814                                 diags.fragment("incompatible.arg.types.in.lambda"));
   815                                 diags.fragment(Fragments.IncompatibleArgTypesInLambda));
   815                     }
   816                     }
   816 
   817 
   817                     Type currentReturnType = descriptorType.getReturnType();
   818                     Type currentReturnType = descriptorType.getReturnType();
   818                     boolean returnTypeIsVoid = currentReturnType.hasTag(VOID);
   819                     boolean returnTypeIsVoid = currentReturnType.hasTag(VOID);
   819                     if (tree.getBodyKind() == BodyKind.EXPRESSION) {
   820                     if (tree.getBodyKind() == BodyKind.EXPRESSION) {
   820                         boolean isExpressionCompatible = !returnTypeIsVoid ||
   821                         boolean isExpressionCompatible = !returnTypeIsVoid ||
   821                             TreeInfo.isExpressionStatement((JCExpression)tree.getBody());
   822                             TreeInfo.isExpressionStatement((JCExpression)tree.getBody());
   822                         if (!isExpressionCompatible) {
   823                         if (!isExpressionCompatible) {
   823                             resultInfo.checkContext.report(tree.pos(),
   824                             resultInfo.checkContext.report(tree.pos(),
   824                                 diags.fragment("incompatible.ret.type.in.lambda",
   825                                 diags.fragment(Fragments.IncompatibleRetTypeInLambda(Fragments.MissingRetVal(currentReturnType))));
   825                                     diags.fragment("missing.ret.val", currentReturnType)));
       
   826                         }
   826                         }
   827                     } else {
   827                     } else {
   828                         LambdaBodyStructChecker lambdaBodyChecker =
   828                         LambdaBodyStructChecker lambdaBodyChecker =
   829                                 new LambdaBodyStructChecker();
   829                                 new LambdaBodyStructChecker();
   830 
   830 
   832                         boolean isVoidCompatible = lambdaBodyChecker.isVoidCompatible;
   832                         boolean isVoidCompatible = lambdaBodyChecker.isVoidCompatible;
   833 
   833 
   834                         if (returnTypeIsVoid) {
   834                         if (returnTypeIsVoid) {
   835                             if (!isVoidCompatible) {
   835                             if (!isVoidCompatible) {
   836                                 resultInfo.checkContext.report(tree.pos(),
   836                                 resultInfo.checkContext.report(tree.pos(),
   837                                     diags.fragment("unexpected.ret.val"));
   837                                     diags.fragment(Fragments.UnexpectedRetVal));
   838                             }
   838                             }
   839                         } else {
   839                         } else {
   840                             boolean isValueCompatible = lambdaBodyChecker.isPotentiallyValueCompatible
   840                             boolean isValueCompatible = lambdaBodyChecker.isPotentiallyValueCompatible
   841                                 && !canLambdaBodyCompleteNormally(tree);
   841                                 && !canLambdaBodyCompleteNormally(tree);
   842                             if (!isValueCompatible && !isVoidCompatible) {
   842                             if (!isValueCompatible && !isVoidCompatible) {
   843                                 log.error(tree.body.pos(),
   843                                 log.error(tree.body.pos(),
   844                                     "lambda.body.neither.value.nor.void.compatible");
   844                                           Errors.LambdaBodyNeitherValueNorVoidCompatible);
   845                             }
   845                             }
   846 
   846 
   847                             if (!isValueCompatible) {
   847                             if (!isValueCompatible) {
   848                                 resultInfo.checkContext.report(tree.pos(),
   848                                 resultInfo.checkContext.report(tree.pos(),
   849                                     diags.fragment("incompatible.ret.type.in.lambda",
   849                                     diags.fragment(Fragments.IncompatibleRetTypeInLambda(Fragments.MissingRetVal(currentReturnType))));
   850                                         diags.fragment("missing.ret.val", currentReturnType)));
       
   851                             }
   850                             }
   852                         }
   851                         }
   853                     }
   852                     }
   854                 }
   853                 }
   855             }
   854             }