diff options
Diffstat (limited to 'java/java-impl/src/com/intellij/codeInsight')
13 files changed, 151 insertions, 38 deletions
diff --git a/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java b/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java index 08a071231410..0bf1c1cd7218 100644 --- a/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java +++ b/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java @@ -31,7 +31,10 @@ import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.PsiShortNamesCache; import com.intellij.psi.search.searches.DeepestSuperMethodsSearch; import com.intellij.psi.tree.IElementType; -import com.intellij.psi.util.*; +import com.intellij.psi.util.PropertyUtil; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.PsiUtil; +import com.intellij.psi.util.TypeConversionUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.NullableFunction; import com.intellij.util.Processor; @@ -126,10 +129,6 @@ public class ExpectedTypesProvider { final boolean voidable, boolean usedAfter) { if (expr == null) return ExpectedTypeInfo.EMPTY_ARRAY; PsiElement parent = expr.getParent(); - while (parent instanceof PsiParenthesizedExpression) { - expr = (PsiExpression)parent; - parent = parent.getParent(); - } MyParentVisitor visitor = new MyParentVisitor(expr, forCompletion, classProvider, voidable, usedAfter); if (parent != null) { parent.accept(visitor); @@ -243,6 +242,25 @@ public class ExpectedTypesProvider { } @Override + public void visitParenthesizedExpression(PsiParenthesizedExpression expression) { + PsiElement parent = expression.getParent(); + if (parent != null) { + final MyParentVisitor visitor = new MyParentVisitor(expression, myForCompletion, myClassProvider, myVoidable, myUsedAfter); + parent.accept(visitor); + for (final ExpectedTypeInfo info : visitor.myResult) { + myResult.add(createInfoImpl(info.getType(), info.getKind(), info.getDefaultType(), TailTypes.RPARENTH, info.getCalledMethod(), + new NullableComputable<String>() { + @Nullable + @Override + public String compute() { + return ((ExpectedTypeInfoImpl)info).getExpectedName(); + } + })); + } + } + } + + @Override public void visitAnnotationMethod(@NotNull final PsiAnnotationMethod method) { if (myExpr == method.getDefaultValue()) { final PsiType type = method.getReturnType(); diff --git a/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsLineMarkerProvider.java b/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsLineMarkerProvider.java index e373207222ea..8605a8f91a83 100644 --- a/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsLineMarkerProvider.java +++ b/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsLineMarkerProvider.java @@ -51,14 +51,14 @@ public class ExternalAnnotationsLineMarkerProvider implements LineMarkerProvider if (!(element instanceof PsiModifierListOwner)) return null; if (element instanceof PsiParameter || element instanceof PsiLocalVariable) return null; - if (!shouldShowSignature(preferCompiledElement((PsiModifierListOwner)element))) { + if (!shouldShowSignature((PsiModifierListOwner)element)) { return null; } final Function<PsiModifierListOwner, String> annotationsCollector = new Function<PsiModifierListOwner, String>() { @Override public String fun(PsiModifierListOwner owner) { - return XmlStringUtil.wrapInHtml(JavaDocInfoGenerator.generateSignature(preferCompiledElement(owner))); + return XmlStringUtil.wrapInHtml(JavaDocInfoGenerator.generateSignature(owner)); } }; return new LineMarkerInfo<PsiModifierListOwner>((PsiModifierListOwner)element, element.getTextOffset(), AllIcons.Gutter.ExtAnnotation, @@ -67,11 +67,6 @@ public class ExternalAnnotationsLineMarkerProvider implements LineMarkerProvider GutterIconRenderer.Alignment.LEFT); } - private static PsiModifierListOwner preferCompiledElement(PsiModifierListOwner element) { - PsiElement original = element.getOriginalElement(); - return original instanceof PsiModifierListOwner ? (PsiModifierListOwner)original : element; - } - private static boolean shouldShowSignature(PsiModifierListOwner owner) { if (hasNonCodeAnnotations(owner)) { return true; @@ -111,7 +106,7 @@ public class ExternalAnnotationsLineMarkerProvider implements LineMarkerProvider if (ref == null) return true; PsiElement target = ref.resolve(); - return !(target instanceof PsiClass) || JavaDocInfoGenerator.isDocumentedAnnotationType((PsiClass)target); + return !(target instanceof PsiClass) || JavaDocInfoGenerator.isDocumentedAnnotationType(target); } @Override diff --git a/java/java-impl/src/com/intellij/codeInsight/TailTypes.java b/java/java-impl/src/com/intellij/codeInsight/TailTypes.java index 923dd8213019..244067bd3f36 100644 --- a/java/java-impl/src/com/intellij/codeInsight/TailTypes.java +++ b/java/java-impl/src/com/intellij/codeInsight/TailTypes.java @@ -28,6 +28,12 @@ public class TailTypes { return styleSettings.SPACE_WITHIN_METHOD_CALL_PARENTHESES && editor.getDocument().getCharsSequence().charAt(tailOffset - 1) != '('; } }; + public static final TailType RPARENTH = new RParenthTailType(){ + @Override + protected boolean isSpaceWithinParentheses(final CommonCodeStyleSettings styleSettings, final Editor editor, final int tailOffset) { + return styleSettings.SPACE_WITHIN_PARENTHESES; + } + }; public static final TailType IF_RPARENTH = new RParenthTailType(){ @Override protected boolean isSpaceWithinParentheses(final CommonCodeStyleSettings styleSettings, final Editor editor, final int tailOffset) { diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java index 8cc9d06aed04..112b243e0ea3 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java @@ -544,7 +544,7 @@ public class JavaCompletionUtil { return JavaClassNameCompletionContributor.createClassLookupItems((PsiClass)completion, JavaClassNameCompletionContributor.AFTER_NEW.accepts(reference), JavaClassNameInsertHandler.JAVA_CLASS_INSERT_HANDLER, - Condition.TRUE); + Conditions.<PsiClass>alwaysTrue()); } } diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaDocCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaDocCompletionContributor.java index 2a9fc2f4a79f..978e5b24d2e8 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaDocCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaDocCompletionContributor.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * 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. @@ -28,7 +28,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.*; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; -import com.intellij.openapi.util.Condition; +import com.intellij.openapi.util.Conditions; import com.intellij.openapi.util.text.StringUtil; import com.intellij.patterns.PsiJavaPatterns; import com.intellij.profile.codeInspection.InspectionProjectProfileManager; @@ -43,7 +43,10 @@ import com.intellij.psi.javadoc.*; import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.TypeConversionUtil; -import com.intellij.util.*; +import com.intellij.util.IncorrectOperationException; +import com.intellij.util.ProcessingContext; +import com.intellij.util.Processor; +import com.intellij.util.SystemProperties; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.text.CharArrayUtil; import org.jetbrains.annotations.NonNls; @@ -81,7 +84,7 @@ public class JavaDocCompletionContributor extends CompletionContributor { if (ref instanceof PsiJavaReference) { result.stopHere(); - final JavaCompletionProcessor processor = new JavaCompletionProcessor(position, TrueFilter.INSTANCE, JavaCompletionProcessor.Options.CHECK_NOTHING, Condition.TRUE); + final JavaCompletionProcessor processor = new JavaCompletionProcessor(position, TrueFilter.INSTANCE, JavaCompletionProcessor.Options.CHECK_NOTHING, Conditions.<String>alwaysTrue()); ((PsiJavaReference) ref).processVariants(processor); for (final CompletionElement _item : processor.getResults()) { 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 ad53d9484959..cc67ca51de58 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/PreferByKindWeigher.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/PreferByKindWeigher.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * 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. @@ -20,6 +20,7 @@ import com.intellij.codeInsight.completion.scope.JavaCompletionProcessor; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupElementWeigher; import com.intellij.openapi.util.Condition; +import com.intellij.openapi.util.Conditions; import com.intellij.patterns.ElementPattern; import com.intellij.psi.*; import com.intellij.psi.filters.getters.MembersGetter; @@ -127,8 +128,7 @@ public class PreferByKindWeigher extends LookupElementWeigher { }; } - //noinspection unchecked - return Condition.FALSE; + return Conditions.alwaysFalse(); } enum MyResult { diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ChangeMethodSignatureFromUsageFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ChangeMethodSignatureFromUsageFix.java index dbf454207cca..d753875208c3 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ChangeMethodSignatureFromUsageFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ChangeMethodSignatureFromUsageFix.java @@ -333,6 +333,9 @@ public class ChangeMethodSignatureFromUsageFix implements IntentionAction/*, Hig else { PsiType exprType = RefactoringUtil.getTypeByExpression(expression); if (exprType == null) return null; + if (exprType instanceof PsiDisjunctionType) { + exprType = ((PsiDisjunctionType)exprType).getLeastUpperBound(); + } final ParameterInfoImpl changedParameterInfo = new ParameterInfoImpl(i, parameter.getName(), exprType); result.add(changedParameterInfo); changedParams.add(changedParameterInfo); @@ -403,6 +406,9 @@ public class ChangeMethodSignatureFromUsageFix implements IntentionAction/*, Hig if (varargParam != null && pi >= parameters.length) return false; PsiType exprType = RefactoringUtil.getTypeByExpression(expression); if (exprType == null) return false; + if (exprType instanceof PsiDisjunctionType) { + exprType = ((PsiDisjunctionType)exprType).getLeastUpperBound(); + } JavaCodeStyleManager codeStyleManager = JavaCodeStyleManager.getInstance(expression.getProject()); String name = suggestUniqueParameterName(codeStyleManager, expression, exprType, existingNames); final ParameterInfoImpl newParameterInfo = new ParameterInfoImpl(-1, name, exprType, expression.getText().replace('\n', ' ')); diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateMethodFromUsageFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateMethodFromUsageFix.java index 8e93a6a0c817..ad3d3fc8010a 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateMethodFromUsageFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateMethodFromUsageFix.java @@ -182,7 +182,7 @@ public class CreateMethodFromUsageFix extends CreateFromUsageBaseFix { context); } - protected static PsiMethod createMethod(PsiClass targetClass, + public static PsiMethod createMethod(PsiClass targetClass, PsiClass parentClass, PsiMember enclosingContext, String methodName) { diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateStaticMethodQuickFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateStaticMethodQuickFix.java new file mode 100644 index 000000000000..8268ee58d44a --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateStaticMethodQuickFix.java @@ -0,0 +1,81 @@ +package com.intellij.codeInsight.daemon.impl.quickfix; + +import com.intellij.codeInsight.ExpectedTypeInfo; +import com.intellij.codeInsight.daemon.QuickFixBundle; +import com.intellij.codeInspection.LocalQuickFix; +import com.intellij.codeInspection.ProblemDescriptor; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Pair; +import com.intellij.psi.*; +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.util.PsiUtil; +import com.intellij.util.Function; +import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class CreateStaticMethodQuickFix implements LocalQuickFix { + @NotNull + private final PsiClass targetClass; + @NotNull + private final String methodName; + @NotNull + private final List<String> types; + + + public CreateStaticMethodQuickFix(@NotNull PsiClass aClass, + @NotNull String name, + @NotNull List<String> types) { + targetClass = aClass; + methodName = name; + this.types = types; + } + + + @NotNull + @Override + public String getName() { + return QuickFixBundle.message("create.method.from.usage.family"); + } + + @NotNull + @Override + public String getFamilyName() { + return QuickFixBundle.message("create.method.from.usage.family"); + } + + @Override + public void applyFix(@NotNull final Project project, @NotNull ProblemDescriptor descriptor) { + boolean java8Interface = false; + if (targetClass.isInterface()) { + if (PsiUtil.isLanguageLevel8OrHigher(targetClass)) { + java8Interface = true; + } else { + return; + } + } + + PsiMethod method = CreateMethodFromUsageFix.createMethod(targetClass, null, null, methodName); + if (method == null) { + return; + } + + if (!java8Interface) { + PsiUtil.setModifierProperty(method, PsiModifier.PUBLIC, true); + } + PsiUtil.setModifierProperty(method, PsiModifier.STATIC, true); + + List<Pair<PsiExpression,PsiType>> args = ContainerUtil.map(types, new Function<String, Pair<PsiExpression, PsiType>>() { + @Override + public Pair<PsiExpression, PsiType> fun(String s) { + return new Pair<PsiExpression, PsiType>(null, PsiType.getTypeByName(s, project, GlobalSearchScope.allScope(project))); + } + }); + CreateMethodFromUsageFix.doCreate(targetClass, method, false, + args, + PsiSubstitutor.UNKNOWN, + ExpectedTypeInfo.EMPTY_ARRAY, + null); + } +} diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/MoveClassToModuleFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/MoveClassToModuleFix.java index d8caac1d59a6..9c1d38853b2c 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/MoveClassToModuleFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/MoveClassToModuleFix.java @@ -42,12 +42,12 @@ import com.intellij.refactoring.RefactoringActionHandler; import com.intellij.refactoring.RefactoringActionHandlerFactory; import com.intellij.ui.components.JBList; import com.intellij.util.IncorrectOperationException; -import org.codehaus.groovy.util.ListHashMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -55,7 +55,7 @@ import java.util.Map; * @author cdr */ public class MoveClassToModuleFix implements IntentionAction { - private final Map<PsiClass, Module> myModules = new ListHashMap<PsiClass, Module>(); + private final Map<PsiClass, Module> myModules = new LinkedHashMap<PsiClass, Module>(); private final String myReferenceName; private final Module myCurrentModule; private final PsiDirectory mySourceRoot; diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/surroundWith/JavaWithTryFinallySurrounder.java b/java/java-impl/src/com/intellij/codeInsight/generation/surroundWith/JavaWithTryFinallySurrounder.java index e757ddeacc17..28732a65390b 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/surroundWith/JavaWithTryFinallySurrounder.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/surroundWith/JavaWithTryFinallySurrounder.java @@ -19,10 +19,8 @@ import com.intellij.codeInsight.CodeInsightBundle; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.editor.EditorModificationUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.TextRange; -import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.util.IncorrectOperationException; @@ -65,16 +63,14 @@ class JavaWithTryFinallySurrounder extends JavaStatementsSurrounder{ if (finallyBlock == null) { return null; } - int offset = finallyBlock.getTextRange().getStartOffset() + 2; - editor.getCaretModel().moveToOffset(offset); - final Document document = editor.getDocument(); + Document document = editor.getDocument(); PsiDocumentManager.getInstance(project).doPostponedOperationsAndUnblockDocument(document); + TextRange finallyBlockRange = finallyBlock.getTextRange(); + int newLineOffset = finallyBlockRange.getStartOffset() + 2; + editor.getCaretModel().moveToOffset(newLineOffset); editor.getSelectionModel().removeSelection(); - final PsiStatement[] tryBlockStatements = tryBlock.getStatements(); - LOG.assertTrue(tryBlockStatements.length > 0, tryBlock.getText()); - final PsiStatement firstTryStmt = tryBlockStatements[0]; - final int indent = firstTryStmt.getTextOffset() - document.getLineStartOffset(document.getLineNumber(firstTryStmt.getTextOffset())); - EditorModificationUtil.insertStringAtCaret(editor, StringUtil.repeat(" ", indent), false, true); + CodeStyleManager.getInstance(project).adjustLineIndent(document, newLineOffset); + PsiDocumentManager.getInstance(project).commitDocument(document); return new TextRange(editor.getCaretModel().getOffset(), editor.getCaretModel().getOffset()); } }
\ No newline at end of file diff --git a/java/java-impl/src/com/intellij/codeInsight/highlighting/HighlightExceptionsHandlerFactory.java b/java/java-impl/src/com/intellij/codeInsight/highlighting/HighlightExceptionsHandlerFactory.java index c7bd10cc2b39..a1f206b4ba8e 100644 --- a/java/java-impl/src/com/intellij/codeInsight/highlighting/HighlightExceptionsHandlerFactory.java +++ b/java/java-impl/src/com/intellij/codeInsight/highlighting/HighlightExceptionsHandlerFactory.java @@ -19,6 +19,7 @@ import com.intellij.codeInsight.ExceptionUtil; import com.intellij.featureStatistics.FeatureUsageTracker; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.util.Condition; +import com.intellij.openapi.util.Conditions; import com.intellij.psi.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -57,7 +58,7 @@ public class HighlightExceptionsHandlerFactory extends HighlightUsagesHandlerFac final PsiCodeBlock tryBlock = tryStatement.getTryBlock(); if (tryBlock == null) return null; final Collection<PsiClassType> psiClassTypes = ExceptionUtil.collectUnhandledExceptions(tryBlock, tryBlock); - return new HighlightExceptionsHandler(editor, file, target, psiClassTypes.toArray(new PsiClassType[psiClassTypes.size()]), tryBlock, Condition.TRUE); + return new HighlightExceptionsHandler(editor, file, target, psiClassTypes.toArray(new PsiClassType[psiClassTypes.size()]), tryBlock, Conditions.<PsiType>alwaysTrue()); } @Nullable @@ -112,6 +113,6 @@ public class HighlightExceptionsHandlerFactory extends HighlightUsagesHandlerFac final Collection<PsiClassType> psiClassTypes = ExceptionUtil.collectUnhandledExceptions(method.getBody(), method.getBody()); - return new HighlightExceptionsHandler(editor, file, target, psiClassTypes.toArray(new PsiClassType[psiClassTypes.size()]), method.getBody(), Condition.TRUE); + return new HighlightExceptionsHandler(editor, file, target, psiClassTypes.toArray(new PsiClassType[psiClassTypes.size()]), method.getBody(), Conditions.<PsiType>alwaysTrue()); } } diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddAnnotationIntention.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddAnnotationIntention.java index 899da3035ce5..027928a4f695 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddAnnotationIntention.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddAnnotationIntention.java @@ -56,9 +56,11 @@ public abstract class AddAnnotationIntention extends BaseIntentionAction { Pair<String, String[]> annotations = getAnnotations(project); String toAdd = annotations.first; String[] toRemove = annotations.second; - if (toRemove.length > 0 && AnnotationUtil.isAnnotated(owner, toRemove[0], false, false)) return false; + if (toRemove.length > 0 && isAnnotatedSkipInferred(owner, toRemove)) { + return false; + } setText(AddAnnotationPsiFix.calcText(owner, toAdd)); - if (AnnotationUtil.isAnnotated(owner, toAdd, false, false)) return false; + if (isAnnotatedSkipInferred(owner, toAdd)) return false; if (owner instanceof PsiMethod) { PsiType returnType = ((PsiMethod)owner).getReturnType(); @@ -73,6 +75,11 @@ public abstract class AddAnnotationIntention extends BaseIntentionAction { return true; } + private static boolean isAnnotatedSkipInferred(PsiModifierListOwner owner, String... annoFqns) { + PsiAnnotation annotation = AnnotationUtil.findAnnotation(owner, false, annoFqns); + return annotation != null && !AnnotationUtil.isInferredAnnotation(annotation); + } + @Override public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException { PsiModifierListOwner owner = AddAnnotationPsiFix.getContainer(file, editor.getCaretModel().getOffset()); |