diff --git a/build/scripts/libLicenses.gant b/build/scripts/libLicenses.gant index b0a6d06c1a97..c0c0de19bafa 100644 --- a/build/scripts/libLicenses.gant +++ b/build/scripts/libLicenses.gant @@ -168,7 +168,7 @@ libraryLicense(name: "Apache Commons Compress", libraryName: "commons-compress", libraryLicense(name: "Apache Commons Discovery", libraryName: "commons-discovery-0.4.jar", version: "0.4", license: "Apache 2.0", url: "http://jakarta.apache.org/commons/discovery/", licenseUrl: "http://commons.apache.org/license.html") libraryLicense(name: "Apache Commons HTTPClient", libraryName: "http-client-3.1", version: "3.1  (with patch by JetBrains)", license: "Apache 2.0", url: "http://hc.apache.org/httpclient-3.x") libraryLicense(name: "HttpComponents HttpClient", libraryName: "http-client", version: "4.3.2", license: "Apache 2.0", url: "http://hc.apache.org/httpcomponents-client-ga/index.html") -libraryLicense(name: "Apache Commons Net", libraryName: "commons-net", version: "3.1", license: "Apache 2.0", url: "http://commons.apache.org/net/") +libraryLicense(name: "Apache Commons Net", libraryName: "commons-net", version: "3.3", license: "Apache 2.0", url: "http://commons.apache.org/net/") libraryLicense(name: "Apache Commons Logging", libraryName: "commons-logging", version: "1.1.1", license: "Apache 2.0", url: "http://commons.apache.org/logging/") libraryLicense(name: "Apache Commons IO", libraryName: "commons-io-1.4.jar", version: "1.4", license: "Apache 2.0", url: "http://commons.apache.org/io/", licenseUrl: "http://www.apache.org/licenses/LICENSE-2.0.txt") libraryLicense(name: "Apache Lucene", libraryName: "lucene-core-2.4.1.jar", version: "2.4.1", license: "Apache 2.0", url: "http://lucene.apache.org/java") diff --git a/colorSchemes/src/colorSchemes/Darcula.xml b/colorSchemes/src/colorSchemes/Darcula.xml index 61e7c02afd11..236f01df78dc 100644 --- a/colorSchemes/src/colorSchemes/Darcula.xml +++ b/colorSchemes/src/colorSchemes/Darcula.xml @@ -362,6 +362,27 @@ + + + diff --git a/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java b/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java index ac8d47f04469..efb592aaa6a2 100644 --- a/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java +++ b/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java @@ -104,7 +104,8 @@ import org.jetbrains.jps.cmdline.ClasspathBootstrap; import org.jetbrains.jps.incremental.Utils; import org.jetbrains.jps.model.serialization.JpsGlobalLoader; -import javax.tools.*; +import javax.tools.JavaCompiler; +import javax.tools.ToolProvider; import java.awt.*; import java.io.File; import java.io.IOException; @@ -130,7 +131,7 @@ public class BuildManager implements ApplicationComponent{ private static final String COMPILER_PROCESS_JDK_PROPERTY = "compiler.process.jdk"; public static final String SYSTEM_ROOT = "compile-server"; public static final String TEMP_DIR_NAME = "_temp_"; - private final boolean IS_UNIT_TEST_MODE; + private static final boolean IS_UNIT_TEST_MODE = ApplicationManager.getApplication().isUnitTestMode(); private static final String IWS_EXTENSION = ".iws"; private static final String IPR_EXTENSION = ".ipr"; private static final String IDEA_PROJECT_DIR_PATTERN = "/.idea/"; @@ -215,7 +216,6 @@ public class BuildManager implements ApplicationComponent{ public BuildManager(final ProjectManager projectManager) { final Application application = ApplicationManager.getApplication(); - IS_UNIT_TEST_MODE = application.isUnitTestMode(); myProjectManager = projectManager; final String systemPath = PathManager.getSystemPath(); File system = new File(systemPath); @@ -764,8 +764,8 @@ public class BuildManager implements ApplicationComponent{ } private static boolean isProcessPreloadingEnabled() { - // automatically disable process preloading when debugging - return Registry.is("compiler.process.preload") && Registry.intValue("compiler.process.debug.port") <= 0 ; + // automatically disable process preloading when debugging or testing + return !IS_UNIT_TEST_MODE && Registry.is("compiler.process.preload") && Registry.intValue("compiler.process.debug.port") <= 0; } private void notifySessionTerminationIfNeeded(UUID sessionId, @Nullable Throwable execFailure) { diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefFieldImpl.java b/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefFieldImpl.java index b7751409f6e4..d2de19b5aac5 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefFieldImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefFieldImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -17,7 +17,6 @@ package com.intellij.codeInspection.reference; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.util.Computable; -import com.intellij.openapi.util.Key; import com.intellij.psi.*; import com.intellij.psi.util.ClassUtil; import com.intellij.psi.util.PsiFormatUtil; @@ -33,7 +32,7 @@ import org.jetbrains.annotations.Nullable; public class RefFieldImpl extends RefJavaElementImpl implements RefField { private static final int USED_FOR_READING_MASK = 0x10000; private static final int USED_FOR_WRITING_MASK = 0x20000; - private static final int ASSIGNED_ONLY_IN_INITIALIZER = 0x40000; + private static final int ASSIGNED_ONLY_IN_INITIALIZER_MASK = 0x40000; RefFieldImpl(@NotNull RefClass ownerClass, PsiField field, RefManager manager) { super(field, manager); @@ -94,13 +93,13 @@ public class RefFieldImpl extends RefJavaElementImpl implements RefField { } private void setUsedForWriting(boolean usedForWriting) { - setFlag(false, ASSIGNED_ONLY_IN_INITIALIZER); + setFlag(false, ASSIGNED_ONLY_IN_INITIALIZER_MASK); setFlag(usedForWriting, USED_FOR_WRITING_MASK); } @Override public boolean isOnlyAssignedInInitializer() { - return checkFlag(ASSIGNED_ONLY_IN_INITIALIZER); + return checkFlag(ASSIGNED_ONLY_IN_INITIALIZER_MASK); } @Override @@ -130,7 +129,7 @@ public class RefFieldImpl extends RefJavaElementImpl implements RefField { if (psiField.getInitializer() != null || psiField instanceof PsiEnumConstant) { if (!checkFlag(USED_FOR_WRITING_MASK)) { - setFlag(true, ASSIGNED_ONLY_IN_INITIALIZER); + setFlag(true, ASSIGNED_ONLY_IN_INITIALIZER_MASK); setFlag(true, USED_FOR_WRITING_MASK); } } diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefJavaElementImpl.java b/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefJavaElementImpl.java index 7607c033bb70..12f42b7b3f23 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefJavaElementImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefJavaElementImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -41,10 +41,11 @@ public abstract class RefJavaElementImpl extends RefElementImpl implements RefJa private static final int ACCESS_PROTECTED = 0x01; private static final int ACCESS_PACKAGE = 0x02; private static final int ACCESS_PUBLIC = 0x03; + private static final int IS_STATIC_MASK = 0x04; private static final int IS_FINAL_MASK = 0x08; private static final int IS_USES_DEPRECATION_MASK = 0x200; - private static final int IS_SYNTHETIC_JSP_ELEMENT = 0x400; + private static final int IS_SYNTHETIC_JSP_ELEMENT_MASK = 0x400; protected RefJavaElementImpl(String name, @NotNull RefJavaElement owner) { super(name, owner); @@ -148,11 +149,11 @@ public abstract class RefJavaElementImpl extends RefElementImpl implements RefJa @Override public boolean isSyntheticJSP() { - return checkFlag(IS_SYNTHETIC_JSP_ELEMENT); + return checkFlag(IS_SYNTHETIC_JSP_ELEMENT_MASK); } public void setSyntheticJSP(boolean b) { - setFlag(b, IS_SYNTHETIC_JSP_ELEMENT); + setFlag(b, IS_SYNTHETIC_JSP_ELEMENT_MASK); } @Override diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefMethodImpl.java b/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefMethodImpl.java index 941de66f8519..6845c42fd95f 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefMethodImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefMethodImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -46,7 +46,7 @@ public class RefMethodImpl extends RefJavaElementImpl implements RefMethod { private static final int IS_RETURN_VALUE_USED_MASK = 0x400000; private static final int IS_TEST_METHOD_MASK = 0x4000000; - private static final int IS_CALLED_ON_SUBCLASS = 0x8000000; + private static final int IS_CALLED_ON_SUBCLASS_MASK = 0x8000000; private static final String RETURN_VALUE_UNDEFINED = "#"; @@ -701,11 +701,11 @@ public class RefMethodImpl extends RefJavaElementImpl implements RefMethod { @Override public boolean isCalledOnSubClass() { - return checkFlag(IS_CALLED_ON_SUBCLASS); + return checkFlag(IS_CALLED_ON_SUBCLASS_MASK); } public void setCalledOnSubClass(boolean isCalledOnSubClass){ - setFlag(isCalledOnSubClass, IS_CALLED_ON_SUBCLASS); + setFlag(isCalledOnSubClass, IS_CALLED_ON_SUBCLASS_MASK); } } diff --git a/java/java-impl/src/com/intellij/application/options/CodeStyleImportForm.form b/java/java-impl/src/com/intellij/application/options/CodeStyleImportForm.form index 370492c2c7de..7009dba79298 100644 --- a/java/java-impl/src/com/intellij/application/options/CodeStyleImportForm.form +++ b/java/java-impl/src/com/intellij/application/options/CodeStyleImportForm.form @@ -29,14 +29,6 @@ - - - - - - - - diff --git a/java/java-impl/src/com/intellij/application/options/CodeStyleImportsPanel.java b/java/java-impl/src/com/intellij/application/options/CodeStyleImportsPanel.java index 47e7b3ad5942..8a47633f2b93 100644 --- a/java/java-impl/src/com/intellij/application/options/CodeStyleImportsPanel.java +++ b/java/java-impl/src/com/intellij/application/options/CodeStyleImportsPanel.java @@ -39,11 +39,8 @@ public class CodeStyleImportsPanel extends JPanel { private JBTable myPackageTable; private final CodeStyleSettings mySettings; - private JRadioButton myJspImportCommaSeparated; - private JRadioButton myJspOneImportPerDirective; private JPanel myGeneralPanel; - private JPanel myJSPPanel; private JPanel myPackagesPanel; private JPanel myImportsLayoutPanel; private JPanel myWholePanel; @@ -56,7 +53,6 @@ public class CodeStyleImportsPanel extends JPanel { add(myWholePanel, BorderLayout.CENTER); myGeneralPanel.add(createGeneralOptionsPanel(), BorderLayout.CENTER); - myJSPPanel.add(createJspImportLayoutPanel(), BorderLayout.CENTER); createImportPanel(); createPackagePanel(); } @@ -77,47 +73,6 @@ public class CodeStyleImportsPanel extends JPanel { myPackagesPanel.add(PackagePanel.createPackagesPanel(myPackageTable, myPackageList), BorderLayout.CENTER); } - private JPanel createJspImportLayoutPanel() { - ButtonGroup buttonGroup = new ButtonGroup(); - myJspImportCommaSeparated = new JRadioButton(ApplicationBundle.message("radio.prefer.comma.separated.import.list")); - myJspOneImportPerDirective = new JRadioButton(ApplicationBundle.message("radio.prefer.one.import.statement.per.page.directive")); - buttonGroup.add(myJspImportCommaSeparated); - buttonGroup.add(myJspOneImportPerDirective); - JPanel btnPanel = new JPanel(new BorderLayout()); - btnPanel.add(myJspImportCommaSeparated, BorderLayout.NORTH); - btnPanel.add(myJspOneImportPerDirective, BorderLayout.CENTER); - - //noinspection HardCodedStringLiteral - final MultiLineLabel commaSeparatedLabel = new MultiLineLabel("<% page import=\"com.company.Boo, \n" + - " com.company.Far\"%>"); - //noinspection HardCodedStringLiteral - final MultiLineLabel oneImportPerDirectiveLabel = new MultiLineLabel("<% page import=\"com.company.Boo\"%>\n" + - "<% page import=\"com.company.Far\"%>"); - final JPanel labelPanel = new JPanel(new BorderLayout()); - labelPanel.setBorder( - BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(20, 10, 0, 0), IdeBorderFactory.createTitledBorder( - ApplicationBundle.message("title.preview"), false))); - - JPanel resultPanel = new JPanel(new BorderLayout()); - resultPanel.add(btnPanel, BorderLayout.NORTH); - resultPanel.add(labelPanel, BorderLayout.CENTER); - resultPanel.setBorder(IdeBorderFactory.createTitledBorder(ApplicationBundle.message("title.jsp.imports.layout"), true)); - - - ActionListener actionListener = new ActionListener() { - public void actionPerformed(ActionEvent e) { - boolean isComma = myJspImportCommaSeparated.isSelected(); - labelPanel.removeAll(); - labelPanel.add(isComma ? commaSeparatedLabel : oneImportPerDirectiveLabel, BorderLayout.NORTH); - labelPanel.repaint(); - labelPanel.revalidate(); - } - }; - myJspImportCommaSeparated.addActionListener(actionListener); - myJspOneImportPerDirective.addActionListener(actionListener); - return resultPanel; - } - private JPanel createGeneralOptionsPanel() { OptionGroup group = new OptionGroup(ApplicationBundle.message("title.general")); myCbUseSingleClassImports = new JCheckBox(ApplicationBundle.message("checkbox.use.single.class.import")); @@ -139,13 +94,13 @@ public class CodeStyleImportsPanel extends JPanel { new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 3, 0, 0), 0, 0)); panel.add(myClassCountField, - new GridBagConstraints(1, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, + new GridBagConstraints(1, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 1, 0, 0), 0, 0)); panel.add(new JLabel(ApplicationBundle.message("editbox.names.count.to.use.static.import.with.star")), new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 3, 0, 0), 0, 0)); panel.add(myNamesCountField, - new GridBagConstraints(1, GridBagConstraints.RELATIVE, 1, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, + new GridBagConstraints(1, GridBagConstraints.RELATIVE, 1, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 1, 0, 0), 0, 0)); group.add(panel); @@ -185,13 +140,6 @@ public class CodeStyleImportsPanel extends JPanel { if (myPackageTable.getRowCount() > 0) { myPackageTable.getSelectionModel().setSelectionInterval(0, 0); } - - if (settings.JSP_PREFER_COMMA_SEPARATED_IMPORT_LIST) { - myJspImportCommaSeparated.doClick(); - } - else { - myJspOneImportPerDirective.doClick(); - } } public void reset() { @@ -225,8 +173,6 @@ public class CodeStyleImportsPanel extends JPanel { myPackageList.removeEmptyPackages(); settings.PACKAGES_TO_USE_IMPORT_ON_DEMAND.copyFrom(myPackageList); - settings.JSP_PREFER_COMMA_SEPARATED_IMPORT_LIST = myJspImportCommaSeparated.isSelected(); - myFqnInJavadocOption.apply(settings); } @@ -250,7 +196,6 @@ public class CodeStyleImportsPanel extends JPanel { isModified |= isModified(myImportLayoutPanel.getImportLayoutList(), settings.IMPORT_LAYOUT_TABLE); isModified |= isModified(myPackageList, settings.PACKAGES_TO_USE_IMPORT_ON_DEMAND); - isModified |= settings.JSP_PREFER_COMMA_SEPARATED_IMPORT_LIST != myJspImportCommaSeparated.isSelected(); return isModified; } diff --git a/java/java-impl/src/com/intellij/application/options/FullyQualifiedNamesInJavadocOptionProvider.java b/java/java-impl/src/com/intellij/application/options/FullyQualifiedNamesInJavadocOptionProvider.java index 3bd00bfb3110..fd66d06561a8 100644 --- a/java/java-impl/src/com/intellij/application/options/FullyQualifiedNamesInJavadocOptionProvider.java +++ b/java/java-impl/src/com/intellij/application/options/FullyQualifiedNamesInJavadocOptionProvider.java @@ -16,64 +16,49 @@ package com.intellij.application.options; import com.intellij.openapi.application.ApplicationBundle; +import com.intellij.openapi.ui.ComboBox; import com.intellij.psi.codeStyle.CodeStyleSettings; import com.intellij.psi.codeStyle.JavaCodeStyleSettings; +import com.intellij.ui.ListCellRendererWrapper; import org.jetbrains.annotations.NotNull; import javax.swing.*; +import java.awt.*; + import static com.intellij.psi.codeStyle.JavaCodeStyleSettings.FULLY_QUALIFY_NAMES_ALWAYS; import static com.intellij.psi.codeStyle.JavaCodeStyleSettings.FULLY_QUALIFY_NAMES_IF_NOT_IMPORTED; import static com.intellij.psi.codeStyle.JavaCodeStyleSettings.SHORTEN_NAMES_ALWAYS_AND_ADD_IMPORT; public class FullyQualifiedNamesInJavadocOptionProvider { - - private JRadioButton myFullyQualifyNamesAlways; - private JRadioButton myShortenNamesAlways; - private JRadioButton myFullyQualifyIfNotImported; - + private JPanel myPanel; + private ComboBox myComboBox; public FullyQualifiedNamesInJavadocOptionProvider(@NotNull CodeStyleSettings settings) { composePanel(); reset(settings); } - + public void reset(@NotNull CodeStyleSettings settings) { JavaCodeStyleSettings javaSettings = settings.getCustomSettings(JavaCodeStyleSettings.class); - int classNamesInJavadoc = javaSettings.CLASS_NAMES_IN_JAVADOC; - - if (classNamesInJavadoc == FULLY_QUALIFY_NAMES_ALWAYS) { - myFullyQualifyNamesAlways.setSelected(true); - } - else if (classNamesInJavadoc == SHORTEN_NAMES_ALWAYS_AND_ADD_IMPORT) { - myShortenNamesAlways.setSelected(true); - } - else { - myFullyQualifyIfNotImported.setSelected(true); - } + QualifyJavadocOptions option = QualifyJavadocOptions.fromIntValue(javaSettings.CLASS_NAMES_IN_JAVADOC); + myComboBox.setSelectedItem(option); } public void apply(@NotNull CodeStyleSettings settings) { JavaCodeStyleSettings javaSettings = settings.getCustomSettings(JavaCodeStyleSettings.class); - javaSettings.CLASS_NAMES_IN_JAVADOC = getIntValueFromSelectedRadioButton(); + javaSettings.CLASS_NAMES_IN_JAVADOC = getSelectedIntOptionValue(); } public boolean isModified(CodeStyleSettings settings) { JavaCodeStyleSettings javaSettings = settings.getCustomSettings(JavaCodeStyleSettings.class); - return javaSettings.CLASS_NAMES_IN_JAVADOC != getIntValueFromSelectedRadioButton(); + return javaSettings.CLASS_NAMES_IN_JAVADOC != getSelectedIntOptionValue(); } - private int getIntValueFromSelectedRadioButton() { - if (myFullyQualifyNamesAlways.isSelected()) { - return FULLY_QUALIFY_NAMES_ALWAYS; - } - else if (myShortenNamesAlways.isSelected()) { - return SHORTEN_NAMES_ALWAYS_AND_ADD_IMPORT; - } - else { - return FULLY_QUALIFY_NAMES_IF_NOT_IMPORTED; - } + private int getSelectedIntOptionValue() { + QualifyJavadocOptions item = (QualifyJavadocOptions)myComboBox.getSelectedItem(); + return item.getIntOptionValue(); } @NotNull @@ -82,30 +67,63 @@ public class FullyQualifiedNamesInJavadocOptionProvider { } private void composePanel() { - myPanel = new JPanel(); - BoxLayout boxLayout = new BoxLayout(myPanel, BoxLayout.Y_AXIS); - myPanel.setLayout(boxLayout); + myPanel = new JPanel(new GridBagLayout()); + + myComboBox = new ComboBox(); + for (QualifyJavadocOptions options : QualifyJavadocOptions.values()) { + myComboBox.addItem(options); + } + myComboBox.setRenderer(new ListCellRendererWrapper() { + @Override + public void customize(final JList list, final Object value, final int index, final boolean selected, final boolean hasFocus) { + if (value instanceof QualifyJavadocOptions) { + setText(((QualifyJavadocOptions)value).getPresentableText()); + } + } + }); JLabel title = new JLabel(ApplicationBundle.message("radio.use.fully.qualified.class.names.in.javadoc")); - title.setBorder(BorderFactory.createEmptyBorder(0, 0, 5, 0)); - - myFullyQualifyNamesAlways = new JRadioButton(ApplicationBundle.message("radio.use.fully.qualified.class.names.in.javadoc.always")); - myFullyQualifyNamesAlways.setBorder(BorderFactory.createEmptyBorder(0, 15, 0, 0)); + myPanel.setBorder(BorderFactory.createEmptyBorder(5, 0, 5, 0)); - myShortenNamesAlways = new JRadioButton(ApplicationBundle.message("radio.use.fully.qualified.class.names.in.javadoc.never")); - myShortenNamesAlways.setBorder(BorderFactory.createEmptyBorder(0, 15, 0, 0)); + GridBagConstraints left = new GridBagConstraints(); + left.anchor = GridBagConstraints.WEST; - myFullyQualifyIfNotImported = new JRadioButton(ApplicationBundle.message("radio.use.fully.qualified.class.names.in.javadoc.if.not.imported")); - myFullyQualifyIfNotImported.setBorder(BorderFactory.createEmptyBorder(0, 15, 0, 0)); + GridBagConstraints right = new GridBagConstraints(); + right.anchor = GridBagConstraints.WEST; + right.weightx = 1.0; + right.insets = new Insets(0, 5, 0, 0); - ButtonGroup group = new ButtonGroup(); - group.add(myFullyQualifyNamesAlways); - group.add(myShortenNamesAlways); - group.add(myFullyQualifyIfNotImported); + myPanel.add(title, left); + myPanel.add(myComboBox, right); + } +} - myPanel.add(title); - myPanel.add(myFullyQualifyNamesAlways); - myPanel.add(myFullyQualifyIfNotImported); - myPanel.add(myShortenNamesAlways); +enum QualifyJavadocOptions { + + FQ_ALWAYS(FULLY_QUALIFY_NAMES_ALWAYS, ApplicationBundle.message("radio.use.fully.qualified.class.names.in.javadoc.always")), + SHORTEN_ALWAYS(SHORTEN_NAMES_ALWAYS_AND_ADD_IMPORT, ApplicationBundle.message("radio.use.fully.qualified.class.names.in.javadoc.never")), + FQ_WHEN_NOT_IMPORTED(FULLY_QUALIFY_NAMES_IF_NOT_IMPORTED, ApplicationBundle.message("radio.use.fully.qualified.class.names.in.javadoc.if.not.imported")); + + private final String myText; + private final int myOption; + + public String getPresentableText() { + return myText; + } + + public int getIntOptionValue() { + return myOption; + } + + public static QualifyJavadocOptions fromIntValue(int value) { + for (QualifyJavadocOptions option : values()) { + if (option.myOption == value) return option; + } + return FQ_WHEN_NOT_IMPORTED; + } + + QualifyJavadocOptions(int option, String text) { + myOption = option; + myText = text; } } \ No newline at end of file diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/defaultHashCode.vm b/java/java-impl/src/com/intellij/codeInsight/generation/defaultHashCode.vm index e4c51becd08c..a37759ce7bd8 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/defaultHashCode.vm +++ b/java/java-impl/src/com/intellij/codeInsight/generation/defaultHashCode.vm @@ -78,11 +78,12 @@ public int hashCode() { #end ## #macro(adjustHashCodeToArrays $field) -#if ($field.array && $java_version > 4) -#if ($field.nestedArray) -// Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode + #if ($field.array && $java_version > 4) + #if ($field.nestedArray) + java.util.Arrays.deepHashCode($field.accessor)## + #else + java.util.Arrays.hashCode($field.accessor)## #end - java.util.Arrays.hashCode($field.accessor)## #else ${field.accessor}.hashCode()## #end diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/objectsEquals.vm b/java/java-impl/src/com/intellij/codeInsight/generation/objectsEquals.vm index 5e240f9f73d2..f87075daf08e 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/objectsEquals.vm +++ b/java/java-impl/src/com/intellij/codeInsight/generation/objectsEquals.vm @@ -13,15 +13,7 @@ Object $paramName){ && #end #set($i = $i + 1) - #if ($field.array) - #if ($field.nestedArray) -java.util.Arrays.deepEquals($field.accessor, ${classInstanceName}.$field.accessor)## - #else -java.util.Arrays.equals($field.accessor, ${classInstanceName}.$field.accessor)## - #end - #else java.util.Objects.equals($field.accessor, ${classInstanceName}.$field.accessor)## - #end #end ; } \ No newline at end of file diff --git a/java/java-impl/src/com/intellij/lang/java/JavaDocumentationProvider.java b/java/java-impl/src/com/intellij/lang/java/JavaDocumentationProvider.java index cf5eea20c05d..97b4cab5aae1 100644 --- a/java/java-impl/src/com/intellij/lang/java/JavaDocumentationProvider.java +++ b/java/java-impl/src/com/intellij/lang/java/JavaDocumentationProvider.java @@ -42,6 +42,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileSystem; import com.intellij.psi.*; import com.intellij.psi.impl.beanProperties.BeanPropertyElement; +import com.intellij.psi.impl.compiled.ClsElementImpl; import com.intellij.psi.impl.source.javadoc.PsiDocParamRef; import com.intellij.psi.infos.CandidateInfo; import com.intellij.psi.javadoc.PsiDocComment; @@ -479,6 +480,13 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext @Override public String generateDoc(PsiElement element, PsiElement originalElement) { + PsiCompiledElement originalCompiledElement = element.getUserData(ClsElementImpl.COMPILED_ELEMENT); + if (originalCompiledElement != null) { + // take compiled element instead decompiled one for finding proper documentation (IDEA-96013) + // it will not be needed iff TargetElementUtilBase stops preferring decompiled source + // via ((PsiCompiledFile) file).getDecompiledPsiFile() + element = originalCompiledElement; + } if (element instanceof PsiExpressionList) { element = element.getParent(); // for new Class() or methodCall() proceed from method call or new expression originalElement = null; diff --git a/java/java-impl/src/com/intellij/psi/impl/smartPointers/AnchorElementInfo.java b/java/java-impl/src/com/intellij/psi/impl/smartPointers/AnchorElementInfo.java index c3319d2d2ce7..aae94191f942 100644 --- a/java/java-impl/src/com/intellij/psi/impl/smartPointers/AnchorElementInfo.java +++ b/java/java-impl/src/com/intellij/psi/impl/smartPointers/AnchorElementInfo.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2010 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -34,13 +34,13 @@ import org.jetbrains.annotations.Nullable; * User: cdr */ class AnchorElementInfo extends SelfElementInfo { - private int stubId = -1; + private int stubId; private IStubElementType myStubElementType; AnchorElementInfo(@NotNull PsiElement anchor, @NotNull PsiFile containingFile) { - super(containingFile.getProject(), ProperTextRange.create(anchor.getTextRange()), anchor.getClass(), containingFile, - LanguageUtil.getRootLanguage(anchor)); + super(containingFile.getProject(), ProperTextRange.create(anchor.getTextRange()), anchor.getClass(), containingFile, LanguageUtil.getRootLanguage(anchor)); assert !(anchor instanceof PsiFile) : "FileElementInfo must be used for file: "+anchor; + stubId = -1; } // will restore by stub index until file tree get loaded AnchorElementInfo(@NotNull PsiElement anchor, diff --git a/java/java-impl/src/com/intellij/psi/refResolve/PersistentIntList.java b/java/java-impl/src/com/intellij/psi/refResolve/PersistentIntList.java index 03d0ee883d47..d3fc1e65486c 100644 --- a/java/java-impl/src/com/intellij/psi/refResolve/PersistentIntList.java +++ b/java/java-impl/src/com/intellij/psi/refResolve/PersistentIntList.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -44,17 +44,17 @@ class PersistentIntList implements Disposable { public PersistentIntList(@NotNull File dataFile, int initialSize) throws IOException { data = new RandomAccessFile(dataFile, "rw").getChannel(); int pointersBase; - int initialCapacity = initialSize + 256; - if (initialSize != 0) { + int initialCapacity = Math.min((initialSize+1)*2, initialSize + 256); + if (initialSize == 0) { + pointersBase = readInt(data, 0); + } + else { writeInt(data, 0, 4); // base of the pointers array writeInt(data, 4, initialSize); writeInt(data, 8, initialCapacity); fillWithZeros(data, 4 + 8, initialCapacity *4); pointersBase = 4; } - else { - pointersBase = readInt(data, 0); - } pointers = new IntArray(data, pointersBase); if (initialSize != 0) { assert pointers.size == initialSize; diff --git a/java/java-impl/src/com/intellij/refactoring/util/RefactoringConflictsUtil.java b/java/java-impl/src/com/intellij/refactoring/util/RefactoringConflictsUtil.java index aece13de0764..19a6be869c43 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/RefactoringConflictsUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/util/RefactoringConflictsUtil.java @@ -134,11 +134,22 @@ public class RefactoringConflictsUtil { } } + public static void checkUsedElements(PsiMember member, + PsiElement scope, + @NotNull Set membersToMove, + @Nullable Set abstractMethods, + @Nullable PsiClass targetClass, + @NotNull PsiElement context, + MultiMap conflicts) { + checkUsedElements(member, scope, membersToMove, abstractMethods, targetClass, null, context, conflicts); + } + public static void checkUsedElements(PsiMember member, PsiElement scope, @NotNull Set membersToMove, @Nullable Set abstractMethods, @Nullable PsiClass targetClass, + PsiClass accessClass, @NotNull PsiElement context, MultiMap conflicts) { final Set moving = new HashSet(membersToMove); @@ -150,10 +161,10 @@ public class RefactoringConflictsUtil { PsiElement refElement = refExpr.resolve(); if (refElement instanceof PsiMember) { PsiExpression qualifier = refExpr.getQualifierExpression(); - PsiClass accessClass = (PsiClass)(qualifier != null ? PsiUtil.getAccessObjectClass(qualifier).getElement() : null); + PsiClass qualifierAccessClass = (PsiClass)(qualifier != null && !(qualifier instanceof PsiSuperExpression) ? PsiUtil.getAccessObjectClass(qualifier).getElement() : accessClass); if (!RefactoringHierarchyUtil.willBeInTargetClass(refElement, moving, targetClass, false) && - (accessClass == null || !RefactoringHierarchyUtil.willBeInTargetClass(accessClass, moving, targetClass, false))) { - checkAccessibility((PsiMember)refElement, context, accessClass, member, conflicts); + (qualifierAccessClass == null || !RefactoringHierarchyUtil.willBeInTargetClass(qualifierAccessClass, moving, targetClass, false))) { + checkAccessibility((PsiMember)refElement, context, qualifierAccessClass, member, conflicts); } } } @@ -169,7 +180,7 @@ public class RefactoringConflictsUtil { final PsiMethod refElement = newExpression.resolveConstructor(); if (refElement != null) { if (!RefactoringHierarchyUtil.willBeInTargetClass(refElement, moving, targetClass, false)) { - checkAccessibility(refElement, context, null, member, conflicts); + checkAccessibility(refElement, context, accessClass, member, conflicts); } } } @@ -179,14 +190,14 @@ public class RefactoringConflictsUtil { PsiElement refElement = refExpr.resolve(); if (refElement instanceof PsiMember) { if (!RefactoringHierarchyUtil.willBeInTargetClass(refElement, moving, targetClass, false)) { - checkAccessibility((PsiMember)refElement, context, null, member, conflicts); + checkAccessibility((PsiMember)refElement, context, accessClass, member, conflicts); } } } for (PsiElement child : scope.getChildren()) { if (child instanceof PsiWhiteSpace || child instanceof PsiComment) continue; - checkUsedElements(member, child, membersToMove, abstractMethods, targetClass, context, conflicts); + checkUsedElements(member, child, membersToMove, abstractMethods, targetClass, child instanceof PsiClass ? (PsiClass)child : accessClass, context, conflicts); } } diff --git a/java/java-psi-api/src/com/intellij/psi/javadoc/PsiDocComment.java b/java/java-psi-api/src/com/intellij/psi/javadoc/PsiDocComment.java index 081d0ce90206..b727ec7f3806 100644 --- a/java/java-psi-api/src/com/intellij/psi/javadoc/PsiDocComment.java +++ b/java/java-psi-api/src/com/intellij/psi/javadoc/PsiDocComment.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -23,20 +23,40 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +/** + * Represents a JavaDoc comment. + */ public interface PsiDocComment extends PsiComment, PsiDocCommentBase { + /** + * Returns the class, method or field described by the comment. + */ @Override @Nullable PsiDocCommentOwner getOwner(); + /** + * Returns the PSI elements containing the description of the element being documented + * (all significant tokens up to the first doc comment tag). + */ @NotNull PsiElement[] getDescriptionElements(); + /** + * Returns the list of JavaDoc tags in the comment. + */ @NotNull PsiDocTag[] getTags(); + /** + * Finds the first JavaDoc tag with the specified name. + * @return the tag with the specified name, or null if not found. + */ @Nullable PsiDocTag findTagByName(@NonNls String name); + /** + * Finds all JavaDoc tags with the specified name. + */ @NotNull PsiDocTag[] findTagsByName(@NonNls String name); } \ No newline at end of file diff --git a/java/java-psi-api/src/com/intellij/psi/javadoc/PsiDocTag.java b/java/java-psi-api/src/com/intellij/psi/javadoc/PsiDocTag.java index f2dfe9165036..6ae7d1321ebb 100644 --- a/java/java-psi-api/src/com/intellij/psi/javadoc/PsiDocTag.java +++ b/java/java-psi-api/src/com/intellij/psi/javadoc/PsiDocTag.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -22,13 +22,38 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public interface PsiDocTag extends PsiElement, PsiNamedElement{ +/** + * Represents a JavaDoc tag (either an inline tag or a block tag). + */ +public interface PsiDocTag extends PsiElement, PsiNamedElement { PsiDocTag[] EMPTY_ARRAY = new PsiDocTag[0]; + /** + * Returns the doc comment in which the tag is conained. + */ PsiDocComment getContainingComment(); + + /** + * Returns the token representing the name of this JavaDoc tag. + */ PsiElement getNameElement(); + + /** + * Returns the name of this JavaDoc tag. + */ @Override @NonNls @NotNull String getName(); + + /** + * Returns the list of all elements representing the contents of a tag. + */ PsiElement[] getDataElements(); + + /** + * Returns the element specifying what exactly is being documented by this tag + * (for example, the parameter name for a param tag or the exception name for a throws tag). + * + * @return the element, or null if the tag structure does not include such an element. + */ @Nullable PsiDocTagValue getValueElement(); } \ No newline at end of file diff --git a/java/java-psi-api/src/com/intellij/psi/javadoc/PsiDocToken.java b/java/java-psi-api/src/com/intellij/psi/javadoc/PsiDocToken.java index c515bbd58d79..f44565286d81 100644 --- a/java/java-psi-api/src/com/intellij/psi/javadoc/PsiDocToken.java +++ b/java/java-psi-api/src/com/intellij/psi/javadoc/PsiDocToken.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -19,8 +19,13 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.tree.IElementType; /** + * Represents a token inside a JavaDoc comment. + * * @author Mike */ public interface PsiDocToken extends PsiElement { + /** + * Returns the element type of this token. + */ IElementType getTokenType(); } diff --git a/java/java-psi-api/src/com/intellij/psi/javadoc/PsiInlineDocTag.java b/java/java-psi-api/src/com/intellij/psi/javadoc/PsiInlineDocTag.java index 535868cc0b1c..b22b44bd4cf3 100644 --- a/java/java-psi-api/src/com/intellij/psi/javadoc/PsiInlineDocTag.java +++ b/java/java-psi-api/src/com/intellij/psi/javadoc/PsiInlineDocTag.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -15,5 +15,8 @@ */ package com.intellij.psi.javadoc; +/** + * Represents an inline JavaDoc tag. + */ public interface PsiInlineDocTag extends PsiDocTag { } \ No newline at end of file diff --git a/java/java-psi-api/src/com/intellij/psi/util/RedundantCastUtil.java b/java/java-psi-api/src/com/intellij/psi/util/RedundantCastUtil.java index 02566166fa28..d11b4a9cf984 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/RedundantCastUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/util/RedundantCastUtil.java @@ -204,7 +204,14 @@ public class RedundantCastUtil { if (rExpr instanceof PsiTypeCastExpression) { PsiExpression castOperand = ((PsiTypeCastExpression)rExpr).getOperand(); if (castOperand != null) { - PsiType operandType = castOperand.getType(); + PsiType operandType; + if (castOperand instanceof PsiTypeCastExpression) { + final PsiExpression nestedCastOperand = ((PsiTypeCastExpression)castOperand).getOperand(); + operandType = nestedCastOperand != null ? nestedCastOperand.getType() : null; + } + else { + operandType = castOperand.getType(); + } if (operandType != null) { if (lType != null && TypeConversionUtil.isAssignable(lType, operandType, false)) { addToResults((PsiTypeCastExpression)rExpr); diff --git a/java/java-tests/testData/codeInsight/generateEquals/afterArraysFromJava15.java b/java/java-tests/testData/codeInsight/generateEquals/afterArraysFromJava15.java index c97281035edd..dca0073b3c7b 100644 --- a/java/java-tests/testData/codeInsight/generateEquals/afterArraysFromJava15.java +++ b/java/java-tests/testData/codeInsight/generateEquals/afterArraysFromJava15.java @@ -21,8 +21,7 @@ class Test { public int hashCode() { int result = myOs != null ? Arrays.hashCode(myOs) : 0; - result = 31 * result + (myIIs != null ? // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode - Arrays.hashCode(myIIs) : 0); + result = 31 * result + (myIIs != null ? Arrays.deepHashCode(myIIs) : 0); result = 31 * result + (myIs != null ? Arrays.hashCode(myIs) : 0); return result; } diff --git a/java/java-tests/testData/codeInsight/generateEquals/afterDifferentTypes.java b/java/java-tests/testData/codeInsight/generateEquals/afterDifferentTypes.java index fc6c3314aeff..b81281d9e49b 100644 --- a/java/java-tests/testData/codeInsight/generateEquals/afterDifferentTypes.java +++ b/java/java-tests/testData/codeInsight/generateEquals/afterDifferentTypes.java @@ -51,14 +51,11 @@ class A { int result; long temp; result = a1 != null ? Arrays.hashCode(a1) : 0; - result = 31 * result + (a2 != null ? // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode - Arrays.hashCode(a2) : 0); + result = 31 * result + (a2 != null ? Arrays.deepHashCode(a2) : 0); result = 31 * result + (a3 != null ? Arrays.hashCode(a3) : 0); - result = 31 * result + (a4 != null ? // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode - Arrays.hashCode(a4) : 0); + result = 31 * result + (a4 != null ? Arrays.deepHashCode(a4) : 0); result = 31 * result + (a5 != null ? Arrays.hashCode(a5) : 0); - result = 31 * result + (a6 != null ? // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode - Arrays.hashCode(a6) : 0); + result = 31 * result + (a6 != null ? Arrays.deepHashCode(a6) : 0); result = 31 * result + (int) a7; result = 31 * result + (int) a8; result = 31 * result + a9; diff --git a/java/java-tests/testData/codeInsight/generateEquals/afterDifferentTypesAllNotNull.java b/java/java-tests/testData/codeInsight/generateEquals/afterDifferentTypesAllNotNull.java index 6465e3455ad8..98a7fa6c18bf 100644 --- a/java/java-tests/testData/codeInsight/generateEquals/afterDifferentTypesAllNotNull.java +++ b/java/java-tests/testData/codeInsight/generateEquals/afterDifferentTypesAllNotNull.java @@ -51,14 +51,11 @@ class A { int result; long temp; result = Arrays.hashCode(a1); - result = 31 * result + // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode - Arrays.hashCode(a2); + result = 31 * result + Arrays.deepHashCode(a2); result = 31 * result + Arrays.hashCode(a3); - result = 31 * result + // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode - Arrays.hashCode(a4); + result = 31 * result + Arrays.deepHashCode(a4); result = 31 * result + Arrays.hashCode(a5); - result = 31 * result + // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode - Arrays.hashCode(a6); + result = 31 * result + Arrays.deepHashCode(a6); result = 31 * result + (int) a7; result = 31 * result + (int) a8; result = 31 * result + a9; diff --git a/java/java-tests/testData/codeInsight/generateEquals/afterDifferentTypesGetters.java b/java/java-tests/testData/codeInsight/generateEquals/afterDifferentTypesGetters.java index c807dcf489de..69bf70d1ec08 100644 --- a/java/java-tests/testData/codeInsight/generateEquals/afterDifferentTypesGetters.java +++ b/java/java-tests/testData/codeInsight/generateEquals/afterDifferentTypesGetters.java @@ -99,14 +99,11 @@ class A { int result; long temp; result = getA1() != null ? Arrays.hashCode(getA1()) : 0; - result = 31 * result + (getA2() != null ? // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode - Arrays.hashCode(getA2()) : 0); + result = 31 * result + (getA2() != null ? Arrays.deepHashCode(getA2()) : 0); result = 31 * result + (getA3() != null ? Arrays.hashCode(getA3()) : 0); - result = 31 * result + (getA4() != null ? // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode - Arrays.hashCode(getA4()) : 0); + result = 31 * result + (getA4() != null ? Arrays.deepHashCode(getA4()) : 0); result = 31 * result + (getA5() != null ? Arrays.hashCode(getA5()) : 0); - result = 31 * result + (getA6() != null ? // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode - Arrays.hashCode(getA6()) : 0); + result = 31 * result + (getA6() != null ? Arrays.deepHashCode(getA6()) : 0); result = 31 * result + (int) getA7(); result = 31 * result + (int) getA8(); result = 31 * result + getA9(); diff --git a/java/java-tests/testData/codeInsight/generateEquals/afterDifferentTypesNoDouble.java b/java/java-tests/testData/codeInsight/generateEquals/afterDifferentTypesNoDouble.java index 29b89feff7d2..5a3e505e01e8 100644 --- a/java/java-tests/testData/codeInsight/generateEquals/afterDifferentTypesNoDouble.java +++ b/java/java-tests/testData/codeInsight/generateEquals/afterDifferentTypesNoDouble.java @@ -47,14 +47,11 @@ class A { @Override public int hashCode() { int result = Arrays.hashCode(a1); - result = 31 * result + // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode - Arrays.hashCode(a2); + result = 31 * result + Arrays.deepHashCode(a2); result = 31 * result + Arrays.hashCode(a3); - result = 31 * result + // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode - Arrays.hashCode(a4); + result = 31 * result + Arrays.deepHashCode(a4); result = 31 * result + Arrays.hashCode(a5); - result = 31 * result + // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode - Arrays.hashCode(a6); + result = 31 * result + Arrays.deepHashCode(a6); result = 31 * result + (int) a7; result = 31 * result + (int) a8; result = 31 * result + a9; diff --git a/java/java-tests/testData/codeInsight/generateEquals/afterDifferentTypesSuperEqualsAndHashCode.java b/java/java-tests/testData/codeInsight/generateEquals/afterDifferentTypesSuperEqualsAndHashCode.java index 5ce0416adf60..629408b134ca 100644 --- a/java/java-tests/testData/codeInsight/generateEquals/afterDifferentTypesSuperEqualsAndHashCode.java +++ b/java/java-tests/testData/codeInsight/generateEquals/afterDifferentTypesSuperEqualsAndHashCode.java @@ -63,14 +63,11 @@ class A extends B { int result = super.hashCode(); long temp; result = 31 * result + Arrays.hashCode(a1); - result = 31 * result + // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode - Arrays.hashCode(a2); + result = 31 * result + Arrays.deepHashCode(a2); result = 31 * result + Arrays.hashCode(a3); - result = 31 * result + // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode - Arrays.hashCode(a4); + result = 31 * result + Arrays.deepHashCode(a4); result = 31 * result + Arrays.hashCode(a5); - result = 31 * result + // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode - Arrays.hashCode(a6); + result = 31 * result + Arrays.deepHashCode(a6); result = 31 * result + (int) a7; result = 31 * result + (int) a8; result = 31 * result + a9; diff --git a/java/java-tests/testData/codeInsight/generateEquals/afterNameConflicts.java b/java/java-tests/testData/codeInsight/generateEquals/afterNameConflicts.java index ff36c08a04e0..37194104a2ed 100644 --- a/java/java-tests/testData/codeInsight/generateEquals/afterNameConflicts.java +++ b/java/java-tests/testData/codeInsight/generateEquals/afterNameConflicts.java @@ -51,14 +51,11 @@ class A { int result1; long temp1; result1 = Arrays.hashCode(a1); - result1 = 31 * result1 + // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode - Arrays.hashCode(a2); + result1 = 31 * result1 + Arrays.deepHashCode(a2); result1 = 31 * result1 + Arrays.hashCode(a3); - result1 = 31 * result1 + // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode - Arrays.hashCode(a4); + result1 = 31 * result1 + Arrays.deepHashCode(a4); result1 = 31 * result1 + Arrays.hashCode(a5); - result1 = 31 * result1 + // Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode - Arrays.hashCode(a6); + result1 = 31 * result1 + Arrays.deepHashCode(a6); result1 = 31 * result1 + (int) a7; result1 = 31 * result1 + (int) a8; result1 = 31 * result1 + a9; diff --git a/java/java-tests/testData/inspection/redundantCast/DoubleCast3/expected.xml b/java/java-tests/testData/inspection/redundantCast/DoubleCast3/expected.xml index e8c201ce3315..49a614757885 100644 --- a/java/java-tests/testData/inspection/redundantCast/DoubleCast3/expected.xml +++ b/java/java-tests/testData/inspection/redundantCast/DoubleCast3/expected.xml @@ -3,12 +3,17 @@ DoubleCast3.java 4 - Casting '(String) o' to String is redundant + Casting 'o' to String is redundant DoubleCast3.java - 4 - Casting 'o' to String is redundant + 6 + Casting '(String) s' to String is redundant + + + DoubleCast3.java + 6 + Casting 's' to String is redundant diff --git a/java/java-tests/testData/inspection/redundantCast/DoubleCast3/src/DoubleCast3.java b/java/java-tests/testData/inspection/redundantCast/DoubleCast3/src/DoubleCast3.java index 36da9cba2007..a4bcb59f55b0 100644 --- a/java/java-tests/testData/inspection/redundantCast/DoubleCast3/src/DoubleCast3.java +++ b/java/java-tests/testData/inspection/redundantCast/DoubleCast3/src/DoubleCast3.java @@ -2,5 +2,7 @@ class Test{ static f(){ Object o; String s = (String) (String) o; + + String s2 = (String) (String) s; } } diff --git a/java/java-tests/testData/refactoring/pullUp/accessibleViaInheritanceInsideAnonymousClass/after/a/A.java b/java/java-tests/testData/refactoring/pullUp/accessibleViaInheritanceInsideAnonymousClass/after/a/A.java new file mode 100644 index 000000000000..34dee12da94d --- /dev/null +++ b/java/java-tests/testData/refactoring/pullUp/accessibleViaInheritanceInsideAnonymousClass/after/a/A.java @@ -0,0 +1,9 @@ +package a; +import b.B; +public class A extends B { + + protected static void bar(){} + public static class I { + protected void foo(){} + } +} diff --git a/java/java-tests/testData/refactoring/pullUp/accessibleViaInheritanceInsideAnonymousClass/after/b/B.java b/java/java-tests/testData/refactoring/pullUp/accessibleViaInheritanceInsideAnonymousClass/after/b/B.java new file mode 100644 index 000000000000..eed100e87513 --- /dev/null +++ b/java/java-tests/testData/refactoring/pullUp/accessibleViaInheritanceInsideAnonymousClass/after/b/B.java @@ -0,0 +1,15 @@ +package b; + +import a.A; + +public class B { + void method2Move() { + new A.I() { + { + super.foo(); + foo(); + A.bar(); + } + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/pullUp/accessibleViaInheritanceInsideAnonymousClass/before/a/A.java b/java/java-tests/testData/refactoring/pullUp/accessibleViaInheritanceInsideAnonymousClass/before/a/A.java new file mode 100644 index 000000000000..4e75f05ef8ec --- /dev/null +++ b/java/java-tests/testData/refactoring/pullUp/accessibleViaInheritanceInsideAnonymousClass/before/a/A.java @@ -0,0 +1,18 @@ +package a; +import b.B; +public class A extends B { + void method2Move() { + new I() { + { + super.foo(); + foo(); + bar(); + } + } + } + + protected static void bar(){} + public static class I { + protected void foo(){} + } +} diff --git a/java/java-tests/testData/refactoring/pullUp/accessibleViaInheritanceInsideAnonymousClass/before/b/B.java b/java/java-tests/testData/refactoring/pullUp/accessibleViaInheritanceInsideAnonymousClass/before/b/B.java new file mode 100644 index 000000000000..64950f347e93 --- /dev/null +++ b/java/java-tests/testData/refactoring/pullUp/accessibleViaInheritanceInsideAnonymousClass/before/b/B.java @@ -0,0 +1,3 @@ +package b; +public class B { +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/actions/AbstractLayoutCodeProcessorTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/actions/AbstractLayoutCodeProcessorTest.java index fbd85a3b62a5..366fd626baaf 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/actions/AbstractLayoutCodeProcessorTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/actions/AbstractLayoutCodeProcessorTest.java @@ -139,10 +139,10 @@ public abstract class AbstractLayoutCodeProcessorTest extends PsiTestCase { protected void performReformatActionOnSelectedFile(PsiFile file) { final AnAction action = getReformatCodeAction(); - action.actionPerformed(createEventFor(action, ContainerUtil.newArrayList(file), getProject(), new AdditionalEventInfo().setPsiElement(file))); + action.actionPerformed(createEventFor(action, ContainerUtil.newArrayList(file.getVirtualFile()), getProject(), new AdditionalEventInfo().setPsiElement(file))); } - protected void performReformatActionOnModule(Module module, List files) { + protected void performReformatActionOnModule(Module module, List files) { final AnAction action = getReformatCodeAction(); action.actionPerformed(createEventFor(action, files, getProject(), new AdditionalEventInfo().setModule(module))); } @@ -156,7 +156,7 @@ public abstract class AbstractLayoutCodeProcessorTest extends PsiTestCase { final AnAction action = getReformatCodeAction(); Document document = PsiDocumentManager.getInstance(getProject()).getDocument(file); Editor editor = EditorFactory.getInstance().createEditor(document); - action.actionPerformed(createEventFor(action, ContainerUtil.newArrayList(file), getProject(), new AdditionalEventInfo().setEditor(editor))); + action.actionPerformed(createEventFor(action, ContainerUtil.newArrayList(file.getVirtualFile()), getProject(), new AdditionalEventInfo().setEditor(editor))); EditorFactory.getInstance().releaseEditor(editor); } @@ -199,13 +199,12 @@ public abstract class AbstractLayoutCodeProcessorTest extends PsiTestCase { }, "", action.getTemplatePresentation(), ActionManager.getInstance(), 0); } - protected AnActionEvent createEventFor(AnAction action, List files, final Project project, @NotNull final AdditionalEventInfo eventInfo) { - final VirtualFile[] vFilesArray = getVirtualFileArrayFrom(files); + protected AnActionEvent createEventFor(AnAction action, final List files, final Project project, @NotNull final AdditionalEventInfo eventInfo) { return new AnActionEvent(null, new DataContext() { @Nullable @Override public Object getData(@NonNls String dataId) { - if (CommonDataKeys.VIRTUAL_FILE_ARRAY.is(dataId)) return vFilesArray; + if (CommonDataKeys.VIRTUAL_FILE_ARRAY.is(dataId)) return files.toArray(new VirtualFile[files.size()]); if (CommonDataKeys.PROJECT.is(dataId)) return project; if (CommonDataKeys.EDITOR.is(dataId)) return eventInfo.getEditor(); if (LangDataKeys.MODULE_CONTEXT.is(dataId)) return eventInfo.getModule(); diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/actions/ReformatCodeActionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/actions/ReformatCodeActionTest.java index f2cd858132db..b0e4024ff076 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/actions/ReformatCodeActionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/actions/ReformatCodeActionTest.java @@ -105,7 +105,7 @@ public class ReformatCodeActionTest extends AbstractLayoutCodeProcessorTest { List files = createTestFiles(srcDir, classNames); injectMockDialogFlags(new MockReformatFileSettings().setOptimizeImports(true)); - performReformatActionOnModule(module, files.subList(0, 1)); + performReformatActionOnModule(module, ContainerUtil.newArrayList(srcDir)); checkFormationAndImportsOptimizationFor(files); } diff --git a/java/java-tests/testSrc/com/intellij/refactoring/PullUpMultifileTest.java b/java/java-tests/testSrc/com/intellij/refactoring/PullUpMultifileTest.java index a1df6dba3b81..195f91ad62a5 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/PullUpMultifileTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/PullUpMultifileTest.java @@ -100,6 +100,10 @@ public class PullUpMultifileTest extends MultiFileTestCase { "Method method2Move() uses method A.foo(), which is not moved to the superclass"); } + public void testAccessibleViaInheritanceInsideAnonymousClass() throws Exception { + doTest("Method method2Move() uses method A.bar(), which is not accessible from the superclass"); + } + public void testReuseSuperMethod() throws Exception { doTest(); } diff --git a/lib/commons-net-3.1.jar b/lib/commons-net-3.1.jar deleted file mode 100644 index b75f1a51cc60..000000000000 Binary files a/lib/commons-net-3.1.jar and /dev/null differ diff --git a/lib/commons-net-3.3.jar b/lib/commons-net-3.3.jar new file mode 100644 index 000000000000..f4f19a902a93 Binary files /dev/null and b/lib/commons-net-3.3.jar differ diff --git a/lib/required_for_dist.txt b/lib/required_for_dist.txt index 5eedb6dc43c5..6525fb9804d5 100644 --- a/lib/required_for_dist.txt +++ b/lib/required_for_dist.txt @@ -8,7 +8,7 @@ cli-parser-1.1.jar commons-codec-1.8.jar commons-httpclient-3.1-patched.jar commons-logging-1.1.3.jar -commons-net-3.1.jar +commons-net-3.3.jar httpcore-4.3.3.jar httpclient-4.3.6.jar fluent-hc-4.3.6.jar diff --git a/lib/src/commons-net-3.1-sources.jar b/lib/src/commons-net-3.1-sources.jar deleted file mode 100644 index 37392ab0434c..000000000000 Binary files a/lib/src/commons-net-3.1-sources.jar and /dev/null differ diff --git a/lib/src/commons-net-3.3-sources.jar b/lib/src/commons-net-3.3-sources.jar new file mode 100644 index 000000000000..9dc8a3bc7d9f Binary files /dev/null and b/lib/src/commons-net-3.3-sources.jar differ diff --git a/lib/src/proxy-vole-20131209-src.zip b/lib/src/proxy-vole-20131209-src.zip new file mode 100644 index 000000000000..e7455560863d Binary files /dev/null and b/lib/src/proxy-vole-20131209-src.zip differ diff --git a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/HighlightInfo.java b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/HighlightInfo.java index f3f087a880ff..49ca573251e1 100644 --- a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/HighlightInfo.java +++ b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/HighlightInfo.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -41,6 +41,7 @@ import com.intellij.profile.codeInspection.InspectionProjectProfileManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.util.ArrayUtilRt; +import com.intellij.util.BitUtil; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import com.intellij.xml.util.XmlStringUtil; @@ -90,12 +91,12 @@ public class HighlightInfo implements Segment { private final ProblemGroup myProblemGroup; private volatile byte myFlags; // bit packed flags below: - private static final int BIJECTIVE_FLAG = 0; - private static final int HAS_HINT_FLAG = 1; - private static final int FROM_INJECTION_FLAG = 2; - private static final int AFTER_END_OF_LINE_FLAG = 3; - private static final int FILE_LEVEL_ANNOTATION_FLAG = 4; - private static final int NEEDS_UPDATE_ON_TYPING_FLAG = 5; + private static final byte BIJECTIVE_MASK = 1; + private static final byte HAS_HINT_MASK = 2; + private static final byte FROM_INJECTION_MASK = 4; + private static final byte AFTER_END_OF_LINE_MASK = 8; + private static final byte FILE_LEVEL_ANNOTATION_MASK = 16; + private static final byte NEEDS_UPDATE_ON_TYPING_MASK = 32; PsiElement psiElement; @NotNull @@ -104,7 +105,7 @@ public class HighlightInfo implements Segment { } void setFromInjection(boolean fromInjection) { - setFlag(FROM_INJECTION_FLAG, fromInjection); + setFlag(FROM_INJECTION_MASK, fromInjection); } public String getToolTip() { @@ -132,31 +133,28 @@ public class HighlightInfo implements Segment { return description; } - @MagicConstant(intValues = {BIJECTIVE_FLAG, HAS_HINT_FLAG, FROM_INJECTION_FLAG, AFTER_END_OF_LINE_FLAG, FILE_LEVEL_ANNOTATION_FLAG, NEEDS_UPDATE_ON_TYPING_FLAG}) - @interface FlagConstant {} + @MagicConstant(intValues = {BIJECTIVE_MASK, HAS_HINT_MASK, FROM_INJECTION_MASK, AFTER_END_OF_LINE_MASK, FILE_LEVEL_ANNOTATION_MASK, + NEEDS_UPDATE_ON_TYPING_MASK}) + private @interface FlagConstant {} - private boolean isFlagSet(@FlagConstant int flag) { - assert flag < 8; - int state = myFlags >> flag; - return (state & 1) != 0; + private boolean isFlagSet(@FlagConstant byte mask) { + return BitUtil.isSet(myFlags, mask); } - private void setFlag(@FlagConstant int flag, boolean value) { - assert flag < 8; - int state = value ? 1 : 0; - myFlags = (byte)(myFlags & ~(1 << flag) | state << flag); + private void setFlag(@FlagConstant byte mask, boolean value) { + myFlags = BitUtil.set(myFlags, mask, value); } boolean isFileLevelAnnotation() { - return isFlagSet(FILE_LEVEL_ANNOTATION_FLAG); + return isFlagSet(FILE_LEVEL_ANNOTATION_MASK); } boolean isBijective() { - return isFlagSet(BIJECTIVE_FLAG); + return isFlagSet(BIJECTIVE_MASK); } void setBijective(boolean bijective) { - setFlag(BIJECTIVE_FLAG, bijective); + setFlag(BIJECTIVE_MASK, bijective); } @NotNull @@ -165,7 +163,7 @@ public class HighlightInfo implements Segment { } public boolean isAfterEndOfLine() { - return isFlagSet(AFTER_END_OF_LINE_FLAG); + return isFlagSet(AFTER_END_OF_LINE_MASK); } @Nullable @@ -253,7 +251,7 @@ public class HighlightInfo implements Segment { private static final HighlightInfoFilter[] FILTERS = HighlightInfoFilter.EXTENSION_POINT_NAME.getExtensions(); public boolean needUpdateOnTyping() { - return isFlagSet(NEEDS_UPDATE_ON_TYPING_FLAG); + return isFlagSet(NEEDS_UPDATE_ON_TYPING_MASK); } HighlightInfo(@Nullable TextAttributes forcedTextAttributes, @@ -284,9 +282,9 @@ public class HighlightInfo implements Segment { // optimisation: do not retain extra memory if can recompute toolTip = encodeTooltip(escapedToolTip, escapedDescription); this.severity = severity; - setFlag(AFTER_END_OF_LINE_FLAG, afterEndOfLine); - setFlag(NEEDS_UPDATE_ON_TYPING_FLAG, calcNeedUpdateOnTyping(needsUpdateOnTyping, type)); - setFlag(FILE_LEVEL_ANNOTATION_FLAG, isFileLevelAnnotation); + setFlag(AFTER_END_OF_LINE_MASK, afterEndOfLine); + setFlag(NEEDS_UPDATE_ON_TYPING_MASK, calcNeedUpdateOnTyping(needsUpdateOnTyping, type)); + setFlag(FILE_LEVEL_ANNOTATION_MASK, isFileLevelAnnotation); this.navigationShift = navigationShift; myProblemGroup = problemGroup; this.gutterIconRenderer = gutterIconRenderer; @@ -701,11 +699,11 @@ public class HighlightInfo implements Segment { public boolean hasHint() { - return isFlagSet(HAS_HINT_FLAG); + return isFlagSet(HAS_HINT_MASK); } void setHint(final boolean hasHint) { - setFlag(HAS_HINT_FLAG, hasHint); + setFlag(HAS_HINT_MASK, hasHint); } public int getActualStartOffset() { @@ -879,7 +877,7 @@ public class HighlightInfo implements Segment { } boolean isFromInjection() { - return isFlagSet(FROM_INJECTION_FLAG); + return isFlagSet(FROM_INJECTION_MASK); } @NotNull diff --git a/platform/analysis-impl/src/com/intellij/codeInspection/reference/RefEntityImpl.java b/platform/analysis-impl/src/com/intellij/codeInspection/reference/RefEntityImpl.java index 6b0bb66018fc..5ad5b1d33cf2 100644 --- a/platform/analysis-impl/src/com/intellij/codeInspection/reference/RefEntityImpl.java +++ b/platform/analysis-impl/src/com/intellij/codeInspection/reference/RefEntityImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -27,6 +27,7 @@ package com.intellij.codeInspection.reference; import com.intellij.codeInspection.InspectionsBundle; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.util.Key; +import com.intellij.util.BitUtil; import gnu.trove.THashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -41,7 +42,7 @@ public abstract class RefEntityImpl implements RefEntity { protected List myChildren; private final String myName; private Map myUserMap; - protected int myFlags = 0; + protected int myFlags; protected final RefManagerImpl myManager; protected RefEntityImpl(String name, @NotNull RefManager manager) { @@ -138,16 +139,11 @@ public abstract class RefEntityImpl implements RefEntity { } public boolean checkFlag(int mask) { - return (myFlags & mask) != 0; + return BitUtil.isSet(myFlags, mask); } - public void setFlag(boolean b, int mask) { - if (b) { - myFlags |= mask; - } - else { - myFlags &= ~mask; - } + public void setFlag(final boolean value, final int mask) { + myFlags = BitUtil.set(myFlags, mask, value); } @Override diff --git a/platform/core-api/src/com/intellij/openapi/roots/FileIndexFacade.java b/platform/core-api/src/com/intellij/openapi/roots/FileIndexFacade.java index 96dde81c6a80..8f0dce494eac 100644 --- a/platform/core-api/src/com/intellij/openapi/roots/FileIndexFacade.java +++ b/platform/core-api/src/com/intellij/openapi/roots/FileIndexFacade.java @@ -61,7 +61,7 @@ public abstract class FileIndexFacade { public abstract boolean isValidAncestor(@NotNull VirtualFile baseDir, @NotNull VirtualFile child); public boolean shouldBeFound(GlobalSearchScope scope, VirtualFile virtualFile) { - return (scope.isSearchOutsideRootModel() || isInContent(virtualFile) || isInLibrarySource(virtualFile)) && !virtualFile.getFileType().isBinary(); + return scope.isSearchOutsideRootModel() || isInContent(virtualFile) || isInLibrarySource(virtualFile); } @NotNull public abstract ModificationTracker getRootModificationTracker(); diff --git a/platform/core-impl/src/com/intellij/extapi/psi/ASTDelegatePsiElement.java b/platform/core-impl/src/com/intellij/extapi/psi/ASTDelegatePsiElement.java index 9dd2fc252479..c7651631d212 100644 --- a/platform/core-impl/src/com/intellij/extapi/psi/ASTDelegatePsiElement.java +++ b/platform/core-impl/src/com/intellij/extapi/psi/ASTDelegatePsiElement.java @@ -176,18 +176,17 @@ public abstract class ASTDelegatePsiElement extends PsiElementBase { } @Nullable - protected PsiElement findChildByType(IElementType type) { + protected T findChildByType(IElementType type) { ASTNode node = getNode().findChildByType(type); - return node == null ? null : node.getPsi(); + return node == null ? null : (T)node.getPsi(); } - @Nullable - protected PsiElement findLastChildByType(IElementType type) { + protected T findLastChildByType(IElementType type) { PsiElement child = getLastChild(); while (child != null) { final ASTNode node = child.getNode(); - if (node != null && node.getElementType() == type) return child; + if (node != null && node.getElementType() == type) return (T)child; child = child.getPrevSibling(); } return null; @@ -196,14 +195,14 @@ public abstract class ASTDelegatePsiElement extends PsiElementBase { @NotNull - protected PsiElement findNotNullChildByType(IElementType type) { - return notNullChild(findChildByType(type)); + protected T findNotNullChildByType(IElementType type) { + return notNullChild(this.findChildByType(type)); } @Nullable - protected PsiElement findChildByType(TokenSet type) { + protected T findChildByType(TokenSet type) { ASTNode node = getNode().findChildByType(type); - return node == null ? null : node.getPsi(); + return node == null ? null : (T)node.getPsi(); } @NotNull @@ -263,10 +262,10 @@ public abstract class ASTDelegatePsiElement extends PsiElementBase { } protected T[] findChildrenByType(TokenSet elementType, Class arrayClass) { - return (T[])ContainerUtil.map2Array(getNode().getChildren(elementType), arrayClass, new Function() { + return ContainerUtil.map2Array(getNode().getChildren(elementType), arrayClass, new Function() { @Override - public PsiElement fun(final ASTNode s) { - return s.getPsi(); + public T fun(final ASTNode s) { + return (T)s.getPsi(); } }); } diff --git a/platform/core-impl/src/com/intellij/openapi/editor/impl/IntervalTreeImpl.java b/platform/core-impl/src/com/intellij/openapi/editor/impl/IntervalTreeImpl.java index b07f0b373c29..ed1c71dd095f 100644 --- a/platform/core-impl/src/com/intellij/openapi/editor/impl/IntervalTreeImpl.java +++ b/platform/core-impl/src/com/intellij/openapi/editor/impl/IntervalTreeImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -51,7 +51,7 @@ abstract class IntervalTreeImpl extends RedBlackTree< static class IntervalNode extends RedBlackTree.Node implements MutableInterval { private volatile int myStart; private volatile int myEnd; - private static final int ATTACHED_TO_TREE_FLAG = COLOR_FLAG+1; // true if the node is inserted to the tree + private static final byte ATTACHED_TO_TREE_FLAG = COLOR_MASK <<1; // true if the node is inserted to the tree protected final List> intervals; int maxEnd; // max of all intervalEnd()s among all children. protected int delta; // delta of startOffset. getStartOffset() = myStartOffset + Sum of deltas up to root @@ -268,7 +268,7 @@ abstract class IntervalTreeImpl extends RedBlackTree< return myEnd = end; } - static final int VALID_FLAG = ATTACHED_TO_TREE_FLAG + 1; + static final byte VALID_FLAG = ATTACHED_TO_TREE_FLAG << 1; @Override public boolean isValid() { return isFlagSet(VALID_FLAG); diff --git a/platform/core-impl/src/com/intellij/openapi/editor/impl/RangeMarkerTree.java b/platform/core-impl/src/com/intellij/openapi/editor/impl/RangeMarkerTree.java index 5ce1e2c2167b..5df198263512 100644 --- a/platform/core-impl/src/com/intellij/openapi/editor/impl/RangeMarkerTree.java +++ b/platform/core-impl/src/com/intellij/openapi/editor/impl/RangeMarkerTree.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -152,8 +152,8 @@ public class RangeMarkerTree extends IntervalTreeImpl extends IntervalTreeImpl.IntervalNode { - private static final int EXPAND_TO_LEFT_FLAG = VALID_FLAG+1; - private static final int EXPAND_TO_RIGHT_FLAG = EXPAND_TO_LEFT_FLAG+1; + private static final byte EXPAND_TO_LEFT_FLAG = VALID_FLAG<<1; + private static final byte EXPAND_TO_RIGHT_FLAG = EXPAND_TO_LEFT_FLAG<<1; public RMNode(@NotNull RangeMarkerTree rangeMarkerTree, @NotNull T key, diff --git a/platform/core-impl/src/com/intellij/openapi/editor/impl/RedBlackTree.java b/platform/core-impl/src/com/intellij/openapi/editor/impl/RedBlackTree.java index 6ff5fb91bd17..41197feb5e74 100644 --- a/platform/core-impl/src/com/intellij/openapi/editor/impl/RedBlackTree.java +++ b/platform/core-impl/src/com/intellij/openapi/editor/impl/RedBlackTree.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2010 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -15,6 +15,7 @@ */ package com.intellij.openapi.editor.impl; +import com.intellij.util.BitUtil; import com.intellij.util.Processor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -299,17 +300,14 @@ public abstract class RedBlackTree { protected Node parent = null; private volatile byte myFlags; - protected static final int COLOR_FLAG = 0; + protected static final byte COLOR_MASK = 1; - protected boolean isFlagSet(int flag) { - int state = myFlags >> flag; - return (state & 1) != 0; + protected boolean isFlagSet(byte mask) { + return BitUtil.isSet(myFlags, mask); } - protected void setFlag(int flag, boolean value) { - assert flag < 8; - int state = value ? 1 : 0; - myFlags = (byte)(myFlags & ~(1 << flag) | state << flag); + protected void setFlag(byte mask, boolean value) { + myFlags = BitUtil.set(myFlags, mask, value); } @@ -325,7 +323,7 @@ public abstract class RedBlackTree { return this == parent.getLeft() ? parent.getRight() : parent.getLeft(); } - public Node uncle() { + private Node uncle() { assert getParent() != null; // Root node has no uncle assert getParent().getParent() != null; // Children of root have no uncle return getParent().sibling(); @@ -360,16 +358,16 @@ public abstract class RedBlackTree { public abstract boolean hasAliveKey(boolean purgeDead); public boolean isBlack() { - return isFlagSet(COLOR_FLAG); + return isFlagSet(COLOR_MASK); } - public void setBlack() { - setFlag(COLOR_FLAG, true); + private void setBlack() { + setFlag(COLOR_MASK, true); } public void setRed() { - setFlag(COLOR_FLAG, false); + setFlag(COLOR_MASK, false); } public void setColor(boolean isBlack) { - setFlag(COLOR_FLAG, isBlack); + setFlag(COLOR_MASK, isBlack); } } diff --git a/platform/core-impl/src/com/intellij/psi/impl/smartPointers/SelfElementInfo.java b/platform/core-impl/src/com/intellij/psi/impl/smartPointers/SelfElementInfo.java index d141a79f5703..ceb856e077e6 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/smartPointers/SelfElementInfo.java +++ b/platform/core-impl/src/com/intellij/psi/impl/smartPointers/SelfElementInfo.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -16,7 +16,6 @@ package com.intellij.psi.impl.smartPointers; import com.intellij.lang.Language; -import com.intellij.lang.LanguageUtil; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.RangeMarker; @@ -47,15 +46,11 @@ public class SelfElementInfo implements SmartPointerElementInfo { private volatile RangeMarker myRangeMarker; //maintains hard reference during modification protected final Language myLanguage; - protected SelfElementInfo(@NotNull Project project, @NotNull PsiElement anchor) { - this(project, ProperTextRange.create(anchor.getTextRange()), anchor.getClass(), anchor.getContainingFile(), - LanguageUtil.getRootLanguage(anchor)); - } - public SelfElementInfo(@NotNull Project project, - @NotNull ProperTextRange range, - @NotNull Class anchorClass, - @NotNull PsiFile containingFile, - @NotNull Language language) { + SelfElementInfo(@NotNull Project project, + @NotNull ProperTextRange range, + @NotNull Class anchorClass, + @NotNull PsiFile containingFile, + @NotNull Language language) { myLanguage = language; myVirtualFile = PsiUtilCore.getVirtualFile(containingFile); myType = anchorClass; diff --git a/platform/core-impl/src/com/intellij/psi/impl/smartPointers/SmartPsiElementPointerImpl.java b/platform/core-impl/src/com/intellij/psi/impl/smartPointers/SmartPsiElementPointerImpl.java index d7b70398cf74..326d6b050250 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/smartPointers/SmartPsiElementPointerImpl.java +++ b/platform/core-impl/src/com/intellij/psi/impl/smartPointers/SmartPsiElementPointerImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -126,7 +126,9 @@ class SmartPsiElementPointerImpl implements SmartPointerEx } @NotNull - static SmartPointerElementInfo createElementInfo(@NotNull Project project, @NotNull E element, PsiFile containingFile) { + private static SmartPointerElementInfo createElementInfo(@NotNull Project project, + @NotNull E element, + PsiFile containingFile) { if (element instanceof PsiDirectory) { return new DirElementInfo((PsiDirectory)element); } @@ -185,7 +187,7 @@ class SmartPsiElementPointerImpl implements SmartPointerEx return myElementInfo; } - protected static boolean pointsToTheSameElementAs(@NotNull SmartPsiElementPointer pointer1, @NotNull SmartPsiElementPointer pointer2) { + static boolean pointsToTheSameElementAs(@NotNull SmartPsiElementPointer pointer1, @NotNull SmartPsiElementPointer pointer2) { if (pointer1 == pointer2) return true; if (pointer1 instanceof SmartPsiElementPointerImpl && pointer2 instanceof SmartPsiElementPointerImpl) { SmartPsiElementPointerImpl impl1 = (SmartPsiElementPointerImpl)pointer1; diff --git a/platform/core-impl/src/com/intellij/psi/impl/source/text/BlockSupportImpl.java b/platform/core-impl/src/com/intellij/psi/impl/source/text/BlockSupportImpl.java index 0ef1af849fd1..81369fcd59af 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/source/text/BlockSupportImpl.java +++ b/platform/core-impl/src/com/intellij/psi/impl/source/text/BlockSupportImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -239,8 +239,8 @@ public class BlockSupportImpl extends BlockSupport { } @NotNull - private static DiffLog replaceElementWithEvents(final CompositeElement oldRoot, - final CompositeElement newRoot) { + private static DiffLog replaceElementWithEvents(@NotNull CompositeElement oldRoot, + @NotNull CompositeElement newRoot) { DiffLog diffLog = new DiffLog(); diffLog.appendReplaceElementWithEvents(oldRoot, newRoot); return diffLog; diff --git a/platform/core-impl/src/com/intellij/psi/impl/source/text/DiffLog.java b/platform/core-impl/src/com/intellij/psi/impl/source/text/DiffLog.java index 386fb2dea0e9..32edb4d4e0e7 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/source/text/DiffLog.java +++ b/platform/core-impl/src/com/intellij/psi/impl/source/text/DiffLog.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -70,11 +70,11 @@ public class DiffLog implements DiffTreeChangeBuilder { } } - public void appendReplaceElementWithEvents(CompositeElement oldRoot, CompositeElement newRoot) { + void appendReplaceElementWithEvents(@NotNull CompositeElement oldRoot, @NotNull CompositeElement newRoot) { myEntries.add(new ReplaceElementWithEvents(oldRoot, newRoot)); } - public void appendReplaceFileElement(FileElement oldNode, FileElement newNode) { + void appendReplaceFileElement(@NotNull FileElement oldNode, @NotNull FileElement newNode) { myEntries.add(new ReplaceFileElement(oldNode, newNode)); } @@ -92,7 +92,7 @@ public class DiffLog implements DiffTreeChangeBuilder { private final ASTNode myOldChild; private final ASTNode myNewChild; - public ReplaceEntry(@NotNull ASTNode oldNode, @NotNull ASTNode newNode) { + private ReplaceEntry(@NotNull ASTNode oldNode, @NotNull ASTNode newNode) { myOldChild = oldNode; myNewChild = newNode; ASTNode parent = oldNode.getTreeParent(); @@ -133,10 +133,10 @@ public class DiffLog implements DiffTreeChangeBuilder { } private static class DeleteEntry extends LogEntry { - private final ASTNode myOldParent; - private final ASTNode myOldNode; + @NotNull private final ASTNode myOldParent; + @NotNull private final ASTNode myOldNode; - public DeleteEntry(ASTNode oldParent, ASTNode oldNode) { + private DeleteEntry(@NotNull ASTNode oldParent, @NotNull ASTNode oldNode) { myOldParent = oldParent; myOldNode = oldNode; } @@ -167,11 +167,11 @@ public class DiffLog implements DiffTreeChangeBuilder { } private static class InsertEntry extends LogEntry { - private final ASTNode myOldParent; - private final ASTNode myNewNode; + @NotNull private final ASTNode myOldParent; + @NotNull private final ASTNode myNewNode; private final int myPos; - public InsertEntry(@NotNull ASTNode oldParent, @NotNull ASTNode newNode, int pos) { + private InsertEntry(@NotNull ASTNode oldParent, @NotNull ASTNode newNode, int pos) { assert oldParent instanceof CompositeElement : oldParent; myOldParent = oldParent; myNewNode = newNode; @@ -226,10 +226,10 @@ public class DiffLog implements DiffTreeChangeBuilder { } private static class ReplaceFileElement extends LogEntry { - private final FileElement myOldNode; - private final FileElement myNewNode; + @NotNull private final FileElement myOldNode; + @NotNull private final FileElement myNewNode; - public ReplaceFileElement(FileElement oldNode, FileElement newNode) { + private ReplaceFileElement(@NotNull FileElement oldNode, @NotNull FileElement newNode) { myOldNode = oldNode; myNewNode = newNode; } @@ -250,10 +250,10 @@ public class DiffLog implements DiffTreeChangeBuilder { } private static class ReplaceElementWithEvents extends LogEntry { - private final CompositeElement myOldRoot; - private final CompositeElement myNewRoot; + @NotNull private final CompositeElement myOldRoot; + @NotNull private final CompositeElement myNewRoot; - public ReplaceElementWithEvents(CompositeElement oldRoot, CompositeElement newRoot) { + private ReplaceElementWithEvents(@NotNull CompositeElement oldRoot, @NotNull CompositeElement newRoot) { myOldRoot = oldRoot; myNewRoot = newRoot; } diff --git a/platform/dvcs-impl/src/com/intellij/dvcs/branch/DvcsSyncSettings.java b/platform/dvcs-impl/src/com/intellij/dvcs/branch/DvcsSyncSettings.java index 7d33bc79e9b5..cd31b24f1419 100644 --- a/platform/dvcs-impl/src/com/intellij/dvcs/branch/DvcsSyncSettings.java +++ b/platform/dvcs-impl/src/com/intellij/dvcs/branch/DvcsSyncSettings.java @@ -15,8 +15,12 @@ */ package com.intellij.dvcs.branch; +import com.intellij.dvcs.repo.RepositoryManager; import org.jetbrains.annotations.NotNull; +/** + * @see RepositoryManager#isSyncEnabled() + */ public interface DvcsSyncSettings { enum Value { diff --git a/platform/dvcs-impl/src/com/intellij/dvcs/branch/DvcsTaskHandler.java b/platform/dvcs-impl/src/com/intellij/dvcs/branch/DvcsTaskHandler.java index 0d128e319954..7b2dd244b846 100644 --- a/platform/dvcs-impl/src/com/intellij/dvcs/branch/DvcsTaskHandler.java +++ b/platform/dvcs-impl/src/com/intellij/dvcs/branch/DvcsTaskHandler.java @@ -27,14 +27,15 @@ import com.intellij.openapi.vcs.VcsTaskHandler; import com.intellij.util.Function; import com.intellij.util.NullableFunction; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.FactoryMap; import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.Set; -import java.util.concurrent.atomic.AtomicInteger; +import java.util.Map; public abstract class DvcsTaskHandler extends VcsTaskHandler { @@ -49,8 +50,8 @@ public abstract class DvcsTaskHandler extends VcsTaskHandl } @Override - public boolean isEnabled(@Nullable Project project) { - return project != null && !project.isDisposed() && !myRepositoryManager.getRepositories().isEmpty(); + public boolean isEnabled() { + return !myRepositoryManager.getRepositories().isEmpty(); } @Override @@ -62,17 +63,17 @@ public abstract class DvcsTaskHandler extends VcsTaskHandl return hasBranch(repository, taskName); } }); - MultiMap map = new MultiMap(); + List map = new ArrayList(); if (!problems.isEmpty()) { if (ApplicationManager.getApplication().isUnitTestMode() || Messages.showDialog(myProject, "The following repositories already have specified " + myBranchType + "" + taskName + ":
" + StringUtil.join(problems, "
") + ".
" + - "Do you want to checkout existing " + myBranchType + "?", myBranchType + " Already Exists", + "Do you want to checkout existing " + myBranchType + "?", StringUtil.capitalize(myBranchType) + " Already Exists", new String[]{Messages.YES_BUTTON, Messages.NO_BUTTON}, 0, Messages.getWarningIcon(), new DialogWrapper.PropertyDoNotAskOption("git.checkout.existing.branch")) == 0) { checkout(taskName, problems, null); - fillMap(taskName, problems, map); + map.addAll(problems); } } repositories.removeAll(problems); @@ -80,89 +81,88 @@ public abstract class DvcsTaskHandler extends VcsTaskHandl checkoutAsNewBranch(taskName, repositories); } - fillMap(taskName, repositories, map); - return new TaskInfo(map); - } - - private static void fillMap(String taskName, List repositories, MultiMap map) { - for (R repository : repositories) { - map.putValue(taskName, repository.getPresentableUrl()); - } + map.addAll(repositories); + return new TaskInfo(taskName, ContainerUtil.map(map, new Function() { + @Override + public String fun(R r) { + return r.getPresentableUrl(); + } + })); } @Override public void switchToTask(@NotNull TaskInfo taskInfo, @Nullable Runnable invokeAfter) { - for (final String branchName : taskInfo.branches.keySet()) { - List repositories = getRepositories(taskInfo.branches.get(branchName)); - List notFound = ContainerUtil.filter(repositories, new Condition() { - @Override - public boolean value(R repository) { - return !hasBranch(repository, branchName); - } - }); - if (!notFound.isEmpty()) { - checkoutAsNewBranch(branchName, notFound); - } - repositories.removeAll(notFound); - if (!repositories.isEmpty()) { - checkout(branchName, repositories, invokeAfter); + final String branchName = taskInfo.getName(); + List repositories = getRepositories(taskInfo.getRepositories()); + List notFound = ContainerUtil.filter(repositories, new Condition() { + @Override + public boolean value(R repository) { + return !hasBranch(repository, branchName); } + }); + if (!notFound.isEmpty()) { + checkoutAsNewBranch(branchName, notFound); + } + repositories.removeAll(notFound); + if (!repositories.isEmpty()) { + checkout(branchName, repositories, invokeAfter); } } @Override public void closeTask(@NotNull final TaskInfo taskInfo, @NotNull TaskInfo original) { - Set branches = original.branches.keySet(); - final AtomicInteger counter = new AtomicInteger(branches.size()); - for (final String originalBranch : branches) { - checkout(originalBranch, getRepositories(original.branches.get(originalBranch)), new Runnable() { - @Override - public void run() { - if (counter.decrementAndGet() == 0) { - merge(taskInfo); - } - } - }); - } - } - - private void merge(@NotNull TaskInfo taskInfo) { - for (String featureBranch : taskInfo.branches.keySet()) { - mergeAndClose(featureBranch, getRepositories(taskInfo.branches.get(featureBranch))); - } + checkout(original.getName(), getRepositories(original.getRepositories()), new Runnable() { + @Override + public void run() { + mergeAndClose(taskInfo.getName(), getRepositories(taskInfo.getRepositories())); + } + }); } @Override - @NotNull - public TaskInfo getActiveTask() { - List repositories = myRepositoryManager.getRepositories(); - - MultiMap branches = new MultiMap(); - for (R repository : repositories) { - String branchName = repository.getCurrentBranchName(); - if (branchName != null) { - branches.putValue(branchName, repository.getPresentableUrl()); - } - } - return new TaskInfo(branches); + public boolean isSyncEnabled() { + return myRepositoryManager.isSyncEnabled(); } @Override public TaskInfo[] getCurrentTasks() { List repositories = myRepositoryManager.getRepositories(); - final List names = ContainerUtil.map(repositories, new Function() { + @SuppressWarnings("MismatchedQueryAndUpdateOfCollection") + FactoryMap tasks = new FactoryMap() { + @Nullable @Override - public String fun(R repository) { - return repository.getPresentableUrl(); + protected TaskInfo create(String key) { + return new TaskInfo(key, new ArrayList()); } - }); - Collection branches = getCommonBranchNames(repositories); - return ContainerUtil.map2Array(branches, TaskInfo.class, new Function() { + }; + for (R repository : repositories) { + String branch = getActiveBranch(repository); + if (branch != null) { + tasks.get(branch).getRepositories().add(repository.getPresentableUrl()); + } + } + if (tasks.size() == 0) return new TaskInfo[0]; + if (isSyncEnabled()) { + return new TaskInfo[] { tasks.values().iterator().next() }; + } + else { + return tasks.values().toArray(new TaskInfo[tasks.values().size()]); + } + } + + @Override + public TaskInfo[] getAllExistingTasks() { + List repositories = myRepositoryManager.getRepositories(); + MultiMap tasks = new MultiMap(); + for (R repository : repositories) { + for (String branch : getAllBranches(repository)) { + tasks.putValue(branch, repository.getPresentableUrl()); + } + } + return ContainerUtil.map2Array(tasks.entrySet(), TaskInfo.class, new Function>, TaskInfo>() { @Override - public TaskInfo fun(String branchName) { - MultiMap map = new MultiMap(); - map.put(branchName, names); - return new TaskInfo(map); + public TaskInfo fun(Map.Entry> entry) { + return new TaskInfo(entry.getKey(), entry.getValue()); } }); } @@ -189,8 +189,11 @@ public abstract class DvcsTaskHandler extends VcsTaskHandl protected abstract void checkoutAsNewBranch(@NotNull String name, @NotNull List repositories); + @Nullable + protected abstract String getActiveBranch(R repository); + @NotNull - protected abstract Collection getCommonBranchNames(@NotNull List repositories); + protected abstract Iterable getAllBranches(@NotNull R repository); protected abstract void mergeAndClose(@NotNull String branch, @NotNull List repositories); diff --git a/platform/dvcs-impl/src/com/intellij/dvcs/push/PushController.java b/platform/dvcs-impl/src/com/intellij/dvcs/push/PushController.java index c35f94c047b6..76d0e5bfd061 100644 --- a/platform/dvcs-impl/src/com/intellij/dvcs/push/PushController.java +++ b/platform/dvcs-impl/src/com/intellij/dvcs/push/PushController.java @@ -36,6 +36,7 @@ import com.intellij.util.ObjectUtils; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.UIUtil; import com.intellij.vcs.log.VcsFullCommitDetails; +import com.intellij.xml.util.XmlStringUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -548,46 +549,15 @@ public class PushController implements Disposable { final PushSupport activePushSupport = selectedModel.getSupport(); final PushTarget commonTarget = getCommonTarget(selectedNodes); if (commonTarget != null && activePushSupport.isSilentForcePushAllowed(commonTarget)) return true; - return Messages.showOkCancelDialog(myProject, DvcsBundle.message("push.force.confirmation.text", - commonTarget != null - ? " to " + - commonTarget.getPresentation() + "" - : ""), + return Messages.showOkCancelDialog(myProject, XmlStringUtil.wrapInHtml(DvcsBundle.message("push.force.confirmation.text", + commonTarget != null + ? " to " + + commonTarget.getPresentation() + "" + : "")), "Force Push", "&Force Push", CommonBundle.getCancelButtonText(), Messages.getWarningIcon(), - commonTarget != null - ? new DialogWrapper.DoNotAskOption() { - - @Override - public boolean isToBeShown() { - return true; - } - - @Override - public void setToBeShown(boolean toBeShown, int exitCode) { - if (!toBeShown && exitCode == OK) { - activePushSupport.saveSilentForcePushTarget(commonTarget); - } - } - - @Override - public boolean canBeHidden() { - return true; - } - - @Override - public boolean shouldSaveOptionsOnCancel() { - return false; - } - - @NotNull - @Override - public String getDoNotShowMessage() { - return "Don't warn about this target"; - } - } - : null) == OK; + commonTarget != null ? new MyDoNotAskOptionForPush(activePushSupport, commonTarget) : null) == OK; } @Nullable @@ -689,4 +659,44 @@ public class PushController implements Disposable { return myCheckBoxModel; } } + + private static class MyDoNotAskOptionForPush implements DialogWrapper.DoNotAskOption { + + @NotNull private final PushSupport myActivePushSupport; + @NotNull private final PushTarget myCommonTarget; + + public MyDoNotAskOptionForPush(@NotNull PushSupport support, + @NotNull PushTarget target) { + myActivePushSupport = support; + myCommonTarget = target; + } + + @Override + public boolean isToBeShown() { + return true; + } + + @Override + public void setToBeShown(boolean toBeShown, int exitCode) { + if (!toBeShown && exitCode == OK) { + myActivePushSupport.saveSilentForcePushTarget(myCommonTarget); + } + } + + @Override + public boolean canBeHidden() { + return true; + } + + @Override + public boolean shouldSaveOptionsOnCancel() { + return false; + } + + @NotNull + @Override + public String getDoNotShowMessage() { + return "Don't warn about this target"; + } + } } diff --git a/platform/indexing-impl/src/com/intellij/psi/impl/cache/CacheManager.java b/platform/indexing-impl/src/com/intellij/psi/impl/cache/CacheManager.java index e403f60c8777..fb4a272361dc 100644 --- a/platform/indexing-impl/src/com/intellij/psi/impl/cache/CacheManager.java +++ b/platform/indexing-impl/src/com/intellij/psi/impl/cache/CacheManager.java @@ -18,6 +18,7 @@ package com.intellij.psi.impl.cache; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.UsageSearchContext; @@ -38,6 +39,9 @@ public interface CacheManager { @NotNull PsiFile[] getFilesWithWord(@NotNull String word, short occurenceMask, @NotNull GlobalSearchScope scope, final boolean caseSensitively); + @NotNull + VirtualFile[] getVirtualFilesWithWord(@NotNull String word, short occurenceMask, @NotNull GlobalSearchScope scope, final boolean caseSensitively); + boolean processFilesWithWord(@NotNull Processor processor, @NotNull String word, @MagicConstant(flagsFromClass = UsageSearchContext.class) short occurenceMask, diff --git a/platform/indexing-impl/src/com/intellij/psi/impl/cache/impl/IndexCacheManagerImpl.java b/platform/indexing-impl/src/com/intellij/psi/impl/cache/impl/IndexCacheManagerImpl.java index 1a44cf491b54..d2027575121a 100644 --- a/platform/indexing-impl/src/com/intellij/psi/impl/cache/impl/IndexCacheManagerImpl.java +++ b/platform/indexing-impl/src/com/intellij/psi/impl/cache/impl/IndexCacheManagerImpl.java @@ -65,6 +65,18 @@ public class IndexCacheManagerImpl implements CacheManager{ return processor.getResults().isEmpty() ? PsiFile.EMPTY_ARRAY : processor.toArray(PsiFile.EMPTY_ARRAY); } + @Override + @NotNull + public VirtualFile[] getVirtualFilesWithWord(@NotNull final String word, final short occurenceMask, @NotNull final GlobalSearchScope scope, final boolean caseSensitively) { + if (myProject.isDefault()) { + return VirtualFile.EMPTY_ARRAY; + } + + final List vFiles = new ArrayList(5); + collectVirtualFilesWithWord(new CommonProcessors.CollectProcessor(vFiles), word, occurenceMask, scope, caseSensitively); + return vFiles.isEmpty() ? VirtualFile.EMPTY_ARRAY : vFiles.toArray(new VirtualFile[vFiles.size()]); + } + // IMPORTANT!!! // Since implementation of virtualFileProcessor.process() may call indices directly or indirectly, // we cannot call it inside FileBasedIndex.processValues() method except in collecting form diff --git a/platform/indexing-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java b/platform/indexing-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java index 5081ea2ce148..8e9b6bf78be2 100644 --- a/platform/indexing-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java +++ b/platform/indexing-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java @@ -82,6 +82,12 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { scope = scope.union(additionalScope); } } + for (UseScopeOptimizer optimizer : UseScopeOptimizer.EP_NAME.getExtensions()) { + final GlobalSearchScope scopeToExclude = optimizer.getScopeToExclude(element); + if (scopeToExclude != null) { + scope = scope.intersectWith(GlobalSearchScope.notScope(scopeToExclude)); + } + } return scope; } diff --git a/platform/indexing-impl/src/com/intellij/psi/search/UseScopeOptimizer.java b/platform/indexing-impl/src/com/intellij/psi/search/UseScopeOptimizer.java new file mode 100644 index 000000000000..58849a3f6fca --- /dev/null +++ b/platform/indexing-impl/src/com/intellij/psi/search/UseScopeOptimizer.java @@ -0,0 +1,16 @@ +package com.intellij.psi.search; + +import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.psi.PsiElement; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @author Konstantin.Ulitin + */ +public abstract class UseScopeOptimizer { + public static final ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.useScopeOptimizer"); + + @Nullable + public abstract GlobalSearchScope getScopeToExclude(@NotNull PsiElement element); +} diff --git a/platform/lang-api/src/com/intellij/codeInsight/daemon/LineMarkerProvider.java b/platform/lang-api/src/com/intellij/codeInsight/daemon/LineMarkerProvider.java index 6165561ae1f1..e0c90ef34eeb 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/daemon/LineMarkerProvider.java +++ b/platform/lang-api/src/com/intellij/codeInsight/daemon/LineMarkerProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2015 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,6 +28,26 @@ import java.util.List; */ public interface LineMarkerProvider { @Nullable + /** + * Get line markers for this PsiElement. + * + * NOTE for implementers: + * Please return line marker info for exact element you were asked for. + * For example, do not return class marker info if getLineMarkerInfo() was called for a method. + * Please return relevant line marker info for as small element as possible. + * For example, do not return method marker for PsiMethod. Instead, return it for the PsiIdentifier which is a name of this method. + * + * More technical details: + * Inspection (specifically, LineMarkersPass) for performance reasons queries all LineMarkerProviders in two passes: + * - first pass for all elements in visible area + * - second pass for all the rest elements + * If providers return nothing for either area, its line markers are cleared. + * So if, for example a method, is half-visible (e.g. its name is visible but a part of its body isn't) and + * some poorly written LineMarkerProvider returns info for the PsiMethod instead of PsiIdentifier then following happens: + * - the first pass removes line marker info because whole PsiMethod is not visible. + * - the second pass tries to add line marker info back because LineMarkerProvider is called for the PsiMethod at last. + * As a result, line marker icon blinks annoyingly. + */ LineMarkerInfo getLineMarkerInfo(@NotNull PsiElement element); void collectSlowLineMarkers(@NotNull List elements, @NotNull Collection result); diff --git a/platform/lang-impl/src/com/intellij/application/options/TabbedLanguageCodeStylePanel.java b/platform/lang-impl/src/com/intellij/application/options/TabbedLanguageCodeStylePanel.java index 630fc8a5a3ac..81f2c875d574 100644 --- a/platform/lang-impl/src/com/intellij/application/options/TabbedLanguageCodeStylePanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/TabbedLanguageCodeStylePanel.java @@ -43,6 +43,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -62,6 +64,7 @@ public abstract class TabbedLanguageCodeStylePanel extends CodeStyleAbstractPane private TabbedPaneWrapper myTabbedPane; private final PredefinedCodeStyle[] myPredefinedCodeStyles; private JPopupMenu myCopyFromMenu; + private @Nullable TabChangeListener myListener; protected TabbedLanguageCodeStylePanel(@Nullable Language language, CodeStyleSettings currentSettings, CodeStyleSettings settings) { super(language, currentSettings, settings); @@ -123,6 +126,17 @@ public abstract class TabbedLanguageCodeStylePanel extends CodeStyleAbstractPane myPanel = new JPanel(); myPanel.setLayout(new BorderLayout()); myTabbedPane = new TabbedPaneWrapper(this); + myTabbedPane.addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + if (myListener != null) { + String title = myTabbedPane.getSelectedTitle(); + if (title != null) { + myListener.tabChanged(TabbedLanguageCodeStylePanel.this, title); + } + } + } + }); myTabs = new ArrayList(); myPanel.add(myTabbedPane.getComponent()); initTabs(getSettings()); @@ -662,4 +676,16 @@ public abstract class TabbedLanguageCodeStylePanel extends CodeStyleAbstractPane } } + + public interface TabChangeListener { + void tabChanged(@NotNull TabbedLanguageCodeStylePanel source, @NotNull String tabTitle); + } + + public void setListener(@Nullable TabChangeListener listener) { + myListener = listener; + } + + public void changeTab(@NotNull String tabTitle) { + myTabbedPane.setSelectedTitle(tabTitle); + } } diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/CodeStyleMainPanel.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/CodeStyleMainPanel.java index db86ddaeebff..ef7a514be380 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/CodeStyleMainPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/CodeStyleMainPanel.java @@ -18,6 +18,8 @@ package com.intellij.application.options.codeStyle; import com.intellij.application.options.CodeStyleAbstractPanel; import com.intellij.application.options.TabbedLanguageCodeStylePanel; +import com.intellij.ide.util.PropertiesComponent; +import com.intellij.lang.Language; import com.intellij.openapi.application.ApplicationBundle; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.options.ConfigurationException; @@ -27,6 +29,7 @@ import com.intellij.psi.codeStyle.CodeStyleSchemes; import com.intellij.ui.components.labels.SwingActionLink; import com.intellij.util.Alarm; import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -37,7 +40,7 @@ import java.util.HashMap; import java.util.Map; import java.util.Set; -public class CodeStyleMainPanel extends JPanel { +public class CodeStyleMainPanel extends JPanel implements TabbedLanguageCodeStylePanel.TabChangeListener { private final CardLayout myLayout = new CardLayout(); private final JPanel mySettingsPanel = new JPanel(myLayout); @@ -61,12 +64,16 @@ public class CodeStyleMainPanel extends JPanel { @NonNls private static final String WAIT_CARD = "CodeStyleSchemesConfigurable.$$$.Wait.placeholder.$$$"; + private final PropertiesComponent myProperties; + + private final static String SELECTED_TAB = "settings.code.style.selected.tab"; public CodeStyleMainPanel(CodeStyleSchemesModel model, CodeStyleSettingsPanelFactory factory) { super(new BorderLayout()); myModel = model; myFactory = factory; mySchemesPanel = new CodeStyleSchemesPanel(model); + myProperties = PropertiesComponent.getInstance(); model.addListener(new CodeStyleSettingsListener(){ @Override @@ -214,6 +221,15 @@ public class CodeStyleMainPanel extends JPanel { NewCodeStyleSettingsPanel panel = myFactory.createPanel(scheme); panel.reset(); panel.setModel(myModel); + CodeStyleAbstractPanel settingsPanel = panel.getSelectedPanel(); + if (settingsPanel instanceof TabbedLanguageCodeStylePanel) { + TabbedLanguageCodeStylePanel tabbedPanel = (TabbedLanguageCodeStylePanel)settingsPanel; + tabbedPanel.setListener(this); + String currentTab = myProperties.getValue(getSelectedTabPropertyName(tabbedPanel)); + if (currentTab != null) { + tabbedPanel.changeTab(currentTab); + } + } mySettingsPanels.put(name, panel); mySettingsPanel.add(scheme.getName(), panel); } @@ -244,4 +260,18 @@ public class CodeStyleMainPanel extends JPanel { final NewCodeStyleSettingsPanel panel = ensurePanel(defaultScheme); return panel.processListOptions(); } + + @Override + public void tabChanged(@NotNull TabbedLanguageCodeStylePanel source, @NotNull String tabTitle) { + myProperties.setValue(getSelectedTabPropertyName(source), tabTitle); + for (NewCodeStyleSettingsPanel panel : getPanels()) { + panel.tabChanged(source, tabTitle); + } + } + + @NotNull + private static String getSelectedTabPropertyName(@NotNull TabbedLanguageCodeStylePanel panel) { + Language language = panel.getDefaultLanguage(); + return SELECTED_TAB + (language != null ? "." + language.getID() : ""); + } } diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/NewCodeStyleSettingsPanel.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/NewCodeStyleSettingsPanel.java index 4ee9e0ecc9ad..3677845f5300 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/NewCodeStyleSettingsPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/NewCodeStyleSettingsPanel.java @@ -19,6 +19,7 @@ package com.intellij.application.options.codeStyle; import com.intellij.application.options.CodeStyleAbstractConfigurable; import com.intellij.application.options.CodeStyleAbstractPanel; import com.intellij.application.options.OptionsContainingConfigurable; +import com.intellij.application.options.TabbedLanguageCodeStylePanel; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.options.ConfigurationException; @@ -33,7 +34,7 @@ import java.util.Set; /** * @author max */ -public class NewCodeStyleSettingsPanel extends JPanel { +public class NewCodeStyleSettingsPanel extends JPanel implements TabbedLanguageCodeStylePanel.TabChangeListener { private static final Logger LOG = Logger.getInstance("#com.intellij.application.options.codeStyle.NewCodeStyleSettingsPanel"); private final Configurable myTab; @@ -106,4 +107,12 @@ public class NewCodeStyleSettingsPanel extends JPanel { } return null; } + + @Override + public void tabChanged(@NotNull TabbedLanguageCodeStylePanel source, @NotNull String tabTitle) { + CodeStyleAbstractPanel panel = getSelectedPanel(); + if (panel instanceof TabbedLanguageCodeStylePanel && panel != source) { + ((TabbedLanguageCodeStylePanel)panel).changeTab(tabTitle); + } + } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonListeners.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonListeners.java index b56c0f74ea27..82df1c71f40b 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonListeners.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonListeners.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -85,7 +85,6 @@ import org.jetbrains.annotations.Nullable; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -436,7 +435,7 @@ public class DaemonListeners implements Disposable { if (activeVcs == null) return Result.NOT_SURE; FilePath path = VcsUtil.getFilePath(virtualFile); - boolean vcsIsThinking = !myVcsDirtyScopeManager.whatFilesDirty(Arrays.asList(path)).isEmpty(); + boolean vcsIsThinking = !myVcsDirtyScopeManager.whatFilesDirty(Collections.singletonList(path)).isEmpty(); if (vcsIsThinking) return Result.NOT_SURE; // do not modify file which is in the process of updating FileStatus status = myFileStatusManager.getStatus(virtualFile); @@ -573,7 +572,7 @@ public class DaemonListeners implements Disposable { if (myTogglePopupHintsPanel != null) myTogglePopupHintsPanel.updateStatus(); } - private class MyAnActionListener implements AnActionListener { + private class MyAnActionListener extends AnActionListener.Adapter { private final AnAction escapeAction = myActionManager.getAction(IdeActions.ACTION_EDITOR_ESCAPE); @Override @@ -581,10 +580,6 @@ public class DaemonListeners implements Disposable { myEscPressed = action == escapeAction; } - @Override - public void afterActionPerformed(final AnAction action, final DataContext dataContext, AnActionEvent event) { - } - @Override public void beforeEditorTyping(char c, DataContext dataContext) { Editor editor = CommonDataKeys.EDITOR.getData(dataContext); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/CompletionAutoPopupHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/CompletionAutoPopupHandler.java index 0c618e515248..8010e76335bb 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/CompletionAutoPopupHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/CompletionAutoPopupHandler.java @@ -32,8 +32,6 @@ import com.intellij.openapi.project.IndexNotReadyException; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiPlainText; -import com.intellij.psi.PsiPlainTextFile; import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; import org.jetbrains.annotations.NotNull; @@ -67,9 +65,7 @@ public class CompletionAutoPopupHandler extends TypedHandlerDelegate { return Result.STOP; } - if ((Character.isLetter(charTyped) || charTyped == '_') && - !(file instanceof PsiPlainTextFile) // todo [maxim, peter] why we start autopopup when editing text files ? it cancels find preview - ) { + if (Character.isLetter(charTyped) || charTyped == '_') { AutoPopupController.getInstance(project).scheduleAutoPopup(editor); return Result.STOP; } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/navigation/NavigationUtil.java b/platform/lang-impl/src/com/intellij/codeInsight/navigation/NavigationUtil.java index e8774cedeeb8..2bbbd2ca8869 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/navigation/NavigationUtil.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/navigation/NavigationUtil.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -175,7 +175,6 @@ public final class NavigationUtil { return false; } - private static boolean activatePsiElementIfOpen(@NotNull PsiElement elt, boolean searchForOpen, boolean requestFocus) { if (!elt.isValid()) return false; elt = elt.getNavigationElement(); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateListPanel.java b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateListPanel.java index d310851b8965..24efa6e9dd93 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateListPanel.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateListPanel.java @@ -33,6 +33,7 @@ import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.EmptyRunnable; import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.*; +import com.intellij.ui.speedSearch.SpeedSearchSupply; import com.intellij.util.Alarm; import com.intellij.util.NullableFunction; import com.intellij.util.ObjectUtils; @@ -947,20 +948,7 @@ public class TemplateListPanel extends JPanel implements Disposable { } void selectNode(@NotNull String searchQuery) { - for (TemplateGroup group : myTemplateGroups) { - for (TemplateImpl template : group.getElements()) { - if (StringUtil.startsWithIgnoreCase(template.getKey(), searchQuery)) { - selectTemplate(group.getName(), template.getKey()); - return; - } - } - } - for (TemplateGroup group : myTemplateGroups) { - if (StringUtil.startsWithIgnoreCase(group.getName(), searchQuery)) { - selectTemplate(group.getName(), null); - return; - } - } + ObjectUtils.assertNotNull(SpeedSearchSupply.getSupply(myTree, true)).findAndSelectElement(searchQuery); } private void selectTemplate(@Nullable final String groupName, @Nullable final String templateKey) { diff --git a/platform/lang-impl/src/com/intellij/find/FindUtil.java b/platform/lang-impl/src/com/intellij/find/FindUtil.java index 166a3da626e6..b60587f1d369 100644 --- a/platform/lang-impl/src/com/intellij/find/FindUtil.java +++ b/platform/lang-impl/src/com/intellij/find/FindUtil.java @@ -21,7 +21,6 @@ import com.intellij.codeInsight.hint.HintManagerImpl; import com.intellij.codeInsight.hint.HintUtil; import com.intellij.find.findUsages.PsiElement2UsageTargetAdapter; import com.intellij.find.impl.FindInProjectUtil; -import com.intellij.find.impl.livePreview.LivePreview; import com.intellij.find.replaceInProject.ReplaceInProjectManager; import com.intellij.openapi.actionSystem.ActionManager; import com.intellij.openapi.actionSystem.AnAction; @@ -38,7 +37,6 @@ import com.intellij.openapi.editor.colors.EditorColorsManager; import com.intellij.openapi.editor.event.CaretAdapter; import com.intellij.openapi.editor.event.CaretEvent; import com.intellij.openapi.editor.event.CaretListener; -import com.intellij.openapi.editor.ex.DocumentEx; import com.intellij.openapi.editor.ex.RangeHighlighterEx; import com.intellij.openapi.editor.markup.HighlighterLayer; import com.intellij.openapi.editor.markup.HighlighterTargetArea; @@ -89,7 +87,9 @@ public class FindUtil { public static void initStringToFindWithSelection(FindModel findModel, Editor editor) { if (editor != null) { String s = editor.getSelectionModel().getSelectedText(); - FindModel.initStringToFindNoMultiline(findModel, s); + if (s != null && s.length() < 10000) { + FindModel.initStringToFindNoMultiline(findModel, s); + } } } @@ -97,10 +97,8 @@ public class FindUtil { SelectionModel selectionModel = editor != null ? editor.getSelectionModel() : null; if (selectionModel != null) { String selectedText = selectionModel.getSelectedText(); - if (selectedText != null) { - if (selectedText.indexOf("\n") != -1) { - return true; - } + if (selectedText != null && selectedText.contains("\n")) { + return true; } } return false; @@ -209,7 +207,7 @@ public class FindUtil { final FindManager findManager = FindManager.getInstance(project); String s = editor.getSelectionModel().getSelectedText(); - final FindModel model = (FindModel)findManager.getFindInFileModel().clone(); + final FindModel model = findManager.getFindInFileModel().clone(); if (StringUtil.isEmpty(s)) { model.setGlobal(true); } @@ -330,7 +328,7 @@ public class FindUtil { if (model == null) { model = findManager.getFindInFileModel(); } - model = (FindModel)model.clone(); + model = model.clone(); model.setForward(!model.isForward()); if (!model.isGlobal() && !editor.getSelectionModel().hasSelection()) { model.setGlobal(true); @@ -372,7 +370,7 @@ public class FindUtil { if (model == null) { model = findManager.getFindInFileModel(); } - model = (FindModel)model.clone(); + model = model.clone(); int offset; if (Direction.DOWN.equals(editor.getUserData(KEY)) && model.isForward()) { @@ -410,7 +408,7 @@ public class FindUtil { public static void replace(final Project project, final Editor editor) { final FindManager findManager = FindManager.getInstance(project); - final FindModel model = (FindModel)findManager.getFindInFileModel().clone(); + final FindModel model = findManager.getFindInFileModel().clone(); final String s = editor.getSelectionModel().getSelectedText(); if (!StringUtil.isEmpty(s)) { if (s.indexOf('\n') >= 0) { @@ -778,7 +776,7 @@ public class FindUtil { short position = HintManager.UNDER; if (model.isGlobal()) { - final FindModel newModel = (FindModel)model.clone(); + final FindModel newModel = model.clone(); FindManager findManager = FindManager.getInstance(project); Document document = editor.getDocument(); FindResult result = findManager.findString(document.getCharsSequence(), diff --git a/platform/lang-impl/src/com/intellij/find/impl/FindDialog.java b/platform/lang-impl/src/com/intellij/find/impl/FindDialog.java index 6db6bfe0e4db..25f1e631ca9e 100644 --- a/platform/lang-impl/src/com/intellij/find/impl/FindDialog.java +++ b/platform/lang-impl/src/com/intellij/find/impl/FindDialog.java @@ -61,6 +61,7 @@ import com.intellij.ui.table.JBTable; import com.intellij.usageView.UsageInfo; import com.intellij.usages.*; import com.intellij.usages.impl.UsagePreviewPanel; +import com.intellij.util.Alarm; import com.intellij.util.ArrayUtil; import com.intellij.util.Consumer; import com.intellij.util.Processor; @@ -128,6 +129,7 @@ public class FindDialog extends DialogWrapper { private JBTable myResultsPreviewTable; private UsagePreviewPanel myUsagePreviewPanel; private TabbedPane myContent; + private Alarm mySearchRescheduleOnCancellationsAlarm; private volatile ProgressIndicatorBase myResultsPreviewSearchProgress; public FindDialog(@NotNull Project project, @NotNull FindModel model, @NotNull Consumer myOkHandler){ @@ -176,6 +178,7 @@ public class FindDialog extends DialogWrapper { @Override protected void dispose() { finishPreviousPreviewSearch(); + if (mySearchRescheduleOnCancellationsAlarm != null) Disposer.dispose(mySearchRescheduleOnCancellationsAlarm); if (myUsagePreviewPanel != null) Disposer.dispose(myUsagePreviewPanel); for(Map.Entry e: myComboBoxListeners.entrySet()) { e.getKey().removeDocumentListener(e.getValue()); @@ -324,6 +327,7 @@ public class FindDialog extends DialogWrapper { if (state == ModalityState.NON_MODAL) return; // skip initial changes finishPreviousPreviewSearch(); + mySearchRescheduleOnCancellationsAlarm.cancelAllRequests(); final DefaultTableModel model = new DefaultTableModel() { @Override public boolean isCellEditable(int row, int column) { @@ -337,7 +341,6 @@ public class FindDialog extends DialogWrapper { applyTo(modelClone, false); ValidationInfo result = getValidationInfo(modelClone); - if (result != null) return; // todo final PsiDirectory psiDirectory = FindInProjectUtil.getPsiDirectory(modelClone, myProject); @@ -345,6 +348,12 @@ public class FindDialog extends DialogWrapper { myResultsPreviewSearchProgress = progressIndicatorWhenSearchStarted; myResultsPreviewTable.setModel(model); + + if (result != null) { + myResultsPreviewTable.getEmptyText().setText(UIBundle.message("message.nothingToShow")); + return; + } + myResultsPreviewTable.getColumnModel().getColumn(0).setCellRenderer(new UsageTableCellRenderer()); myResultsPreviewTable.getEmptyText().setText("Searching..."); @@ -375,7 +384,7 @@ public class FindDialog extends DialogWrapper { return resultsCount.incrementAndGet() < ShowUsagesAction.USAGES_PAGE_SIZE; } }, processPresentation); - if (resultsCount.get() == 0) { + if (resultsCount.get() == 0 && !progressIndicatorWhenSearchStarted.isCanceled()) { ApplicationManager.getApplication().invokeLater(new Runnable() { @Override public void run() { @@ -389,8 +398,14 @@ public class FindDialog extends DialogWrapper { @Override public void onCanceled(@NotNull ProgressIndicator indicator) { - if (progressIndicatorWhenSearchStarted == myResultsPreviewSearchProgress && resultsCount.get() == 0) { - myResultsPreviewTable.getEmptyText().setText("Cancelled"); + if (isShowing() && progressIndicatorWhenSearchStarted == myResultsPreviewSearchProgress) { + mySearchRescheduleOnCancellationsAlarm.cancelAllRequests(); + mySearchRescheduleOnCancellationsAlarm.addRequest(new Runnable() { + @Override + public void run() { + findSettingsChanged(); + } + }, 100); } } }); @@ -513,6 +528,7 @@ public class FindDialog extends DialogWrapper { } } }); + mySearchRescheduleOnCancellationsAlarm = new Alarm(); previewSplitter.setFirstComponent(new JBScrollPane(myResultsPreviewTable)); previewSplitter.setSecondComponent(myUsagePreviewPanel.createComponent()); myPreviewSplitter = previewSplitter; diff --git a/platform/lang-impl/src/com/intellij/find/impl/FindInProjectTask.java b/platform/lang-impl/src/com/intellij/find/impl/FindInProjectTask.java index 7d3577851221..93e88a25e0fa 100644 --- a/platform/lang-impl/src/com/intellij/find/impl/FindInProjectTask.java +++ b/platform/lang-impl/src/com/intellij/find/impl/FindInProjectTask.java @@ -82,7 +82,7 @@ class FindInProjectTask { private final Condition myFileMask; private final ProgressIndicator myProgress; @Nullable private final Module myModule; - private final Set myLargeFiles = ContainerUtil.newTroveSet(); + private final Set myLargeFiles = ContainerUtil.newTroveSet(); private boolean myWarningShown; FindInProjectTask(@NotNull final FindModel findModel, @@ -122,9 +122,9 @@ class FindInProjectTask { try { myProgress.setIndeterminate(true); myProgress.setText("Scanning indexed files..."); - final Set filesForFastWordSearch = ApplicationManager.getApplication().runReadAction(new Computable>() { + final Set filesForFastWordSearch = ApplicationManager.getApplication().runReadAction(new Computable>() { @Override - public Set compute() { + public Set compute() { return getFilesForFastWordSearch(); } }); @@ -138,7 +138,7 @@ class FindInProjectTask { myProgress.setIndeterminate(true); myProgress.setText("Scanning non-indexed files..."); boolean skipIndexed = canRelyOnIndices(); - final Collection otherFiles = collectFilesInScope(filesForFastWordSearch, skipIndexed); + final Collection otherFiles = collectFilesInScope(filesForFastWordSearch, skipIndexed); myProgress.setIndeterminate(false); if (LOG.isDebugEnabled()) { @@ -167,13 +167,13 @@ class FindInProjectTask { } } - private static void logStats(Collection otherFiles, long start) { + private static void logStats(Collection otherFiles, long start) { long time = System.currentTimeMillis() - start; final Multiset stats = HashMultiset.create(); - for (PsiFile file : otherFiles) { + for (VirtualFile file : otherFiles) { //noinspection StringToUpperCaseOrToLowerCaseWithoutLocale - stats.add(StringUtil.notNullize(file.getViewProvider().getVirtualFile().getExtension()).toLowerCase()); + stats.add(StringUtil.notNullize(file.getExtension()).toLowerCase()); } List extensions = ContainerUtil.newArrayList(stats.elementSet()); @@ -194,17 +194,16 @@ class FindInProjectTask { LOG.info(message); } - private void searchInFiles(@NotNull Collection psiFiles, + private void searchInFiles(@NotNull Collection virtualFiles, @NotNull FindUsagesProcessPresentation processPresentation, @NotNull final Processor consumer) { int i = 0; long totalFilesSize = 0; int count = 0; - for (final PsiFile psiFile : psiFiles) { - final VirtualFile virtualFile = psiFile.getVirtualFile(); + for (final VirtualFile virtualFile : virtualFiles) { final int index = i++; - if (virtualFile == null) continue; + if (!virtualFile.isValid()) continue; long fileLength = UsageViewManagerImpl.getFileLength(virtualFile); if (fileLength == -1) continue; // Binary or invalid @@ -213,17 +212,26 @@ class FindInProjectTask { if (skipProjectFile && !Registry.is("find.search.in.project.files")) continue; if (fileLength > SINGLE_FILE_SIZE_LIMIT) { - myLargeFiles.add(psiFile); + myLargeFiles.add(virtualFile); continue; } myProgress.checkCanceled(); - myProgress.setFraction((double)index / psiFiles.size()); + myProgress.setFraction((double)index / virtualFiles.size()); String text = FindBundle.message("find.searching.for.string.in.file.progress", myFindModel.getStringToFind(), virtualFile.getPresentableUrl()); myProgress.setText(text); myProgress.setText2(FindBundle.message("find.searching.for.string.in.file.occurrences.progress", count)); + PsiFile psiFile = findFile(virtualFile); + if (psiFile == null) continue; + + if (!(psiFile instanceof PsiBinaryFile)) { + PsiFile sourceFile = (PsiFile)psiFile.getNavigationElement(); + if (sourceFile != null) psiFile = sourceFile; + if (psiFile.getFileType().isBinary()) continue; + } + int countInFile = FindInProjectUtil.processUsagesInFile(psiFile, myFindModel, new Processor() { @Override public boolean process(UsageInfo info) { @@ -258,7 +266,7 @@ class FindInProjectTask { } @NotNull - private Collection collectFilesInScope(@NotNull final Set alreadySearched, final boolean skipIndexed) { + private Collection collectFilesInScope(@NotNull final Set alreadySearched, final boolean skipIndexed) { SearchScope customScope = myFindModel.getCustomScope(); final GlobalSearchScope globalCustomScope = toGlobal(customScope); @@ -266,7 +274,7 @@ class FindInProjectTask { final boolean hasTrigrams = hasTrigrams(myFindModel.getStringToFind()); class EnumContentIterator implements ContentIterator { - final Set myFiles = new LinkedHashSet(); + final Set myFiles = new LinkedHashSet(); @Override public boolean processFile(@NotNull final VirtualFile virtualFile) { @@ -285,14 +293,7 @@ class FindInProjectTask { return; } - PsiFile psiFile = myPsiManager.findFile(virtualFile); - if (psiFile != null && !(psiFile instanceof PsiBinaryFile) && !alreadySearched.contains(psiFile)) { - PsiFile sourceFile = (PsiFile)psiFile.getNavigationElement(); - if (sourceFile != null) psiFile = sourceFile; - if (!psiFile.getFileType().isBinary()) { - myFiles.add(psiFile); - } - } + if (!alreadySearched.contains(virtualFile)) myFiles.add(virtualFile); } private final FileBasedIndexImpl fileBasedIndex = (FileBasedIndexImpl)FileBasedIndex.getInstance(); @@ -309,7 +310,7 @@ class FindInProjectTask { } @NotNull - private Collection getFiles() { + private Collection getFiles() { return myFiles; } } @@ -425,7 +426,7 @@ class FindInProjectTask { @NotNull - private Set getFilesForFastWordSearch() { + private Set getFilesForFastWordSearch() { String stringToFind = myFindModel.getStringToFind(); if (stringToFind.isEmpty() || DumbService.getInstance(myProject).isDumb()) { return Collections.emptySet(); @@ -443,7 +444,7 @@ class FindInProjectTask { scope = ProjectScope.getContentScope(myProject); } - final Set resultFiles = new LinkedHashSet(); + final Set resultFiles = new LinkedHashSet(); if (TrigramIndex.ENABLED) { final Set keys = ContainerUtil.newTroveSet(); @@ -468,10 +469,7 @@ class FindInProjectTask { for (VirtualFile hit : hits) { if (myFileMask.value(hit)) { - PsiFile file = findFile(hit); - if (file != null) { - resultFiles.add(file); - } + resultFiles.add(hit); } } @@ -484,7 +482,7 @@ class FindInProjectTask { @Override public boolean process(VirtualFile file) { if (myFileMask.value(file)) { - ContainerUtil.addIfNotNull(resultFiles, findFile(file)); + ContainerUtil.addIfNotNull(resultFiles, file); } return true; } @@ -492,9 +490,10 @@ class FindInProjectTask { // in case our word splitting is incorrect CacheManager cacheManager = CacheManager.SERVICE.getInstance(myProject); - PsiFile[] filesWithWord = cacheManager.getFilesWithWord(stringToFind, UsageSearchContext.ANY, scope, myFindModel.isCaseSensitive()); - for (PsiFile file : filesWithWord) { - if (myFileMask.value(file.getVirtualFile())) { + VirtualFile[] filesWithWord = cacheManager.getVirtualFilesWithWord(stringToFind, UsageSearchContext.ANY, scope, + myFindModel.isCaseSensitive()); + for (VirtualFile file : filesWithWord) { + if (myFileMask.value(file)) { resultFiles.add(file); } } diff --git a/platform/lang-impl/src/com/intellij/formatting/WhiteSpace.java b/platform/lang-impl/src/com/intellij/formatting/WhiteSpace.java index 1df92e2803bb..63692a899925 100644 --- a/platform/lang-impl/src/com/intellij/formatting/WhiteSpace.java +++ b/platform/lang-impl/src/com/intellij/formatting/WhiteSpace.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -23,6 +23,7 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.PsiWhiteSpace; import com.intellij.psi.codeStyle.CommonCodeStyleSettings; import com.intellij.psi.formatter.FormattingDocumentModelImpl; +import com.intellij.util.BitUtil; import com.intellij.util.text.CharArrayUtil; import org.jetbrains.annotations.NotNull; @@ -61,13 +62,14 @@ class WhiteSpace { private boolean myForceSkipTabulationsUsage; private boolean myIsBeforeCodeBlockEnd; - private static final byte FIRST = 1; - private static final byte SAFE = 0x2; - private static final byte KEEP_FIRST_COLUMN = 0x4; - private static final byte LINE_FEEDS_ARE_READ_ONLY = 0x8; - private static final byte READ_ONLY = 0x10; - private static final byte CONTAINS_LF_INITIALLY = 0x20; - private static final byte CONTAINS_SPACES_INITIALLY = 0x40; + private static final byte FIRST_MASK = 1; + private static final byte SAFE_MASK = 0x2; + private static final byte KEEP_FIRST_COLUMN_MASK = 0x4; + private static final byte LINE_FEEDS_ARE_READ_ONLY_MASK = 0x8; + private static final byte READ_ONLY_MASK = 0x10; + private static final byte CONTAINS_LF_INITIALLY_MASK = 0x20; + private static final byte CONTAINS_SPACES_INITIALLY_MASK = 0x40; + private static final int LF_COUNT_SHIFT = 7; private static final int MAX_LF_COUNT = 1 << 24; @@ -139,12 +141,10 @@ class WhiteSpace { myInitialLastLinesSpaces = indent.whiteSpaces; myInitialLastLinesTabs = indent.tabs; - if (getLineFeeds() > 0) myFlags |= CONTAINS_LF_INITIALLY; - else myFlags &= ~CONTAINS_LF_INITIALLY; + setFlag(CONTAINS_LF_INITIALLY_MASK, getLineFeeds() > 0); final int totalSpaces = getTotalSpaces(); - if (totalSpaces > 0) myFlags |= CONTAINS_SPACES_INITIALLY; - else myFlags &=~ CONTAINS_SPACES_INITIALLY; + setFlag(CONTAINS_SPACES_INITIALLY_MASK, totalSpaces > 0); } /** @@ -295,7 +295,7 @@ class WhiteSpace { performModification(new Runnable() { @Override public void run() { - if (!isKeepFirstColumn() || (myFlags & CONTAINS_SPACES_INITIALLY) != 0) { + if (!isKeepFirstColumn() || getFlag(CONTAINS_SPACES_INITIALLY_MASK)) { mySpaces = spaces; myIndentSpaces = indent; } @@ -508,20 +508,15 @@ class WhiteSpace { } public void setIsSafe(final boolean value) { - setFlag(SAFE, value); + setFlag(SAFE_MASK, value); } private void setFlag(final int mask, final boolean value) { - if (value) { - myFlags |= mask; - } - else { - myFlags &= ~mask; - } + myFlags = BitUtil.set(myFlags, mask, value); } private boolean getFlag(final int mask) { - return (myFlags & mask) != 0; + return BitUtil.isSet(myFlags, mask); } private boolean isFirst() { @@ -537,7 +532,7 @@ class WhiteSpace { */ public boolean containsLineFeedsInitially() { if (myInitial == null) return false; - return (myFlags & CONTAINS_LF_INITIALLY) != 0; + return getFlag(CONTAINS_LF_INITIALLY_MASK); } /** @@ -588,7 +583,7 @@ class WhiteSpace { } public void setKeepFirstColumn(final boolean b) { - setFlag(KEEP_FIRST_COLUMN, b); + setFlag(KEEP_FIRST_COLUMN_MASK, b); } public void setLineFeedsAreReadOnly() { @@ -600,35 +595,35 @@ class WhiteSpace { } public boolean isIsFirstWhiteSpace() { - return getFlag(FIRST); + return getFlag(FIRST_MASK); } public boolean isIsSafe() { - return getFlag(SAFE); + return getFlag(SAFE_MASK); } public boolean isKeepFirstColumn() { - return getFlag(KEEP_FIRST_COLUMN); + return getFlag(KEEP_FIRST_COLUMN_MASK); } public boolean isLineFeedsAreReadOnly() { - return getFlag(LINE_FEEDS_ARE_READ_ONLY); + return getFlag(LINE_FEEDS_ARE_READ_ONLY_MASK); } public void setLineFeedsAreReadOnly(final boolean lineFeedsAreReadOnly) { - setFlag(LINE_FEEDS_ARE_READ_ONLY, lineFeedsAreReadOnly); + setFlag(LINE_FEEDS_ARE_READ_ONLY_MASK, lineFeedsAreReadOnly); } public boolean isIsReadOnly() { - return getFlag(READ_ONLY); + return getFlag(READ_ONLY_MASK); } public void setIsReadOnly(final boolean isReadOnly) { - setFlag(READ_ONLY, isReadOnly); + setFlag(READ_ONLY_MASK, isReadOnly); } public void setIsFirstWhiteSpace(final boolean isFirstWhiteSpace) { - setFlag(FIRST, isFirstWhiteSpace); + setFlag(FIRST_MASK, isFirstWhiteSpace); } public StringBuilder generateWhiteSpace(final CommonCodeStyleSettings.IndentOptions indentOptions, diff --git a/platform/lang-impl/src/com/intellij/ide/actions/GotoClassAction.java b/platform/lang-impl/src/com/intellij/ide/actions/GotoClassAction.java index 24d7a09942df..a6c296bba9f4 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/GotoClassAction.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/GotoClassAction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -13,11 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.intellij.ide.actions; import com.intellij.codeInsight.navigation.NavigationUtil; import com.intellij.featureStatistics.FeatureUsageTracker; +import com.intellij.ide.IdeBundle; import com.intellij.ide.structureView.StructureView; import com.intellij.ide.structureView.StructureViewBuilder; import com.intellij.ide.structureView.StructureViewTreeElement; @@ -29,7 +29,6 @@ import com.intellij.lang.LanguageStructureViewBuilder; import com.intellij.lang.PsiStructureViewFactory; import com.intellij.navigation.AnonymousElementProvider; import com.intellij.navigation.ChooseByNameRegistry; -import com.intellij.navigation.ItemPresentation; import com.intellij.navigation.NavigationItem; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.application.AccessToken; @@ -53,34 +52,38 @@ import com.intellij.psi.util.PsiUtilCore; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.awt.*; +import java.awt.event.InputEvent; import java.util.ArrayList; import java.util.List; public class GotoClassAction extends GotoActionBase implements DumbAware { @Override - public void actionPerformed(@NotNull final AnActionEvent e) { - final Project project = e.getData(CommonDataKeys.PROJECT); - assert project != null; + public void actionPerformed(@NotNull AnActionEvent e) { + Project project = e.getProject(); + if (project == null) return; + if (!DumbService.getInstance(project).isDumb()) { super.actionPerformed(e); } else { - DumbService.getInstance(project) - .showDumbModeNotification("Goto Class action is not available until indices are built, using Goto File instead"); - ActionManager.getInstance() - .tryToExecute(ActionManager.getInstance().getAction(GotoFileAction.ID), ActionCommand.getInputEvent(GotoFileAction.ID), - e.getData(PlatformDataKeys.CONTEXT_COMPONENT), e.getPlace(), true); + DumbService.getInstance(project).showDumbModeNotification(IdeBundle.message("go.to.class.dumb.mode.message")); + AnAction action = ActionManager.getInstance().getAction(GotoFileAction.ID); + InputEvent event = ActionCommand.getInputEvent(GotoFileAction.ID); + Component component = e.getData(PlatformDataKeys.CONTEXT_COMPONENT); + ActionManager.getInstance().tryToExecute(action, event, component, e.getPlace(), true); } } @Override - public void gotoActionPerformed(AnActionEvent e) { - final Project project = e.getData(CommonDataKeys.PROJECT); - assert project != null; + public void gotoActionPerformed(@NotNull AnActionEvent e) { + final Project project = e.getProject(); + if (project == null) return; + + FeatureUsageTracker.getInstance().triggerFeatureUsed("navigation.popup.class"); PsiDocumentManager.getInstance(project).commitAllDocuments(); - FeatureUsageTracker.getInstance().triggerFeatureUsed("navigation.popup.class"); final GotoClassModel2 model = new GotoClassModel2(project); showNavigationPopup(e, model, new GotoActionCallback() { @Override @@ -93,17 +96,20 @@ public class GotoClassAction extends GotoActionBase implements DumbAware { AccessToken token = ReadAction.start(); try { if (element instanceof PsiElement) { - final PsiElement psiElement = getElement(((PsiElement)element), popup); - final VirtualFile file = PsiUtilCore.getVirtualFile(psiElement); - if (popup.getLinePosition() != -1 && file != null) { - Navigatable n = new OpenFileDescriptor(project, file, popup.getLinePosition(), popup.getColumnPosition()).setUseCurrentWindow( - popup.isOpenInCurrentWindowRequested()); + PsiElement psiElement = getElement(((PsiElement)element), popup); + psiElement = psiElement.getNavigationElement(); + VirtualFile file = PsiUtilCore.getVirtualFile(psiElement); + + if (file != null && popup.getLinePosition() != -1) { + OpenFileDescriptor descriptor = new OpenFileDescriptor(project, file, popup.getLinePosition(), popup.getColumnPosition()); + Navigatable n = descriptor.setUseCurrentWindow(popup.isOpenInCurrentWindowRequested()); if (n.canNavigate()) { n.navigate(true); return; } } - if (psiElement != null && file != null && popup.getMemberPattern() != null) { + + if (file != null && popup.getMemberPattern() != null) { NavigationUtil.activateFileWithPsiElement(psiElement, !popup.isOpenInCurrentWindowRequested()); Navigatable member = findMember(popup.getMemberPattern(), psiElement, file); if (member != null) { @@ -121,10 +127,11 @@ public class GotoClassAction extends GotoActionBase implements DumbAware { token.finish(); } } - }, "Classes matching pattern", true); + }, IdeBundle.message("go.to.class.toolwindow.title"), true); } - @Nullable private static Navigatable findMember(String pattern, PsiElement psiElement, VirtualFile file) { + @Nullable + private static Navigatable findMember(String pattern, PsiElement psiElement, VirtualFile file) { final PsiStructureViewFactory factory = LanguageStructureViewBuilder.INSTANCE.forLanguage(psiElement.getLanguage()); final StructureViewBuilder builder = factory == null ? null : factory.getStructureViewBuilder(psiElement.getContainingFile()); final FileEditor[] editors = FileEditorManager.getInstance(psiElement.getProject()).getEditors(file); @@ -144,8 +151,7 @@ public class GotoClassAction extends GotoActionBase implements DumbAware { Object target = null; for (TreeElement treeElement : element.getChildren()) { if (treeElement instanceof StructureViewTreeElement) { - final ItemPresentation presentation = treeElement.getPresentation(); - String presentableText = presentation == null ? null : presentation.getPresentableText(); + String presentableText = treeElement.getPresentation().getPresentableText(); if (presentableText != null) { final int degree = matcher.matchingDegree(presentableText); if (degree > max) { @@ -181,6 +187,7 @@ public class GotoClassAction extends GotoActionBase implements DumbAware { return null; } + @NotNull private static PsiElement getElement(@NotNull PsiElement element, ChooseByNamePopup popup) { final String path = popup.getPathToAnonymous(); if (path != null) { diff --git a/platform/lang-impl/src/com/intellij/ide/actions/GotoFileAction.java b/platform/lang-impl/src/com/intellij/ide/actions/GotoFileAction.java index 280e4c7736b1..e43d45ada6d8 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/GotoFileAction.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/GotoFileAction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -13,11 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.intellij.ide.actions; import com.intellij.featureStatistics.FeatureUsageTracker; -import com.intellij.ide.util.gotoByName.*; +import com.intellij.ide.IdeBundle; +import com.intellij.ide.util.gotoByName.ChooseByNameFilter; +import com.intellij.ide.util.gotoByName.ChooseByNamePopup; +import com.intellij.ide.util.gotoByName.GotoFileConfiguration; +import com.intellij.ide.util.gotoByName.GotoFileModel; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.application.ApplicationManager; @@ -30,7 +33,6 @@ import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.pom.Navigatable; -import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; @@ -52,8 +54,11 @@ public class GotoFileAction extends GotoActionBase implements DumbAware { @Override public void gotoActionPerformed(AnActionEvent e) { - FeatureUsageTracker.getInstance().triggerFeatureUsed("navigation.popup.file"); final Project project = e.getData(CommonDataKeys.PROJECT); + if (project == null) return; + + FeatureUsageTracker.getInstance().triggerFeatureUsed("navigation.popup.file"); + final GotoFileModel gotoFileModel = new GotoFileModel(project); GotoActionCallback callback = new GotoActionCallback() { @Override @@ -71,9 +76,10 @@ public class GotoFileAction extends GotoActionBase implements DumbAware { //this is for better cursor position if (element instanceof PsiFile) { - VirtualFile vfile = ((PsiFile)element).getVirtualFile(); - if (vfile == null) return; - n = new OpenFileDescriptor(project, vfile, popup.getLinePosition(), popup.getColumnPosition()).setUseCurrentWindow(popup.isOpenInCurrentWindowRequested()); + VirtualFile file = ((PsiFile)element).getVirtualFile(); + if (file == null) return; + OpenFileDescriptor descriptor = new OpenFileDescriptor(project, file, popup.getLinePosition(), popup.getColumnPosition()); + n = descriptor.setUseCurrentWindow(popup.isOpenInCurrentWindowRequested()); } if (!n.canNavigate()) return; @@ -82,8 +88,8 @@ public class GotoFileAction extends GotoActionBase implements DumbAware { }, ModalityState.NON_MODAL); } }; - PsiElement context = getPsiContext(e); - showNavigationPopup(e, gotoFileModel, callback, "Files matching pattern", true, true, new GotoFileItemProvider(project, context)); + GotoFileItemProvider provider = new GotoFileItemProvider(project, getPsiContext(e)); + showNavigationPopup(e, gotoFileModel, callback, IdeBundle.message("go.to.file.toolwindow.title"), true, true, provider); } protected static class GotoFileFilter extends ChooseByNameFilter { @@ -148,5 +154,4 @@ public class GotoFileAction extends GotoActionBase implements DumbAware { return o1.getName().compareToIgnoreCase(o2.getName()); } } - } diff --git a/platform/lang-impl/src/com/intellij/ide/scratch/ScratchFileServiceImpl.java b/platform/lang-impl/src/com/intellij/ide/scratch/ScratchFileServiceImpl.java index 5352b24cb5ec..e2e264a8e86c 100644 --- a/platform/lang-impl/src/com/intellij/ide/scratch/ScratchFileServiceImpl.java +++ b/platform/lang-impl/src/com/intellij/ide/scratch/ScratchFileServiceImpl.java @@ -36,7 +36,9 @@ import com.intellij.openapi.fileTypes.*; import com.intellij.openapi.fileTypes.ex.FileTypeIdentifiableByVirtualFile; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Iconable; +import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.ThrowableComputable; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; @@ -305,8 +307,13 @@ public abstract class ScratchFileServiceImpl extends ScratchFileService { } private static boolean isFileInRootImpl(@NotNull VirtualFile file, RootId scratches) { + // files are created under scratches.getId() directory, quickly check parent name to avoid calling getPath() + VirtualFile parent = file.getParent(); + if (parent == null) return false; + if (!Comparing.equal(parent.getNameSequence(), scratches.getId(), SystemInfo.isFileSystemCaseSensitive)) return false; + String rootPath = ScratchFileService.getInstance().getRootPath(scratches); - return file.getPath().startsWith(rootPath); + return FileUtil.startsWith(file.getPath(), rootPath); } private static class MyFileType extends LanguageFileType implements FileTypeIdentifiableByVirtualFile, InternalFileType { diff --git a/platform/lang-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/MoveFileHandler.java b/platform/lang-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/MoveFileHandler.java index a73dc4fd89e4..ec4c5fc3bfd6 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/MoveFileHandler.java +++ b/platform/lang-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/MoveFileHandler.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -30,18 +30,58 @@ import java.util.List; import java.util.Map; /** + * Allows plugins to handle the Move refactoring for a file in a custom way. + * * @author Maxim.Mossienko - * Date: Sep 18, 2008 - * Time: 3:40:48 PM */ public abstract class MoveFileHandler { private static final ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.moveFileHandler"); + /** + * Checks whether a file can be handled by this move handler. + * + * @param element the file being moved. + * @return true if this handler can handle this file, false otherwise. + */ public abstract boolean canProcessElement(PsiFile element); + + /** + * Performs any necessary modifications of the file contents before the move. + * + * @param file the file being moved. + * @param moveDestination the directory to which the file is being moved. + * @param oldToNewMap the map of elements which can be referenced from other files directly (not through a file reference) + * to their counterparts after the move. The handler needs to add elements to this map according to the + * file modifications that it has performed. + */ public abstract void prepareMovedFile(PsiFile file, PsiDirectory moveDestination, Map oldToNewMap); + + /** + * Finds the list of references to the file being moved that will need to be updated during the move refactoring. + * + * @param psiFile the file being moved. + * @param newParent the directory to which the file is being moved. + * @param searchInComments if true, search for references in comments has been requested. + * @param searchInNonJavaFiles if true, search for references in non-code files (such as .xml) has been requested. + * @return the list of usages that need to be updated, or null if nothing needs to be updated. + */ @Nullable public abstract List findUsages(PsiFile psiFile, PsiDirectory newParent, boolean searchInComments, boolean searchInNonJavaFiles); + + /** + * After a file has been moved, updates the references to the file so that they point to the new location of the file. + * + * @param usageInfos the list of references, as returned from {@link #findUsages} + * @param oldToNewMap the map of all moved elements, filled by {@link #prepareMovedFile} + */ public abstract void retargetUsages(List usageInfos, Map oldToNewMap) ; + + /** + * Updates the contents of the file after it has been moved (e.g. updates the package statement to correspond to the + * new location of a Java class). + * + * @param file the moved file. + */ public abstract void updateMovedFile(PsiFile file) throws IncorrectOperationException; @NotNull diff --git a/platform/lang-impl/src/com/intellij/util/CompletionContributorForTextField.java b/platform/lang-impl/src/com/intellij/util/CompletionContributorForTextField.java index 50eadaa0a2c4..427805facc71 100644 --- a/platform/lang-impl/src/com/intellij/util/CompletionContributorForTextField.java +++ b/platform/lang-impl/src/com/intellij/util/CompletionContributorForTextField.java @@ -43,5 +43,6 @@ public class CompletionContributorForTextField extends CompletionContributor imp } field.addCompletionVariants(text, offset, prefix, activeResult); + activeResult.stopHere(); } } diff --git a/platform/platform-api/src/com/intellij/openapi/actionSystem/ActionPlaces.java b/platform/platform-api/src/com/intellij/openapi/actionSystem/ActionPlaces.java index 7c0006c9a3e7..d899d533f052 100644 --- a/platform/platform-api/src/com/intellij/openapi/actionSystem/ActionPlaces.java +++ b/platform/platform-api/src/com/intellij/openapi/actionSystem/ActionPlaces.java @@ -81,7 +81,7 @@ public abstract class ActionPlaces { public static final String ANT_MESSAGES_TOOLBAR = "AntMessagesToolbar"; public static final String ANT_EXPLORER_POPUP = "AntExplorerPopup"; public static final String ANT_EXPLORER_TOOLBAR = "AntExplorerToolbar"; - public static final String GULP_VIEW_POPUP = "JavaScriptGulpPopup"; + public static final String JS_BUILD_TOOL_POPUP = "JavaScriptBuildTool"; //todo: probably these context should be splitted into several contexts public static final String CODE_INSPECTION = "CodeInspection"; @@ -143,7 +143,7 @@ public abstract class ActionPlaces { FILEVIEW_POPUP, CHECKOUT_POPUP, LVCS_DIRECTORY_HISTORY_POPUP, GUI_DESIGNER_EDITOR_POPUP, GUI_DESIGNER_COMPONENT_TREE_POPUP, GUI_DESIGNER_PROPERTY_INSPECTOR_POPUP, CREATE_EJB_POPUP, CHANGES_VIEW_POPUP, REMOTE_HOST_VIEW_POPUP, REMOTE_HOST_DIALOG_POPUP, TFS_TREE_POPUP, - ACTION_PLACE_VCS_QUICK_LIST_POPUP_ACTION, PHING_EXPLORER_POPUP, NAVIGATION_BAR_POPUP, GULP_VIEW_POPUP + ACTION_PLACE_VCS_QUICK_LIST_POPUP_ACTION, PHING_EXPLORER_POPUP, NAVIGATION_BAR_POPUP, JS_BUILD_TOOL_POPUP }; public static boolean isPopupPlace(@NotNull String place) { diff --git a/platform/platform-api/src/com/intellij/openapi/fileEditor/OpenFileDescriptor.java b/platform/platform-api/src/com/intellij/openapi/fileEditor/OpenFileDescriptor.java index fbf057f50acc..654490929110 100644 --- a/platform/platform-api/src/com/intellij/openapi/fileEditor/OpenFileDescriptor.java +++ b/platform/platform-api/src/com/intellij/openapi/fileEditor/OpenFileDescriptor.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -36,21 +36,17 @@ import java.util.List; public class OpenFileDescriptor implements Navigatable { /** - * Tells descriptor to navigate in specific editor rather than file editor - * in main IDEA window. - * For example if you want to navigate in editor embedded into modal dialog, - * you should provide this data. + * Tells descriptor to navigate in specific editor rather than file editor in main IDEA window. + * For example if you want to navigate in editor embedded into modal dialog, you should provide this data. */ public static final DataKey NAVIGATE_IN_EDITOR = DataKey.create("NAVIGATE_IN_EDITOR"); - @NotNull + private final Project myProject; private final VirtualFile myFile; - private final int myOffset; private final int myLogicalLine; private final int myLogicalColumn; + private final int myOffset; private final RangeMarker myRangeMarker; - @NotNull - private final Project myProject; private boolean myUseCurrentWindow = false; @@ -62,8 +58,7 @@ public class OpenFileDescriptor implements Navigatable { this(project, file, logicalLine, logicalColumn, -1, false); } - public OpenFileDescriptor(@NotNull Project project, @NotNull VirtualFile file, - int logicalLine, int logicalColumn, boolean persistent) { + public OpenFileDescriptor(@NotNull Project project, @NotNull VirtualFile file, int logicalLine, int logicalColumn, boolean persistent) { this(project, file, logicalLine, logicalColumn, -1, persistent); } @@ -71,10 +66,8 @@ public class OpenFileDescriptor implements Navigatable { this(project, file, -1, -1, -1, false); } - private OpenFileDescriptor(@NotNull Project project, @NotNull VirtualFile file, - int logicalLine, int logicalColumn, int offset, boolean persistent) { + private OpenFileDescriptor(@NotNull Project project, @NotNull VirtualFile file, int logicalLine, int logicalColumn, int offset, boolean persistent) { myProject = project; - myFile = file; myLogicalLine = logicalLine; myLogicalColumn = logicalColumn; @@ -139,7 +132,7 @@ public class OpenFileDescriptor implements Navigatable { } private boolean navigateInRequestedEditor() { - DataContext ctx = DataManager.getInstance().getDataContext(); + @SuppressWarnings("deprecation") DataContext ctx = DataManager.getInstance().getDataContext(); Editor e = NAVIGATE_IN_EDITOR.getData(ctx); if (e == null) return false; if (!Comparing.equal(FileDocumentManager.getInstance().getFile(e.getDocument()), myFile)) return false; diff --git a/platform/platform-api/src/com/intellij/ui/CollectionListModel.java b/platform/platform-api/src/com/intellij/ui/CollectionListModel.java index d806eb2e06b8..e87ca745465b 100644 --- a/platform/platform-api/src/com/intellij/ui/CollectionListModel.java +++ b/platform/platform-api/src/com/intellij/ui/CollectionListModel.java @@ -72,8 +72,9 @@ public class CollectionListModel extends AbstractListModel implements Editabl public void remove(@NotNull final T element) { int i = myItems.indexOf(element); - myItems.remove(element); - fireIntervalRemoved(this, i, i); + if (myItems.remove(element)) { + fireIntervalRemoved(this, i, i); + } } public void setElementAt(@NotNull final T element, final int index) { diff --git a/platform/platform-api/src/com/intellij/ui/CommonActionsPanel.java b/platform/platform-api/src/com/intellij/ui/CommonActionsPanel.java index 3aacbf00edf5..9e31235b469d 100644 --- a/platform/platform-api/src/com/intellij/ui/CommonActionsPanel.java +++ b/platform/platform-api/src/com/intellij/ui/CommonActionsPanel.java @@ -25,6 +25,7 @@ import com.intellij.util.IconUtil; import com.intellij.util.containers.ContainerUtilRt; import com.intellij.util.ui.MacUIUtil; import com.intellij.util.ui.UIUtil; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -38,6 +39,7 @@ import java.util.*; */ public class CommonActionsPanel extends JPanel { private final boolean myDecorateButtons; + private final ActionToolbarPosition myPosition; public enum Buttons { ADD, REMOVE, EDIT, UP, DOWN; @@ -102,6 +104,7 @@ public class CommonActionsPanel extends JPanel { String addName, String removeName, String moveUpName, String moveDownName, String editName, Icon addIcon, Buttons... buttons) { super(new BorderLayout()); + myPosition = position; final Listener listener = factory.createListener(this); AnActionButton[] actions = new AnActionButton[buttons.length + (additionalActions == null ? 0 : additionalActions.length)]; for (int i = 0; i < buttons.length; i++) { @@ -224,6 +227,11 @@ public class CommonActionsPanel extends JPanel { } } + @NotNull + public ActionToolbarPosition getPosition() { + return myPosition; + } + static class MyActionButton extends AnActionButton implements DumbAware { private final Buttons myButton; private final Listener myListener; diff --git a/platform/platform-api/src/com/intellij/ui/speedSearch/SpeedSearchSupply.java b/platform/platform-api/src/com/intellij/ui/speedSearch/SpeedSearchSupply.java index 736c4db0b677..75ffa534737e 100644 --- a/platform/platform-api/src/com/intellij/ui/speedSearch/SpeedSearchSupply.java +++ b/platform/platform-api/src/com/intellij/ui/speedSearch/SpeedSearchSupply.java @@ -80,4 +80,10 @@ public abstract class SpeedSearchSupply { public abstract void addChangeListener(@NotNull PropertyChangeListener listener); public abstract void removeChangeListener(@NotNull PropertyChangeListener listener); + + /** + * Find an element matching the searching query in the underlying component and select it there. Speed-search popup is not affected. + * @param searchQuery text that the selected element should match + */ + public abstract void findAndSelectElement(@NotNull String searchQuery); } diff --git a/platform/platform-impl/src/com/intellij/help/impl/HelpManagerImpl.java b/platform/platform-impl/src/com/intellij/help/impl/HelpManagerImpl.java index 340fbb9ae186..8d8fa2d6797b 100644 --- a/platform/platform-impl/src/com/intellij/help/impl/HelpManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/help/impl/HelpManagerImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -21,6 +21,7 @@ import com.intellij.ide.IdeBundle; import com.intellij.ide.plugins.HelpSetPath; import com.intellij.ide.plugins.IdeaPluginDescriptor; import com.intellij.ide.plugins.PluginManager; +import com.intellij.internal.statistic.UsageTrigger; import com.intellij.openapi.application.ApplicationInfo; import com.intellij.openapi.application.ex.ApplicationInfoEx; import com.intellij.openapi.diagnostic.Logger; @@ -49,6 +50,8 @@ public class HelpManagerImpl extends HelpManager { private Object myFXHelpBrowser = null; public void invokeHelp(@Nullable String id) { + UsageTrigger.trigger("ide.help." + id); + if (myHelpSet == null) { myHelpSet = createHelpSet(); } diff --git a/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java b/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java index 2bbca4d274fc..affb8e4968b3 100644 --- a/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java +++ b/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java @@ -974,7 +974,7 @@ public class IdeEventQueue extends EventQueue { !SystemInfo.isWindows || !Registry.is("actionSystem.win.suppressAlt") || !(UISettings.getInstance().HIDE_TOOL_STRIPES || UISettings.getInstance().PRESENTATION_MODE)) { - return true; + return false; } if (ke.getID() == KeyEvent.KEY_PRESSED) { diff --git a/platform/platform-impl/src/com/intellij/notification/impl/NotificationSearchableOptionContributor.java b/platform/platform-impl/src/com/intellij/notification/impl/NotificationSearchableOptionContributor.java new file mode 100644 index 000000000000..b08890a14d61 --- /dev/null +++ b/platform/platform-impl/src/com/intellij/notification/impl/NotificationSearchableOptionContributor.java @@ -0,0 +1,32 @@ +/* + * Copyright 2000-2015 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.notification.impl; + +import com.intellij.ide.ui.search.SearchableOptionContributor; +import com.intellij.ide.ui.search.SearchableOptionProcessor; +import org.jetbrains.annotations.NotNull; + +/** + * @author peter + */ +public class NotificationSearchableOptionContributor extends SearchableOptionContributor { + @Override + public void processOptions(@NotNull SearchableOptionProcessor processor) { + for (NotificationSettings settings : NotificationsConfigurationImpl.getInstanceImpl().getAllSettings()) { + processor.addOptions(settings.getGroupId(), null, settings.getGroupId() + " notifications", NotificationsConfigurable.ID, NotificationsConfigurable.DISPLAY_NAME, true); + } + } +} diff --git a/platform/platform-impl/src/com/intellij/notification/impl/NotificationsConfigurable.java b/platform/platform-impl/src/com/intellij/notification/impl/NotificationsConfigurable.java index 17f6f42cb4df..99871d163225 100644 --- a/platform/platform-impl/src/com/intellij/notification/impl/NotificationsConfigurable.java +++ b/platform/platform-impl/src/com/intellij/notification/impl/NotificationsConfigurable.java @@ -30,6 +30,7 @@ import javax.swing.*; */ public class NotificationsConfigurable implements Configurable, SearchableConfigurable, Configurable.NoScroll { public static final String DISPLAY_NAME = "Notifications"; + static final String ID = "reference.settings.ide.settings.notifications"; private NotificationsConfigurablePanel myComponent; @Override @@ -41,7 +42,7 @@ public class NotificationsConfigurable implements Configurable, SearchableConfig @Override @NotNull public String getHelpTopic() { - return "reference.settings.ide.settings.notifications"; + return ID; } @Override @@ -82,6 +83,11 @@ public class NotificationsConfigurable implements Configurable, SearchableConfig @Override public Runnable enableSearch(final String option) { - return null; + return new Runnable() { + @Override + public void run() { + myComponent.selectGroup(option); + } + }; } } diff --git a/platform/platform-impl/src/com/intellij/notification/impl/ui/NotificationsConfigurablePanel.java b/platform/platform-impl/src/com/intellij/notification/impl/ui/NotificationsConfigurablePanel.java index 7931606053e5..1706376cc8e0 100644 --- a/platform/platform-impl/src/com/intellij/notification/impl/ui/NotificationsConfigurablePanel.java +++ b/platform/platform-impl/src/com/intellij/notification/impl/ui/NotificationsConfigurablePanel.java @@ -23,6 +23,8 @@ import com.intellij.openapi.ui.ComboBoxTableRenderer; import com.intellij.openapi.ui.StripeTable; import com.intellij.openapi.util.SystemInfo; import com.intellij.ui.*; +import com.intellij.ui.speedSearch.SpeedSearchSupply; +import com.intellij.util.ObjectUtils; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; @@ -427,4 +429,8 @@ public class NotificationsConfigurablePanel extends JPanel implements Disposable return result; } } + + public void selectGroup(String searchQuery) { + ObjectUtils.assertNotNull(SpeedSearchSupply.getSupply(myTable, true)).findAndSelectElement(searchQuery); + } } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/LineExtensionInfo.java b/platform/platform-impl/src/com/intellij/openapi/editor/LineExtensionInfo.java index f84502097b10..86a80c702585 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/LineExtensionInfo.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/LineExtensionInfo.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -16,6 +16,7 @@ package com.intellij.openapi.editor; import com.intellij.openapi.editor.markup.EffectType; +import com.intellij.openapi.editor.markup.TextAttributes; import org.intellij.lang.annotations.JdkConstants; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -43,6 +44,13 @@ public class LineExtensionInfo { myEffectColor = effectColor; myFontType = fontType; } + public LineExtensionInfo(@NotNull String text, @NotNull TextAttributes attr) { + myText = text; + myColor = attr.getForegroundColor(); + myEffectType = attr.getEffectType(); + myEffectColor = attr.getEffectColor(); + myFontType = attr.getFontType(); + } @NotNull public String getText() { diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/persistent/PersistentFSImpl.java b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/persistent/PersistentFSImpl.java index b1c3d90a8aed..bf91a747b948 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/persistent/PersistentFSImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/persistent/PersistentFSImpl.java @@ -1323,7 +1323,7 @@ public class PersistentFSImpl extends PersistentFS implements ApplicationCompone @NotNull @Override public CharSequence getNameSequence() { - return myParentLocalFile.getName(); + return myParentLocalFile.getNameSequence(); } @Override diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ProjectWindowAction.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ProjectWindowAction.java index 3383236b02e6..15045cedc05c 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ProjectWindowAction.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ProjectWindowAction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -17,12 +17,12 @@ package com.intellij.openapi.wm.impl; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CommonDataKeys; -import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.actionSystem.ToggleAction; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.wm.WindowManager; +import com.intellij.util.BitUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -121,7 +121,7 @@ public class ProjectWindowAction extends ToggleAction implements DumbAware { } final JFrame projectFrame = WindowManager.getInstance().getFrame(project); final int frameState = projectFrame.getExtendedState(); - if ((frameState & Frame.ICONIFIED) == Frame.ICONIFIED) { + if (BitUtil.isSet(frameState, Frame.ICONIFIED)) { // restore the frame if it is minimized projectFrame.setExtendedState(frameState ^ Frame.ICONIFIED); } diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowHeader.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowHeader.java index e3ebfe83a4b3..8f113e5fe3fb 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowHeader.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowHeader.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -36,6 +36,7 @@ import com.intellij.ui.PopupHandler; import com.intellij.ui.UIBundle; import com.intellij.ui.components.panels.Wrapper; import com.intellij.ui.tabs.TabsUtil; +import com.intellij.util.BitUtil; import com.intellij.util.Producer; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.EmptyIcon; @@ -520,7 +521,7 @@ public abstract class ToolWindowHeader extends JPanel implements Disposable, UIS public void actionPerformed(final ActionEvent e) { AnAction action = - myAlternativeAction != null && (e.getModifiers() & InputEvent.ALT_MASK) == InputEvent.ALT_MASK ? myAlternativeAction : myAction; + myAlternativeAction != null && BitUtil.isSet(e.getModifiers(), InputEvent.ALT_MASK) ? myAlternativeAction : myAction; final DataContext dataContext = DataManager.getInstance().getDataContext(this); final ActionManagerEx actionManager = ActionManagerEx.getInstanceEx(); InputEvent inputEvent = e.getSource() instanceof InputEvent ? (InputEvent) e.getSource() : null; diff --git a/platform/platform-impl/src/com/intellij/ui/SpeedSearchBase.java b/platform/platform-impl/src/com/intellij/ui/SpeedSearchBase.java index 6ee1ded56642..7170e20b9d7f 100644 --- a/platform/platform-impl/src/com/intellij/ui/SpeedSearchBase.java +++ b/platform/platform-impl/src/com/intellij/ui/SpeedSearchBase.java @@ -338,6 +338,11 @@ public abstract class SpeedSearchBase extends SpeedSear if ( mySearchPopup != null ) mySearchPopup.refreshSelection(); } + @Override + public void findAndSelectElement(@NotNull String searchQuery) { + selectElement(findElement(searchQuery), searchQuery); + } + private class SearchPopup extends JPanel { private final SearchField mySearchField; @@ -425,7 +430,7 @@ public abstract class SpeedSearchBase extends SpeedSear } public void refreshSelection () { - updateSelection(findElement(mySearchField.getText())); + findAndSelectElement(mySearchField.getText()); } private void updateSelection(Object element) { diff --git a/platform/platform-impl/src/com/intellij/ui/components/SliderSelectorAction.java b/platform/platform-impl/src/com/intellij/ui/components/SliderSelectorAction.java index 189e2d39e0d7..7712d4e4abfa 100644 --- a/platform/platform-impl/src/com/intellij/ui/components/SliderSelectorAction.java +++ b/platform/platform-impl/src/com/intellij/ui/components/SliderSelectorAction.java @@ -19,6 +19,10 @@ import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.ui.popup.JBPopup; import com.intellij.openapi.ui.popup.JBPopupFactory; +import com.intellij.openapi.ui.popup.JBPopupListener; +import com.intellij.openapi.ui.popup.LightweightWindowEvent; +import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.Ref; import com.intellij.ui.awt.RelativePoint; import com.intellij.util.Consumer; import com.intellij.util.ui.SwingHelper; @@ -28,10 +32,8 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.InputEvent; -import java.awt.event.MouseEvent; +import java.awt.event.*; +import java.util.Collections; import java.util.Dictionary; import java.util.Enumeration; import java.util.Hashtable; @@ -65,7 +67,6 @@ public class SliderSelectorAction extends DumbAwareAction { label.setBorder(BorderFactory.createEmptyBorder(4, 4, 0, 0)); JPanel wrapper = new JPanel(new BorderLayout()); wrapper.add(label, BorderLayout.NORTH); - result.add(wrapper, BorderLayout.WEST); final JSlider slider = new JSlider(SwingConstants.HORIZONTAL, myConfiguration.getMin(), myConfiguration.getMax(), myConfiguration.getSelected()); slider.setMinorTickSpacing(1); @@ -75,35 +76,52 @@ public class SliderSelectorAction extends DumbAwareAction { UIUtil.setSliderIsFilled(slider, true); slider.setPaintLabels(true); slider.setLabelTable(myConfiguration.getDictionary()); - result.add(slider, BorderLayout.CENTER); - final Runnable[] closeMe = new Runnable[1]; - if (myConfiguration.isShowOk()) { - final JButton done = new JButton("Done"); - result.add(SwingHelper.wrapWithoutStretch(done), BorderLayout.SOUTH); - done.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if (closeMe[0] != null) closeMe[0].run(); - } - }); + + if (! myConfiguration.isShowOk()) { + result.add(wrapper, BorderLayout.WEST); + result.add(slider, BorderLayout.CENTER); + } else { + result.add(wrapper, BorderLayout.WEST); + result.add(slider, BorderLayout.CENTER); } - final JBPopup popup = JBPopupFactory.getInstance().createComponentPopupBuilder(result, slider).setMovable(true).createPopup(); - final Runnable finalRunnable = new Runnable() { + final Runnable saveSelection = new Runnable() { @Override public void run() { int value = slider.getModel().getValue(); myConfiguration.getResultConsumer().consume(value); } }; - closeMe[0] = new Runnable() { - @Override - public void run() { - finalRunnable.run(); - popup.closeOk(null); - } - }; - popup.setFinalRunnable(finalRunnable); + final Ref popupRef = new Ref(null); + final JBPopup popup = JBPopupFactory.getInstance().createComponentPopupBuilder(result, slider) + .setMovable(true) + .setCancelOnWindowDeactivation(true) + .setCancelKeyEnabled(myConfiguration.isShowOk()) + .setKeyboardActions(Collections.singletonList(Pair.create(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + saveSelection.run(); + popupRef.get().closeOk(null); + } + }, KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0)))) + .createPopup(); + + popupRef.set(popup); + if (myConfiguration.isShowOk()) { + final JButton done = new JButton("Done"); + final JBPanel doneWrapper = new JBPanel(new BorderLayout()); + doneWrapper.add(done, BorderLayout.NORTH); + result.add(doneWrapper, BorderLayout.EAST); + done.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + saveSelection.run(); + popup.closeOk(null); + } + }); + } else { + popup.setFinalRunnable(saveSelection); + } InputEvent inputEvent = e.getInputEvent(); show(e, result, popup, inputEvent); } diff --git a/platform/platform-impl/src/com/intellij/ui/content/ContentManagerUtil.java b/platform/platform-impl/src/com/intellij/ui/content/ContentManagerUtil.java index b1a1a2f8a2eb..9129f3c3bb73 100644 --- a/platform/platform-impl/src/com/intellij/ui/content/ContentManagerUtil.java +++ b/platform/platform-impl/src/com/intellij/ui/content/ContentManagerUtil.java @@ -21,6 +21,7 @@ import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.project.Project; import com.intellij.openapi.wm.ex.ToolWindowEx; import com.intellij.openapi.wm.ex.ToolWindowManagerEx; +import com.intellij.util.ObjectUtils; public class ContentManagerUtil { private ContentManagerUtil() { @@ -43,18 +44,14 @@ public class ContentManagerUtil { id = mgr.getLastActiveToolWindowId(); } } - if(id == null){ + + ToolWindowEx toolWindow = id != null ? (ToolWindowEx)mgr.getToolWindow(id) : null; + if (requiresVisibleToolWindow && (toolWindow == null || !toolWindow.isVisible())) { return null; } - ToolWindowEx toolWindow = (ToolWindowEx)mgr.getToolWindow(id); - if (requiresVisibleToolWindow && !toolWindow.isVisible()) { - return null; - } - - final ContentManager fromContext = PlatformDataKeys.CONTENT_MANAGER.getData(dataContext); - if (fromContext != null) return fromContext; - - return toolWindow != null ? toolWindow.getContentManager() : null; + ContentManager fromToolWindow = toolWindow != null ? toolWindow.getContentManager() : null; + ContentManager fromContext = PlatformDataKeys.CONTENT_MANAGER.getData(dataContext); + return ObjectUtils.chooseNotNull(fromContext, fromToolWindow); } } diff --git a/platform/platform-resources-en/src/messages/ApplicationBundle.properties b/platform/platform-resources-en/src/messages/ApplicationBundle.properties index 2212fb98e3f6..adc5d40cd4f6 100644 --- a/platform/platform-resources-en/src/messages/ApplicationBundle.properties +++ b/platform/platform-resources-en/src/messages/ApplicationBundle.properties @@ -116,7 +116,7 @@ checkbox.use.fully.qualified.class.names.in.javadoc=Use fully qualified class na radio.use.fully.qualified.class.names.in.javadoc=Use fully qualified class names in JavaDoc: radio.use.fully.qualified.class.names.in.javadoc.always=Always radio.use.fully.qualified.class.names.in.javadoc.if.not.imported=If not already imported -radio.use.fully.qualified.class.names.in.javadoc.never=Never: use short name and add import +radio.use.fully.qualified.class.names.in.javadoc.never=Never, use short name and add import editbox.class.count.to.use.import.with.star=Class count to use import with '*': editbox.names.count.to.use.static.import.with.star=Names count to use static import with '*': title.packages.to.use.import.with=Packages to Use Import with '*' diff --git a/platform/platform-resources-en/src/messages/IdeBundle.properties b/platform/platform-resources-en/src/messages/IdeBundle.properties index 7af9239acdc0..49dede6c95ca 100644 --- a/platform/platform-resources-en/src/messages/IdeBundle.properties +++ b/platform/platform-resources-en/src/messages/IdeBundle.properties @@ -1166,3 +1166,7 @@ new.dir.project.chooser.title=Select Location for Project Directory new.dir.project.default.generator=Empty project new.dir.project.error.empty=Project name can't be empty new.dir.project.error.buck=Project directory name must not contain the ''$'' character + +go.to.file.toolwindow.title=Files matching pattern +go.to.class.toolwindow.title=Classes matching pattern +go.to.class.dumb.mode.message=Go To Class action is not available until indices are built, using Go To File instead diff --git a/platform/platform-resources-en/src/messages/OptionsBundle.properties b/platform/platform-resources-en/src/messages/OptionsBundle.properties index cb27a90f5dd7..b51a7a78bb5b 100644 --- a/platform/platform-resources-en/src/messages/OptionsBundle.properties +++ b/platform/platform-resources-en/src/messages/OptionsBundle.properties @@ -95,6 +95,9 @@ options.java.attribute.descriptor.bad.character=Bad character options.java.attribute.descriptor.breakpoint.line=Breakpoint line options.java.attribute.descriptor.execution.point=Execution point options.java.attribute.descriptor.not.top.frame=Not top frame +options.java.attribute.descriptor.inlined.values=Inlined values +options.java.attribute.descriptor.inlined.values.modified=Inlined modified values +options.java.attribute.descriptor.inlined.values.execution.line=Inlined values for breakpoint line options.java.attribute.descriptor.recursive.call=Recursive calls highlighting options.java.attribute.descriptor.annotation.name=Annotation name options.java.attribute.descriptor.annotation.attribute.name=Annotation attribute name diff --git a/platform/platform-resources/src/DefaultColorSchemesManager.xml b/platform/platform-resources/src/DefaultColorSchemesManager.xml index 06e6feb837d9..83962be2446e 100644 --- a/platform/platform-resources/src/DefaultColorSchemesManager.xml +++ b/platform/platform-resources/src/DefaultColorSchemesManager.xml @@ -33,6 +33,27 @@ + + +