diff --git a/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteDelegateImpl.java b/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteDelegateImpl.java index b3d10e606f5f..a57af58e8457 100644 --- a/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteDelegateImpl.java +++ b/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteDelegateImpl.java @@ -76,7 +76,7 @@ public class JavaSafeDeleteDelegateImpl implements JavaSafeDeleteDelegate { newText.append(StringUtil.join(parameters, new Function() { @Override public String fun(PsiParameter psiParameter) { - return parameter.getType().getCanonicalText(); + return psiParameter.getType().getCanonicalText(); } }, ",")); newText.append(")*/"); diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java index 9e42f4b8c330..7471b915928c 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java @@ -261,8 +261,7 @@ public class InferenceSession { return prepareSubstitution(); } - if (parameters != null && args != null && - !MethodCandidateInfo.ourOverloadGuard.currentStack().contains(PsiUtil.skipParenthesizedExprUp(parent.getParent()))) { + if (parameters != null && args != null) { final Set additionalConstraints = new LinkedHashSet(); if (parameters.length > 0) { collectAdditionalConstraints(parameters, args, properties.getMethod(), PsiSubstitutor.EMPTY, additionalConstraints, properties.isVarargs()); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/overloadResolution/MethodReferenceWithTypeArgs.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/overloadResolution/MethodReferenceWithTypeArgs.java new file mode 100644 index 000000000000..36b6740c13bd --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/overloadResolution/MethodReferenceWithTypeArgs.java @@ -0,0 +1,22 @@ + +import java.util.TreeSet; +import java.util.function.Supplier; +import java.util.stream.Stream; + +class Test { + + void foo() { + log(get(TreeSet::new)); + } + + private void log(String params[]) { + System.out.println(params); + } + private void log(Object params) { + System.out.println(params); + } + + C get(Supplier s) { + return s.get(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/safeDelete/DeleteParameterAndUpdateJavadocRef.java b/java/java-tests/testData/refactoring/safeDelete/DeleteParameterAndUpdateJavadocRef.java new file mode 100644 index 000000000000..d2db572f1a36 --- /dev/null +++ b/java/java-tests/testData/refactoring/safeDelete/DeleteParameterAndUpdateJavadocRef.java @@ -0,0 +1,6 @@ +class Test { + public void abc(Integer arg1, String arg2, Integer arg3) {} + + /** {@link #abc(Integer, String, Integer)} */ + public void def() {} +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/safeDelete/DeleteParameterAndUpdateJavadocRef_after.java b/java/java-tests/testData/refactoring/safeDelete/DeleteParameterAndUpdateJavadocRef_after.java new file mode 100644 index 000000000000..c4703325534a --- /dev/null +++ b/java/java-tests/testData/refactoring/safeDelete/DeleteParameterAndUpdateJavadocRef_after.java @@ -0,0 +1,6 @@ +class Test { + public void abc(Integer arg1, Integer arg3) {} + + /** {@link #abc(Integer, Integer)} */ + public void def() {} +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/OverloadResolutionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/OverloadResolutionTest.java index 0139a107b413..02f5f8770e1c 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/OverloadResolutionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/OverloadResolutionTest.java @@ -114,6 +114,10 @@ public class OverloadResolutionTest extends LightDaemonAnalyzerTestCase { doTest(); } + public void testMethodReferenceWithTypeArgs() throws Exception { + doTest(); + } + private void doTest() { doTest(true); } diff --git a/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java b/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java index b52048be0b95..98a72b4e989e 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java @@ -112,6 +112,10 @@ public class SafeDeleteTest extends MultiFileTestCase { doSingleFileTest(); } + public void testDeleteParameterAndUpdateJavadocRef() throws Exception { + doSingleFileTest(); + } + public void testDeleteConstructorParameterWithAnonymousClassUsage() throws Exception { doSingleFileTest(); } diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/inheritance/AbstractMethodOverridesAbstractMethodInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/inheritance/AbstractMethodOverridesAbstractMethodInspection.java index 1ab70368e8c7..137374f12006 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/inheritance/AbstractMethodOverridesAbstractMethodInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/inheritance/AbstractMethodOverridesAbstractMethodInspection.java @@ -115,22 +115,28 @@ public class AbstractMethodOverridesAbstractMethodInspection extends BaseInspect if (!method.hasModifierProperty(PsiModifier.ABSTRACT) && !containingClass.isInterface()) { return; } + boolean overrideDefault = false; + boolean accept = false; final PsiMethod[] superMethods = method.findSuperMethods(); for (final PsiMethod superMethod : superMethods) { + overrideDefault |= superMethod.hasModifierProperty(PsiModifier.DEFAULT); if (!isAbstract(superMethod)) { continue; } - if (!methodsHaveSameReturnTypes(method, superMethod) || !haveSameExceptionSignatures(method, superMethod)) { - continue; + if (overrideDefault) { + return; } + accept |= methodsHaveSameReturnTypes(method, superMethod) && haveSameExceptionSignatures(method, superMethod); + if (ignoreJavaDoc && !haveSameJavaDoc(method, superMethod)) { return; } if (ignoreAnnotations && !methodsHaveSameAnnotations(method, superMethod)) { return; } + } + if (accept && !overrideDefault) { registerMethodError(method); - return; } } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/inheritance/abstract_method_overrides_abstract_method/AbstractMethodOverridesAbstractMethod.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/inheritance/abstract_method_overrides_abstract_method/AbstractMethodOverridesAbstractMethod.java index 5cb023abb49f..2823bd71b25d 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/inheritance/abstract_method_overrides_abstract_method/AbstractMethodOverridesAbstractMethod.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/inheritance/abstract_method_overrides_abstract_method/AbstractMethodOverridesAbstractMethod.java @@ -62,6 +62,23 @@ class SuperclassSubst { } class Java8DefaultMethods { + + interface A { + String method(); + } + + interface B { + default String method() { + return null; + } + } + + //without override would inherit abstract & default - red code + interface C extends A, B { + @Override + String method(); + } + interface Super { default void method() diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/inheritance/AbstractMethodOverridesAbstractMethodInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/inheritance/AbstractMethodOverridesAbstractMethodInspectionTest.java index 5e6ed0b25c88..753c2f76f53a 100644 --- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/inheritance/AbstractMethodOverridesAbstractMethodInspectionTest.java +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/inheritance/AbstractMethodOverridesAbstractMethodInspectionTest.java @@ -1,5 +1,9 @@ package com.siyeh.ig.inheritance; +import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.openapi.roots.LanguageLevelProjectExtension; +import com.intellij.pom.java.LanguageLevel; +import com.intellij.testFramework.IdeaTestUtil; import com.siyeh.ig.IGInspectionTestCase; public class AbstractMethodOverridesAbstractMethodInspectionTest extends IGInspectionTestCase { @@ -10,4 +14,11 @@ public class AbstractMethodOverridesAbstractMethodInspectionTest extends IGInspe tool.ignoreJavaDoc = true; doTest("com/siyeh/igtest/inheritance/abstract_method_overrides_abstract_method", tool); } + + @Override + protected Sdk getTestProjectSdk() { + Sdk sdk = IdeaTestUtil.getMockJdk17(); + LanguageLevelProjectExtension.getInstance(getProject()).setLanguageLevel(LanguageLevel.HIGHEST); + return sdk; + } } diff --git a/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFxCoercingTest.java b/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFxCoercingTest.java index f305c88f7e8f..a1b160fc5cca 100644 --- a/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFxCoercingTest.java +++ b/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFxCoercingTest.java @@ -47,6 +47,10 @@ public class JavaFxCoercingTest extends AbstractJavaFXTestCase { doTest(); } + public void testPrimitiveCoercing() throws Exception { + doTest(); + } + private void doTest() throws Exception { myFixture.testHighlighting(false, false, false, getTestName(true) + ".fxml"); } diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxPropertyAttributeDescriptor.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxPropertyAttributeDescriptor.java index 37488f345330..65b66e8901e0 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxPropertyAttributeDescriptor.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/descriptors/JavaFxPropertyAttributeDescriptor.java @@ -3,6 +3,7 @@ package org.jetbrains.plugins.javaFX.fxml.descriptors; import com.intellij.psi.*; import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.PsiUtil; +import com.intellij.psi.util.TypeConversionUtil; import com.intellij.psi.xml.*; import com.intellij.util.ArrayUtil; import com.intellij.xml.XmlAttributeDescriptor; @@ -151,7 +152,14 @@ public class JavaFxPropertyAttributeDescriptor extends BasicXmlAttributeDescript final XmlAttributeDescriptor attributeDescriptor = ((XmlAttribute)parent).getDescriptor(); if (attributeDescriptor != null) { final PsiElement declaration = attributeDescriptor.getDeclaration(); - final String boxedQName = getBoxedPropertyType(declaration); + final String boxedQName; + if (declaration != null) { + boxedQName = getBoxedPropertyType(declaration); + } + else { + final PsiClass tagClass = JavaFxPsiUtil.getTagClass((XmlAttributeValue)context); + boxedQName = tagClass != null ? tagClass.getQualifiedName() : null; + } if (boxedQName != null) { try { final Class aClass = Class.forName(boxedQName); @@ -161,10 +169,20 @@ public class JavaFxPropertyAttributeDescriptor extends BasicXmlAttributeDescript catch (InvocationTargetException e) { final Throwable cause = e.getCause(); if (cause instanceof NumberFormatException) { + final PsiReference reference = context.getReference(); + if (reference != null) { + final PsiElement resolve = reference.resolve(); + if (resolve instanceof XmlAttributeValue) { + final PsiClass tagClass = JavaFxPsiUtil.getTagClass((XmlAttributeValue)resolve); + if (tagClass != null && boxedQName.equals(tagClass.getQualifiedName())) { + return null; + } + } + } return "Invalid value: unable to coerce to " + boxedQName; } } - catch (Exception ignore) { + catch (Throwable ignore) { } } } diff --git a/plugins/javaFX/testData/coercing/primitiveCoercing.fxml b/plugins/javaFX/testData/coercing/primitiveCoercing.fxml new file mode 100644 index 000000000000..a77915f43493 --- /dev/null +++ b/plugins/javaFX/testData/coercing/primitiveCoercing.fxml @@ -0,0 +1,8 @@ + + + + + "200p"/> + + + \ No newline at end of file