diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateConstructorHandler.java b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateConstructorHandler.java index f2eec3cbc0fa..606bb3b72f89 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateConstructorHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateConstructorHandler.java @@ -182,7 +182,7 @@ public class GenerateConstructorHandler extends GenerateMembersHandlerBase { PsiSubstitutor substitutor = TypeConversionUtil.getSuperClassSubstitutor(superClass, aClass, PsiSubstitutor.EMPTY); for (PsiMethod baseConstructor : baseConstructors) { if (substitutor != PsiSubstitutor.EMPTY) { - baseConstructor = GenerateMembersUtil.substituteGenericMethod(baseConstructor, substitutor); + baseConstructor = GenerateMembersUtil.substituteGenericMethod(baseConstructor, substitutor, aClass); } constructors.add(new PsiGenerationInfo(generateConstructorPrototype(aClass, baseConstructor, myCopyJavadoc, fields))); } diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java index 6b0731e8937c..0eb85a0d11f5 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java @@ -22,6 +22,8 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.ScrollType; import com.intellij.openapi.extensions.Extensions; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.text.StringUtil; @@ -31,6 +33,7 @@ import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.codeStyle.VariableKind; import com.intellij.psi.javadoc.PsiDocComment; +import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.TypeConversionUtil; import com.intellij.refactoring.util.RefactoringUtil; @@ -220,6 +223,12 @@ public class GenerateMembersUtil { } public static PsiMethod substituteGenericMethod(PsiMethod method, final PsiSubstitutor substitutor) { + return substituteGenericMethod(method, substitutor, null); + } + + public static PsiMethod substituteGenericMethod(PsiMethod method, + final PsiSubstitutor substitutor, + final PsiElement target) { Project project = method.getProject(); final PsiElementFactory factory = JavaPsiFacade.getInstance(method.getProject()).getElementFactory(); @@ -244,6 +253,9 @@ public class GenerateMembersUtil { newMethod.addAfter(docComment, null); } + final Module module = target != null ? ModuleUtil.findModuleForPsiElement(target) : null; + final GlobalSearchScope moduleScope = module != null ? GlobalSearchScope.moduleWithDependenciesAndLibrariesScope(module) : null; + PsiParameter[] parameters = method.getParameterList().getParameters(); JavaCodeStyleManager codeStyleManager = JavaCodeStyleManager.getInstance(project); Map> m = new HashMap>(); @@ -283,7 +295,7 @@ public class GenerateMembersUtil { if (parameter.getLanguage() == JavaLanguage.INSTANCE) { PsiModifierList modifierList = newParameter.getModifierList(); modifierList = (PsiModifierList)modifierList.replace(parameter.getModifierList()); - processAnnotations(project, modifierList); + processAnnotations(project, modifierList, moduleScope); } newMethod.getParameterList().add(newParameter); } @@ -316,13 +328,17 @@ public class GenerateMembersUtil { } } - private static void processAnnotations(Project project, PsiModifierList modifierList) { + private static void processAnnotations(Project project, PsiModifierList modifierList, GlobalSearchScope moduleScope) { + final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project); final Set toRemove = new HashSet(); for (PsiAnnotation annotation : modifierList.getAnnotations()) { final String qualifiedName = annotation.getQualifiedName(); for (OverrideImplementsAnnotationsHandler handler : Extensions.getExtensions(OverrideImplementsAnnotationsHandler.EP_NAME)) { final String[] annotations2Remove = handler.annotationsToRemove(project, qualifiedName); Collections.addAll(toRemove, annotations2Remove); + if (moduleScope != null && psiFacade.findClass(qualifiedName, moduleScope) == null) { + toRemove.add(qualifiedName); + } } } for (String fqn : toRemove) { diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/OverrideImplementUtil.java b/java/java-impl/src/com/intellij/codeInsight/generation/OverrideImplementUtil.java index e70700a7bae9..6a52ec171673 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/OverrideImplementUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/OverrideImplementUtil.java @@ -262,7 +262,7 @@ public class OverrideImplementUtil { } } if (results.isEmpty()) { - PsiMethod method1 = GenerateMembersUtil.substituteGenericMethod(method, substitutor); + PsiMethod method1 = GenerateMembersUtil.substituteGenericMethod(method, substitutor, aClass); PsiElementFactory factory = JavaPsiFacade.getInstance(method.getProject()).getElementFactory(); PsiMethod result = (PsiMethod)factory.createClass("Dummy").add(method1); diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/OverrideImplementsAnnotationsHandlerImpl.java b/java/java-impl/src/com/intellij/codeInsight/generation/OverrideImplementsAnnotationsHandlerImpl.java index 5f707acd6857..6abe3a84d68b 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/OverrideImplementsAnnotationsHandlerImpl.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/OverrideImplementsAnnotationsHandlerImpl.java @@ -24,7 +24,6 @@ import com.intellij.codeInsight.AnnotationUtil; import com.intellij.codeInsight.NullableNotNullManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; -import com.intellij.openapi.util.JDOMExternalizableStringList; import com.intellij.util.ArrayUtil; import org.jetbrains.annotations.NotNull; @@ -45,6 +44,7 @@ public class OverrideImplementsAnnotationsHandlerImpl implements OverrideImpleme if (manager.getNotNulls().contains(fqName)) { return ArrayUtil.toStringArray(manager.getNullables()); } + if (Comparing.strEqual(fqName, AnnotationUtil.NLS)){ return new String[]{AnnotationUtil.NON_NLS}; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/overrideMethod/afterSkipUnresolvedNullable.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/overrideMethod/afterSkipUnresolvedNullable.java new file mode 100644 index 000000000000..f9ef728d7056 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/overrideMethod/afterSkipUnresolvedNullable.java @@ -0,0 +1,13 @@ +import org.jetbrains.annotations.Nullable; + +// "Implement method 'foo'" "true" +abstract class Test { + public abstract void foo(@org.jetbrains.annotations.Nullable String a); +} + +class TImple extends Test { + @Override + public void foo(@Nullable String a) { + //To change body of implemented methods use File | Settings | File Templates. + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/overrideMethod/beforeSkipUnresolvedNullable.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/overrideMethod/beforeSkipUnresolvedNullable.java new file mode 100644 index 000000000000..92d515efbd5b --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/overrideMethod/beforeSkipUnresolvedNullable.java @@ -0,0 +1,6 @@ +// "Implement method 'foo'" "true" +abstract class Test { + public abstract void foo(@org.jetbrains.annotations.Nullable String a); +} + +class TImple extends Test {} \ No newline at end of file