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 } |