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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/platform/platform-resources/src/META-INF/LangExtensionPoints.xml b/platform/platform-resources/src/META-INF/LangExtensionPoints.xml
index d5375dca95bd..42cfe0195523 100644
--- a/platform/platform-resources/src/META-INF/LangExtensionPoints.xml
+++ b/platform/platform-resources/src/META-INF/LangExtensionPoints.xml
@@ -246,6 +246,7 @@
+
diff --git a/platform/platform-resources/src/META-INF/PlatformExtensions.xml b/platform/platform-resources/src/META-INF/PlatformExtensions.xml
index d383db2838f0..5bd41b391f08 100644
--- a/platform/platform-resources/src/META-INF/PlatformExtensions.xml
+++ b/platform/platform-resources/src/META-INF/PlatformExtensions.xml
@@ -241,6 +241,7 @@
displayName="Notifications"
id="reference.settings.ide.settings.notifications"
provider="com.intellij.notification.impl.NotificationsConfigurableProvider"/>
+
+
+
+
diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/vfs/VfsUtilPerformanceTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/vfs/VfsUtilPerformanceTest.java
new file mode 100644
index 000000000000..af9b337aa6c2
--- /dev/null
+++ b/platform/platform-tests/testSrc/com/intellij/openapi/vfs/VfsUtilPerformanceTest.java
@@ -0,0 +1,290 @@
+/*
+ * 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.openapi.vfs;
+
+import com.intellij.concurrency.JobLauncher;
+import com.intellij.openapi.command.WriteCommandAction;
+import com.intellij.openapi.progress.ProgressManager;
+import com.intellij.openapi.util.Ref;
+import com.intellij.openapi.util.io.FileUtil;
+import com.intellij.openapi.util.io.IoTestUtil;
+import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.openapi.vfs.newvfs.ManagingFS;
+import com.intellij.openapi.vfs.newvfs.NewVirtualFile;
+import com.intellij.testFramework.PlatformLangTestCase;
+import com.intellij.testFramework.PlatformTestUtil;
+import com.intellij.testFramework.SkipSlowTestLocally;
+import com.intellij.util.Processor;
+import com.intellij.util.ThrowableRunnable;
+import com.intellij.util.TimeoutUtil;
+import com.intellij.util.ui.UIUtil;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+@SkipSlowTestLocally
+public class VfsUtilPerformanceTest extends PlatformLangTestCase {
+ @Override
+ protected boolean isRunInEdt() {
+ return false;
+ }
+
+ @Override
+ protected boolean isRunInWriteAction() {
+ return false;
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ invokeAndWaitIfNeeded(new ThrowableRunnable() {
+ @Override
+ public void run() throws Exception {
+ VfsUtilPerformanceTest.super.setUp();
+ }
+ });
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ invokeAndWaitIfNeeded(new ThrowableRunnable() {
+ @Override
+ public void run() throws Exception {
+ VfsUtilPerformanceTest.super.tearDown();
+ }
+ });
+ }
+
+ public void testFindChildByNamePerformance() throws IOException {
+ File tempDir = createTempDirectory();
+ final VirtualFile vDir = refreshAndFindFile(tempDir);
+ assertNotNull(vDir);
+ assertTrue(vDir.isDirectory());
+
+ new WriteCommandAction.Simple(getProject()) {
+ @Override
+ protected void run() throws Throwable {
+ for (int i = 0; i < 10000; i++) {
+ final String name = i + ".txt";
+ vDir.createChildData(vDir, name);
+ }
+ }
+ }.execute();
+
+ final VirtualFile theChild = vDir.findChild("5111.txt");
+ System.out.println("Start searching...");
+ PlatformTestUtil.startPerformanceTest("find child is slow", 450, new ThrowableRunnable() {
+ @Override
+ public void run() throws Throwable {
+ for (int i = 0; i < 1000000; i++) {
+ VirtualFile child = vDir.findChild("5111.txt");
+ assertEquals(theChild, child);
+ }
+ }
+ }).assertTiming();
+
+ new WriteCommandAction.Simple(getProject()) {
+ @Override
+ protected void run() throws Throwable {
+ for (VirtualFile file : vDir.getChildren()) {
+ file.delete(this);
+ }
+ }
+ }.execute().throwException();
+ }
+
+ public void testFindRootPerformance() throws IOException {
+ File tempJar = IoTestUtil.createTestJar();
+ final VirtualFile jar = refreshAndFindFile(tempJar);
+ assertNotNull(jar);
+
+ final JarFileSystem fs = JarFileSystem.getInstance();
+ final NewVirtualFile root = ManagingFS.getInstance().findRoot(jar.getPath() + "!/", fs);
+ PlatformTestUtil.startPerformanceTest("find root is slow", 500, new ThrowableRunnable() {
+ @Override
+ public void run() throws Throwable {
+ final String path = jar.getPath() + "!/";
+ JobLauncher.getInstance().invokeConcurrentlyUnderProgress(Collections.nCopies(500, null), null, false, new Processor