diff options
Diffstat (limited to 'java/java-impl')
37 files changed, 265 insertions, 200 deletions
diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/PreferByKindWeigher.java b/java/java-impl/src/com/intellij/codeInsight/completion/PreferByKindWeigher.java index b60094ffbd6f..ad53d9484959 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/PreferByKindWeigher.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/PreferByKindWeigher.java @@ -138,8 +138,8 @@ public class PreferByKindWeigher extends LookupElementWeigher { qualifiedWithField, qualifiedWithGetter, superMethodParameters, - expectedTypeConstant, field, + expectedTypeConstant, getter, normal, collectionFactory, diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddMethodQualifierFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddMethodQualifierFix.java index ff851372e208..4ab9d43fbc1d 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddMethodQualifierFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddMethodQualifierFix.java @@ -69,10 +69,14 @@ public class AddMethodQualifierFix implements IntentionAction { if (element == null || !element.isValid()) { return false; } + return getOrFindCandidates().size() != 0; + } + + private synchronized List<PsiVariable> getOrFindCandidates() { if (myCandidates == null) { findCandidates(); } - return myCandidates.size() != 0; + return myCandidates; } private void findCandidates() { @@ -84,6 +88,9 @@ public class AddMethodQualifierFix implements IntentionAction { } for (final PsiVariable var : CreateFromUsageUtils.guessMatchingVariables(methodCallElement)) { + if (var.getName() == null) { + continue; + } final PsiType type = var.getType(); if (!(type instanceof PsiClassType)) { continue; @@ -132,7 +139,7 @@ public class AddMethodQualifierFix implements IntentionAction { @NotNull @Override public String getTextFor(final PsiVariable value) { - return ObjectUtils.assertNotNull(value.getName()); + return value.getName(); } @Override diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AnonymousTargetClassPreselectionUtil.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AnonymousTargetClassPreselectionUtil.java new file mode 100644 index 000000000000..421c43cabe88 --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AnonymousTargetClassPreselectionUtil.java @@ -0,0 +1,45 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.codeInsight.daemon.impl.quickfix; + +import com.intellij.ide.util.PropertiesComponent; +import com.intellij.psi.PsiAnonymousClass; +import com.intellij.psi.PsiClass; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; + +public class AnonymousTargetClassPreselectionUtil { + private static final String PRESELECT_ANONYMOUS = "create.member.preselect.anonymous"; + + public static void rememberSelection(PsiClass aClass, PsiClass firstClass) { + if (firstClass instanceof PsiAnonymousClass) { + PropertiesComponent.getInstance().setValue(PRESELECT_ANONYMOUS, String.valueOf(aClass == firstClass)); + } + } + + @Nullable + public static PsiClass getPreselection(Collection<PsiClass> classes, PsiClass firstClass) { + if (firstClass instanceof PsiAnonymousClass && !PropertiesComponent.getInstance().getBoolean(PRESELECT_ANONYMOUS, true)) { + for (PsiClass aClass : classes) { + if (!(aClass instanceof PsiAnonymousClass)) { + return aClass; + } + } + } + return null; + } +} diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageBaseFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageBaseFix.java index 09b83e2a489f..abe9368374e8 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageBaseFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageBaseFix.java @@ -119,7 +119,8 @@ public abstract class CreateFromUsageBaseFix extends BaseIntentionAction { protected abstract PsiElement getElement(); private void chooseTargetClass(List<PsiClass> classes, final Editor editor) { - final Project project = classes.get(0).getProject(); + final PsiClass firstClass = classes.get(0); + final Project project = firstClass.getProject(); final JList list = new JBList(classes); PsiElementListCellRenderer renderer = new PsiClassListCellRenderer(); @@ -128,12 +129,18 @@ public abstract class CreateFromUsageBaseFix extends BaseIntentionAction { final PopupChooserBuilder builder = new PopupChooserBuilder(list); renderer.installSpeedSearch(builder); + final PsiClass preselection = AnonymousTargetClassPreselectionUtil.getPreselection(classes, firstClass); + if (preselection != null) { + list.setSelectedValue(preselection, true); + } + Runnable runnable = new Runnable() { @Override public void run() { int index = list.getSelectedIndex(); if (index < 0) return; final PsiClass aClass = (PsiClass) list.getSelectedValue(); + AnonymousTargetClassPreselectionUtil.rememberSelection(aClass, firstClass); CommandProcessor.getInstance().executeCommand(project, new Runnable() { @Override public void run() { diff --git a/java/java-impl/src/com/intellij/codeInsight/editorActions/CopyPasteReferenceProcessor.java b/java/java-impl/src/com/intellij/codeInsight/editorActions/CopyPasteReferenceProcessor.java index 906dfa6258de..e6991736c0e3 100644 --- a/java/java-impl/src/com/intellij/codeInsight/editorActions/CopyPasteReferenceProcessor.java +++ b/java/java-impl/src/com/intellij/codeInsight/editorActions/CopyPasteReferenceProcessor.java @@ -144,6 +144,17 @@ public abstract class CopyPasteReferenceProcessor<TRef extends PsiElement> exten RangeMarker bounds, ReferenceData[] referenceData); + protected PsiElement resolveReferenceIgnoreOverriding(PsiPolyVariantReference reference) { + PsiElement referent = reference.resolve(); + if (referent == null) { + final ResolveResult[] results = reference.multiResolve(true); + if (results.length > 0) { + referent = results[0].getElement(); + } + } + return referent; + } + protected abstract void restoreReferences(ReferenceData[] referenceData, TRef[] refs); diff --git a/java/java-impl/src/com/intellij/codeInsight/editorActions/JavaCopyPasteReferenceProcessor.java b/java/java-impl/src/com/intellij/codeInsight/editorActions/JavaCopyPasteReferenceProcessor.java index 51edddd250aa..76be78b7932d 100644 --- a/java/java-impl/src/com/intellij/codeInsight/editorActions/JavaCopyPasteReferenceProcessor.java +++ b/java/java-impl/src/com/intellij/codeInsight/editorActions/JavaCopyPasteReferenceProcessor.java @@ -88,7 +88,8 @@ public class JavaCopyPasteReferenceProcessor extends CopyPasteReferenceProcessor } else { if (reference instanceof PsiReferenceExpression) { - PsiElement referent = reference.resolve(); + PsiElement referent = resolveReferenceIgnoreOverriding(reference); + if (!(referent instanceof PsiNamedElement) || !data.staticMemberName.equals(((PsiNamedElement)referent).getName()) || !(referent instanceof PsiMember) diff --git a/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/MissingCatchBodyFixer.java b/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/MissingCatchBodyFixer.java index 1d4d281aea68..08e06283d4a5 100644 --- a/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/MissingCatchBodyFixer.java +++ b/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/MissingCatchBodyFixer.java @@ -36,7 +36,7 @@ public class MissingCatchBodyFixer implements Fixer { final Document doc = editor.getDocument(); PsiCodeBlock body = catchSection.getCatchBlock(); - if (body != null && startLine(doc, body) == startLine(doc, catchSection)) return; + if (body != null && body.getLBrace() != null && body.getRBrace() != null) return; final PsiJavaToken rParenth = catchSection.getRParenth(); if (rParenth == null) return; @@ -44,7 +44,4 @@ public class MissingCatchBodyFixer implements Fixer { doc.insertString(rParenth.getTextRange().getEndOffset(), "{}"); } - private static int startLine(Document doc, PsiElement psiElement) { - return doc.getLineNumber(psiElement.getTextRange().getStartOffset()); - } }
\ No newline at end of file diff --git a/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/PlainEnterProcessor.java b/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/PlainEnterProcessor.java index 6bafcc00d983..884442c778cc 100644 --- a/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/PlainEnterProcessor.java +++ b/java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/PlainEnterProcessor.java @@ -83,6 +83,22 @@ public class PlainEnterProcessor implements EnterProcessor { @Nullable private static PsiCodeBlock getControlStatementBlock(int caret, PsiElement element) { + if (element instanceof PsiTryStatement) { + PsiCodeBlock tryBlock = ((PsiTryStatement)element).getTryBlock(); + if (tryBlock != null && caret < tryBlock.getTextRange().getEndOffset()) return tryBlock; + + for (PsiCodeBlock catchBlock : ((PsiTryStatement)element).getCatchBlocks()) { + if (catchBlock != null && caret < catchBlock.getTextRange().getEndOffset()) return catchBlock; + } + + return ((PsiTryStatement)element).getFinallyBlock(); + } + + if (element instanceof PsiMethod) { + PsiCodeBlock methodBody = ((PsiMethod)element).getBody(); + if (methodBody != null) return methodBody; + } + PsiStatement body = null; if (element instanceof PsiIfStatement) { body = ((PsiIfStatement)element).getThenBranch(); @@ -102,10 +118,6 @@ public class PlainEnterProcessor implements EnterProcessor { else if (element instanceof PsiDoWhileStatement) { body = ((PsiDoWhileStatement)element).getBody(); } - else if (element instanceof PsiMethod) { - PsiCodeBlock methodBody = ((PsiMethod)element).getBody(); - if (methodBody != null) return methodBody; - } return body instanceof PsiBlockStatement ? ((PsiBlockStatement)body).getCodeBlock() : null; } diff --git a/java/java-impl/src/com/intellij/codeInsight/hint/api/impls/MethodParameterInfoHandler.java b/java/java-impl/src/com/intellij/codeInsight/hint/api/impls/MethodParameterInfoHandler.java index fd85d1124171..daf2e3002dd2 100644 --- a/java/java-impl/src/com/intellij/codeInsight/hint/api/impls/MethodParameterInfoHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/hint/api/impls/MethodParameterInfoHandler.java @@ -450,18 +450,24 @@ public class MethodParameterInfoHandler implements ParameterInfoHandlerWithTabAc final PsiJavaCodeReferenceElement element = annotation.getNameReferenceElement(); if (element != null) { final PsiElement resolved = element.resolve(); - if (resolved instanceof PsiClass && !AnnotationUtil.isAnnotated((PsiClass)resolved, "java.lang.annotation.Documented", false)) continue; + if (resolved instanceof PsiClass && !AnnotationUtil.isAnnotated((PsiClass)resolved, "java.lang.annotation.Documented", false, true)) { + continue; + } String referenceName = element.getReferenceName(); - if (!shownAnnotations.add(referenceName)) continue; - - if (lastSize != buffer.length()) buffer.append(" "); - buffer.append("@").append(referenceName); + if (shownAnnotations.add(referenceName) || isRepeatableAnnotation(resolved)) { + if (lastSize != buffer.length()) buffer.append(" "); + buffer.append("@").append(referenceName); + } } } if (lastSize != buffer.length()) buffer.append(" "); } + private static boolean isRepeatableAnnotation(PsiElement resolved) { + return resolved instanceof PsiClass && !AnnotationUtil.isAnnotated((PsiModifierListOwner)resolved, CommonClassNames.JAVA_LANG_ANNOTATION_REPEATABLE, false, true); + } + @Override public void updateUI(final Object p, @NotNull final ParameterInfoUIContext context) { if (p instanceof CandidateInfo) { diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/FieldFromParameterUtils.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/FieldFromParameterUtils.java index ccec3c3cab07..37fb882e5e66 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/FieldFromParameterUtils.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/FieldFromParameterUtils.java @@ -187,14 +187,14 @@ public final class FieldFromParameterUtils { modifierList.setModifierProperty(PsiModifier.FINAL, isFinal); final NullableNotNullManager manager = NullableNotNullManager.getInstance(project); - final String nullable = manager.getNullable(parameter); - if (nullable != null) { - modifierList.addAfter(factory.createAnnotationFromText("@" + nullable, field), null); + final PsiAnnotation nullable = manager.getNullableAnnotation(parameter, false); + if (nullable != null && !manager.isContainerAnnotation(nullable)) { + modifierList.addAfter(factory.createAnnotationFromText("@" + nullable.getQualifiedName(), field), null); } else if (isFinal) { - final String notNull = manager.getNotNull(parameter); - if (notNull != null) { - modifierList.addAfter(factory.createAnnotationFromText("@" + notNull, field), null); + final PsiAnnotation notNull = manager.getNotNullAnnotation(parameter, false); + if (notNull != null && !manager.isContainerAnnotation(notNull)) { + modifierList.addAfter(factory.createAnnotationFromText("@" + notNull.getQualifiedName(), field), null); } } diff --git a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/CastExpressionPostfixTemplate.java b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/CastExpressionPostfixTemplate.java index 952987a72c19..14059174cc16 100644 --- a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/CastExpressionPostfixTemplate.java +++ b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/CastExpressionPostfixTemplate.java @@ -20,13 +20,17 @@ import com.intellij.openapi.editor.Editor; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; -public class CastExpressionPostfixTemplate extends JavaPostfixTemplateWithChooser { +import static com.intellij.codeInsight.template.postfix.templates.PostfixTemplatesUtils.selectorWithChooser; +import static com.intellij.codeInsight.template.postfix.util.JavaPostfixTemplatesUtils.IS_NON_VOID; +import static com.intellij.codeInsight.template.postfix.util.JavaPostfixTemplatesUtils.JAVA_PSI_INFO; + +public class CastExpressionPostfixTemplate extends PostfixTemplateWithExpressionSelector { public CastExpressionPostfixTemplate() { - super("cast", "((SomeType) expr)"); + super("cast", "((SomeType) expr)", JAVA_PSI_INFO, selectorWithChooser(IS_NON_VOID)); } @Override - protected void doIt(@NotNull final Editor editor, @NotNull final PsiElement expression) { + protected void expandForChooseExpression(@NotNull PsiElement expression, @NotNull Editor editor) { PostfixTemplatesUtils.surround(new JavaWithCastSurrounder(), editor, expression); } }
\ No newline at end of file diff --git a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/IntroduceFieldPostfixTemplate.java b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/IntroduceFieldPostfixTemplate.java index 40da7fd94b88..2bac79d890bd 100644 --- a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/IntroduceFieldPostfixTemplate.java +++ b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/IntroduceFieldPostfixTemplate.java @@ -23,13 +23,17 @@ import com.intellij.psi.util.PsiTreeUtil; import com.intellij.refactoring.introduceField.IntroduceFieldHandler; import org.jetbrains.annotations.NotNull; -public class IntroduceFieldPostfixTemplate extends JavaPostfixTemplateWithChooser { +import static com.intellij.codeInsight.template.postfix.templates.PostfixTemplatesUtils.selectorWithChooser; +import static com.intellij.codeInsight.template.postfix.util.JavaPostfixTemplatesUtils.IS_NON_VOID; +import static com.intellij.codeInsight.template.postfix.util.JavaPostfixTemplatesUtils.JAVA_PSI_INFO; + +public class IntroduceFieldPostfixTemplate extends PostfixTemplateWithExpressionSelector { public IntroduceFieldPostfixTemplate() { - super("field", "myField = expr"); + super("field", "myField = expr", JAVA_PSI_INFO, selectorWithChooser(IS_NON_VOID)); } @Override - protected void doIt(@NotNull Editor editor, @NotNull PsiElement expression) { + protected void expandForChooseExpression(@NotNull PsiElement expression, @NotNull Editor editor) { IntroduceFieldHandler handler = ApplicationManager.getApplication().isUnitTestMode() ? getMockHandler(expression) : new IntroduceFieldHandler(); handler.invoke(expression.getProject(), new PsiElement[]{expression}, null); diff --git a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/IntroduceVariablePostfixTemplate.java b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/IntroduceVariablePostfixTemplate.java index 57c03f9501fa..be2dc23850e7 100644 --- a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/IntroduceVariablePostfixTemplate.java +++ b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/IntroduceVariablePostfixTemplate.java @@ -28,14 +28,18 @@ import com.intellij.refactoring.introduceVariable.IntroduceVariableSettings; import com.intellij.refactoring.ui.TypeSelectorManagerImpl; import org.jetbrains.annotations.NotNull; +import static com.intellij.codeInsight.template.postfix.templates.PostfixTemplatesUtils.selectorWithChooser; +import static com.intellij.codeInsight.template.postfix.util.JavaPostfixTemplatesUtils.IS_NON_VOID; +import static com.intellij.codeInsight.template.postfix.util.JavaPostfixTemplatesUtils.JAVA_PSI_INFO; + // todo: support for int[].var (parses as .class access!) -public class IntroduceVariablePostfixTemplate extends JavaPostfixTemplateWithChooser { +public class IntroduceVariablePostfixTemplate extends PostfixTemplateWithExpressionSelector { public IntroduceVariablePostfixTemplate() { - super("var", "T name = expr"); + super("var", "T name = expr", JAVA_PSI_INFO, selectorWithChooser(IS_NON_VOID)); } @Override - protected void doIt(@NotNull Editor editor, @NotNull PsiElement expression) { + protected void expandForChooseExpression(@NotNull PsiElement expression, @NotNull Editor editor) { // for advanced stuff use ((PsiJavaCodeReferenceElement)expression).advancedResolve(true).getElement(); IntroduceVariableHandler handler = ApplicationManager.getApplication().isUnitTestMode() ? getMockHandler() : new IntroduceVariableHandler(); diff --git a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/JavaPostfixTemplateProvider.java b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/JavaPostfixTemplateProvider.java index 148f4bb187db..629d4dd02115 100644 --- a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/JavaPostfixTemplateProvider.java +++ b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/JavaPostfixTemplateProvider.java @@ -144,6 +144,6 @@ public class JavaPostfixTemplateProvider implements PostfixTemplateProvider { } private static boolean isSemicolonNeeded(@NotNull PsiFile file, @NotNull Editor editor) { - return JavaCompletionContributor.semicolonNeeded(editor, file, CompletionInitializationContext.calcStartOffset(editor)); + return JavaCompletionContributor.semicolonNeeded(editor, file, CompletionInitializationContext.calcStartOffset(editor.getCaretModel().getCurrentCaret())); } } diff --git a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/JavaPostfixTemplateWithChooser.java b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/JavaPostfixTemplateWithChooser.java deleted file mode 100644 index 72de706f4858..000000000000 --- a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/JavaPostfixTemplateWithChooser.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2000-2014 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.intellij.codeInsight.template.postfix.templates; - - -import com.intellij.codeInsight.template.postfix.util.JavaPostfixTemplatesUtils; -import com.intellij.openapi.util.Condition; -import com.intellij.psi.PsiElement; -import org.jetbrains.annotations.NotNull; - -import static com.intellij.codeInsight.template.postfix.util.JavaPostfixTemplatesUtils.JAVA_PSI_INFO; - -public abstract class JavaPostfixTemplateWithChooser extends ExpressionPostfixTemplateWithChooser { - - - protected JavaPostfixTemplateWithChooser(@NotNull String name, @NotNull String example) { - super(name, example, JAVA_PSI_INFO); - } - - protected JavaPostfixTemplateWithChooser(@NotNull String name, @NotNull String key, @NotNull String example) { - super(name, key, example, JAVA_PSI_INFO); - } - - @NotNull - @Override - protected Condition<PsiElement> getTypeCondition() { - return JavaPostfixTemplatesUtils.IS_NON_VOID; - } -} diff --git a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/NotExpressionPostfixTemplate.java b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/NotExpressionPostfixTemplate.java index ac6f22c5092f..6160433cefe3 100644 --- a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/NotExpressionPostfixTemplate.java +++ b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/NotExpressionPostfixTemplate.java @@ -15,26 +15,16 @@ */ package com.intellij.codeInsight.template.postfix.templates; -import com.intellij.codeInsight.template.postfix.util.JavaPostfixTemplatesUtils; -import com.intellij.openapi.util.Condition; -import com.intellij.psi.PsiElement; -import org.jetbrains.annotations.NotNull; - +import static com.intellij.codeInsight.template.postfix.util.JavaPostfixTemplatesUtils.IS_BOOLEAN; import static com.intellij.codeInsight.template.postfix.util.JavaPostfixTemplatesUtils.JAVA_PSI_INFO; public class NotExpressionPostfixTemplate extends NotPostfixTemplate { public NotExpressionPostfixTemplate() { - super(JAVA_PSI_INFO); + super(JAVA_PSI_INFO, IS_BOOLEAN); } public NotExpressionPostfixTemplate(String alias) { - super(alias, alias, "!expr", JAVA_PSI_INFO); - } - - @NotNull - @Override - protected Condition<PsiElement> getTypeCondition() { - return JavaPostfixTemplatesUtils.IS_BOOLEAN; + super(alias, alias, "!expr", JAVA_PSI_INFO, IS_BOOLEAN); } }
\ No newline at end of file diff --git a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/ParenthesizedExpressionPostfixTemplate.java b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/ParenthesizedExpressionPostfixTemplate.java index 68b5c48fcd15..46c0c30b24f5 100644 --- a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/ParenthesizedExpressionPostfixTemplate.java +++ b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/ParenthesizedExpressionPostfixTemplate.java @@ -15,21 +15,11 @@ */ package com.intellij.codeInsight.template.postfix.templates; -import com.intellij.openapi.util.Condition; -import com.intellij.psi.PsiElement; -import org.jetbrains.annotations.NotNull; - import static com.intellij.codeInsight.template.postfix.util.JavaPostfixTemplatesUtils.IS_NON_VOID; import static com.intellij.codeInsight.template.postfix.util.JavaPostfixTemplatesUtils.JAVA_PSI_INFO; public class ParenthesizedExpressionPostfixTemplate extends ParenthesizedPostfixTemplate { public ParenthesizedExpressionPostfixTemplate() { - super(JAVA_PSI_INFO); - } - - @NotNull - @Override - protected Condition<PsiElement> getTypeCondition() { - return IS_NON_VOID; + super(JAVA_PSI_INFO, IS_NON_VOID); } }
\ No newline at end of file diff --git a/java/java-impl/src/com/intellij/codeInsight/template/postfix/util/JavaPostfixTemplatesUtils.java b/java/java-impl/src/com/intellij/codeInsight/template/postfix/util/JavaPostfixTemplatesUtils.java index e217175cdab9..2142c8fd33da 100644 --- a/java/java-impl/src/com/intellij/codeInsight/template/postfix/util/JavaPostfixTemplatesUtils.java +++ b/java/java-impl/src/com/intellij/codeInsight/template/postfix/util/JavaPostfixTemplatesUtils.java @@ -16,7 +16,7 @@ package com.intellij.codeInsight.template.postfix.util; import com.intellij.codeInsight.CodeInsightServicesUtil; -import com.intellij.codeInsight.template.postfix.templates.PostfixTemplatePsiInfoBase; +import com.intellij.codeInsight.template.postfix.templates.PostfixTemplatePsiInfo; import com.intellij.openapi.editor.Document; import com.intellij.openapi.util.Condition; import com.intellij.psi.*; @@ -36,7 +36,7 @@ public abstract class JavaPostfixTemplatesUtils { private JavaPostfixTemplatesUtils() { } - public static final PostfixTemplatePsiInfoBase JAVA_PSI_INFO = new PostfixTemplatePsiInfoBase() { + public static final PostfixTemplatePsiInfo JAVA_PSI_INFO = new PostfixTemplatePsiInfo() { @NotNull @Override @@ -136,7 +136,11 @@ public abstract class JavaPostfixTemplatesUtils { @Contract("null -> false") public static boolean isNotPrimitiveTypeExpression(@Nullable PsiExpression expression) { - return expression != null && !(expression.getType() instanceof PsiPrimitiveType); + if (expression == null) { + return false; + } + PsiType type = expression.getType(); + return type != null && !(type instanceof PsiPrimitiveType); } @Contract("null -> false") diff --git a/java/java-impl/src/com/intellij/codeInspection/ex/GlobalJavaInspectionContextImpl.java b/java/java-impl/src/com/intellij/codeInspection/ex/GlobalJavaInspectionContextImpl.java index aff69ec85da9..b3aed0603150 100644 --- a/java/java-impl/src/com/intellij/codeInspection/ex/GlobalJavaInspectionContextImpl.java +++ b/java/java-impl/src/com/intellij/codeInspection/ex/GlobalJavaInspectionContextImpl.java @@ -194,7 +194,7 @@ public class GlobalJavaInspectionContextImpl extends GlobalJavaInspectionContext final SearchScope searchScope = new GlobalSearchScope(refManager.getProject()) { @Override public boolean contains(@NotNull VirtualFile file) { - return !scope.contains(file) || file.getFileType() != StdFileTypes.JAVA; + return scope != null && !scope.contains(file) || file.getFileType() != StdFileTypes.JAVA; } @Override @@ -394,7 +394,7 @@ public class GlobalJavaInspectionContextImpl extends GlobalJavaInspectionContext @Override public boolean execute(PsiReference reference) { AnalysisScope scope = context.getRefManager().getScope(); - if (scope.contains(reference.getElement()) && reference.getElement().getLanguage() == StdLanguages.JAVA || + if (scope != null && scope.contains(reference.getElement()) && reference.getElement().getLanguage() == StdLanguages.JAVA || PsiTreeUtil.getParentOfType(reference.getElement(), PsiDocComment.class) != null) { return true; } diff --git a/java/java-impl/src/com/intellij/codeInspection/sameParameterValue/SameParameterValueInspection.java b/java/java-impl/src/com/intellij/codeInspection/sameParameterValue/SameParameterValueInspection.java index baab93de8d25..bcfea46a569c 100644 --- a/java/java-impl/src/com/intellij/codeInspection/sameParameterValue/SameParameterValueInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/sameParameterValue/SameParameterValueInspection.java @@ -76,7 +76,7 @@ public class SameParameterValueInspection extends SameParameterValueInspectionBa public void applyFix(@NotNull final Project project, @NotNull ProblemDescriptor descriptor) { final PsiElement element = descriptor.getPsiElement(); final PsiMethod method = PsiTreeUtil.getParentOfType(element, PsiMethod.class); - LOG.assertTrue(method != null); + if (method == null) return; PsiParameter parameter = PsiTreeUtil.getParentOfType(element, PsiParameter.class, false); if (parameter == null) { final PsiParameter[] parameters = method.getParameterList().getParameters(); diff --git a/java/java-impl/src/com/intellij/codeInspection/unusedParameters/UnusedParametersInspection.java b/java/java-impl/src/com/intellij/codeInspection/unusedParameters/UnusedParametersInspection.java index c33d0d68b8cb..bb97f5cd78d5 100644 --- a/java/java-impl/src/com/intellij/codeInspection/unusedParameters/UnusedParametersInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/unusedParameters/UnusedParametersInspection.java @@ -132,7 +132,7 @@ public class UnusedParametersInspection extends GlobalJavaBatchInspectionTool { int idx = refParameter.getIndex(); final boolean[] found = {false}; for (int i = 0; i < derived.length && !found[0]; i++) { - if (!scope.contains(derived[i])) { + if (scope == null || !scope.contains(derived[i])) { final PsiParameter[] parameters = derived[i].getParameterList().getParameters(); if (parameters.length >= idx) continue; PsiParameter psiParameter = parameters[idx]; diff --git a/java/java-impl/src/com/intellij/codeInspection/varScopeCanBeNarrowed/FieldCanBeLocalInspection.java b/java/java-impl/src/com/intellij/codeInspection/varScopeCanBeNarrowed/FieldCanBeLocalInspection.java index 38ee7449994a..51beb4239fc3 100644 --- a/java/java-impl/src/com/intellij/codeInspection/varScopeCanBeNarrowed/FieldCanBeLocalInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/varScopeCanBeNarrowed/FieldCanBeLocalInspection.java @@ -63,7 +63,7 @@ public class FieldCanBeLocalInspection extends FieldCanBeLocalInspectionBase { @Override protected PsiElement moveDeclaration(@NotNull final Project project, @NotNull final PsiField variable) { final Map<PsiCodeBlock, Collection<PsiReference>> refs = new HashMap<PsiCodeBlock, Collection<PsiReference>>(); - groupByCodeBlocks(ReferencesSearch.search(variable).findAll(), refs); + if (!groupByCodeBlocks(ReferencesSearch.search(variable).findAll(), refs)) return null; PsiElement element = null; for (Collection<PsiReference> psiReferences : refs.values()) { element = super.moveDeclaration(project, variable, psiReferences, false); @@ -82,11 +82,14 @@ public class FieldCanBeLocalInspection extends FieldCanBeLocalInspectionBase { return element; } - private static void groupByCodeBlocks(final Collection<PsiReference> allReferences, Map<PsiCodeBlock, Collection<PsiReference>> refs) { + private static boolean groupByCodeBlocks(final Collection<PsiReference> allReferences, Map<PsiCodeBlock, Collection<PsiReference>> refs) { for (PsiReference psiReference : allReferences) { final PsiElement element = psiReference.getElement(); final PsiCodeBlock block = PsiTreeUtil.getTopmostParentOfType(element, PsiCodeBlock.class); - LOG.assertTrue(block != null); + if (block == null) { + return false; + } + Collection<PsiReference> references = refs.get(block); if (references == null) { references = new ArrayList<PsiReference>(); @@ -95,6 +98,7 @@ public class FieldCanBeLocalInspection extends FieldCanBeLocalInspectionBase { } references.add(psiReference); } + return true; } private static boolean findExistentBlock(Map<PsiCodeBlock, Collection<PsiReference>> refs, diff --git a/java/java-impl/src/com/intellij/ide/projectView/impl/PackageViewPane.java b/java/java-impl/src/com/intellij/ide/projectView/impl/PackageViewPane.java index 98f1fbeddfca..73fcc83df646 100644 --- a/java/java-impl/src/com/intellij/ide/projectView/impl/PackageViewPane.java +++ b/java/java-impl/src/com/intellij/ide/projectView/impl/PackageViewPane.java @@ -28,9 +28,7 @@ import com.intellij.ide.SelectInTarget; import com.intellij.ide.impl.PackagesPaneSelectInTarget; import com.intellij.ide.projectView.ProjectView; import com.intellij.ide.projectView.ViewSettings; -import com.intellij.ide.projectView.impl.nodes.PackageElement; -import com.intellij.ide.projectView.impl.nodes.PackageUtil; -import com.intellij.ide.projectView.impl.nodes.PackageViewProjectNode; +import com.intellij.ide.projectView.impl.nodes.*; import com.intellij.ide.util.DeleteHandler; import com.intellij.ide.util.treeView.AbstractTreeBuilder; import com.intellij.ide.util.treeView.AbstractTreeNode; @@ -48,8 +46,8 @@ import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiPackage; import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.psi.util.PsiUtilBase; import com.intellij.psi.util.PsiUtilCore; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -140,14 +138,30 @@ public final class PackageViewPane extends AbstractProjectViewPSIPane { @Override public PsiDirectory[] getSelectedDirectories() { - final PackageElement packageElement = getSelectedPackageElement(); - if (packageElement != null) { - final Module module = packageElement.getModule(); - final PsiPackage aPackage = packageElement.getPackage(); - if (module != null && aPackage != null) { - return aPackage.getDirectories(GlobalSearchScope.moduleScope(module)); + List<PsiDirectory> directories = ContainerUtil.newArrayList(); + for (PackageElementNode node : getSelectedNodes(PackageElementNode.class)) { + PackageElement packageElement = node.getValue(); + PsiPackage aPackage = packageElement != null ? packageElement.getPackage() : null; + final Module module = packageElement != null ? packageElement.getModule() : null; + if (aPackage != null && module != null) { + GlobalSearchScope scope = GlobalSearchScope.moduleScope(module); + Collections.addAll(directories, aPackage.getDirectories(scope)); + + Object parentValue = node.getParent().getValue(); + PsiPackage parentNodePackage = parentValue instanceof PackageElement ? ((PackageElement)parentValue).getPackage() : null; + while (true) { + aPackage = aPackage.getParentPackage(); + if (aPackage == null || aPackage.getQualifiedName().isEmpty() || aPackage.equals(parentNodePackage)) { + break; + } + Collections.addAll(directories, aPackage.getDirectories(scope)); + } } } + if (!directories.isEmpty()) { + return directories.toArray(new PsiDirectory[directories.size()]); + } + return super.getSelectedDirectories(); } diff --git a/java/java-impl/src/com/intellij/ide/util/gotoByName/DefaultClassNavigationContributor.java b/java/java-impl/src/com/intellij/ide/util/gotoByName/DefaultClassNavigationContributor.java index b0cbc06d048e..2f5418631dae 100644 --- a/java/java-impl/src/com/intellij/ide/util/gotoByName/DefaultClassNavigationContributor.java +++ b/java/java-impl/src/com/intellij/ide/util/gotoByName/DefaultClassNavigationContributor.java @@ -19,10 +19,14 @@ import com.intellij.navigation.ChooseByNameContributorEx; import com.intellij.navigation.GotoClassContributor; import com.intellij.navigation.NavigationItem; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiClass; +import com.intellij.psi.codeStyle.MinusculeMatcher; +import com.intellij.psi.codeStyle.NameUtil; import com.intellij.psi.presentation.java.SymbolPresentationUtil; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.PsiShortNamesCache; +import com.intellij.psi.util.ClassUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.CommonProcessors; import com.intellij.util.Processor; @@ -32,6 +36,8 @@ import com.intellij.util.indexing.IdFilter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.regex.Matcher; + public class DefaultClassNavigationContributor implements ChooseByNameContributorEx, GotoClassContributor { @Override @NotNull @@ -74,7 +80,7 @@ public class DefaultClassNavigationContributor implements ChooseByNameContributo @Override public String getQualifiedNameSeparator() { - return "."; + return "$"; } @Override @@ -86,12 +92,28 @@ public class DefaultClassNavigationContributor implements ChooseByNameContributo public void processElementsWithName(@NotNull String name, @NotNull final Processor<NavigationItem> processor, @NotNull final FindSymbolParameters parameters) { + String namePattern = StringUtil.getShortName(parameters.getCompletePattern()); + boolean hasDollar = namePattern.contains("$"); + if (hasDollar) { + Matcher matcher = ChooseByNamePopup.patternToDetectAnonymousClasses.matcher(namePattern); + if (matcher.matches()) { + namePattern = matcher.group(1); + hasDollar = namePattern.contains("$"); + } + } + final MinusculeMatcher innerMatcher = hasDollar ? new MinusculeMatcher("*" + namePattern, NameUtil.MatchingCaseSensitivity.NONE) : null; PsiShortNamesCache.getInstance(parameters.getProject()).processClassesWithName(name, new Processor<PsiClass>() { final boolean isAnnotation = parameters.getLocalPatternName().startsWith("@"); + @Override public boolean process(PsiClass aClass) { if (aClass.getContainingFile().getVirtualFile() == null || !aClass.isPhysical()) return true; if (isAnnotation && !aClass.isAnnotationType()) return true; + if (innerMatcher != null) { + if (aClass.getContainingClass() == null) return true; + String jvmQName = ClassUtil.getJVMClassName(aClass); + if (jvmQName == null || !innerMatcher.matches(StringUtil.getShortName(jvmQName))) return true; + } return processor.process(aClass); } }, parameters.getSearchScope(), parameters.getIdFilter()); diff --git a/java/java-impl/src/com/intellij/openapi/roots/impl/ExcludeCompilerOutputPolicy.java b/java/java-impl/src/com/intellij/openapi/roots/impl/ExcludeCompilerOutputPolicy.java index adbacfcd38ce..c825d8318edc 100644 --- a/java/java-impl/src/com/intellij/openapi/roots/impl/ExcludeCompilerOutputPolicy.java +++ b/java/java-impl/src/com/intellij/openapi/roots/impl/ExcludeCompilerOutputPolicy.java @@ -15,16 +15,12 @@ */ package com.intellij.openapi.roots.impl; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.CompilerModuleExtension; import com.intellij.openapi.roots.CompilerProjectExtension; import com.intellij.openapi.roots.ModuleRootModel; -import com.intellij.openapi.util.Comparing; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.pointers.VirtualFilePointer; -import com.intellij.openapi.util.io.FileUtil; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; @@ -40,26 +36,6 @@ public class ExcludeCompilerOutputPolicy implements DirectoryIndexExcludePolicy myProject = project; } - @Override - public boolean isExcludeRoot(final VirtualFile file) { - CompilerProjectExtension compilerProjectExtension = CompilerProjectExtension.getInstance(myProject); - if (isEqualWithFileOrUrl(file, compilerProjectExtension.getCompilerOutput(), compilerProjectExtension.getCompilerOutputUrl())) return true; - - for (Module m : ModuleManager.getInstance(myProject).getModules()) { - CompilerModuleExtension rm = CompilerModuleExtension.getInstance(m); - if (isEqualWithFileOrUrl(file, rm.getCompilerOutputPath(), rm.getCompilerOutputUrl())) return true; - if (isEqualWithFileOrUrl(file, rm.getCompilerOutputPathForTests(), rm.getCompilerOutputUrlForTests())) return true; - } - return false; - } - - @Override - public boolean isExcludeRootForModule(@NotNull final Module module, final VirtualFile excludeRoot) { - final CompilerModuleExtension compilerModuleExtension = CompilerModuleExtension.getInstance(module); - return Comparing.equal(compilerModuleExtension.getCompilerOutputPath(), excludeRoot) || - Comparing.equal(compilerModuleExtension.getCompilerOutputPathForTests(), excludeRoot); - } - @NotNull @Override public VirtualFile[] getExcludeRootsForProject() { @@ -88,14 +64,4 @@ public class ExcludeCompilerOutputPolicy implements DirectoryIndexExcludePolicy } return result.isEmpty() ? VirtualFilePointer.EMPTY_ARRAY : result.toArray(new VirtualFilePointer[result.size()]); } - - private static boolean isEqualWithFileOrUrl(VirtualFile file, VirtualFile fileToCompareWith, String url) { - if (fileToCompareWith != null) { - if (Comparing.equal(fileToCompareWith, file)) return true; - } - else if (url != null) { - if (FileUtil.pathsEqual(url, file.getUrl())) return true; - } - return false; - } } diff --git a/java/java-impl/src/com/intellij/psi/codeStyle/arrangement/JavaArrangementVisitor.java b/java/java-impl/src/com/intellij/psi/codeStyle/arrangement/JavaArrangementVisitor.java index 3651fa1afe3a..ff1170b64bef 100644 --- a/java/java-impl/src/com/intellij/psi/codeStyle/arrangement/JavaArrangementVisitor.java +++ b/java/java-impl/src/com/intellij/psi/codeStyle/arrangement/JavaArrangementVisitor.java @@ -280,6 +280,7 @@ public class JavaArrangementVisitor extends JavaRecursiveElementVisitor { if (ref instanceof PsiField && containingClassFields.contains(ref)) { referencedElements.add((PsiField)ref); } + super.visitReferenceExpression(expression); } }); diff --git a/java/java-impl/src/com/intellij/psi/impl/search/JspIndexPatternBuilder.java b/java/java-impl/src/com/intellij/psi/impl/search/JspIndexPatternBuilder.java index a8316f8dc0ee..eaa93875ba15 100644 --- a/java/java-impl/src/com/intellij/psi/impl/search/JspIndexPatternBuilder.java +++ b/java/java-impl/src/com/intellij/psi/impl/search/JspIndexPatternBuilder.java @@ -18,6 +18,7 @@ package com.intellij.psi.impl.search; import com.intellij.lang.LanguageParserDefinitions; import com.intellij.lang.ParserDefinition; import com.intellij.lexer.Lexer; +import com.intellij.openapi.editor.impl.EditorHighlighterCache; import com.intellij.psi.JspPsiUtil; import com.intellij.psi.PsiFile; import com.intellij.psi.impl.source.tree.StdTokenSets; @@ -34,7 +35,7 @@ public class JspIndexPatternBuilder implements IndexPatternBuilder { @Override public Lexer getIndexingLexer(@NotNull final PsiFile file) { if (JspPsiUtil.isInJspFile(file)) { - return LexerEditorHighlighterLexer.getLexerBasedOnLexerHighlighter(file.getText(), file.getVirtualFile(), file.getProject()); + return EditorHighlighterCache.getLexerBasedOnLexerHighlighter(file.getText(), file.getVirtualFile(), file.getProject()); } return null; diff --git a/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/FilePathReferenceProvider.java b/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/FilePathReferenceProvider.java index 827a3d128a24..5380043307c7 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/FilePathReferenceProvider.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/FilePathReferenceProvider.java @@ -142,9 +142,7 @@ public class FilePathReferenceProvider extends PsiReferenceProvider { @NotNull public static Collection<PsiFileSystemItem> getRoots(final Module thisModule, boolean includingClasses) { if (thisModule == null) return Collections.emptyList(); - Set<Module> modules = new com.intellij.util.containers.HashSet<Module>(); ModuleRootManager moduleRootManager = ModuleRootManager.getInstance(thisModule); - ModuleUtilCore.getDependencies(thisModule, modules); List<PsiFileSystemItem> result = new ArrayList<PsiFileSystemItem>(); final PsiManager psiManager = PsiManager.getInstance(thisModule.getProject()); if (includingClasses) { diff --git a/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/MethodPropertyReference.java b/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/MethodPropertyReference.java index f7dc89ce5b80..307d608ddbd8 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/MethodPropertyReference.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/MethodPropertyReference.java @@ -16,7 +16,6 @@ package com.intellij.psi.impl.source.resolve.reference.impl.providers; import com.intellij.psi.*; -import com.intellij.psi.jsp.JspImplicitVariable; import com.intellij.psi.jsp.JspSpiUtil; import com.intellij.psi.util.PropertyUtil; import com.intellij.psi.xml.XmlAttribute; @@ -62,8 +61,8 @@ public class MethodPropertyReference extends BasicAttributeValueReference { } } else if (psiElement instanceof PsiClass) { return (PsiClass)psiElement; - } else if (psiElement instanceof JspImplicitVariable) { - final PsiType type=((JspImplicitVariable)psiElement).getType(); + } else if (psiElement instanceof PsiVariable) { + final PsiType type=((PsiVariable)psiElement).getType(); if (type instanceof PsiClassType) { return ((PsiClassType)type).resolve(); } diff --git a/java/java-impl/src/com/intellij/refactoring/anonymousToInner/AnonymousToInnerDialog.java b/java/java-impl/src/com/intellij/refactoring/anonymousToInner/AnonymousToInnerDialog.java index 7bca3c07b4c0..80201559ef34 100644 --- a/java/java-impl/src/com/intellij/refactoring/anonymousToInner/AnonymousToInnerDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/anonymousToInner/AnonymousToInnerDialog.java @@ -86,20 +86,23 @@ class AnonymousToInnerDialog extends DialogWrapper{ final String[] names; String name = myAnonClass.getBaseClassReference().getReferenceName(); PsiType[] typeParameters = myAnonClass.getBaseClassReference().getTypeParameters(); - if (typeParameters.length > 0) { - names = new String[]{StringUtil.join(typeParameters, new Function<PsiType, String>() { - public String fun(PsiType psiType) { - PsiType type = psiType; - if (psiType instanceof PsiClassType) { - type = TypeConversionUtil.erasure(psiType); - } - if (type == null || type.equalsToText(CommonClassNames.JAVA_LANG_OBJECT)) return ""; - if (type instanceof PsiArrayType) { - type = type.getDeepComponentType(); - } - return StringUtil.getShortName(type.getPresentableText()); + + final String typeParamsList = StringUtil.join(typeParameters, new Function<PsiType, String>() { + public String fun(PsiType psiType) { + PsiType type = psiType; + if (psiType instanceof PsiClassType) { + type = TypeConversionUtil.erasure(psiType); } - }, "") + name, "My" + name}; + if (type == null || type.equalsToText(CommonClassNames.JAVA_LANG_OBJECT)) return ""; + if (type instanceof PsiArrayType) { + type = type.getDeepComponentType(); + } + return StringUtil.getShortName(type.getPresentableText()); + } + }, "") + name; + + if (!typeParamsList.equals(name)) { + names = new String[]{typeParamsList, "My" + name}; } else { names = new String[]{"My" + name}; } diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java index 75544f9d8ab9..ce52274140bb 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java @@ -19,6 +19,7 @@ import com.intellij.codeInsight.ChangeContextUtil; import com.intellij.codeInsight.ExceptionUtil; import com.intellij.codeInsight.NullableNotNullManager; import com.intellij.codeInsight.daemon.impl.analysis.JavaHighlightUtil; +import com.intellij.codeInsight.daemon.impl.quickfix.AnonymousTargetClassPreselectionUtil; import com.intellij.codeInsight.highlighting.HighlightManager; import com.intellij.codeInsight.intention.impl.AddNullableAnnotationFix; import com.intellij.codeInsight.navigation.NavigationUtil; @@ -1133,6 +1134,7 @@ public class ExtractMethodProcessor implements MatchProvider { final PsiElementProcessor<PsiClass> processor = new PsiElementProcessor<PsiClass>() { @Override public boolean execute(@NotNull PsiClass selectedClass) { + AnonymousTargetClassPreselectionUtil.rememberSelection(selectedClass, myTargetClass); final List<PsiVariable> array = classes.get(selectedClass); myNeedChangeContext = myTargetClass != selectedClass; myTargetClass = selectedClass; @@ -1184,7 +1186,9 @@ public class ExtractMethodProcessor implements MatchProvider { if (classes.size() > 1) { final PsiClass[] psiClasses = classes.keySet().toArray(new PsiClass[classes.size()]); - NavigationUtil.getPsiElementPopup(psiClasses, new PsiClassListCellRenderer(), "Choose Destination Class", processor).showInBestPositionFor(myEditor); + final PsiClass preselection = AnonymousTargetClassPreselectionUtil.getPreselection(classes.keySet(), psiClasses[0]); + NavigationUtil.getPsiElementPopup(psiClasses, new PsiClassListCellRenderer(), "Choose Destination Class", processor, preselection) + .showInBestPositionFor(myEditor); return true; } } diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java b/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java index a751acea42df..75473959ddcc 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/BaseExpressionToFieldHandler.java @@ -27,6 +27,7 @@ package com.intellij.refactoring.introduceField; import com.intellij.codeInsight.AnnotationUtil; import com.intellij.codeInsight.ChangeContextUtil; import com.intellij.codeInsight.TestFrameworks; +import com.intellij.codeInsight.daemon.impl.quickfix.AnonymousTargetClassPreselectionUtil; import com.intellij.codeInsight.highlighting.HighlightManager; import com.intellij.codeInsight.lookup.LookupManager; import com.intellij.codeInsight.navigation.NavigationUtil; @@ -129,18 +130,13 @@ public abstract class BaseExpressionToFieldHandler extends IntroduceHandlerBase return !convertExpressionToField(selectedExpr, editor, file, project, tempType); } else { - PsiClass selection = null; - for (PsiClass psiClass : classes) { - if (!(psiClass instanceof PsiAnonymousClass)) { - selection = psiClass; - break; - } - } + PsiClass selection = AnonymousTargetClassPreselectionUtil.getPreselection(classes, myParentClass); NavigationUtil.getPsiElementPopup(classes.toArray(new PsiClass[classes.size()]), new PsiClassListCellRenderer(), "Choose class to introduce " + (myIsConstant ? "constant" : "field"), new PsiElementProcessor<PsiClass>() { @Override public boolean execute(@NotNull PsiClass aClass) { + AnonymousTargetClassPreselectionUtil.rememberSelection(aClass, myParentClass); myParentClass = aClass; convertExpressionToField(selectedExpr, editor, file, project, tempType); return false; diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/LocalToFieldHandler.java b/java/java-impl/src/com/intellij/refactoring/introduceField/LocalToFieldHandler.java index 5b5c39fb10a8..0b31eedf8be0 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/LocalToFieldHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/LocalToFieldHandler.java @@ -18,6 +18,7 @@ package com.intellij.refactoring.introduceField; import com.intellij.codeInsight.ChangeContextUtil; import com.intellij.codeInsight.CodeInsightUtil; import com.intellij.codeInsight.TestFrameworks; +import com.intellij.codeInsight.daemon.impl.quickfix.AnonymousTargetClassPreselectionUtil; import com.intellij.codeInsight.navigation.NavigationUtil; import com.intellij.ide.util.PsiClassListCellRenderer; import com.intellij.openapi.application.ApplicationManager; @@ -66,7 +67,7 @@ public abstract class LocalToFieldHandler { public boolean convertLocalToField(final PsiLocalVariable local, final Editor editor) { boolean tempIsStatic = myIsConstant; PsiElement parent = local.getParent(); - List<PsiClass> classes = new ArrayList<PsiClass>(); + final List<PsiClass> classes = new ArrayList<PsiClass>(); while (parent != null && parent.getContainingFile() != null) { if (parent instanceof PsiClass && !(myIsConstant && parent instanceof PsiAnonymousClass)) { classes.add((PsiClass)parent); @@ -90,13 +91,16 @@ public abstract class LocalToFieldHandler { if (convertLocalToField(local, classes.get(getChosenClassIndex(classes)), editor, tempIsStatic)) return false; } else { final boolean isStatic = tempIsStatic; + final PsiClass firstClass = classes.get(0); + final PsiClass preselection = AnonymousTargetClassPreselectionUtil.getPreselection(classes, firstClass); NavigationUtil.getPsiElementPopup(classes.toArray(new PsiClass[classes.size()]), new PsiClassListCellRenderer(), "Choose class to introduce " + (myIsConstant ? "constant" : "field"), new PsiElementProcessor<PsiClass>() { @Override public boolean execute(@NotNull PsiClass aClass) { + AnonymousTargetClassPreselectionUtil.rememberSelection(aClass, aClass); convertLocalToField(local, aClass, editor, isStatic); return false; } - }).showInBestPositionFor(editor); + }, preselection).showInBestPositionFor(editor); } return true; diff --git a/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaMethodProcessor.java index c410d763dac1..f09da834c348 100644 --- a/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaMethodProcessor.java @@ -210,10 +210,16 @@ public class RenameJavaMethodProcessor extends RenameJavaMemberProcessor { if (element instanceof PsiReferenceExpression) { if (((PsiReferenceExpression)element).resolve() == methodToRename) { final PsiElement parent = element.getParent(); - LOG.assertTrue(parent instanceof PsiMethodCallExpression, parent.getText()); - final PsiMethodCallExpression copy = (PsiMethodCallExpression)JavaPsiFacade.getElementFactory(element.getProject()) - .createExpressionFromText(parent.getText(), element); - final PsiReferenceExpression expression = (PsiReferenceExpression)processRef(copy.getMethodExpression(), newName); + final PsiReferenceExpression copyRef; + if (parent instanceof PsiMethodCallExpression) { + final PsiMethodCallExpression copy = (PsiMethodCallExpression)JavaPsiFacade.getElementFactory(element.getProject()) + .createExpressionFromText(parent.getText(), element); + copyRef = copy.getMethodExpression(); + } else { + LOG.assertTrue(element instanceof PsiMethodReferenceExpression, element.getText()); + copyRef = (PsiReferenceExpression)element.copy(); + } + final PsiReferenceExpression expression = (PsiReferenceExpression)processRef(copyRef, newName); if (expression == null) continue; final JavaResolveResult resolveResult = expression.advancedResolve(true); final PsiMember resolveResultElement = (PsiMember)resolveResult.getElement(); diff --git a/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java b/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java index f2ac34e8aed0..ca01331d3e94 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java @@ -617,7 +617,7 @@ public class RefactoringUtil { Project project = expr.getProject(); String[] suggestedNames = JavaCodeStyleManager.getInstance(project).suggestVariableName(VariableKind.LOCAL_VARIABLE, null, expr, null).names; - final String prefix = suggestedNames[0]; + final String prefix = suggestedNames.length > 0 ? suggestedNames[0] : "var"; final String id = JavaCodeStyleManager.getInstance(project).suggestUniqueVariableName(prefix, context, true); PsiElementFactory factory = JavaPsiFacade.getInstance(expr.getProject()).getElementFactory(); diff --git a/java/java-impl/src/com/intellij/testIntegration/createTest/MissedTestsDialog.java b/java/java-impl/src/com/intellij/testIntegration/createTest/MissedTestsDialog.java index b34d28e3f6f4..ee8bcf0d1c1c 100644 --- a/java/java-impl/src/com/intellij/testIntegration/createTest/MissedTestsDialog.java +++ b/java/java-impl/src/com/intellij/testIntegration/createTest/MissedTestsDialog.java @@ -20,19 +20,15 @@ import com.intellij.codeInsight.template.Template; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.psi.JavaPsiFacade; -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiMember; -import com.intellij.psi.PsiMethod; -import com.intellij.refactoring.ui.MemberSelectionPanel; +import com.intellij.psi.*; import com.intellij.refactoring.ui.MemberSelectionTable; import com.intellij.refactoring.util.classMembers.MemberInfo; import com.intellij.testIntegration.TestFramework; import com.intellij.testIntegration.TestIntegrationUtils; import com.intellij.ui.ScrollPaneFactory; -import com.intellij.ui.SeparatorFactory; import com.intellij.ui.components.JBCheckBox; import com.intellij.util.Function; +import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.Nullable; @@ -40,8 +36,10 @@ import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.util.*; +import java.util.Collection; +import java.util.HashSet; import java.util.List; +import java.util.Set; public class MissedTestsDialog extends DialogWrapper { private final PsiClass mySourceClass; @@ -85,9 +83,7 @@ public class MissedTestsDialog extends DialogWrapper { private void disableMethodsWithTests(List<MemberInfo> info) { final Set<String> existingNames = new HashSet<String>(); - final Template template = TestIntegrationUtils - .createTestMethodTemplate(TestIntegrationUtils.MethodKind.TEST, myDescriptor, myTestClass, null, true, existingNames); - final String prefix = JavaPsiFacade.getElementFactory(myTestClass.getProject()).createMethodFromText(template.getTemplateText(), myTestClass).getName(); + final String prefix = getTestPrefix(existingNames); existingNames.addAll(ContainerUtil.map(myTestClass.getMethods(), new Function<PsiMethod, String>() { @Override @@ -103,6 +99,16 @@ public class MissedTestsDialog extends DialogWrapper { } } + private String getTestPrefix(Set<String> existingNames) { + final Template template = TestIntegrationUtils.createTestMethodTemplate(TestIntegrationUtils.MethodKind.TEST, myDescriptor, myTestClass, null, true, existingNames); + try { + return JavaPsiFacade.getElementFactory(myTestClass.getProject()).createMethodFromText(template.getTemplateText(), myTestClass).getName(); + } + catch (IncorrectOperationException e) { + return ""; + } + } + private void updateMethodsTable() { List<MemberInfo> infos = TestIntegrationUtils.extractClassMethods(mySourceClass, myIncludeInheritedCb.isSelected()); diff --git a/java/java-impl/src/com/intellij/usages/impl/rules/JavaUsageTypeProvider.java b/java/java-impl/src/com/intellij/usages/impl/rules/JavaUsageTypeProvider.java index 445a8aab14a2..93b9737bdfe3 100644 --- a/java/java-impl/src/com/intellij/usages/impl/rules/JavaUsageTypeProvider.java +++ b/java/java-impl/src/com/intellij/usages/impl/rules/JavaUsageTypeProvider.java @@ -70,7 +70,8 @@ public class JavaUsageTypeProvider implements UsageTypeProviderEx { return UsageType.RECURSION; } if (qualifier != null && !(qualifier instanceof PsiThisExpression) && calledMethod != null) { - if (haveCommonSuperMethod(containerMethod, calledMethod)) { + if (Comparing.equal(containerMethod.getName(), calledMethod.getName()) && + haveCommonSuperMethod(containerMethod, calledMethod)) { boolean parametersDelegated = parametersDelegated(containerMethod, callExpression); if (qualifier instanceof PsiSuperExpression) { |