From bed98927ed176e7146c61ea0c64fd06546ab7485 Mon Sep 17 00:00:00 2001 From: Michael Golubev Date: Tue, 11 Sep 2012 01:26:25 +0200 Subject: [PATCH 01/12] IDEA-91313 - Kill app server process on close --- .../execution/ui/RunContentManagerImpl.java | 87 ++++++++++++------- .../src/messages/ExecutionBundle.properties | 1 + 2 files changed, 57 insertions(+), 31 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/execution/ui/RunContentManagerImpl.java b/platform/lang-impl/src/com/intellij/execution/ui/RunContentManagerImpl.java index 3b1bff659f54..31091a7cab76 100644 --- a/platform/lang-impl/src/com/intellij/execution/ui/RunContentManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/ui/RunContentManagerImpl.java @@ -15,10 +15,7 @@ */ package com.intellij.execution.ui; -import com.intellij.execution.ExecutionBundle; -import com.intellij.execution.Executor; -import com.intellij.execution.ExecutorRegistry; -import com.intellij.execution.TerminateRemoteProcessDialog; +import com.intellij.execution.*; import com.intellij.execution.process.ProcessAdapter; import com.intellij.execution.process.ProcessEvent; import com.intellij.execution.process.ProcessHandler; @@ -35,6 +32,7 @@ import com.intellij.openapi.application.impl.LaterInvocator; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; +import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.project.ProjectManagerListener; @@ -566,7 +564,7 @@ public class RunContentManagerImpl implements RunContentManager, Disposable { public void contentRemoveQuery(final ContentManagerEvent event) { if (event.getContent() == myContent) { - final boolean canClose = closeQuery(); + final boolean canClose = closeQuery(false); if (!canClose) { event.consume(); } @@ -588,7 +586,7 @@ public class RunContentManagerImpl implements RunContentManager, Disposable { if (myContent == null) return true; - final boolean canClose = closeQuery(); + final boolean canClose = closeQuery(true); if (canClose) { myContent.getManager().removeContent(myContent, true); myContent = null; @@ -599,7 +597,7 @@ public class RunContentManagerImpl implements RunContentManager, Disposable { public void projectClosing(final Project project) { } - private boolean closeQuery() { + private boolean closeQuery(boolean modal) { final RunContentDescriptor descriptor = getRunContentDescriptorByContent(myContent); if (descriptor == null) { @@ -628,14 +626,38 @@ public class RunContentManagerImpl implements RunContentManager, Disposable { else { processHandler.detachProcess(); } - waitForProcess(descriptor); + waitForProcess(descriptor, modal); return true; } } - private void waitForProcess(final RunContentDescriptor descriptor) { - ProgressManager.getInstance().runProcessWithProgressSynchronously(new Runnable() { - public void run() { + private void waitForProcess(final RunContentDescriptor descriptor, final boolean modal) { + final ProcessHandler processHandler = descriptor.getProcessHandler(); + final boolean killable = !modal && (processHandler instanceof KillableProcess) && ((KillableProcess)processHandler).canKillProcess(); + + String title = ExecutionBundle.message("terminating.process.progress.title", descriptor.getDisplayName()); + ProgressManager.getInstance().run(new Task.Backgroundable(myProject, title, true) { + + { + if (killable) { + String cancelText= ExecutionBundle.message("terminating.process.progress.kill"); + setCancelText(cancelText); + setCancelTooltipText(cancelText); + } + } + + @Override + public boolean isConditionalModal() { + return modal; + } + + @Override + public boolean shouldStartInBackground() { + return !modal; + } + + @Override + public void run(@NotNull final ProgressIndicator progressIndicator) { final Semaphore semaphore = new Semaphore(); semaphore.down(); @@ -653,31 +675,34 @@ public class RunContentManagerImpl implements RunContentManager, Disposable { } }); - final ProgressIndicator progressIndicator = ProgressManager.getInstance().getProgressIndicator(); - - if (progressIndicator != null) { - progressIndicator.setText(ExecutionBundle.message("waiting.for.vm.detach.progress.text")); - ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { - public void run() { - while (true) { - if (progressIndicator.isCanceled() || !progressIndicator.isRunning()) { - semaphore.up(); - break; - } - try { - synchronized (this) { - wait(2000L); - } - } - catch (InterruptedException ignore) { + progressIndicator.setText(ExecutionBundle.message("waiting.for.vm.detach.progress.text")); + ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { + public void run() { + while (true) { + if (progressIndicator.isCanceled() || !progressIndicator.isRunning()) { + semaphore.up(); + break; + } + try { + synchronized (this) { + wait(2000L); } } + catch (InterruptedException ignore) { + } } - }); - } + } + }); semaphore.waitFor(); } - }, ExecutionBundle.message("terminating.process.progress.title", descriptor.getDisplayName()), true, myProject); + + @Override + public void onCancel() { + if (killable && !processHandler.isProcessTerminated()) { + ((KillableProcess)processHandler).killProcess(); + } + } + }); } } diff --git a/platform/platform-resources-en/src/messages/ExecutionBundle.properties b/platform/platform-resources-en/src/messages/ExecutionBundle.properties index a7104caf1df1..a0d9889ec8fd 100644 --- a/platform/platform-resources-en/src/messages/ExecutionBundle.properties +++ b/platform/platform-resources-en/src/messages/ExecutionBundle.properties @@ -156,6 +156,7 @@ run.configuration.select.alternate.jre.label=Select Alternative JRE run.configuration.select.jre.dir.label=Select directory with JRE to run with run.configuration.arguments.help.panel.copy.action.name=Copy terminating.process.progress.title=Terminating ''{0}'' +terminating.process.progress.kill=Kill process waiting.for.vm.detach.progress.text=Waiting for process detach restart.error.message.title=Restart Error rerun.configuration.action.name=Rerun ''{0}'' From 588d68b5eb8a49d83663f0969e8e30e2fc0c571f Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Tue, 11 Sep 2012 08:33:07 +0400 Subject: [PATCH 02/12] IDEA-91164 Intention should work only on variable name identifier --- .../declaration/GrSetStrongTypeIntention.java | 100 ++++++++++++------ 1 file changed, 67 insertions(+), 33 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/declaration/GrSetStrongTypeIntention.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/declaration/GrSetStrongTypeIntention.java index 3125f875b467..11d4daa666b7 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/declaration/GrSetStrongTypeIntention.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/declaration/GrSetStrongTypeIntention.java @@ -34,6 +34,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifier; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariableDeclaration; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; import org.jetbrains.plugins.groovy.lang.psi.expectedTypes.SupertypeConstraint; import org.jetbrains.plugins.groovy.lang.psi.expectedTypes.TypeConstraint; import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil; @@ -47,49 +48,68 @@ import java.util.ArrayList; */ public class GrSetStrongTypeIntention extends Intention { - @Override protected void processIntention(@NotNull PsiElement element, Project project, Editor editor) throws IncorrectOperationException { - if (element instanceof GrVariableDeclaration) { - GrVariable[] variables = ((GrVariableDeclaration)element).getVariables(); - ArrayList types = new ArrayList(); - for (GrVariable variable : variables) { - if (variable.getInitializerGroovy() != null) { - PsiType type = variable.getInitializerGroovy().getType(); + PsiElement parent = element.getParent(); + if (!(parent instanceof GrVariable)) return; + + + PsiElement elementToBuildTemplate; + GrVariable[] variables; + if (parent.getParent() instanceof GrVariableDeclaration) { + variables = ((GrVariableDeclaration)parent.getParent()).getVariables(); + elementToBuildTemplate = parent.getParent(); + } + else { + variables = new GrVariable[]{((GrVariable)parent)}; + elementToBuildTemplate = parent; + } + + ArrayList types = new ArrayList(); + for (GrVariable variable : variables) { + GrExpression initializer = variable.getInitializerGroovy(); + if (initializer != null) { + PsiType type = initializer.getType(); + if (type != null) { types.add(SupertypeConstraint.create(type)); } } + } - TemplateBuilderImpl builder = new TemplateBuilderImpl(element); + TemplateBuilderImpl builder = new TemplateBuilderImpl(elementToBuildTemplate); - PsiManager manager = element.getManager(); + PsiManager manager = element.getManager(); - GrModifierList modifierList = ((GrVariableDeclaration)element).getModifierList(); + GrModifierList modifierList = ((GrVariable)parent).getModifierList(); - PsiElement replaceElement; - if (modifierList.hasModifierProperty(GrModifier.DEF) && modifierList.getModifiers().length == 1) { - replaceElement = PsiUtil.findModifierInList(modifierList, GrModifier.DEF); + PsiElement replaceElement; + if (modifierList != null && modifierList.hasModifierProperty(GrModifier.DEF) && modifierList.getModifiers().length == 1) { + replaceElement = PsiUtil.findModifierInList(modifierList, GrModifier.DEF); + } + else { + if (elementToBuildTemplate instanceof GrVariableDeclaration) { + ((GrVariableDeclaration)elementToBuildTemplate).setType(TypesUtil.createType("Abc", element)); } else { - ((GrVariableDeclaration)element).setType(TypesUtil.createType("Abc", element)); - replaceElement = ((GrVariableDeclaration)element).getTypeElementGroovy(); + ((GrVariable)parent).setType(TypesUtil.createType("Abc", element)); } - assert replaceElement != null; - TypeConstraint[] constraints = types.toArray(new TypeConstraint[types.size()]); - ChooseTypeExpression chooseTypeExpression = new ChooseTypeExpression(constraints, manager, replaceElement.getResolveScope()); - builder.replaceElement(replaceElement, chooseTypeExpression); - - - final PsiElement afterPostprocess = CodeInsightUtilBase.forcePsiPostprocessAndRestoreElement(element); - final Template template = builder.buildTemplate(); - TextRange range = afterPostprocess.getTextRange(); - Document document = editor.getDocument(); - document.deleteString(range.getStartOffset(), range.getEndOffset()); - - TemplateManager templateManager = TemplateManager.getInstance(project); - templateManager.startTemplate(editor, template); + replaceElement = ((GrVariable)parent).getTypeElementGroovy(); } + assert replaceElement != null; + TypeConstraint[] constraints = types.toArray(new TypeConstraint[types.size()]); + ChooseTypeExpression chooseTypeExpression = new ChooseTypeExpression(constraints, manager, replaceElement.getResolveScope()); + builder.replaceElement(replaceElement, chooseTypeExpression); + + + final PsiElement afterPostprocess = CodeInsightUtilBase.forcePsiPostprocessAndRestoreElement(elementToBuildTemplate); + final Template template = builder.buildTemplate(); + TextRange range = afterPostprocess.getTextRange(); + Document document = editor.getDocument(); + document.deleteString(range.getStartOffset(), range.getEndOffset()); + + TemplateManager templateManager = TemplateManager.getInstance(project); + templateManager.startTemplate(editor, template); } @NotNull @@ -98,10 +118,19 @@ public class GrSetStrongTypeIntention extends Intention { return new PsiElementPredicate() { @Override public boolean satisfiedBy(PsiElement element) { - if (element instanceof GrVariableDeclaration && ((GrVariableDeclaration)element).getTypeElementGroovy() == null) { - GrVariable[] variables = ((GrVariableDeclaration)element).getVariables(); - for (GrVariable variable : variables) { - if (variable.getInitializerGroovy() != null) return true; + PsiElement parent = element.getParent(); + if (parent instanceof GrVariable && + ((GrVariable)parent).getTypeElementGroovy() == null && + element == ((GrVariable)parent).getNameIdentifierGroovy()) { + PsiElement pparent = parent.getParent(); + if (pparent instanceof GrVariableDeclaration) { + GrVariable[] variables = ((GrVariableDeclaration)pparent).getVariables(); + for (GrVariable variable : variables) { + if (isVarDeclaredWithInitializer(variable)) return true; + } + } + else { + return isVarDeclaredWithInitializer((GrVariable)parent); } } @@ -109,4 +138,9 @@ public class GrSetStrongTypeIntention extends Intention { } }; } + + private static boolean isVarDeclaredWithInitializer(GrVariable variable) { + GrExpression initializer = variable.getInitializerGroovy(); + return initializer != null && initializer.getType() != null; + } } From 4996248a4d8491ba881eeb792a09448ec3b133c5 Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Tue, 11 Sep 2012 08:34:35 +0400 Subject: [PATCH 03/12] cleanup --- .../plugins/groovy/refactoring/extract/InitialInfo.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/extract/InitialInfo.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/extract/InitialInfo.java index ba481c93f680..f425b0965ac0 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/extract/InitialInfo.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/extract/InitialInfo.java @@ -45,7 +45,7 @@ public class InitialInfo implements ExtractInfoHelper { private final Project myProject; private final GrStatement[] myStatements; private final boolean myHasReturnValue; - private String[] myArgumentNames; + private final String[] myArgumentNames; public InitialInfo(VariableInfo[] inputInfos, VariableInfo[] outputInfos, From 3cb56e363756942baa57962ae417bf192acb0e7e Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 10 Sep 2012 21:57:49 +0400 Subject: [PATCH 04/12] label for destination combo (IDEA-91302) --- .../codeInsight/intention/impl/CreateClassDialog.java | 1 + .../src/com/intellij/refactoring/copy/CopyClassDialog.java | 2 +- .../extractSuperclass/JavaExtractSuperBaseDialog.java | 5 +++-- .../IntroduceParameterObjectForm.form | 3 ++- .../ReplaceConstructorWithBuilderPanel.form | 3 ++- .../refactoring/wrapreturnvalue/WrapReturnValueForm.form | 1 + 6 files changed, 10 insertions(+), 5 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateClassDialog.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateClassDialog.java index 2de7be61a346..5cb86ad43c17 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateClassDialog.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateClassDialog.java @@ -210,6 +210,7 @@ public class CreateClassDialog extends DialogWrapper { final boolean isMultipleSourceRoots = ProjectRootManager.getInstance(myProject).getContentSourceRoots().length > 1; myDestinationCB.setVisible(isMultipleSourceRoots); label.setVisible(isMultipleSourceRoots); + label.setLabelFor(myDestinationCB); return panel; } diff --git a/java/java-impl/src/com/intellij/refactoring/copy/CopyClassDialog.java b/java/java-impl/src/com/intellij/refactoring/copy/CopyClassDialog.java index 5072a4f3491a..17649100a191 100644 --- a/java/java-impl/src/com/intellij/refactoring/copy/CopyClassDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/copy/CopyClassDialog.java @@ -115,7 +115,7 @@ class CopyClassDialog extends DialogWrapper{ final boolean isMultipleSourceRoots = ProjectRootManager.getInstance(myProject).getContentSourceRoots().length > 1; myDestinationCB.setVisible(!myDoClone && isMultipleSourceRoots); label.setVisible(!myDoClone && isMultipleSourceRoots); - + label.setLabelFor(myDestinationCB); return FormBuilder.createFormBuilder() .addComponent(myInformationLabel) diff --git a/java/java-impl/src/com/intellij/refactoring/extractSuperclass/JavaExtractSuperBaseDialog.java b/java/java-impl/src/com/intellij/refactoring/extractSuperclass/JavaExtractSuperBaseDialog.java index 0fdb5959f16c..bd25a0e7d8b7 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractSuperclass/JavaExtractSuperBaseDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/extractSuperclass/JavaExtractSuperBaseDialog.java @@ -74,8 +74,9 @@ public abstract class JavaExtractSuperBaseDialog extends ExtractSuperBaseDialog< if (sourceRoots.length <= 1) return super.createDestinationRootPanel(); final JPanel panel = new JPanel(new BorderLayout()); panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); - panel.add(new JBLabel(RefactoringBundle.message("target.destination.folder")), BorderLayout.NORTH); - + final JBLabel label = new JBLabel(RefactoringBundle.message("target.destination.folder")); + panel.add(label, BorderLayout.NORTH); + label.setLabelFor(myDestinationFolderComboBox); myDestinationFolderComboBox.setData(myProject, myTargetDirectory, new Pass() { @Override public void pass(String s) { diff --git a/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/IntroduceParameterObjectForm.form b/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/IntroduceParameterObjectForm.form index 0ea2aa74025f..ac14419cd910 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/IntroduceParameterObjectForm.form +++ b/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/IntroduceParameterObjectForm.form @@ -3,7 +3,7 @@ - + @@ -75,6 +75,7 @@ + diff --git a/java/java-impl/src/com/intellij/refactoring/replaceConstructorWithBuilder/ReplaceConstructorWithBuilderPanel.form b/java/java-impl/src/com/intellij/refactoring/replaceConstructorWithBuilder/ReplaceConstructorWithBuilderPanel.form index 63601539eb95..7e9de2c0916a 100644 --- a/java/java-impl/src/com/intellij/refactoring/replaceConstructorWithBuilder/ReplaceConstructorWithBuilderPanel.form +++ b/java/java-impl/src/com/intellij/refactoring/replaceConstructorWithBuilder/ReplaceConstructorWithBuilderPanel.form @@ -2,7 +2,7 @@
- + @@ -86,6 +86,7 @@ + diff --git a/java/java-impl/src/com/intellij/refactoring/wrapreturnvalue/WrapReturnValueForm.form b/java/java-impl/src/com/intellij/refactoring/wrapreturnvalue/WrapReturnValueForm.form index 4114a0d8d3e9..d02ed331061b 100644 --- a/java/java-impl/src/com/intellij/refactoring/wrapreturnvalue/WrapReturnValueForm.form +++ b/java/java-impl/src/com/intellij/refactoring/wrapreturnvalue/WrapReturnValueForm.form @@ -68,6 +68,7 @@ + From 9a98e4afb85cbb65d93885ef2d9180769801b5e3 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 11 Sep 2012 10:31:33 +0400 Subject: [PATCH 05/12] inplace rename: check reference for member renamers only --- .../refactoring/rename/inplace/InplaceRefactoring.java | 4 ---- .../refactoring/rename/inplace/MemberInplaceRenamer.java | 9 +++++++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/InplaceRefactoring.java b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/InplaceRefactoring.java index a2fc0cc2413c..7f743742985f 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/InplaceRefactoring.java +++ b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/InplaceRefactoring.java @@ -220,10 +220,6 @@ public abstract class InplaceRefactoring { } protected boolean acceptReference(PsiReference reference) { - final PsiElement element = reference.getElement(); - if (element instanceof PsiNamedElement) { - return Comparing.strEqual(((PsiNamedElement)element).getName(), myElementToRename.getName()); - } return true; } diff --git a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/MemberInplaceRenamer.java b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/MemberInplaceRenamer.java index 4a86b817e16a..d7c610af617b 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/MemberInplaceRenamer.java +++ b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/MemberInplaceRenamer.java @@ -80,6 +80,15 @@ public class MemberInplaceRenamer extends VariableInplaceRenamer { return new MemberInplaceRenamer(variable, getSubstituted(), editor, initialName, myOldName); } + @Override + protected boolean acceptReference(PsiReference reference) { + final PsiElement element = reference.getElement(); + if (element instanceof PsiNamedElement) { + return Comparing.strEqual(((PsiNamedElement)element).getName(), myElementToRename.getName()); + } + return super.acceptReference(reference); + } + @Override protected PsiElement checkLocalScope() { PsiFile currentFile = PsiDocumentManager.getInstance(myProject).getPsiFile(myEditor.getDocument()); From d2ebef63e853bc0951f037538df89b138aa06fa5 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 11 Sep 2012 10:39:16 +0400 Subject: [PATCH 06/12] (int)Object cast conversion in java 1.7 supported (IDEA-90906; IDEA-66803) --- .../com/intellij/psi/util/TypeConversionUtil.java | 9 +++++++++ .../advHighlighting7/PolymorphicTypeCast.java | 14 ++++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java b/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java index d3f9c17ce7e3..01e89aa28bbf 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java @@ -111,6 +111,15 @@ public class TypeConversionUtil { return boxedType != null && areTypesConvertible(boxedType, toType); } if (!fromIsPrimitive) { + if (fromType instanceof PsiClassType && ((PsiClassType)fromType).getLanguageLevel().isAtLeast(LanguageLevel.JDK_1_7)) { + final PsiClassType classType = (PsiClassType)fromType; + final PsiClass psiClass = classType.resolve(); + if (psiClass == null || psiClass instanceof PsiTypeParameter) return false; + final PsiClassType boxedType = ((PsiPrimitiveType)toType).getBoxedType(psiClass.getManager(), psiClass.getResolveScope()); + if (boxedType != null) { + return isAssignable(fromType, boxedType); + } + } return fromTypeRank == toTypeRank || fromTypeRank <= MAX_NUMERIC_RANK && toTypeRank <= MAX_NUMERIC_RANK && fromTypeRank < toTypeRank; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/PolymorphicTypeCast.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/PolymorphicTypeCast.java index 2da4725db253..c967a7328b62 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/PolymorphicTypeCast.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/PolymorphicTypeCast.java @@ -71,14 +71,20 @@ class C { MethodHandle mh1 = MethodHandles.convertArguments(mh0, MethodType.methodType(Integer.class, String.class)); System.out.println((Integer) mh1.invokeExact("daddy")); } + + void supported() { + Object o = 42; + int i = (int) o; + String s = ""; + int i1 = (int) s; + System.out.println(i); + m((int) o); + } void unsupported() { Object o = 42; - int i = (int) o; - System.out.println(i); - m((int) o); if (o instanceof int) { - i = (Integer) o; + int i = (Integer) o; System.out.println(i); } } From 8ab800a71c16912d12ff658043bd08bb9228b523 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Tue, 11 Sep 2012 09:08:51 +0200 Subject: [PATCH 07/12] remove "Constructor with too many parameters" inspection from black list --- .../src/com/intellij/codeInspection/inspection-black-list.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/codeInspection/inspection-black-list.txt b/platform/lang-impl/src/com/intellij/codeInspection/inspection-black-list.txt index 61a3085d889d..5fc2f281c98d 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/inspection-black-list.txt +++ b/platform/lang-impl/src/com/intellij/codeInspection/inspection-black-list.txt @@ -162,7 +162,6 @@ com.siyeh.ig.methodmetrics.MethodCouplingInspection com.siyeh.ig.methodmetrics.MultipleReturnPointsPerMethodInspection com.siyeh.ig.methodmetrics.NestingDepthInspection com.siyeh.ig.methodmetrics.NonCommentSourceStatementsInspection -com.siyeh.ig.methodmetrics.ParametersPerConstructorInspection com.siyeh.ig.methodmetrics.ParametersPerMethodInspection com.siyeh.ig.methodmetrics.ThreeNegationsPerMethodInspection com.siyeh.ig.methodmetrics.ThrownExceptionsPerMethodInspection From af6da9b13c89ee1da11221633fa74c2210f4afa3 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Tue, 11 Sep 2012 09:09:20 +0200 Subject: [PATCH 08/12] IDEA-90329 (Constructor with too many parameters shall have an option to be ignored according to its accessesibility) --- .../siyeh/InspectionGadgetsBundle.properties | 5 + .../ParametersPerConstructorInspection.java | 112 ++++++++++++++++-- .../ParametersPerConstructor.html | 3 + 3 files changed, 112 insertions(+), 8 deletions(-) diff --git a/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties b/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties index 4d8a80d7e687..9de82e4a9d56 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties +++ b/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties @@ -1283,6 +1283,7 @@ non.comment.source.statements.problem.descriptor=#ref is too long ( parameters.per.method.problem.descriptor=#ref() has too many parameters (num parameters = {0}) #loc parameters.per.constructor.problem.descriptor=#ref() has too many parameters (num parameters = {0}) #loc parameter.limit.option=Parameter limit: +constructor.visibility.option=Ignore constructors with visibility three.negations.per.method.ignore.option=Ignore negations in 'equals()' methods three.negations.per.method.ignore.assert.option=Ignore negations in 'assert' statements three.negations.per.method.problem.descriptor=#ref contains {0} negations #loc @@ -1989,3 +1990,7 @@ public.constructor.problem.descriptor=Public constructor #ref() public.constructor.quickfix=Replace constructor with factory method junit3.style.test.method.in.junit4.class.display.name=Old style JUnit test method in JUnit 4 class junit3.style.test.method.in.junit4.class.problem.descriptor=Old style JUnit test method #ref in JUnit 4 class +none=none +private=private +package.local.private=package local & private +protected.package.local.private=protected, package local & private diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/methodmetrics/ParametersPerConstructorInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/methodmetrics/ParametersPerConstructorInspection.java index 6e8f12373c39..409c8e007eaf 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/methodmetrics/ParametersPerConstructorInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/methodmetrics/ParametersPerConstructorInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2012 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,44 +16,133 @@ package com.siyeh.ig.methodmetrics; import com.intellij.psi.PsiMethod; +import com.intellij.psi.PsiModifier; import com.intellij.psi.PsiParameterList; +import com.intellij.ui.ListCellRendererWrapper; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspectionVisitor; import org.jetbrains.annotations.NotNull; +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + public class ParametersPerConstructorInspection extends MethodMetricInspection { + private enum Scope { + NONE { + @Override + String getText() { + return InspectionGadgetsBundle.message("none"); + } + }, + PRIVATE { + @Override + String getText() { + return InspectionGadgetsBundle.message("private"); + } + }, + PACKAGE_LOCAL { + @Override + String getText() { + return InspectionGadgetsBundle.message("package.local.private"); + } + }, + PROTECTED { + @Override + String getText() { + return InspectionGadgetsBundle.message("protected.package.local.private"); + } + }; + + abstract String getText(); + } + + @SuppressWarnings("PublicField") public Scope ignoreScope = Scope.NONE; + + @Override @NotNull public String getID() { return "ConstructorWithTooManyParameters"; } + @Override @NotNull public String getDisplayName() { - return InspectionGadgetsBundle.message( - "parameters.per.constructor.display.name"); + return InspectionGadgetsBundle.message("parameters.per.constructor.display.name"); } + @Override @NotNull public String buildErrorString(Object... infos) { final Integer parameterCount = (Integer)infos[0]; - return InspectionGadgetsBundle.message( - "parameters.per.constructor.problem.descriptor", parameterCount); + return InspectionGadgetsBundle.message("parameters.per.constructor.problem.descriptor", parameterCount); } + @Override protected int getDefaultLimit() { return 5; } + @Override protected String getConfigurationLabel() { return InspectionGadgetsBundle.message("parameter.limit.option"); } - public BaseInspectionVisitor buildVisitor() { - return new ParametersPerMethodVisitor(); + @Override + public JComponent createOptionsPanel() { + final JPanel panel = new JPanel(); + final JLabel textFieldLabel = new JLabel(getConfigurationLabel()); + final JFormattedTextField valueField = prepareNumberEditor("m_limit"); + final JLabel comboBoxLabel = new JLabel(InspectionGadgetsBundle.message("constructor.visibility.option")); + final JComboBox comboBox = new JComboBox(); + comboBox.addItem(Scope.NONE); + comboBox.addItem(Scope.PRIVATE); + comboBox.addItem(Scope.PACKAGE_LOCAL); + comboBox.addItem(Scope.PROTECTED); + comboBox.setRenderer(new ListCellRendererWrapper() { + @Override + public void customize(JList list, Object value, int index, boolean selected, boolean hasFocus) { + if (value instanceof Scope) setText(((Scope)value).getText()); + } + }); + comboBox.setSelectedItem(ignoreScope); + comboBox.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + ignoreScope = (Scope)comboBox.getSelectedItem(); + } + }); + comboBox.setPrototypeDisplayValue(Scope.PROTECTED); + + final GroupLayout layout = new GroupLayout(panel); + layout.setAutoCreateGaps(true); + panel.setLayout(layout); + final GroupLayout.ParallelGroup horizontal = layout.createParallelGroup(); + horizontal.addGroup(layout.createSequentialGroup() + .addComponent(textFieldLabel) + .addComponent(valueField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)); + horizontal.addGroup(layout.createSequentialGroup() + .addComponent(comboBoxLabel).addComponent(comboBox, 100, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)); + layout.setHorizontalGroup(horizontal); + final GroupLayout.SequentialGroup vertical = layout.createSequentialGroup(); + vertical.addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(textFieldLabel) + .addComponent(valueField)); + vertical.addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(comboBoxLabel) + .addComponent(comboBox)); + layout.setVerticalGroup(vertical); + + return panel; } - private class ParametersPerMethodVisitor extends BaseInspectionVisitor { + @Override + public BaseInspectionVisitor buildVisitor() { + return new ParametersPerConstructorVisitor(); + } + + private class ParametersPerConstructorVisitor extends BaseInspectionVisitor { @Override public void visitMethod(@NotNull PsiMethod method) { @@ -64,6 +153,13 @@ public class ParametersPerConstructorInspection extends MethodMetricInspection { if (!method.isConstructor()) { return; } + if (ignoreScope != Scope.NONE) { + switch (ignoreScope.ordinal()) { + case 3: if (method.hasModifierProperty(PsiModifier.PROTECTED)) return; + case 2: if (method.hasModifierProperty(PsiModifier.PACKAGE_LOCAL)) return; + case 1: if (method.hasModifierProperty(PsiModifier.PRIVATE)) return; + } + } final PsiParameterList parameterList = method.getParameterList(); final int parametersCount = parameterList.getParametersCount(); if (parametersCount <= getLimit()) { diff --git a/plugins/InspectionGadgets/src/inspectionDescriptions/ParametersPerConstructor.html b/plugins/InspectionGadgets/src/inspectionDescriptions/ParametersPerConstructor.html index 4392ee862fc8..f9d0928af51f 100644 --- a/plugins/InspectionGadgets/src/inspectionDescriptions/ParametersPerConstructor.html +++ b/plugins/InspectionGadgets/src/inspectionDescriptions/ParametersPerConstructor.html @@ -6,6 +6,9 @@ with too many parameters can be a good sign that refactoring is necessary.

Use the field provided below to specify the maximum acceptable number of parameters a constructor might have.

+Use the combobox below to specify if the inspection should ignore private, package local & private or protected, package local and +private constructors +

Powered by InspectionGadgets \ No newline at end of file From 5f62a822268c4adce0178526f4b6ea2c1a767d70 Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Tue, 11 Sep 2012 12:21:12 +0400 Subject: [PATCH 09/12] IDEA-91100 Annotation processing still configured when using JDK 1.5 --- .../org/jetbrains/idea/maven/importing/MavenModuleImporter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModuleImporter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModuleImporter.java index a9f726154ff7..8229982d1372 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModuleImporter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModuleImporter.java @@ -238,7 +238,7 @@ public class MavenModuleImporter { if (sdk != null) { String versionString = sdk.getVersionString(); if (versionString != null) { - if (versionString.contains("1.5.") || versionString.contains("1.4.") || versionString.contains("1.3.") || versionString.contains("1.2.")) { + if (versionString.contains("1.5") || versionString.contains("1.4") || versionString.contains("1.3") || versionString.contains("1.2")) { return; } } From bd45b87409dd9fa4241f2403ba59878473c46591 Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Tue, 11 Sep 2012 12:35:23 +0400 Subject: [PATCH 10/12] IDEA-60719 Maven: pass MAVEN_OPTS to maven server --- .../org/jetbrains/idea/maven/server/MavenServerManager.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenServerManager.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenServerManager.java index fe4ddd399780..00d7913ad647 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenServerManager.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenServerManager.java @@ -205,12 +205,10 @@ public class MavenServerManager extends RemoteObjectWrapper { for (String param : mavenOptsList.getParameters()) { if (param.startsWith("-Xmx")) { - params.getVMParametersList().add(param); xmxSet = true; } - else if (param.startsWith("-Xms") || param.startsWith("-XX:MaxPermSize") || param.startsWith("-XX:PermSize")) { - params.getVMParametersList().add(param); - } + + params.getVMParametersList().add(param); } } From 2b2026ac641728b09bc50075b96c90d315650c9e Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Tue, 11 Sep 2012 12:33:58 +0400 Subject: [PATCH 11/12] IDEA-54104 JSF resources support missing partly in CSS --- .../lang/injection/MultiHostInjector.java | 3 +++ .../com/intellij/psi/LiteralTextEscaper.java | 19 +++++++++++++++++++ .../openapi/paths/PathReferenceManager.java | 1 - .../impl/providers/FileReference.java | 2 +- .../tree/injected/MultiHostRegistrarImpl.java | 5 ++++- 5 files changed, 27 insertions(+), 3 deletions(-) diff --git a/platform/core-api/src/com/intellij/lang/injection/MultiHostInjector.java b/platform/core-api/src/com/intellij/lang/injection/MultiHostInjector.java index 5d1f35d4ffef..396bdf4b4524 100644 --- a/platform/core-api/src/com/intellij/lang/injection/MultiHostInjector.java +++ b/platform/core-api/src/com/intellij/lang/injection/MultiHostInjector.java @@ -28,6 +28,9 @@ import org.jetbrains.annotations.NotNull; import java.util.List; +/** + * @see com.intellij.psi.PsiLanguageInjectionHost + */ public interface MultiHostInjector { ExtensionPointName MULTIHOST_INJECTOR_EP_NAME = ExtensionPointName.create("com.intellij.multiHostInjector"); diff --git a/platform/core-api/src/com/intellij/psi/LiteralTextEscaper.java b/platform/core-api/src/com/intellij/psi/LiteralTextEscaper.java index 07afd9c72916..bc93b01f0c78 100644 --- a/platform/core-api/src/com/intellij/psi/LiteralTextEscaper.java +++ b/platform/core-api/src/com/intellij/psi/LiteralTextEscaper.java @@ -60,4 +60,23 @@ public abstract class LiteralTextEscaper { public abstract boolean isOneLine(); + public static LiteralTextEscaper createSimple(T element) { + return new LiteralTextEscaper(element) { + @Override + public boolean decode(@NotNull TextRange rangeInsideHost, @NotNull StringBuilder outChars) { + outChars.append(rangeInsideHost.substring(myHost.getText())); + return true; + } + + @Override + public int getOffsetInHost(int offsetInDecoded, @NotNull TextRange rangeInsideHost) { + return rangeInsideHost.getStartOffset() + offsetInDecoded; + } + + @Override + public boolean isOneLine() { + return true; + } + }; + } } diff --git a/platform/lang-api/src/com/intellij/openapi/paths/PathReferenceManager.java b/platform/lang-api/src/com/intellij/openapi/paths/PathReferenceManager.java index a6aa7062b117..69e077ee9237 100644 --- a/platform/lang-api/src/com/intellij/openapi/paths/PathReferenceManager.java +++ b/platform/lang-api/src/com/intellij/openapi/paths/PathReferenceManager.java @@ -64,7 +64,6 @@ public abstract class PathReferenceManager { * @param endingSlashNotAllowed true if paths like "/foo/" should not be resolved. * @param relativePathsAllowed true if the folder of the file containing the PsiElement should be used as "root". * Otherwise, web application root will be used. - * @param suitableFileTypes *@param additionalProviders additional providers to process. @return created references or an empty array. */ @NotNull diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/FileReference.java b/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/FileReference.java index ce1a41ffbb38..ba819aa6ff66 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/FileReference.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/FileReference.java @@ -359,7 +359,7 @@ public class FileReference implements FileReferenceOwner, PsiPolyVariantReferenc @Override public PsiFileSystemItem resolve() { ResolveResult[] resolveResults = multiResolve(false); - return resolveResults.length == 1 ? (PsiFileSystemItem)resolveResults[0].getElement() : null; + return resolveResults.length == 1 ? (PsiFileSystemItem)resolveResults[0].getElement() : null; } @Nullable diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/MultiHostRegistrarImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/MultiHostRegistrarImpl.java index 615c58974177..61ac24305495 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/MultiHostRegistrarImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/MultiHostRegistrarImpl.java @@ -242,7 +242,10 @@ public class MultiHostRegistrarImpl implements MultiHostRegistrar, ModificationT finally { viewProvider.setPatchingLeaves(false); } - assert parsedNode.getText().equals(documentText) : exceptionContext("After patch: doc:\n'" + documentText + "'\n---PSI:\n'" + parsedNode.getText() + "'\n---chars:\n'"+outChars+"'"); + if (!parsedNode.getText().equals(documentText)) { + throw new AssertionError(exceptionContext( + "After patch: doc:\n'" + documentText + "'\n---PSI:\n'" + parsedNode.getText() + "'\n---chars:\n'" + outChars + "'")); + } virtualFile.setContent(null, documentWindow.getText(), false); From ae902aff6864ff6f922004da9aeee5ae70c8cf9b Mon Sep 17 00:00:00 2001 From: Vassiliy Kudryashov Date: Tue, 11 Sep 2012 12:27:30 +0400 Subject: [PATCH 12/12] get rid of needless method --- .../src/com/intellij/execution/ProgramRunnerUtil.java | 2 +- .../src/com/intellij/execution/impl/RunManagerImpl.java | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/execution/ProgramRunnerUtil.java b/platform/lang-impl/src/com/intellij/execution/ProgramRunnerUtil.java index 207ca4aadcf6..e74259e88c50 100644 --- a/platform/lang-impl/src/com/intellij/execution/ProgramRunnerUtil.java +++ b/platform/lang-impl/src/com/intellij/execution/ProgramRunnerUtil.java @@ -72,7 +72,7 @@ public class ProgramRunnerUtil { return; } - if (!RunManagerImpl.canRunConfiguration(configuration, executor) || (showSettings && RunManagerImpl.isEditBeforeRun(configuration))) { + if (!RunManagerImpl.canRunConfiguration(configuration, executor) || (showSettings && configuration.isEditBeforeRun())) { if (!RunDialog.editConfiguration(project, configuration, "Edit configuration", executor)) { return; } diff --git a/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.java b/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.java index fec7906323ba..4352717e2137 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.java @@ -761,10 +761,6 @@ public class RunManagerImpl extends RunManagerEx implements JDOMExternalizable, setActiveConfiguration(tempConfiguration); } - public static boolean isEditBeforeRun(@NotNull final RunnerAndConfigurationSettings configuration) { - return configuration.isEditBeforeRun(); - } - Collection getStableConfigurations() { final Map result = new LinkedHashMap(myConfigurations);