diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateFieldFromParameterAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateFieldFromParameterAction.java index 38dda39044e0..afa1a8420329 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateFieldFromParameterAction.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateFieldFromParameterAction.java @@ -102,13 +102,33 @@ public class CreateFieldFromParameterAction implements IntentionAction { public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) { PsiParameter psiParameter = findParameterAtCursor(file, editor); - if (psiParameter == null) return false; - final Collection> params = getUnboundedParams(psiParameter); + PsiMethod method = null; + if (psiParameter == null) { + final PsiElement elementAt = file.findElementAt(editor.getCaretModel().getOffset()); + if (elementAt instanceof PsiIdentifier) { + final PsiElement parent = elementAt.getParent(); + if (parent instanceof PsiMethod) { + method = (PsiMethod)parent; + } + } + } else { + final PsiElement declarationScope = psiParameter.getDeclarationScope(); + if (declarationScope instanceof PsiMethod) { + method = (PsiMethod)declarationScope; + } + } + if (method == null) return false; + final Collection> params = getUnboundedParams(method); params.clear(); - final PsiParameter[] parameters = ((PsiMethod)psiParameter.getDeclarationScope()).getParameterList().getParameters(); + final PsiParameter[] parameters = method.getParameterList().getParameters(); for (PsiParameter parameter : parameters) { params.add(SmartPointerManager.getInstance(project).createSmartPsiElementPointer(parameter)); } + if (params.isEmpty()) return false; + if (psiParameter == null) { + psiParameter = params.iterator().next().getElement(); + LOG.assertTrue(psiParameter != null); + } myName = params.size() > 1 && !ApplicationManager.getApplication().isUnitTestMode() ? null : psiParameter.getName(); return isAvailable(psiParameter); } @@ -130,10 +150,7 @@ public class CreateFieldFromParameterAction implements IntentionAction { } @NotNull - private static Collection> getUnboundedParams(PsiParameter parameter) { - final PsiElement psiElement = parameter.getDeclarationScope(); - if (!(psiElement instanceof PsiMethod)) return Collections.emptyList(); - final PsiMethod psiMethod = (PsiMethod)psiElement; + private static Collection> getUnboundedParams(PsiMethod psiMethod) { Map, Boolean> params = psiMethod.getUserData(PARAMS); if (params == null) psiMethod.putUserData(PARAMS, params = new ConcurrentWeakHashMap, Boolean>(1)); final Map, Boolean> finalParams = params; @@ -201,9 +218,14 @@ public class CreateFieldFromParameterAction implements IntentionAction { } private static void invoke(final Project project, Editor editor, PsiFile file, boolean isInteractive) { - final PsiParameter myParameter = findParameterAtCursor(file, editor); - if (!CodeInsightUtilBase.prepareFileForWrite(myParameter.getContainingFile())) return; - final Collection> unboundedParams = getUnboundedParams(myParameter); + PsiParameter myParameter = findParameterAtCursor(file, editor); + if (!CodeInsightUtilBase.prepareFileForWrite(file)) return; + final PsiMethod method = myParameter != null ? (PsiMethod)myParameter.getDeclarationScope() : PsiTreeUtil.getParentOfType(file.findElementAt(editor.getCaretModel().getOffset()), PsiMethod.class); + LOG.assertTrue(method != null); + final Collection> unboundedParams = getUnboundedParams(method); + if (myParameter == null) { + myParameter = unboundedParams.iterator().next().getElement(); + } if (unboundedParams.size() > 1 && !ApplicationManager.getApplication().isUnitTestMode()) { ClassMember[] members = new ClassMember[unboundedParams.size()]; ClassMember selection = null; @@ -216,7 +238,7 @@ public class CreateFieldFromParameterAction implements IntentionAction { selection = classMember; } } - final PsiParameterList parameterList = ((PsiMethod)myParameter.getDeclarationScope()).getParameterList(); + final PsiParameterList parameterList = method.getParameterList(); Arrays.sort(members, new Comparator() { @Override public int compare(ClassMember o1, ClassMember o2) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createFieldFromParameter/afterCaretOnMethod.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createFieldFromParameter/afterCaretOnMethod.java new file mode 100644 index 000000000000..d28e91d248ff --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createFieldFromParameter/afterCaretOnMethod.java @@ -0,0 +1,10 @@ +// "Create Field For Parameter 'p1'" "true" + +class Test{ + private final String myP1; + + void f(T p1){ + myP1 = p1; + } +} + diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createFieldFromParameter/beforeCaretOnMethod.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createFieldFromParameter/beforeCaretOnMethod.java new file mode 100644 index 000000000000..bd7b4b96da2f --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createFieldFromParameter/beforeCaretOnMethod.java @@ -0,0 +1,7 @@ +// "Create Field For Parameter 'p1'" "true" + +class Test{ + void f(T p1){ + } +} + diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createFieldFromParameter/beforeCaretOnMethodWithOnlyAssignedParams.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createFieldFromParameter/beforeCaretOnMethodWithOnlyAssignedParams.java new file mode 100644 index 000000000000..184c8b1cfe2d --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createFieldFromParameter/beforeCaretOnMethodWithOnlyAssignedParams.java @@ -0,0 +1,10 @@ +// "Create Field For Parameter 'p1'" "false" + +class Test{ + private final String myP1; + + void f(T p1){ + myP1 = p1; + } +} + diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createFieldFromParameter/beforeCaretOnMethodWithoutParams.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createFieldFromParameter/beforeCaretOnMethodWithoutParams.java new file mode 100644 index 000000000000..58b98be08c79 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createFieldFromParameter/beforeCaretOnMethodWithoutParams.java @@ -0,0 +1,7 @@ +// "Create Field For Parameter 'p1'" "false" + +class Test{ + void f(){ + } +} +