diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java index 4c89fcb8c474..bdbcc7d05a25 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java @@ -1479,6 +1479,19 @@ public class HighlightUtil extends HighlightUtilBase { return null; } + static void addLambdaReturnTypeFixes(HighlightInfo info, PsiLambdaExpression lambda, PsiExpression expression) { + PsiType type = LambdaUtil.getFunctionalInterfaceReturnType(lambda); + if (type != null) { + PsiType exprType = expression.getType(); + if (exprType != null && TypeConversionUtil.areTypesConvertible(exprType, type)) { + QuickFixAction.registerQuickFixAction(info, QUICK_FIX_FACTORY.createAddTypeCastFix(type, expression)); + } + QuickFixAction.registerQuickFixAction(info, QUICK_FIX_FACTORY.createWrapWithOptionalFix(type, expression)); + QuickFixAction.registerQuickFixAction(info, QUICK_FIX_FACTORY.createWrapExpressionFix(type, expression)); + QuickFixAction.registerQuickFixAction(info, QUICK_FIX_FACTORY.createWrapWithAdapterFix(type, expression)); + } + } + private enum SelectorKind { INT, ENUM, STRING } private static SelectorKind getSwitchSelectorKind(@NotNull PsiType type) { diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java index b9718d1d87eb..1b96c4fb3283 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java @@ -376,6 +376,10 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh .range(entry.getKey()) .descriptionAndTooltip(entry.getValue()).create(); QuickFixAction.registerQuickFixAction(info, AdjustFunctionContextFix.createFix(entry.getKey())); + if (entry.getKey() instanceof PsiExpression) { + PsiExpression expr = (PsiExpression)entry.getKey(); + HighlightUtil.addLambdaReturnTypeFixes(info, expression, expr); + } myHolder.add(info); } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/afterInLambda.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/afterInLambda.java new file mode 100644 index 000000000000..50984c9d5db1 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/afterInLambda.java @@ -0,0 +1,9 @@ +// "Cast to 'int'" "true" +import java.util.*; +import java.util.function.*; + +class Test { + void test() { + IntSupplier i = () -> (int) Math.PI; + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/beforeInLambda.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/beforeInLambda.java new file mode 100644 index 000000000000..39dfc88f738d --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/beforeInLambda.java @@ -0,0 +1,9 @@ +// "Cast to 'int'" "true" +import java.util.*; +import java.util.function.*; + +class Test { + void test() { + IntSupplier i = () -> Math.PI; + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/wrapLongWithMathToIntExact/afterInLambda.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/wrapLongWithMathToIntExact/afterInLambda.java new file mode 100644 index 000000000000..7cd6226f8ee2 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/wrapLongWithMathToIntExact/afterInLambda.java @@ -0,0 +1,17 @@ +// "Wrap using 'Math.toIntExact()'" "true" +import java.util.function.*; + +public class Test { + + void m() { + + LongToIntFunction fn = x -> { + if(x > 0) { + return Math.toIntExact(x * 2); + } + return 0; + }; + + } + +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/wrapLongWithMathToIntExact/beforeInLambda.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/wrapLongWithMathToIntExact/beforeInLambda.java new file mode 100644 index 000000000000..eafefa5ba8f2 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/wrapLongWithMathToIntExact/beforeInLambda.java @@ -0,0 +1,17 @@ +// "Wrap using 'Math.toIntExact()'" "true" +import java.util.function.*; + +public class Test { + + void m() { + + LongToIntFunction fn = x -> { + if(x > 0) { + return x*2; + } + return 0; + }; + + } + +}