diff --git a/.idea/artifacts/jps.xml b/.idea/artifacts/jps.xml
deleted file mode 100644
index 1d3be3b3de76..000000000000
--- a/.idea/artifacts/jps.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
- $PROJECT_DIR$/out/artifacts/jps
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/idea_default.xml b/.idea/inspectionProfiles/idea_default.xml
index ceda65526e01..c56a697395e0 100644
--- a/.idea/inspectionProfiles/idea_default.xml
+++ b/.idea/inspectionProfiles/idea_default.xml
@@ -349,6 +349,9 @@
+
+
+
diff --git a/.idea/inspectionProfiles/idea_default_no_spellchecker.xml b/.idea/inspectionProfiles/idea_default_no_spellchecker.xml
index a37e8d620b51..c2533ca21484 100644
--- a/.idea/inspectionProfiles/idea_default_no_spellchecker.xml
+++ b/.idea/inspectionProfiles/idea_default_no_spellchecker.xml
@@ -513,6 +513,9 @@
+
+
+
diff --git a/.idea/modules.xml b/.idea/modules.xml
index abadb76c492f..ac849c617625 100644
--- a/.idea/modules.xml
+++ b/.idea/modules.xml
@@ -50,6 +50,8 @@
+
+
@@ -73,7 +75,6 @@
-
diff --git a/bin/linux/fsnotifier b/bin/linux/fsnotifier
index a69112111637..16677a1aa909 100755
Binary files a/bin/linux/fsnotifier and b/bin/linux/fsnotifier differ
diff --git a/bin/linux/fsnotifier64 b/bin/linux/fsnotifier64
index 355776567d54..1335f1300ddb 100755
Binary files a/bin/linux/fsnotifier64 and b/bin/linux/fsnotifier64 differ
diff --git a/build/scripts/layouts.gant b/build/scripts/layouts.gant
index 5ed678e152f3..b999d8506f26 100644
--- a/build/scripts/layouts.gant
+++ b/build/scripts/layouts.gant
@@ -159,7 +159,6 @@ def layoutFull(String home, String targetDirectory, String patchedDescriptorDir
jar("jps-server.jar") {
module("jps-builders")
- module("jps-model")
}
fileset(dir: "$home/jps/lib") {
@@ -335,8 +334,17 @@ public def layoutCommunityPlugins(String home) {
exclude(name: "standardDsls/**")
}
}
-
- jar("groovy_rt.jar") {module("groovy_rt")}
+ //layout of groovy jars must be consistent with GroovyBuilder.getGroovyRtRoot method
+ dir("jps") {
+ jar("groovy-jps-plugin.jar") {
+ module("groovy-jps-plugin")
+ module("groovy-rt-constants")
+ }
+ }
+ jar("groovy_rt.jar") {
+ module("groovy_rt")
+ module("groovy-rt-constants")
+ }
dir("standardDsls") {
fileset(dir: "$home/plugins/groovy/resources/standardDsls")
}
@@ -516,7 +524,6 @@ def layout_jps(String target) {
module("util")
}
jar("jps-model.jar") {
- module("jps-model")
module("jps-model-api")
module("jps-model-impl")
module("jps-model-serialization")
diff --git a/images/src/icons/ImagesIcons.java b/images/src/icons/ImagesIcons.java
index 721de575a12f..8bba3a9663c7 100644
--- a/images/src/icons/ImagesIcons.java
+++ b/images/src/icons/ImagesIcons.java
@@ -14,7 +14,6 @@ public class ImagesIcons {
}
public static final Icon EditExternaly = load("/org/intellij/images/icons/EditExternaly.png"); // 16x16
- public static final Icon ImagesConfigurable = load("/org/intellij/images/icons/ImagesConfigurable.png"); // 32x32
public static final Icon ImagesFileType = load("/org/intellij/images/icons/ImagesFileType.png"); // 18x18
public static final Icon ThumbnailBlank = load("/org/intellij/images/icons/ThumbnailBlank.png"); // 75x86
public static final Icon ThumbnailDirectory = load("/org/intellij/images/icons/ThumbnailDirectory.png"); // 75x82
diff --git a/images/src/org/intellij/images/icons/ImagesConfigurable.png b/images/src/org/intellij/images/icons/ImagesConfigurable.png
deleted file mode 100644
index c9b4e307e4c3..000000000000
Binary files a/images/src/org/intellij/images/icons/ImagesConfigurable.png and /dev/null differ
diff --git a/java/compiler/impl/src/com/intellij/compiler/CompilerConfigurationImpl.java b/java/compiler/impl/src/com/intellij/compiler/CompilerConfigurationImpl.java
index 81f9019d8619..5f5fa3af6813 100644
--- a/java/compiler/impl/src/com/intellij/compiler/CompilerConfigurationImpl.java
+++ b/java/compiler/impl/src/com/intellij/compiler/CompilerConfigurationImpl.java
@@ -56,6 +56,10 @@ import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import org.jetbrains.jps.model.java.compiler.ProcessorConfigProfile;
+import org.jetbrains.jps.model.java.impl.compiler.ProcessorConfigProfileImpl;
+import org.jetbrains.jps.model.serialization.java.compiler.AnnotationProcessorProfileSerializer;
+import org.jetbrains.jps.model.serialization.java.compiler.JpsJavaCompilerConfigurationSerializer;
import java.io.File;
import java.util.*;
@@ -71,16 +75,6 @@ public class CompilerConfigurationImpl extends CompilerConfiguration implements
private static final Logger LOG = Logger.getInstance("#com.intellij.compiler.CompilerConfiguration");
@NonNls public static final String TESTS_EXTERNAL_COMPILER_HOME_PROPERTY_NAME = "tests.external.compiler.home";
public static final int DEPENDENCY_FORMAT_VERSION = 55;
- private static final Comparator ALPHA_COMPARATOR = new Comparator() {
- @Override
- public int compare(String o1, String o2) {
- return o1.compareToIgnoreCase(o2);
- }
- };
- private static final String ENTRY = "entry";
- private static final String NAME = "name";
- private static final String ENABLED = "enabled";
- private static final String MODULE = "module";
@SuppressWarnings({"WeakerAccess"}) public String DEFAULT_COMPILER;
@NotNull private BackendCompiler myDefaultJavaCompiler;
@@ -104,7 +98,7 @@ public class CompilerConfigurationImpl extends CompilerConfiguration implements
}
private boolean myAddNotNullAssertions = true;
- private final ProcessorConfigProfile myDefaultProcessorsProfile = new ProcessorConfigProfile("Default");
+ private final ProcessorConfigProfile myDefaultProcessorsProfile = new ProcessorConfigProfileImpl("Default");
private final List myModuleProcessorProfiles = new ArrayList();
// the map is calculated by module processor profiles list for faster access to module settings
@@ -597,35 +591,27 @@ public class CompilerConfigurationImpl extends CompilerConfiguration implements
return true;
}
- // property names
- private static final String EXCLUDE_FROM_COMPILE = "excludeFromCompile";
- private static final String RESOURCE_EXTENSIONS = "resourceExtensions";
- private static final String ANNOTATION_PROCESSING = "annotationProcessing";
- private static final String BYTECODE_TARGET_LEVEL = "bytecodeTargetLevel";
- private static final String WILDCARD_RESOURCE_PATTERNS = "wildcardResourcePatterns";
- private static final String ADD_NOTNULL_ASSERTIONS = "addNotNullAssertions";
-
public void readExternal(Element parentNode) throws InvalidDataException {
DefaultJDOMExternalizer.readExternal(this, parentNode);
- final Element notNullAssertions = parentNode.getChild(ADD_NOTNULL_ASSERTIONS);
+ final Element notNullAssertions = parentNode.getChild(JpsJavaCompilerConfigurationSerializer.ADD_NOTNULL_ASSERTIONS);
if (notNullAssertions != null) {
- myAddNotNullAssertions = Boolean.valueOf(notNullAssertions.getAttributeValue(ENABLED, "true"));
+ myAddNotNullAssertions = Boolean.valueOf(notNullAssertions.getAttributeValue(JpsJavaCompilerConfigurationSerializer.ENABLED, "true"));
}
- Element node = parentNode.getChild(EXCLUDE_FROM_COMPILE);
+ Element node = parentNode.getChild(JpsJavaCompilerConfigurationSerializer.EXCLUDE_FROM_COMPILE);
if (node != null) {
myExcludedEntriesConfiguration.readExternal(node);
}
try {
removeRegexpPatterns();
- node = parentNode.getChild(RESOURCE_EXTENSIONS);
+ node = parentNode.getChild(JpsJavaCompilerConfigurationSerializer.RESOURCE_EXTENSIONS);
if (node != null) {
- for (final Object o : node.getChildren(ENTRY)) {
+ for (final Object o : node.getChildren(JpsJavaCompilerConfigurationSerializer.ENTRY)) {
Element element = (Element)o;
- String pattern = element.getAttributeValue(NAME);
+ String pattern = element.getAttributeValue(JpsJavaCompilerConfigurationSerializer.NAME);
if (!StringUtil.isEmpty(pattern)) {
addRegexpPattern(pattern);
}
@@ -633,12 +619,12 @@ public class CompilerConfigurationImpl extends CompilerConfiguration implements
}
removeWildcardPatterns();
- node = parentNode.getChild(WILDCARD_RESOURCE_PATTERNS);
+ node = parentNode.getChild(JpsJavaCompilerConfigurationSerializer.WILDCARD_RESOURCE_PATTERNS);
if (node != null) {
myWildcardPatternsInitialized = true;
- for (final Object o : node.getChildren(ENTRY)) {
+ for (final Object o : node.getChildren(JpsJavaCompilerConfigurationSerializer.ENTRY)) {
final Element element = (Element)o;
- String pattern = element.getAttributeValue(NAME);
+ String pattern = element.getAttributeValue(JpsJavaCompilerConfigurationSerializer.NAME);
if (!StringUtil.isEmpty(pattern)) {
addWildcardResourcePattern(pattern);
}
@@ -653,7 +639,7 @@ public class CompilerConfigurationImpl extends CompilerConfiguration implements
myModuleProcessorProfiles.clear();
myProcessorsProfilesMap = null;
- final Element annotationProcessingSettings = parentNode.getChild(ANNOTATION_PROCESSING);
+ final Element annotationProcessingSettings = parentNode.getChild(JpsJavaCompilerConfigurationSerializer.ANNOTATION_PROCESSING);
if (annotationProcessingSettings != null) {
final List profiles = annotationProcessingSettings.getChildren("profile");
if (!profiles.isEmpty()) {
@@ -661,11 +647,11 @@ public class CompilerConfigurationImpl extends CompilerConfiguration implements
final Element profileElement = (Element)elem;
final boolean isDefault = "true".equals(profileElement.getAttributeValue("default"));
if (isDefault) {
- myDefaultProcessorsProfile.readExternal(profileElement);
+ AnnotationProcessorProfileSerializer.readExternal(myDefaultProcessorsProfile, profileElement);
}
else {
- final ProcessorConfigProfile profile = new ProcessorConfigProfile("");
- profile.readExternal(profileElement);
+ final ProcessorConfigProfile profile = new ProcessorConfigProfileImpl("");
+ AnnotationProcessorProfileSerializer.readExternal(profile, profileElement);
myModuleProcessorProfiles.add(profile);
}
}
@@ -678,15 +664,15 @@ public class CompilerConfigurationImpl extends CompilerConfiguration implements
myBytecodeTargetLevel = null;
myModuleBytecodeTarget.clear();
- final Element bytecodeTargetElement = parentNode.getChild(BYTECODE_TARGET_LEVEL);
+ final Element bytecodeTargetElement = parentNode.getChild(JpsJavaCompilerConfigurationSerializer.BYTECODE_TARGET_LEVEL);
if (bytecodeTargetElement != null) {
- myBytecodeTargetLevel = bytecodeTargetElement.getAttributeValue("target");
- for (Element elem : (Collection)bytecodeTargetElement.getChildren(MODULE)) {
- final String name = elem.getAttributeValue(NAME);
+ myBytecodeTargetLevel = bytecodeTargetElement.getAttributeValue(JpsJavaCompilerConfigurationSerializer.TARGET_ATTRIBUTE);
+ for (Element elem : (Collection)bytecodeTargetElement.getChildren(JpsJavaCompilerConfigurationSerializer.MODULE)) {
+ final String name = elem.getAttributeValue(JpsJavaCompilerConfigurationSerializer.NAME);
if (name == null) {
continue;
}
- final String target = elem.getAttributeValue("target");
+ final String target = elem.getAttributeValue(JpsJavaCompilerConfigurationSerializer.TARGET_ATTRIBUTE);
if (target == null) {
continue;
}
@@ -697,7 +683,7 @@ public class CompilerConfigurationImpl extends CompilerConfiguration implements
private void loadProfilesFromOldFormat(Element processing) {
// collect data
- final boolean isEnabled = Boolean.parseBoolean(processing.getAttributeValue(ENABLED, "false"));
+ final boolean isEnabled = Boolean.parseBoolean(processing.getAttributeValue(JpsJavaCompilerConfigurationSerializer.ENABLED, "false"));
final boolean isUseClasspath = Boolean.parseBoolean(processing.getAttributeValue("useClasspath", "true"));
final StringBuilder processorPath = new StringBuilder();
final Set optionPairs = new HashSet();
@@ -717,7 +703,7 @@ public class CompilerConfigurationImpl extends CompilerConfiguration implements
for (Object child : processing.getChildren("processor")) {
final Element processorElement = (Element)child;
- final String proc = processorElement.getAttributeValue(NAME, (String)null);
+ final String proc = processorElement.getAttributeValue(JpsJavaCompilerConfigurationSerializer.NAME, (String)null);
if (proc != null) {
processors.add(proc);
}
@@ -730,7 +716,7 @@ public class CompilerConfigurationImpl extends CompilerConfiguration implements
for (Object child : processing.getChildren("processModule")) {
final Element moduleElement = (Element)child;
- final String name = moduleElement.getAttributeValue(NAME, (String)null);
+ final String name = moduleElement.getAttributeValue(JpsJavaCompilerConfigurationSerializer.NAME, (String)null);
if (name == null) {
continue;
}
@@ -769,7 +755,7 @@ public class CompilerConfigurationImpl extends CompilerConfiguration implements
int profileIndex = 0;
for (Map.Entry> entry : dirNameToModulesMap.entrySet()) {
final String dirName = entry.getKey();
- final ProcessorConfigProfile profile = new ProcessorConfigProfile(myDefaultProcessorsProfile);
+ final ProcessorConfigProfile profile = new ProcessorConfigProfileImpl(myDefaultProcessorsProfile);
profile.setName("Profile" + (++profileIndex));
profile.setEnabled(isEnabled);
profile.setGeneratedSourcesDirectoryName(dirName);
@@ -784,44 +770,47 @@ public class CompilerConfigurationImpl extends CompilerConfiguration implements
DefaultJDOMExternalizer.writeExternal(this, parentNode);
if (myAddNotNullAssertions != true) {
- addChild(parentNode, ADD_NOTNULL_ASSERTIONS).setAttribute(ENABLED, String.valueOf(myAddNotNullAssertions));
+ addChild(parentNode, JpsJavaCompilerConfigurationSerializer.ADD_NOTNULL_ASSERTIONS).setAttribute(
+ JpsJavaCompilerConfigurationSerializer.ENABLED, String.valueOf(myAddNotNullAssertions));
}
if(myExcludedEntriesConfiguration.getExcludeEntryDescriptions().length > 0) {
- myExcludedEntriesConfiguration.writeExternal(addChild(parentNode, EXCLUDE_FROM_COMPILE));
+ myExcludedEntriesConfiguration.writeExternal(addChild(parentNode, JpsJavaCompilerConfigurationSerializer.EXCLUDE_FROM_COMPILE));
}
- final Element newChild = addChild(parentNode, RESOURCE_EXTENSIONS);
+ final Element newChild = addChild(parentNode, JpsJavaCompilerConfigurationSerializer.RESOURCE_EXTENSIONS);
for (final String pattern : getRegexpPatterns()) {
- addChild(newChild, ENTRY).setAttribute(NAME, pattern);
+ addChild(newChild, JpsJavaCompilerConfigurationSerializer.ENTRY).setAttribute(JpsJavaCompilerConfigurationSerializer.NAME, pattern);
}
if (myWildcardPatternsInitialized || !myWildcardPatterns.isEmpty()) {
- final Element wildcardPatterns = addChild(parentNode, WILDCARD_RESOURCE_PATTERNS);
+ final Element wildcardPatterns = addChild(parentNode, JpsJavaCompilerConfigurationSerializer.WILDCARD_RESOURCE_PATTERNS);
for (final String wildcardPattern : myWildcardPatterns) {
- addChild(wildcardPatterns, ENTRY).setAttribute(NAME, wildcardPattern);
+ addChild(wildcardPatterns, JpsJavaCompilerConfigurationSerializer.ENTRY).setAttribute(JpsJavaCompilerConfigurationSerializer.NAME, wildcardPattern);
}
}
- final Element annotationProcessingSettings = addChild(parentNode, ANNOTATION_PROCESSING);
- myDefaultProcessorsProfile.writeExternal(addChild(annotationProcessingSettings, "profile").setAttribute("default", "true"));
+ final Element annotationProcessingSettings = addChild(parentNode, JpsJavaCompilerConfigurationSerializer.ANNOTATION_PROCESSING);
+ AnnotationProcessorProfileSerializer
+ .writeExternal(myDefaultProcessorsProfile, addChild(annotationProcessingSettings, "profile").setAttribute("default", "true"));
for (ProcessorConfigProfile profile : myModuleProcessorProfiles) {
- profile.writeExternal(addChild(annotationProcessingSettings, "profile").setAttribute("default", "false"));
+ AnnotationProcessorProfileSerializer
+ .writeExternal(profile, addChild(annotationProcessingSettings, "profile").setAttribute("default", "false"));
}
if (!StringUtil.isEmpty(myBytecodeTargetLevel) || !myModuleBytecodeTarget.isEmpty()) {
- final Element bytecodeTarget = addChild(parentNode, BYTECODE_TARGET_LEVEL);
+ final Element bytecodeTarget = addChild(parentNode, JpsJavaCompilerConfigurationSerializer.BYTECODE_TARGET_LEVEL);
if (!StringUtil.isEmpty(myBytecodeTargetLevel)) {
- bytecodeTarget.setAttribute("target", myBytecodeTargetLevel);
+ bytecodeTarget.setAttribute(JpsJavaCompilerConfigurationSerializer.TARGET_ATTRIBUTE, myBytecodeTargetLevel);
}
if (!myModuleBytecodeTarget.isEmpty()) {
final List moduleNames = new ArrayList(myModuleBytecodeTarget.keySet());
- Collections.sort(moduleNames, ALPHA_COMPARATOR);
+ Collections.sort(moduleNames, String.CASE_INSENSITIVE_ORDER);
for (String name : moduleNames) {
- final Element moduleElement = addChild(bytecodeTarget, MODULE);
- moduleElement.setAttribute(NAME, name);
+ final Element moduleElement = addChild(bytecodeTarget, JpsJavaCompilerConfigurationSerializer.MODULE);
+ moduleElement.setAttribute(JpsJavaCompilerConfigurationSerializer.NAME, name);
final String value = myModuleBytecodeTarget.get(name);
- moduleElement.setAttribute("target", value != null? value : "");
+ moduleElement.setAttribute(JpsJavaCompilerConfigurationSerializer.TARGET_ATTRIBUTE, value != null? value : "");
}
}
}
diff --git a/java/compiler/impl/src/com/intellij/compiler/actions/ProcessAnnotationsAction.java b/java/compiler/impl/src/com/intellij/compiler/actions/ProcessAnnotationsAction.java
index 1b9c50e6ce2c..bb5970753e0c 100644
--- a/java/compiler/impl/src/com/intellij/compiler/actions/ProcessAnnotationsAction.java
+++ b/java/compiler/impl/src/com/intellij/compiler/actions/ProcessAnnotationsAction.java
@@ -15,7 +15,7 @@
*/
package com.intellij.compiler.actions;
-import com.intellij.compiler.AnnotationProcessingConfiguration;
+import org.jetbrains.jps.model.java.compiler.AnnotationProcessingConfiguration;
import com.intellij.compiler.CompilerConfiguration;
import com.intellij.compiler.impl.FileSetCompileScope;
import com.intellij.compiler.impl.ModuleCompileScope;
diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/javac/JavacCompiler.java b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/javac/JavacCompiler.java
index 1a2a44ef74e7..7b3a9f5dd67d 100644
--- a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/javac/JavacCompiler.java
+++ b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/javac/JavacCompiler.java
@@ -41,6 +41,7 @@ import com.intellij.rt.compiler.JavacRunner;
import com.intellij.util.ArrayUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.jps.model.java.compiler.AnnotationProcessingConfiguration;
import java.io.*;
import java.util.*;
diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/javac/JavacSettings.java b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/javac/JavacSettings.java
index 97106f0fe19b..f8dd14500237 100644
--- a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/javac/JavacSettings.java
+++ b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/javac/JavacSettings.java
@@ -22,6 +22,7 @@ import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.util.Chunk;
import org.jetbrains.annotations.TestOnly;
+import org.jetbrains.jps.model.java.compiler.JpsJavaCompilerOptions;
import java.nio.charset.Charset;
import java.util.ArrayList;
@@ -29,13 +30,7 @@ import java.util.Collection;
import java.util.List;
import java.util.StringTokenizer;
-public class JavacSettings {
- public boolean DEBUGGING_INFO = true;
- public boolean GENERATE_NO_WARNINGS = false;
- public boolean DEPRECATION = true;
- public String ADDITIONAL_OPTIONS_STRING = "";
- public int MAXIMUM_HEAP_SIZE = 128;
-
+public class JavacSettings extends JpsJavaCompilerOptions {
private boolean myTestsUseExternalCompiler = false;
public Collection getOptions(Chunk chunk) {
diff --git a/java/compiler/impl/src/com/intellij/compiler/options/AnnotationProcessorsConfigurable.java b/java/compiler/impl/src/com/intellij/compiler/options/AnnotationProcessorsConfigurable.java
index ea1848d7dae8..1bf80911e040 100644
--- a/java/compiler/impl/src/com/intellij/compiler/options/AnnotationProcessorsConfigurable.java
+++ b/java/compiler/impl/src/com/intellij/compiler/options/AnnotationProcessorsConfigurable.java
@@ -17,13 +17,13 @@ package com.intellij.compiler.options;
import com.intellij.compiler.CompilerConfiguration;
import com.intellij.compiler.CompilerConfigurationImpl;
-import com.intellij.compiler.ProcessorConfigProfile;
import com.intellij.compiler.server.BuildManager;
import com.intellij.openapi.options.Configurable;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.options.SearchableConfigurable;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.jps.model.java.compiler.ProcessorConfigProfile;
import javax.swing.*;
import java.util.List;
diff --git a/java/compiler/impl/src/com/intellij/compiler/options/AnnotationProcessorsPanel.java b/java/compiler/impl/src/com/intellij/compiler/options/AnnotationProcessorsPanel.java
index bd21e07f56b6..0eeadcab8c29 100644
--- a/java/compiler/impl/src/com/intellij/compiler/options/AnnotationProcessorsPanel.java
+++ b/java/compiler/impl/src/com/intellij/compiler/options/AnnotationProcessorsPanel.java
@@ -15,7 +15,7 @@
*/
package com.intellij.compiler.options;
-import com.intellij.compiler.ProcessorConfigProfile;
+import org.jetbrains.jps.model.java.compiler.ProcessorConfigProfile;
import com.intellij.icons.AllIcons;
import com.intellij.openapi.actionSystem.ActionManager;
import com.intellij.openapi.actionSystem.AnActionEvent;
@@ -38,6 +38,7 @@ import com.intellij.ui.components.JBList;
import com.intellij.ui.treeStructure.Tree;
import com.intellij.util.ui.EditableTreeModel;
import com.intellij.util.ui.tree.TreeUtil;
+import org.jetbrains.jps.model.java.impl.compiler.ProcessorConfigProfileImpl;
import javax.swing.*;
import javax.swing.event.TreeSelectionEvent;
@@ -55,7 +56,7 @@ import java.util.List;
*/
@SuppressWarnings({"unchecked", "UseOfObsoleteCollectionType"})
public class AnnotationProcessorsPanel extends JPanel {
- private final ProcessorConfigProfile myDefaultProfile = new ProcessorConfigProfile("");
+ private final ProcessorConfigProfile myDefaultProfile = new ProcessorConfigProfileImpl("");
private final List myModuleProfiles = new ArrayList();
private final Map myAllModulesMap = new HashMap();
private final Project myProject;
@@ -170,7 +171,7 @@ public class AnnotationProcessorsPanel extends JPanel {
myDefaultProfile.initFrom(defaultProfile);
myModuleProfiles.clear();
for (ProcessorConfigProfile profile : moduleProfiles) {
- ProcessorConfigProfile copy = new ProcessorConfigProfile("");
+ ProcessorConfigProfile copy = new ProcessorConfigProfileImpl("");
copy.initFrom(profile);
myModuleProfiles.add(copy);
}
@@ -252,7 +253,7 @@ public class AnnotationProcessorsPanel extends JPanel {
}
});
if (newProfileName != null) {
- final ProcessorConfigProfile profile = new ProcessorConfigProfile(newProfileName);
+ final ProcessorConfigProfile profile = new ProcessorConfigProfileImpl(newProfileName);
myModuleProfiles.add(profile);
((DataSynchronizable)getRoot()).sync();
final DefaultMutableTreeNode object = TreeUtil.findNodeWithObject((DefaultMutableTreeNode)getRoot(), profile);
diff --git a/java/compiler/impl/src/com/intellij/compiler/options/ProcessorProfilePanel.java b/java/compiler/impl/src/com/intellij/compiler/options/ProcessorProfilePanel.java
index 403e070b2657..e47cf402473a 100644
--- a/java/compiler/impl/src/com/intellij/compiler/options/ProcessorProfilePanel.java
+++ b/java/compiler/impl/src/com/intellij/compiler/options/ProcessorProfilePanel.java
@@ -15,7 +15,7 @@
*/
package com.intellij.compiler.options;
-import com.intellij.compiler.ProcessorConfigProfile;
+import org.jetbrains.jps.model.java.compiler.ProcessorConfigProfile;
import com.intellij.openapi.fileChooser.FileChooser;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
diff --git a/java/compiler/openapi/src/com/intellij/compiler/CompilerConfiguration.java b/java/compiler/openapi/src/com/intellij/compiler/CompilerConfiguration.java
index 7bbba891ff29..76bb48a9f0ad 100644
--- a/java/compiler/openapi/src/com/intellij/compiler/CompilerConfiguration.java
+++ b/java/compiler/openapi/src/com/intellij/compiler/CompilerConfiguration.java
@@ -21,6 +21,7 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import org.jetbrains.jps.model.java.compiler.AnnotationProcessingConfiguration;
public abstract class CompilerConfiguration {
// need this flag for profiling purposes. In production code is always set to 'true'
diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java
index 8bfcd3f2b0f0..a11968f67cbd 100644
--- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java
+++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java
@@ -268,7 +268,7 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh
final PsiClassType.ClassResolveResult resolveResult = PsiUtil.resolveGenericsClassInType(functionalInterfaceType);
for (int i = 0; i < lambdaParameters.length; i++) {
PsiParameter lambdaParameter = lambdaParameters[i];
- if (!TypeConversionUtil.isAssignable(resolveResult.getSubstitutor().substitute(parameters[i].getType()), lambdaParameter.getType())) {
+ if (!TypeConversionUtil.isAssignable(LambdaUtil.getSubstitutor(interfaceMethod, resolveResult).substitute(parameters[i].getType()), lambdaParameter.getType())) {
myHolder.add(HighlightInfo.createHighlightInfo(HighlightInfoType.ERROR, lambdaParameter, incompatibleTypesMessage));
break;
}
diff --git a/java/java-impl/src/com/intellij/codeInspection/AnonymousCanBeLambdaInspection.java b/java/java-impl/src/com/intellij/codeInspection/AnonymousCanBeLambdaInspection.java
index f9e873a5d891..99699e9a1a47 100644
--- a/java/java-impl/src/com/intellij/codeInspection/AnonymousCanBeLambdaInspection.java
+++ b/java/java-impl/src/com/intellij/codeInspection/AnonymousCanBeLambdaInspection.java
@@ -77,19 +77,29 @@ public class AnonymousCanBeLambdaInspection extends BaseJavaLocalInspectionTool
if (methods.length == 1) {
final PsiCodeBlock body = methods[0].getBody();
if (body != null) {
- final boolean [] recursive = new boolean[1];
+ final boolean [] bodyContainsForbiddenRefs = new boolean[1];
body.accept(new JavaRecursiveElementWalkingVisitor() {
@Override
public void visitMethodCallExpression(PsiMethodCallExpression methodCallExpression) {
super.visitMethodCallExpression(methodCallExpression);
if (methodCallExpression.resolveMethod() == methods[0]) {
- recursive[0] = true;
+ bodyContainsForbiddenRefs[0] = true;
}
}
+
+ @Override
+ public void visitThisExpression(PsiThisExpression expression) {
+ bodyContainsForbiddenRefs[0] = true;
+ }
+
+ @Override
+ public void visitSuperExpression(PsiSuperExpression expression) {
+ bodyContainsForbiddenRefs[0] = true;
+ }
});
- if (!recursive[0]) {
+ if (!bodyContainsForbiddenRefs[0]) {
holder.registerProblem(aClass.getBaseClassReference(), "Anonymous #ref #loc can be replaced with lambda",
- ProblemHighlightType.LIKE_UNUSED_SYMBOL, new ReplaceWithLambdaFix());
+ ProblemHighlightType.GENERIC_ERROR_OR_WARNING, new ReplaceWithLambdaFix());
}
}
}
diff --git a/java/java-impl/src/com/intellij/codeInspection/deadCode/UnusedDeclarationInspection.java b/java/java-impl/src/com/intellij/codeInspection/deadCode/UnusedDeclarationInspection.java
index 63f7af036750..64eaa91db3af 100644
--- a/java/java-impl/src/com/intellij/codeInspection/deadCode/UnusedDeclarationInspection.java
+++ b/java/java-impl/src/com/intellij/codeInspection/deadCode/UnusedDeclarationInspection.java
@@ -96,6 +96,7 @@ public class UnusedDeclarationInspection extends FilteringInspectionTool {
private WeakUnreferencedFilter myFilter;
private DeadHTMLComposer myComposer;
@NonNls public static final String SHORT_NAME = "UnusedDeclaration";
+ @NonNls private static final String ALTERNATIVE_ID = "unused";
private static final String COMMENT_OUT_QUICK_FIX = InspectionsBundle.message("inspection.dead.code.comment.quickfix");
private static final String DELETE_QUICK_FIX = InspectionsBundle.message("inspection.dead.code.safe.delete.quickfix");
@@ -351,7 +352,7 @@ public class UnusedDeclarationInspection extends FilteringInspectionTool {
PsiFile file = refElement.getContainingFile();
if (file == null) return;
- final boolean isSuppressed = refElement.isSuppressed(getShortName());
+ final boolean isSuppressed = refElement.isSuppressed(getShortName(), ALTERNATIVE_ID);
if (!getContext().isToCheckFile(file, UnusedDeclarationInspection.this) || isSuppressed) {
if (isSuppressed || !scope.contains(file)) {
getEntryPointsManager().addEntryPoint(refElement, false);
diff --git a/java/java-impl/src/com/intellij/psi/codeStyle/arrangement/JavaArrangementVisitor.java b/java/java-impl/src/com/intellij/psi/codeStyle/arrangement/JavaArrangementVisitor.java
index c14cb2f493df..2137a0c06318 100644
--- a/java/java-impl/src/com/intellij/psi/codeStyle/arrangement/JavaArrangementVisitor.java
+++ b/java/java-impl/src/com/intellij/psi/codeStyle/arrangement/JavaArrangementVisitor.java
@@ -45,14 +45,15 @@ public class JavaArrangementVisitor extends JavaElementVisitor {
MODIFIERS.put(PsiModifier.ABSTRACT, ArrangementModifier.ABSTRACT);
}
- private final Stack myStack = new Stack();
+ @NotNull private final Stack myStack = new Stack();
+ @NotNull private final Map myEntries = new HashMap();
@NotNull private final List myRootEntries;
- @NotNull private Document myDocument;
@NotNull private Collection myRanges;
+ @Nullable private Document myDocument;
public JavaArrangementVisitor(@NotNull List entries,
- @NotNull Document document,
+ @Nullable Document document,
@NotNull Collection ranges)
{
myRootEntries = entries;
@@ -69,16 +70,16 @@ public class JavaArrangementVisitor extends JavaElementVisitor {
else if (aClass.isInterface()) {
type = ArrangementEntryType.INTERFACE;
}
- JavaElementArrangementEntry entry = createNewEntry(aClass.getTextRange(), type, aClass.getName(), true);
+ JavaElementArrangementEntry entry = createNewEntry(aClass, type, aClass.getName(), true);
processEntry(entry, aClass, aClass);
}
@Override
public void visitAnonymousClass(PsiAnonymousClass aClass) {
- JavaElementArrangementEntry entry = createNewEntry(aClass.getTextRange(), ArrangementEntryType.CLASS, aClass.getName(), false);
+ JavaElementArrangementEntry entry = createNewEntry(aClass, ArrangementEntryType.CLASS, aClass.getName(), false);
processEntry(entry, null, aClass);
}
-
+
@Override
public void visitJavaFile(PsiJavaFile file) {
for (PsiClass psiClass : file.getClasses()) {
@@ -88,13 +89,43 @@ public class JavaArrangementVisitor extends JavaElementVisitor {
@Override
public void visitField(PsiField field) {
- JavaElementArrangementEntry entry = createNewEntry(field.getTextRange(), ArrangementEntryType.FIELD, field.getName(), true);
+ JavaElementArrangementEntry entry = createNewEntry(field, ArrangementEntryType.FIELD, field.getName(), true);
processEntry(entry, field, field.getInitializer());
}
+ @Override
+ public void visitClassInitializer(PsiClassInitializer initializer) {
+ JavaElementArrangementEntry entry = createNewEntry(initializer, ArrangementEntryType.FIELD, null, true);
+ if (entry == null) {
+ return;
+ }
+
+ PsiElement classLBrace = null;
+ PsiClass clazz = initializer.getContainingClass();
+ if (clazz != null) {
+ classLBrace = clazz.getLBrace();
+ }
+ for (PsiElement e = initializer.getPrevSibling(); e != null; e = e.getPrevSibling()) {
+ JavaElementArrangementEntry prevEntry;
+ if (e == classLBrace) {
+ prevEntry = myEntries.get(clazz);
+ }
+ else {
+ prevEntry = myEntries.get(e);
+ }
+ if (prevEntry != null) {
+ entry.addDependency(prevEntry);
+ }
+ if (!(e instanceof PsiWhiteSpace)) {
+ break;
+ }
+ }
+ }
+
@Override
public void visitMethod(PsiMethod method) {
- JavaElementArrangementEntry entry = createNewEntry(method.getTextRange(), ArrangementEntryType.METHOD, method.getName(), true);
+ ArrangementEntryType type = method.isConstructor() ? ArrangementEntryType.CONSTRUCTOR : ArrangementEntryType.METHOD;
+ JavaElementArrangementEntry entry = createNewEntry(method, type, method.getName(), true);
processEntry(entry, method, method.getBody());
}
@@ -110,7 +141,7 @@ public class JavaArrangementVisitor extends JavaElementVisitor {
return;
}
JavaElementArrangementEntry entry =
- createNewEntry(anonymousClass.getTextRange(), ArrangementEntryType.CLASS, anonymousClass.getName(), false);
+ createNewEntry(anonymousClass, ArrangementEntryType.CLASS, anonymousClass.getName(), false);
processEntry(entry, null, anonymousClass);
}
@@ -151,31 +182,33 @@ public class JavaArrangementVisitor extends JavaElementVisitor {
}
@Nullable
- private JavaElementArrangementEntry createNewEntry(@NotNull TextRange range,
+ private JavaElementArrangementEntry createNewEntry(@NotNull PsiElement element,
@NotNull ArrangementEntryType type,
@Nullable String name,
boolean canArrange)
{
+ TextRange range = element.getTextRange();
if (!isWithinBounds(range)) {
return null;
}
DefaultArrangementEntry current = getCurrent();
JavaElementArrangementEntry entry;
if (canArrange) {
- TextRange expandedRange = ArrangementUtil.expandToLine(range, myDocument.getCharsSequence());
+ TextRange expandedRange = myDocument == null ? null : ArrangementUtil.expandToLine(range, myDocument.getCharsSequence());
TextRange rangeToUse = expandedRange == null ? range : expandedRange;
- entry = new JavaElementArrangementEntry(current, rangeToUse, type, name, expandedRange != null);
+ entry = new JavaElementArrangementEntry(current, rangeToUse, type, name, myDocument == null || expandedRange != null);
}
else {
entry = new JavaElementArrangementEntry(current, range, type, name, false);
}
+ myEntries.put(element, entry);
if (current == null) {
myRootEntries.add(entry);
}
else {
current.addChild(entry);
}
-
+
return entry;
}
diff --git a/java/java-impl/src/com/intellij/psi/codeStyle/arrangement/JavaElementArrangementEntry.java b/java/java-impl/src/com/intellij/psi/codeStyle/arrangement/JavaElementArrangementEntry.java
index ebb29bf6868d..3e8499813fa3 100644
--- a/java/java-impl/src/com/intellij/psi/codeStyle/arrangement/JavaElementArrangementEntry.java
+++ b/java/java-impl/src/com/intellij/psi/codeStyle/arrangement/JavaElementArrangementEntry.java
@@ -26,6 +26,8 @@ import java.util.EnumSet;
import java.util.Set;
/**
+ * Not thread-safe.
+ *
* @author Denis Zhdanov
* @since 7/20/12 4:50 PM
*/
@@ -58,6 +60,9 @@ public class JavaElementArrangementEntry extends DefaultArrangementEntry
super(parent, startOffset, endOffset, canBeArranged);
myType = type;
myTypes = EnumSet.of(type);
+ if (myType == ArrangementEntryType.CONSTRUCTOR) {
+ myTypes.add(ArrangementEntryType.METHOD);
+ }
myName = name;
}
diff --git a/java/java-impl/src/com/intellij/psi/codeStyle/arrangement/JavaRearranger.java b/java/java-impl/src/com/intellij/psi/codeStyle/arrangement/JavaRearranger.java
index f4b9a342257e..8cc7d3d1e8ec 100644
--- a/java/java-impl/src/com/intellij/psi/codeStyle/arrangement/JavaRearranger.java
+++ b/java/java-impl/src/com/intellij/psi/codeStyle/arrangement/JavaRearranger.java
@@ -45,7 +45,7 @@ public class JavaRearranger implements Rearranger,
{
// Type
- @NotNull private static final Set SUPPORTED_TYPES = EnumSet.of(INTERFACE, CLASS, ENUM, FIELD, METHOD);
+ @NotNull private static final Set SUPPORTED_TYPES = EnumSet.of(INTERFACE, CLASS, ENUM, FIELD, METHOD, CONSTRUCTOR);
// Modifier
@NotNull private static final Set SUPPORTED_MODIFIERS = EnumSet.of(
@@ -68,6 +68,7 @@ public class JavaRearranger implements Rearranger,
MODIFIERS_BY_TYPE.put(INTERFACE, visibilityModifiers);
MODIFIERS_BY_TYPE.put(CLASS, concat(commonModifiers, ABSTRACT));
MODIFIERS_BY_TYPE.put(METHOD, concat(commonModifiers, SYNCHRONIZED, ABSTRACT));
+ MODIFIERS_BY_TYPE.put(CONSTRUCTOR, concat(commonModifiers, SYNCHRONIZED));
MODIFIERS_BY_TYPE.put(FIELD, concat(commonModifiers, TRANSIENT, VOLATILE));
}
@@ -86,9 +87,12 @@ public class JavaRearranger implements Rearranger,
for (ArrangementModifier modifier : visibility) {
and(FIELD, modifier);
}
+ and(CONSTRUCTOR);
+ and(METHOD, STATIC);
and(METHOD);
and(ENUM);
and(INTERFACE);
+ and(CLASS, STATIC);
and(CLASS);
}
@@ -114,11 +118,19 @@ public class JavaRearranger implements Rearranger,
return result;
}
+ @Nullable
+ @Override
+ public JavaElementArrangementEntry wrap(@NotNull PsiElement element) {
+ List result = new ArrayList();
+ element.accept(new JavaArrangementVisitor(result, null, Collections.singleton(element.getTextRange())));
+ return result.size() == 1 ? result.get(0) : null;
+ }
+
@NotNull
@Override
- public Collection parse(@NotNull PsiElement root,
- @NotNull Document document,
- @NotNull Collection ranges)
+ public List parse(@NotNull PsiElement root,
+ @Nullable Document document,
+ @NotNull Collection ranges)
{
// Following entries are subject to arrangement: class, interface, field, method.
List result = new ArrayList();
diff --git a/java/java-impl/src/com/intellij/psi/impl/JavaPsiImplementationHelperImpl.java b/java/java-impl/src/com/intellij/psi/impl/JavaPsiImplementationHelperImpl.java
index 5a1b11ae77f2..b50de94d8e6a 100644
--- a/java/java-impl/src/com/intellij/psi/impl/JavaPsiImplementationHelperImpl.java
+++ b/java/java-impl/src/com/intellij/psi/impl/JavaPsiImplementationHelperImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2011 JetBrains s.r.o.
+ * Copyright 2000-2012 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,6 +19,8 @@ import com.intellij.ide.fileTemplates.FileTemplate;
import com.intellij.ide.fileTemplates.FileTemplateManager;
import com.intellij.ide.fileTemplates.JavaTemplateUtil;
import com.intellij.lang.ASTNode;
+import com.intellij.lang.java.JavaLanguage;
+import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.openapi.module.Module;
@@ -32,6 +34,7 @@ import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleSettings;
import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
+import com.intellij.psi.codeStyle.arrangement.MemberOrderService;
import com.intellij.psi.impl.compiled.ClsClassImpl;
import com.intellij.psi.impl.source.codeStyle.ImportHelper;
import com.intellij.psi.search.GlobalSearchScope;
@@ -174,43 +177,43 @@ public class JavaPsiImplementationHelperImpl extends JavaPsiImplementationHelper
return importHelper.getDefaultAnchor(list, statement);
}
+ @Nullable
@Override
- public PsiElement getDefaultMemberAnchor(PsiClass aClass, PsiMember member) {
+ public PsiElement getDefaultMemberAnchor(@NotNull PsiClass aClass, @NotNull PsiMember member) {
CodeStyleSettings settings = CodeStyleSettingsManager.getSettings(aClass.getProject());
+ MemberOrderService service = ServiceManager.getService(MemberOrderService.class);
+ PsiElement anchor = service.getAnchor(member, settings.getCommonSettings(JavaLanguage.INSTANCE), aClass);
- int order = getMemberOrderWeight(member, settings);
- if (order < 0) return null;
-
- PsiElement lastMember = null;
- for (PsiElement child = aClass.getFirstChild(); child != null; child = child.getNextSibling()) {
- int order1 = getMemberOrderWeight(child, settings);
- if (order1 < 0) continue;
- if (order1 > order) {
- if (lastMember != null) {
- PsiElement nextSibling = lastMember.getNextSibling();
- while (nextSibling instanceof PsiJavaToken && (nextSibling.getText().equals(",") || nextSibling.getText().equals(";"))) {
- nextSibling = nextSibling.getNextSibling();
- }
- return nextSibling == null ? aClass.getLBrace().getNextSibling() : nextSibling;
- }
- else {
- // The main idea is to avoid to anchor to 'white space' element because that causes reformatting algorithm
- // to perform incorrectly. The algorithm is encapsulated at PostprocessReformattingAspect.doPostponedFormattingInner().
- final PsiElement lBrace = aClass.getLBrace();
- if (lBrace != null) {
- PsiElement result = lBrace.getNextSibling();
- while (result instanceof PsiWhiteSpace) {
- result = result.getNextSibling();
- }
- return result;
- }
- }
- }
- lastMember = child;
+ if (anchor != null && anchor.getNextSibling() == aClass.getRBrace()) {
+ // Given member should be inserted as the last child.
+ return aClass.getRBrace();
}
+
+ if (anchor != null && anchor != aClass) {
+ anchor = anchor.getNextSibling();
+ while (anchor instanceof PsiJavaToken && (anchor.getText().equals(",") || anchor.getText().equals(";"))) {
+ anchor = anchor.getNextSibling();
+ }
+ if (anchor != null) {
+ return anchor;
+ }
+ }
+
+ // The main idea is to avoid to anchor to 'white space' element because that causes reformatting algorithm
+ // to perform incorrectly. The algorithm is encapsulated at the PostprocessReformattingAspect.doPostponedFormattingInner().
+ final PsiElement lBrace = aClass.getLBrace();
+ if (lBrace != null) {
+ PsiElement result = lBrace.getNextSibling();
+ while (result instanceof PsiWhiteSpace) {
+ result = result.getNextSibling();
+ }
+ return result;
+ }
+
return aClass.getRBrace();
}
-
+
+ // TODO remove as soon as an arrangement sub-system is provided for groovy.
public static int getMemberOrderWeight(PsiElement member, CodeStyleSettings settings) {
if (member instanceof PsiField) {
if (member instanceof PsiEnumConstant) {
diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/search/AnnotatedElementsSearcher.java b/java/java-indexing-impl/src/com/intellij/psi/impl/search/AnnotatedElementsSearcher.java
index bd34343787ee..1ceaaa9295dd 100644
--- a/java/java-indexing-impl/src/com/intellij/psi/impl/search/AnnotatedElementsSearcher.java
+++ b/java/java-indexing-impl/src/com/intellij/psi/impl/search/AnnotatedElementsSearcher.java
@@ -1,8 +1,6 @@
package com.intellij.psi.impl.search;
-import com.intellij.openapi.application.AccessToken;
import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.application.ReadAction;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.vfs.VirtualFile;
@@ -13,7 +11,7 @@ import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.LocalSearchScope;
import com.intellij.psi.search.SearchScope;
import com.intellij.psi.search.searches.AnnotatedElementsSearch;
-import com.intellij.psi.util.PsiUtil;
+import com.intellij.psi.util.PsiUtilCore;
import com.intellij.util.Processor;
import com.intellij.util.QueryExecutor;
import com.intellij.util.indexing.FileBasedIndex;
@@ -21,6 +19,7 @@ import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.List;
/**
* @author max
@@ -71,11 +70,8 @@ public class AnnotatedElementsSearcher implements QueryExecutor getAnnotationCandidates(final PsiClass annClass, SearchScope useScope) {
- AccessToken token = ReadAction.start();
- try {
- if (useScope instanceof GlobalSearchScope) {
- return JavaAnnotationIndex.getInstance().get(annClass.getName(), annClass.getProject(), (GlobalSearchScope)useScope);
- }
- final ArrayList result = new ArrayList();
- for (PsiElement element : ((LocalSearchScope)useScope).getScope()) {
- element.accept(new PsiRecursiveElementWalkingVisitor() {
- @Override
- public void visitElement(PsiElement element) {
- if (element instanceof PsiAnnotation) {
- result.add((PsiAnnotation)element);
+ private static Collection extends PsiElement> getAnnotationCandidates(final PsiClass annClass, final SearchScope useScope) {
+ return ApplicationManager.getApplication().runReadAction(new Computable>() {
+ @Override
+ public Collection extends PsiElement> compute() {
+ if (useScope instanceof GlobalSearchScope) {
+ return JavaAnnotationIndex.getInstance().get(annClass.getName(), annClass.getProject(), (GlobalSearchScope)useScope);
+ }
+ final List result = new ArrayList();
+ for (PsiElement element : ((LocalSearchScope)useScope).getScope()) {
+ element.accept(new PsiRecursiveElementWalkingVisitor() {
+ @Override
+ public void visitElement(PsiElement element) {
+ if (element instanceof PsiAnnotation) {
+ result.add(element);
+ }
}
- }
- });
+ });
+ }
+ return result;
}
- return result;
- }
- finally {
- token.finish();
- }
+ });
}
public static boolean isInstanceof(PsiElement owner, Class extends PsiModifierListOwner>[] types) {
@@ -123,7 +118,7 @@ public class AnnotatedElementsSearcher implements QueryExecutor() {
+ @Override
+ public Boolean compute() {
+ return !p.isCheckInheritance() || candidate.isInheritor(aClass, false);
+ }
+ });
}
private static boolean processSameNamedClasses(Processor consumer, PsiClass aClass, List sameNamedClasses) {
diff --git a/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java b/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java
index 9ace49ef2003..18a71e4c5944 100644
--- a/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java
+++ b/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java
@@ -340,10 +340,10 @@ public class GenericsUtil {
}
public static PsiType eliminateWildcards(PsiType type) {
- return eliminateWildcardsInner(type, true);
+ return eliminateWildcards(type, true);
}
- static PsiType eliminateWildcardsInner(PsiType type, final boolean eliminateInTypeArguments) {
+ public static PsiType eliminateWildcards(PsiType type, final boolean eliminateInTypeArguments) {
if (eliminateInTypeArguments && type instanceof PsiClassType) {
PsiClassType classType = ((PsiClassType)type);
JavaResolveResult resolveResult = classType.resolveGenerics();
@@ -367,7 +367,7 @@ public class GenericsUtil {
}
}
else if (type instanceof PsiArrayType) {
- return eliminateWildcardsInner(((PsiArrayType)type).getComponentType(), false).createArrayType();
+ return eliminateWildcards(((PsiArrayType)type).getComponentType(), false).createArrayType();
}
else if (type instanceof PsiWildcardType) {
final PsiType bound = ((PsiWildcardType)type).getBound();
diff --git a/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java b/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java
index 859ffea05220..d27d77536a2e 100644
--- a/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java
+++ b/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java
@@ -30,6 +30,7 @@ import java.util.*;
*/
public class LambdaUtil {
private static final Logger LOG = Logger.getInstance("#" + LambdaUtil.class.getName());
+ public static ThreadLocal> ourParams = new ThreadLocal>();
@Nullable
public static PsiType getFunctionalInterfaceReturnType(PsiLambdaExpression expr) {
@@ -52,8 +53,12 @@ public class LambdaUtil {
@Nullable
public static PsiMethod getFunctionalInterfaceMethod(PsiType functionalInterfaceType) {
- final PsiClassType.ClassResolveResult resolveResult = PsiUtil.resolveGenericsClassInType(functionalInterfaceType);
- final PsiClass psiClass = resolveResult.getElement();
+ return getFunctionalInterfaceMethod(PsiUtil.resolveGenericsClassInType(functionalInterfaceType));
+ }
+
+ @Nullable
+ public static PsiMethod getFunctionalInterfaceMethod(PsiClassType.ClassResolveResult result) {
+ final PsiClass psiClass = result.getElement();
if (psiClass != null) {
final MethodSignature methodSignature = getFunction(psiClass);
if (methodSignature != null) {
@@ -63,6 +68,15 @@ public class LambdaUtil {
return null;
}
+ public static PsiSubstitutor getSubstitutor(@NotNull PsiMethod method, @NotNull PsiClassType.ClassResolveResult resolveResult) {
+ final PsiClass derivedClass = resolveResult.getElement();
+ LOG.assertTrue(derivedClass != null);
+
+ final PsiClass methodContainingClass = method.getContainingClass();
+ LOG.assertTrue(methodContainingClass != null);
+ return TypeConversionUtil.getSuperClassSubstitutor(methodContainingClass, derivedClass, resolveResult.getSubstitutor());
+ }
+
public static boolean isValidLambdaContext(PsiElement context) {
return context instanceof PsiTypeCastExpression ||
context instanceof PsiAssignmentExpression ||
@@ -75,9 +89,10 @@ public class LambdaUtil {
}
public static boolean isLambdaFullyInferred(PsiLambdaExpression expression, PsiType functionalInterfaceType) {
- if (expression.getParameterList().getParametersCount() > 0 || getFunctionalInterfaceReturnType(functionalInterfaceType) != PsiType.VOID) { //todo check that void lambdas without params check
+ if (expression.getParameterList().getParametersCount() > 0 ||
+ getFunctionalInterfaceReturnType(functionalInterfaceType) != PsiType.VOID) { //todo check that void lambdas without params check
if (functionalInterfaceType instanceof PsiClassType && ((PsiClassType)functionalInterfaceType).isRaw()) return false;
- return !dependsOnTypeParams(functionalInterfaceType, expression);
+ return !dependsOnTypeParams(functionalInterfaceType, functionalInterfaceType, expression, null);
}
return true;
}
@@ -126,11 +141,11 @@ public class LambdaUtil {
return null;
}
- public static boolean isAcceptable(PsiLambdaExpression lambdaExpression, final PsiType leftType) {
+ public static boolean isAcceptable(PsiLambdaExpression lambdaExpression, final PsiType leftType, boolean checkReturnType) {
final PsiClassType.ClassResolveResult resolveResult = PsiUtil.resolveGenericsClassInType(leftType);
final PsiClass psiClass = resolveResult.getElement();
if (psiClass instanceof PsiAnonymousClass) {
- return isAcceptable(lambdaExpression, ((PsiAnonymousClass)psiClass).getBaseClassType());
+ return isAcceptable(lambdaExpression, ((PsiAnonymousClass)psiClass).getBaseClassType(), checkReturnType);
}
final MethodSignature methodSignature = getFunction(psiClass);
if (methodSignature == null) return false;
@@ -149,16 +164,19 @@ public class LambdaUtil {
}
if (!TypeConversionUtil.erasure(lambdaFormalType)
- .isAssignableFrom(TypeConversionUtil.erasure(GenericsUtil.eliminateWildcards(resolveResult.getSubstitutor().substitute(methodSignature.getSubstitutor().substitute(methodParameterType)))))) {
+ .isAssignableFrom(TypeConversionUtil.erasure(GenericsUtil.eliminateWildcards(
+ resolveResult.getSubstitutor().substitute(methodSignature.getSubstitutor().substitute(methodParameterType)))))) {
return false;
}
}
}
- LOG.assertTrue(psiClass != null);
- PsiType methodReturnType = getReturnType(psiClass, methodSignature);
- if (methodReturnType != null) {
- methodReturnType = resolveResult.getSubstitutor().substitute(methodSignature.getSubstitutor().substitute(methodReturnType));
- return checkReturnTypeCompatible(lambdaExpression, methodReturnType) == null;
+ if (checkReturnType) {
+ LOG.assertTrue(psiClass != null);
+ PsiType methodReturnType = getReturnType(psiClass, methodSignature);
+ if (methodReturnType != null) {
+ methodReturnType = resolveResult.getSubstitutor().substitute(methodSignature.getSubstitutor().substitute(methodReturnType));
+ return checkReturnTypeCompatible(lambdaExpression, methodReturnType) == null;
+ }
}
return true;
}
@@ -274,6 +292,14 @@ public class LambdaUtil {
return depends(type, param2Check, new TypeParamsChecker(expr));
}
+ public static boolean dependsOnTypeParams(PsiType type,
+ PsiType functionalInterfaceType,
+ PsiLambdaExpression lambdaExpression,
+ PsiTypeParameter param2Check) {
+ return depends(type, param2Check, new TypeParamsChecker(lambdaExpression,
+ PsiUtil.resolveClassInType(functionalInterfaceType)));
+ }
+
public static boolean dependsOnTypeParams(PsiType type,
PsiClass aClass,
PsiMethod aMethod) {
@@ -291,7 +317,10 @@ public class LambdaUtil {
public static boolean isFreeFromTypeInferenceArgs(final PsiParameter[] methodParameters,
final PsiLambdaExpression lambdaExpression,
- final PsiExpression expression) {
+ final PsiExpression expression,
+ final PsiSubstitutor subst,
+ final PsiType functionalInterfaceType,
+ final PsiTypeParameter typeParam) {
if (expression instanceof PsiCallExpression && ((PsiCallExpression)expression).getTypeArguments().length > 0) return true;
if (expression instanceof PsiNewExpression) {
final PsiJavaCodeReferenceElement classReference = ((PsiNewExpression)expression).getClassOrAnonymousClassReference();
@@ -300,16 +329,16 @@ public class LambdaUtil {
if (parameterList != null) {
final PsiTypeElement[] typeParameterElements = parameterList.getTypeParameterElements();
if (typeParameterElements.length > 0) {
- if (!(typeParameterElements[0].getType() instanceof PsiDiamondType)){
+ if (!(typeParameterElements[0].getType() instanceof PsiDiamondType)) {
return true;
}
}
}
}
}
- final PsiParameter[] lambdaParams = lambdaExpression.getParameterList().getParameters();
+ final PsiParameter[] lambdaParams = lambdaExpression.getParameterList().getParameters();
if (lambdaParams.length != methodParameters.length) return false;
- final boolean [] independent = new boolean[]{true};
+ final boolean[] independent = new boolean[]{true};
expression.accept(new JavaRecursiveElementWalkingVisitor() {
@Override
public void visitConditionalExpression(PsiConditionalExpression expression) {
@@ -335,7 +364,7 @@ public class LambdaUtil {
}
}
- if (usedParamIdx > -1 && dependsOnTypeParams(methodParameters[usedParamIdx].getType(), lambdaExpression)) {
+ if (usedParamIdx > -1 && dependsOnTypeParams(subst.substitute(methodParameters[usedParamIdx].getType()), functionalInterfaceType, lambdaExpression, typeParam)) {
independent[0] = false;
}
}
@@ -386,22 +415,21 @@ public class LambdaUtil {
final PsiElement gParent = expressionList.getParent();
if (gParent instanceof PsiCallExpression) {
final PsiCallExpression contextCall = (PsiCallExpression)gParent;
- final JavaResolveResult resolveResult = contextCall.resolveMethodGenerics();
- final PsiElement resolve = resolveResult.getElement();
- if (resolve instanceof PsiMethod) {
- final PsiParameter[] parameters = ((PsiMethod)resolve).getParameterList().getParameters();
- if (lambdaIdx < parameters.length) {
- if (!tryToSubstitute) {
- return parameters[lambdaIdx].getType();
- }
- return PsiResolveHelper.ourGuard.doPreventingRecursion(expression, true, new Computable() {
- @Override
- public PsiType compute() {
+ return PsiResolveHelper.ourGuard.doPreventingRecursion(expression, true, new Computable() {
+ @Override
+ public PsiType compute() {
+ final JavaResolveResult resolveResult = contextCall.resolveMethodGenerics();
+ final PsiElement resolve = resolveResult.getElement();
+ if (resolve instanceof PsiMethod) {
+ final PsiParameter[] parameters = ((PsiMethod)resolve).getParameterList().getParameters();
+ if (lambdaIdx < parameters.length) {
+ if (!tryToSubstitute) return parameters[lambdaIdx].getType();
return resolveResult.getSubstitutor().substitute(parameters[lambdaIdx].getType());
}
- });
+ }
+ return null;
}
- }
+ });
}
}
}
@@ -426,28 +454,38 @@ public class LambdaUtil {
final int parameterIndex = ((PsiParameterList)paramParent).getParameterIndex(param);
if (parameterIndex > -1) {
final PsiLambdaExpression lambdaExpression = PsiTreeUtil.getParentOfType(param, PsiLambdaExpression.class);
- PsiType type = getFunctionalInterfaceType(lambdaExpression, true);
- if (type == null) {
- type = getFunctionalInterfaceType(lambdaExpression, false);
- }
- final PsiClassType.ClassResolveResult resolveResult = PsiUtil.resolveGenericsClassInType(type);
- if (resolveResult != null) {
- final PsiMethod method = getFunctionalInterfaceMethod(type);
- if (method != null) {
- final PsiParameter[] parameters = method.getParameterList().getParameters();
- if (parameterIndex < parameters.length) {
- final PsiType psiType = resolveResult.getSubstitutor().substitute(parameters[parameterIndex].getType());
- if (!dependsOnTypeParams(psiType, lambdaExpression)) {
- if (psiType instanceof PsiWildcardType) {
- final PsiType bound = ((PsiWildcardType)psiType).getBound();
- if (bound != null) {
- return bound;
+ if (lambdaExpression != null) {
+
+ Set currentStack = ourParams.get();
+ if (currentStack == null) {
+ currentStack = new HashSet();
+ ourParams.set(currentStack);
+ }
+
+ final PsiParameterList parameterList = lambdaExpression.getParameterList();
+ try {
+ currentStack.add(parameterList);
+ PsiType type = getFunctionalInterfaceType(lambdaExpression, true);
+ if (type == null) {
+ type = getFunctionalInterfaceType(lambdaExpression, false);
+ }
+ final PsiClassType.ClassResolveResult resolveResult = PsiUtil.resolveGenericsClassInType(type);
+ if (resolveResult != null) {
+ final PsiMethod method = getFunctionalInterfaceMethod(type);
+ if (method != null) {
+ final PsiParameter[] parameters = method.getParameterList().getParameters();
+ if (parameterIndex < parameters.length) {
+ final PsiType psiType = getSubstitutor(method, resolveResult).substitute(parameters[parameterIndex].getType());
+ if (!dependsOnTypeParams(psiType, type, lambdaExpression, null)) {
+ return GenericsUtil.eliminateWildcards(psiType);
}
}
- return psiType;
}
}
}
+ finally {
+ currentStack.remove(parameterList);
+ }
}
}
}
@@ -457,7 +495,7 @@ public class LambdaUtil {
private static class TypeParamsChecker extends PsiTypeVisitor {
private PsiMethod myMethod;
private final PsiClass myClass;
- private final Set myUsedTypeParams = new HashSet();
+ private final Set myUsedTypeParams = new HashSet();
private TypeParamsChecker(PsiMethod method, PsiClass aClass) {
myMethod = method;
@@ -465,7 +503,11 @@ public class LambdaUtil {
}
public TypeParamsChecker(PsiLambdaExpression expression) {
- myClass = PsiUtil.resolveGenericsClassInType(getFunctionalInterfaceType(expression, false)).getElement();
+ this(expression, PsiUtil.resolveGenericsClassInType(getFunctionalInterfaceType(expression, false)).getElement());
+ }
+
+ public TypeParamsChecker(PsiLambdaExpression expression, PsiClass aClass) {
+ myClass = aClass;
PsiElement parent = expression.getParent();
while (parent instanceof PsiParenthesizedExpression) {
parent = parent.getParent();
diff --git a/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java b/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java
index 02085303e9d8..019dc845efcd 100644
--- a/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java
+++ b/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java
@@ -15,19 +15,17 @@
*/
package com.intellij.psi.infos;
-import com.intellij.openapi.util.Key;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.resolve.DefaultParameterTypeInferencePolicy;
import com.intellij.psi.impl.source.resolve.ParameterTypeInferencePolicy;
import com.intellij.psi.util.PsiUtil;
-import com.intellij.util.containers.ConcurrentHashMap;
import com.intellij.util.containers.ConcurrentWeakHashMap;
import org.intellij.lang.annotations.MagicConstant;
import org.jetbrains.annotations.Nullable;
-import java.util.HashMap;
import java.util.Map;
+import java.util.Set;
/**
* @author ik, dsl
@@ -108,6 +106,12 @@ public class MethodCandidateInfo extends CandidateInfo{
}
map.put(myArgumentList, getElement());
try {
+
+ final Set lists = LambdaUtil.ourParams.get();
+ if (lists != null && !lists.isEmpty()) {
+ return inferTypeArguments(DefaultParameterTypeInferencePolicy.INSTANCE);
+ }
+
myCalcedSubstitutor = inferTypeArguments(DefaultParameterTypeInferencePolicy.INSTANCE);
}
finally {
diff --git a/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java b/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java
index 06c0bcad82ee..d3f9c17ce7e3 100644
--- a/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java
+++ b/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java
@@ -648,7 +648,7 @@ public class TypeConversionUtil {
if (right instanceof PsiLambdaExpressionType) {
final PsiLambdaExpression rLambdaExpression = ((PsiLambdaExpressionType)right).getExpression();
if (left instanceof PsiClassType) {
- return LambdaUtil.isAcceptable(rLambdaExpression, left);
+ return LambdaUtil.isAcceptable(rLambdaExpression, left, false);
}
if (left instanceof PsiLambdaExpressionType) {
final PsiLambdaExpression lLambdaExpression = ((PsiLambdaExpressionType)left).getExpression();
diff --git a/java/java-psi-impl/src/com/intellij/core/CoreJavaPsiImplementationHelper.java b/java/java-psi-impl/src/com/intellij/core/CoreJavaPsiImplementationHelper.java
index 0407bc285e35..e78527248038 100644
--- a/java/java-psi-impl/src/com/intellij/core/CoreJavaPsiImplementationHelper.java
+++ b/java/java-psi-impl/src/com/intellij/core/CoreJavaPsiImplementationHelper.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2011 JetBrains s.r.o.
+ * Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,6 +20,7 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
import com.intellij.psi.impl.JavaPsiImplementationHelper;
+import org.jetbrains.annotations.NotNull;
/**
* @author yole
@@ -46,7 +47,7 @@ public class CoreJavaPsiImplementationHelper extends JavaPsiImplementationHelper
}
@Override
- public PsiElement getDefaultMemberAnchor(PsiClass psiClass, PsiMember firstPsi) {
+ public PsiElement getDefaultMemberAnchor(@NotNull PsiClass psiClass, @NotNull PsiMember firstPsi) {
throw new UnsupportedOperationException("TODO");
}
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/JavaPsiImplementationHelper.java b/java/java-psi-impl/src/com/intellij/psi/impl/JavaPsiImplementationHelper.java
index 89030a88f5fb..77b0675b6dde 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/JavaPsiImplementationHelper.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/JavaPsiImplementationHelper.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2011 JetBrains s.r.o.
+ * Copyright 2000-2012 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.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
+import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
@@ -46,7 +47,8 @@ public abstract class JavaPsiImplementationHelper {
public abstract ASTNode getDefaultImportAnchor(PsiImportList list, PsiImportStatementBase statement);
- public abstract PsiElement getDefaultMemberAnchor(PsiClass psiClass, PsiMember firstPsi);
+ @Nullable
+ public abstract PsiElement getDefaultMemberAnchor(@NotNull PsiClass psiClass, @NotNull PsiMember firstPsi);
public abstract void setupCatchBlock(String exceptionName, PsiElement context, PsiCatchSection element);
}
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsTypeParametersListImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsTypeParametersListImpl.java
index 05b9cc608287..48ba55cc57e2 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsTypeParametersListImpl.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsTypeParametersListImpl.java
@@ -16,15 +16,13 @@
package com.intellij.psi.impl.compiled;
import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.psi.JavaElementVisitor;
-import com.intellij.psi.PsiElementVisitor;
-import com.intellij.psi.PsiTypeParameter;
-import com.intellij.psi.PsiTypeParameterList;
+import com.intellij.psi.*;
import com.intellij.psi.impl.PsiImplUtil;
import com.intellij.psi.impl.java.stubs.JavaStubElementTypes;
import com.intellij.psi.impl.java.stubs.PsiTypeParameterListStub;
import com.intellij.psi.impl.source.SourceTreeToPsiMap;
import com.intellij.psi.impl.source.tree.TreeElement;
+import com.intellij.psi.scope.PsiScopeProcessor;
import org.jetbrains.annotations.NotNull;
/**
@@ -90,4 +88,16 @@ public class ClsTypeParametersListImpl extends ClsRepositoryPsiElement RAW_INFERENCE = new Pair(null, ConstraintType.EQUALS);
private final PsiManager myManager;
public PsiResolveHelperImpl(PsiManager manager) {
@@ -206,7 +208,10 @@ public class PsiResolveHelperImpl implements PsiResolveHelper {
final Pair currentSubstitution;
if (argumentType instanceof PsiLambdaExpressionType) {
currentSubstitution = inferSubstitutionFromLambda(typeParameter, (PsiLambdaExpressionType)argumentType, lowerBound);
- if (rawType && currentSubstitution == FAILED_INFERENCE || nullPassed && currentSubstitution == null) return new Pair(null, ConstraintType.EQUALS);
+ if (rawType) {
+ if (currentSubstitution == FAILED_INFERENCE || (currentSubstitution == null && lowerBound == PsiType.NULL)) return RAW_INFERENCE;
+ }
+ if (nullPassed && currentSubstitution == null) return RAW_INFERENCE;
} else {
currentSubstitution = getSubstitutionForTypeParameterConstraint(typeParameter, parameterType,
argumentType, true, PsiUtil.getLanguageLevel(typeParameter));
@@ -218,7 +223,7 @@ public class PsiResolveHelperImpl implements PsiResolveHelper {
final ConstraintType constraintType = currentSubstitution.getSecond();
final PsiType type = currentSubstitution.getFirst();
- if (type == null) return new Pair(null, ConstraintType.EQUALS);
+ if (type == null) return RAW_INFERENCE;
switch(constraintType) {
case EQUALS:
if (!(type instanceof PsiWildcardType)) return currentSubstitution;
@@ -590,27 +595,31 @@ public class PsiResolveHelperImpl implements PsiResolveHelper {
final PsiType functionalInterfaceType,
PsiType lowerBound) {
final PsiClassType.ClassResolveResult resolveResult = PsiUtil.resolveGenericsClassInType(functionalInterfaceType);
- final PsiMethod method = LambdaUtil.getFunctionalInterfaceMethod(functionalInterfaceType);
+ final PsiMethod method = LambdaUtil.getFunctionalInterfaceMethod(resolveResult);
if (method != null) {
- final Pair constraintFromFormalParams = inferConstraintFromLambdaFormalParams(typeParam, resolveResult, method, lambdaExpression);
+ final PsiSubstitutor subst = LambdaUtil.getSubstitutor(method, resolveResult);
+ final Pair constraintFromFormalParams = inferConstraintFromLambdaFormalParams(typeParam, subst, method, lambdaExpression);
if (constraintFromFormalParams != null) return constraintFromFormalParams;
final PsiParameter[] methodParameters = method.getParameterList().getParameters();
- final PsiSubstitutor subst =
- TypeConversionUtil.getSuperClassSubstitutor(method.getContainingClass(), resolveResult.getElement(), resolveResult.getSubstitutor());
- final boolean methodParamsDependOnTypeParams = methodParamsDependOnTypeParams(lambdaExpression, methodParameters, subst, typeParam);
+ if (methodParamsDependOn(typeParam, lambdaExpression, functionalInterfaceType, methodParameters, subst)) {
+ if (lowerBound != PsiType.NULL) {
+ return null;
+ }
+ return getFailedInferenceConstraint(typeParam);
+ }
+
+ final Set lists = LambdaUtil.ourParams.get();
+ if (lists != null && lists.contains(lambdaExpression.getParameterList())){
+ return null;
+ }
+
final PsiType returnType = subst.substitute(method.getReturnType());
if (returnType != null && returnType != PsiType.VOID) {
Pair constraint = null;
final List expressions = lambdaExpression.getReturnExpressions();
for (final PsiExpression expression : expressions) {
- final boolean independent = LambdaUtil.isFreeFromTypeInferenceArgs(methodParameters, lambdaExpression, expression);
- if (independent && methodParamsDependOnTypeParams ) {
- if (lowerBound != PsiType.NULL) {
- return null;
- }
- return FAILED_INFERENCE;
- }
+ final boolean independent = LambdaUtil.isFreeFromTypeInferenceArgs(methodParameters, lambdaExpression, expression, subst, functionalInterfaceType, typeParam);
if (!independent) {
if (lowerBound != PsiType.NULL) {
return null;
@@ -634,7 +643,7 @@ public class PsiResolveHelperImpl implements PsiResolveHelper {
}
final Pair returnExprConstraint =
- getSubstitutionForTypeParameterConstraint(typeParam, returnType, exprType, true, PsiUtil.getLanguageLevel(method));
+ getSubstitutionForTypeParameterConstraint(typeParam, GenericsUtil.eliminateWildcards(returnType), exprType, true, PsiUtil.getLanguageLevel(method));
if (returnExprConstraint != null) {
if (returnExprConstraint == FAILED_INFERENCE) return returnExprConstraint;
if (constraint != null) {
@@ -647,17 +656,16 @@ public class PsiResolveHelperImpl implements PsiResolveHelper {
}
if (constraint != null) return constraint;
}
- if (methodParamsDependOnTypeParams) return getFailedInferenceConstraint(typeParam);
}
return null;
}
- private static boolean methodParamsDependOnTypeParams(PsiLambdaExpression lambdaExpression,
- PsiParameter[] methodParameters,
- PsiSubstitutor subst,
- PsiTypeParameter typeParam) {
+ private static boolean methodParamsDependOn(PsiTypeParameter typeParam, PsiLambdaExpression lambdaExpression,
+ PsiType functionalInterfaceType,
+ PsiParameter[] methodParameters,
+ PsiSubstitutor subst) {
for (PsiParameter parameter : methodParameters) {
- if (LambdaUtil.dependsOnTypeParams(subst.substitute(parameter.getType()), lambdaExpression, typeParam)) {
+ if (LambdaUtil.dependsOnTypeParams(subst.substitute(parameter.getType()), functionalInterfaceType, lambdaExpression, typeParam)) {
return true;
}
}
@@ -666,7 +674,7 @@ public class PsiResolveHelperImpl implements PsiResolveHelper {
@Nullable
private static Pair inferConstraintFromLambdaFormalParams(PsiTypeParameter typeParam,
- PsiClassType.ClassResolveResult resolveResult,
+ PsiSubstitutor subst,
PsiMethod method, PsiLambdaExpression lambdaExpression) {
final PsiParameter[] parameters = lambdaExpression.getParameterList().getParameters();
if (parameters.length == 0) return null;
@@ -679,13 +687,12 @@ public class PsiResolveHelperImpl implements PsiResolveHelper {
lambdaArgs[i] = parameter.getType();
}
- final PsiSubstitutor subst = resolveResult.getSubstitutor();
final PsiParameter[] methodParameters = method.getParameterList().getParameters();
PsiType[] methodParamTypes = new PsiType[methodParameters.length];
for (int i = 0; i < methodParameters.length; i++) {
methodParamTypes[i] = subst.substitute(methodParameters[i].getType());
}
- return inferTypeForMethodTypeParameterInner(typeParam, methodParamTypes, lambdaArgs, subst, null, DefaultParameterTypeInferencePolicy.INSTANCE);
+ return inferTypeForMethodTypeParameterInner(typeParam, methodParamTypes, lambdaArgs, subst, null, DefaultParameterTypeInferencePolicy.INSTANCE);
}
private static PsiType intersectAllExtends(PsiTypeParameter typeParam, PsiType arg) {
@@ -903,8 +910,9 @@ public class PsiResolveHelperImpl implements PsiResolveHelper {
final PsiMethod method = LambdaUtil.getFunctionalInterfaceMethod(functionalInterfaceType);
final PsiClassType.ClassResolveResult resolveResult = PsiUtil.resolveGenericsClassInType(functionalInterfaceType);
- if (method == null || methodParamsDependOnTypeParams((PsiLambdaExpression)expression, method.getParameterList().getParameters(),
- TypeConversionUtil.getSuperClassSubstitutor(method.getContainingClass(), resolveResult.getElement(), resolveResult.getSubstitutor()), typeParameter)) {
+ if (method == null || methodParamsDependOn(typeParameter, (PsiLambdaExpression)expression,
+ functionalInterfaceType, method.getParameterList().getParameters(),
+ LambdaUtil.getSubstitutor(method, resolveResult))) {
return getFailedInferenceConstraint(typeParameter);
}
}
diff --git a/java/java-psi-impl/src/com/intellij/psi/presentation/java/VariablePresentationProvider.java b/java/java-psi-impl/src/com/intellij/psi/presentation/java/VariablePresentationProvider.java
index 90c2e440a55f..c94ee9f79548 100644
--- a/java/java-psi-impl/src/com/intellij/psi/presentation/java/VariablePresentationProvider.java
+++ b/java/java-psi-impl/src/com/intellij/psi/presentation/java/VariablePresentationProvider.java
@@ -18,10 +18,7 @@ package com.intellij.psi.presentation.java;
import com.intellij.navigation.ItemPresentation;
import com.intellij.navigation.ItemPresentationProvider;
import com.intellij.navigation.NavigationItem;
-import com.intellij.psi.PsiSubstitutor;
import com.intellij.psi.PsiVariable;
-import com.intellij.psi.util.PsiFormatUtil;
-import com.intellij.psi.util.PsiFormatUtilBase;
import javax.swing.*;
@@ -34,7 +31,8 @@ public class VariablePresentationProvider {
+ interface BinaryOperator {
+
+ public T eval(T left, T right);
+ }
+
+ interface Mapper {
+ U map(T t);
+ }
+
+ public static LambdaTest map(final Iterable extends T> iterable, final Mapper super T, ? extends U> mapper) {
+ return null;
+ }
+
+ TT reduce(TT base, BinaryOperator reducer) {
+ return null;
+ }
+
+ public void test() {
+ final List aStrings = Arrays.asList("1", "2", "3");
+ map(aStrings, s -> s.length()).reduce(0, (l, r) -> l + r);
+ }
+}
+
+class LambdaTest2 {
+ interface BinaryOperator {
+ public T eval(T left, T right);
+ }
+
+ interface Mapper {
+ U map(T t);
+ }
+
+ public LambdaTest map(final Mapper super TypeParam, ? extends U> mapper) {
+ return null;
+ }
+
+ TypeParam reduce(TypeParam base, BinaryOperator reducer) {
+ return null;
+ }
+
+ public void test() {
+ final LambdaTest2 lt = new LambdaTest2<>();
+ lt.map(s -> s.length()).reduce(0, (l, r) -> l + r);
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/LambdaRawOrNot.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/LambdaRawOrNot.java
index f4dfd65eed29..cfece56e219b 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/LambdaRawOrNot.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/LambdaRawOrNot.java
@@ -34,3 +34,27 @@ class Test3 {
bar(x->{}, new ArrayList());
}
}
+
+
+class Test4 {
+ protected U exerciseOps(TestData data, TerminalOp1 terminal, IntermediateOp1... ops) {
+ return exerciseOps(data, (u, v) -> u.equals(v), terminal, ops);
+ }
+
+ protected static U exerciseOps(TestData data,
+ BiPredicate1 equalator,
+ TerminalOp1 terminalOp,
+ IntermediateOp1[] ops) {
+ return null;
+ }
+
+ public interface IntermediateOp1 {
+
+ }
+ public interface BiPredicate1 extends IntermediateOp1{
+ boolean _(T t, U u);
+ }
+
+ public interface TerminalOp1 extends IntermediateOp1 {}
+
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeThisRefInside.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeThisRefInside.java
new file mode 100644
index 000000000000..9bfb884a7be1
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeThisRefInside.java
@@ -0,0 +1,11 @@
+// "Replace with lambda" "false"
+class Test {
+ {
+ Runnable x = new Runnable() {
+ public void run() {
+ this.toString();
+ }
+ };
+
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/bindFieldsFromParameters/afterSimple.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/bindFieldsFromParameters/afterSimple.java
index 829746789fed..673c1773b046 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/bindFieldsFromParameters/afterSimple.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/bindFieldsFromParameters/afterSimple.java
@@ -2,11 +2,11 @@
class Bar {
- private int myi1;
- private int myi2;
private final int myI1;
private final int myI2;
private final String myI3;
+ private int myi1;
+ private int myi2;
Bar(int i1, int i2, String i3) {
myI1 = i1;
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/bindFieldsFromParameters/beforeSimple.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/bindFieldsFromParameters/beforeSimple.java
index 6f64007a938f..608d6064f84d 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/bindFieldsFromParameters/beforeSimple.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/bindFieldsFromParameters/beforeSimple.java
@@ -2,9 +2,9 @@
class Bar {
- private int myi1;
- private int myi2;
+ private int myi1;
+ private int myi2;
- Bar(int i1, int i2, String i3) {
- }
+ Bar(int i1, int i2, String i3) {
+ }
}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeParameterClass/before6.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeParameterClass/before6.java
index cc6d7029a28e..3aa784d6b1ef 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeParameterClass/before6.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeParameterClass/before6.java
@@ -3,7 +3,6 @@ class a {
void f(b r) {
r.g(this);
}
-
}
interface b {
void g(b t);
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromNew/after6.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromNew/after6.java
index 6a2efa6d4be0..9d3259784c3f 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromNew/after6.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromNew/after6.java
@@ -3,7 +3,7 @@ public class Test {
public static void main() {
Collection[] cc = new MyCollection[10];
}
-
+
private static class MyCollection {
}
}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromNew/after8.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromNew/after8.java
index cc29ef3e9228..edc5d2214de0 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromNew/after8.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromNew/after8.java
@@ -6,7 +6,7 @@ public class Test {
public static void main() {
JTable table = new JTable(new MyTableModel());
}
-
+
private static class MyTableModel implements TableModel {
}
}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromNew/afterGenerics.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromNew/afterGenerics.java
index b6b899b61d22..4461f899b52b 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromNew/afterGenerics.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromNew/afterGenerics.java
@@ -3,7 +3,7 @@ class Test {
void foo () {
new Generic ();
}
-
+
private class Generic {
}
}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodObject/WithPrivateMethodUsed1.java b/java/java-tests/testData/refactoring/extractMethodObject/WithPrivateMethodUsed1.java
index c5fbbd81e4c1..e2c3ea2bb64b 100644
--- a/java/java-tests/testData/refactoring/extractMethodObject/WithPrivateMethodUsed1.java
+++ b/java/java-tests/testData/refactoring/extractMethodObject/WithPrivateMethodUsed1.java
@@ -43,12 +43,10 @@ public class TestClass {
return yearsTo( expiry );
}
return 0.0;
-
}
private double yearsTo( final Date endDate ) {
Date beginDate = ( today == null ? start : today );
return ( ( endDate.getTime() - beginDate.getTime() ));
}
-
}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodObject/WithPrivateMethodUsed1.java.after b/java/java-tests/testData/refactoring/extractMethodObject/WithPrivateMethodUsed1.java.after
index b19b72b035ae..c4543e3e663e 100644
--- a/java/java-tests/testData/refactoring/extractMethodObject/WithPrivateMethodUsed1.java.after
+++ b/java/java-tests/testData/refactoring/extractMethodObject/WithPrivateMethodUsed1.java.after
@@ -41,7 +41,6 @@ public class TestClass {
return yearsTo( expiry );
}
return 0.0;
-
}
private double riskFactor() {
diff --git a/java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/MultilineDeclarations.java b/java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/MultilineDeclarations.java
index c180b6d990c0..89619d3152a2 100644
--- a/java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/MultilineDeclarations.java
+++ b/java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/MultilineDeclarations.java
@@ -6,5 +6,4 @@ class Test {
System.out.println(MessageFormat.format("i: {0}", i));
System.out.println(MessageFormat.format("k: {0}", j));
}
-
}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/OutputVarsReferences.java b/java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/OutputVarsReferences.java
index 8f488e8ef028..e0028c433982 100644
--- a/java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/OutputVarsReferences.java
+++ b/java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/OutputVarsReferences.java
@@ -7,5 +7,4 @@ class Test {
System.out.println(MessageFormat.format("i: {0}", i));
System.out.println(MessageFormat.format("k: {0}", k));
}
-
}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/WithInnerClasses.java b/java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/WithInnerClasses.java
index fba58852f134..880283dfb940 100644
--- a/java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/WithInnerClasses.java
+++ b/java/java-tests/testData/refactoring/extractMethodObject/multipleExitPoints/WithInnerClasses.java
@@ -48,7 +48,6 @@ public class Demo {
this.content = content;
}
}
-
}
diff --git a/java/java-tests/testData/refactoring/inheritanceToDelegation/hierarchy/after/X.java b/java/java-tests/testData/refactoring/inheritanceToDelegation/hierarchy/after/X.java
index 2e2966015be7..de17c5c88db9 100644
--- a/java/java-tests/testData/refactoring/inheritanceToDelegation/hierarchy/after/X.java
+++ b/java/java-tests/testData/refactoring/inheritanceToDelegation/hierarchy/after/X.java
@@ -1,7 +1,6 @@
public class X {
- A myField;
private final Base myDelegate = new Base();
-
+ A myField;
public void method(Test t) {
myField = t.getA();
myField.methodFromA();
diff --git a/java/java-tests/testData/refactoring/inheritanceToDelegation/overridenMethods/after/A.java b/java/java-tests/testData/refactoring/inheritanceToDelegation/overridenMethods/after/A.java
index f9de8b45ae26..3eae87f94120 100644
--- a/java/java-tests/testData/refactoring/inheritanceToDelegation/overridenMethods/after/A.java
+++ b/java/java-tests/testData/refactoring/inheritanceToDelegation/overridenMethods/after/A.java
@@ -1,6 +1,6 @@
class A {
- int fieldFromA;
private final MyBase myDelegate = new MyBase();
+ int fieldFromA;
public void firstMethodFromBase() {
myDelegate.firstMethodFromBase();
diff --git a/java/java-tests/testData/refactoring/inplaceIntroduceField/beforeAssignmentReplaceAllCall_after.java b/java/java-tests/testData/refactoring/inplaceIntroduceField/beforeAssignmentReplaceAllCall_after.java
index f7d817a812a8..ed252a20d1d1 100644
--- a/java/java-tests/testData/refactoring/inplaceIntroduceField/beforeAssignmentReplaceAllCall_after.java
+++ b/java/java-tests/testData/refactoring/inplaceIntroduceField/beforeAssignmentReplaceAllCall_after.java
@@ -1,6 +1,6 @@
class Test {
- private Foo myFoo;
private final Foo foo;
+ private Foo myFoo;
Test() {
foo = new Foo();
diff --git a/java/java-tests/testData/refactoring/inplaceIntroduceField/beforeAssignmentReplaceAll_after.java b/java/java-tests/testData/refactoring/inplaceIntroduceField/beforeAssignmentReplaceAll_after.java
index 3e61dd57c8de..356bd37129fd 100644
--- a/java/java-tests/testData/refactoring/inplaceIntroduceField/beforeAssignmentReplaceAll_after.java
+++ b/java/java-tests/testData/refactoring/inplaceIntroduceField/beforeAssignmentReplaceAll_after.java
@@ -1,6 +1,6 @@
class Test {
- private String myTimer;
private final String string;
+ private String myTimer;
Test() {
string = "";
diff --git a/java/java-tests/testData/refactoring/inplaceIntroduceField/beforeAssignment_after.java b/java/java-tests/testData/refactoring/inplaceIntroduceField/beforeAssignment_after.java
index affd5251fc65..8c1a737d6311 100644
--- a/java/java-tests/testData/refactoring/inplaceIntroduceField/beforeAssignment_after.java
+++ b/java/java-tests/testData/refactoring/inplaceIntroduceField/beforeAssignment_after.java
@@ -1,6 +1,6 @@
class Test {
- private String myTimer;
private final String string;
+ private String myTimer;
Test() {
string = "";
diff --git a/java/java-tests/testData/refactoring/moveInstanceMethod/PolyadicExpr.java b/java/java-tests/testData/refactoring/moveInstanceMethod/PolyadicExpr.java
index d9ecff9098e5..387ed5dd9347 100644
--- a/java/java-tests/testData/refactoring/moveInstanceMethod/PolyadicExpr.java
+++ b/java/java-tests/testData/refactoring/moveInstanceMethod/PolyadicExpr.java
@@ -20,5 +20,4 @@ class B {
public int getI() {
return i;
}
-
}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/wrapReturnValue/staticMethodInnerClass/before/Test.java b/java/java-tests/testData/refactoring/wrapReturnValue/staticMethodInnerClass/before/Test.java
index b48e2eb88e18..d406379d1e43 100644
--- a/java/java-tests/testData/refactoring/wrapReturnValue/staticMethodInnerClass/before/Test.java
+++ b/java/java-tests/testData/refactoring/wrapReturnValue/staticMethodInnerClass/before/Test.java
@@ -6,5 +6,4 @@ class Test {
void bar() {
String s = foo();
}
-
}
\ No newline at end of file
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaHighlightingTest.java
index 1ba880774e42..7dcec9c186b5 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaHighlightingTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaHighlightingTest.java
@@ -125,6 +125,10 @@ public class LambdaHighlightingTest extends LightDaemonAnalyzerTestCase {
doTest();
}
+ public void testIncompleteSubst() throws Exception {
+ doTest();
+ }
+
private void doTest() throws Exception {
doTest(BASE_PATH + "/" + getTestName(false) + ".java", false, false);
}
diff --git a/java/java-tests/testSrc/com/intellij/psi/codeStyle/arrangement/JavaRearrangerByTypeAndModifierTest.groovy b/java/java-tests/testSrc/com/intellij/psi/codeStyle/arrangement/JavaRearrangerByTypeAndModifierTest.groovy
index 2d2fa4e39634..eec789d00f25 100644
--- a/java/java-tests/testSrc/com/intellij/psi/codeStyle/arrangement/JavaRearrangerByTypeAndModifierTest.groovy
+++ b/java/java-tests/testSrc/com/intellij/psi/codeStyle/arrangement/JavaRearrangerByTypeAndModifierTest.groovy
@@ -69,4 +69,38 @@ class Test {
rule(CLASS)]
)
}
+
+ void testInstanceInitializationBlockBoundToField() {
+ doTest('''\
+class Test {
+ private int i;
+ public int j;
+ { j = 1; }
+ protected int k;
+}''', '''\
+class Test {
+ public int j;
+ { j = 1; }
+ protected int k;
+ private int i;
+}''',
+ [rule(FIELD, PUBLIC), rule(FIELD, PROTECTED), rule(FIELD, PRIVATE)])
+ }
+
+ void testInstanceInitializationBlockAsFirstChild() {
+ doTest('''\
+class Test {
+ { j = 1; }
+ private int i;
+ public int j;
+ protected int k;
+}''', '''\
+class Test {
+ { j = 1; }
+ public int j;
+ protected int k;
+ private int i;
+}''',
+ [rule(FIELD, PUBLIC), rule(FIELD, PROTECTED), rule(FIELD, PRIVATE)])
+ }
}
diff --git a/java/java-tests/testSrc/com/intellij/psi/codeStyle/arrangement/JavaRearrangerByTypeTest.groovy b/java/java-tests/testSrc/com/intellij/psi/codeStyle/arrangement/JavaRearrangerByTypeTest.groovy
index 29a24c4f2773..4397ffcd2cd3 100644
--- a/java/java-tests/testSrc/com/intellij/psi/codeStyle/arrangement/JavaRearrangerByTypeTest.groovy
+++ b/java/java-tests/testSrc/com/intellij/psi/codeStyle/arrangement/JavaRearrangerByTypeTest.groovy
@@ -18,6 +18,7 @@ package com.intellij.psi.codeStyle.arrangement
import org.junit.Before
import static com.intellij.psi.codeStyle.arrangement.match.ArrangementEntryType.*
+import static com.intellij.psi.codeStyle.arrangement.match.ArrangementModifier.PUBLIC
/**
* @author Denis Zhdanov
* @since 7/20/12 2:45 PM
@@ -198,4 +199,36 @@ class Test {
[rule(FIELD)]
)
}
+
+ void testMethodsAndConstructors() {
+ doTest('''\
+class Test {
+ abstract void method1();
+ Test() {}
+ abstract void method2();
+}''',
+ '''\
+class Test {
+ Test() {}
+ abstract void method1();
+ abstract void method2();
+}''',
+ [rule(CONSTRUCTOR), rule(METHOD)])
+ }
+
+ void testConstructorAsMethod() {
+ doTest('''\
+class Test {
+ private int i;
+ Test() {}
+ public int j;
+}''',
+ '''\
+class Test {
+ public int j;
+ Test() {}
+ private int i;
+}''',
+ [rule(FIELD, PUBLIC), rule(METHOD), rule(FIELD)])
+ }
}
diff --git a/jps/jps-builders/jps-builders.iml b/jps/jps-builders/jps-builders.iml
index 663db3cccfe0..52b7313e1d64 100644
--- a/jps/jps-builders/jps-builders.iml
+++ b/jps/jps-builders/jps-builders.iml
@@ -8,7 +8,6 @@
-
@@ -37,6 +36,7 @@
+
diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/Callbacks.java b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/Callbacks.java
similarity index 96%
rename from jps/model/src/org/jetbrains/ether/dependencyView/Callbacks.java
rename to jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/Callbacks.java
index 2b3e499a2493..750297cab978 100644
--- a/jps/model/src/org/jetbrains/ether/dependencyView/Callbacks.java
+++ b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/Callbacks.java
@@ -1,4 +1,4 @@
-package org.jetbrains.ether.dependencyView;
+package org.jetbrains.jps.builders.java.dependencyView;
import org.jetbrains.asm4.ClassReader;
diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/ClassRepr.java b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/ClassRepr.java
similarity index 99%
rename from jps/model/src/org/jetbrains/ether/dependencyView/ClassRepr.java
rename to jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/ClassRepr.java
index 0a8f41e27766..a6a1db871f5a 100644
--- a/jps/model/src/org/jetbrains/ether/dependencyView/ClassRepr.java
+++ b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/ClassRepr.java
@@ -1,10 +1,9 @@
-package org.jetbrains.ether.dependencyView;
+package org.jetbrains.jps.builders.java.dependencyView;
import com.intellij.util.io.DataExternalizer;
-import groovyjarjarasm.asm.Opcodes;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import org.jetbrains.ether.RW;
+import org.jetbrains.asm4.Opcodes;
import java.io.*;
import java.lang.annotation.RetentionPolicy;
diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/ClassfileAnalyzer.java b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/ClassfileAnalyzer.java
similarity index 99%
rename from jps/model/src/org/jetbrains/ether/dependencyView/ClassfileAnalyzer.java
rename to jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/ClassfileAnalyzer.java
index af8622107a5a..2a999cfe49b0 100644
--- a/jps/model/src/org/jetbrains/ether/dependencyView/ClassfileAnalyzer.java
+++ b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/ClassfileAnalyzer.java
@@ -1,4 +1,4 @@
-package org.jetbrains.ether.dependencyView;
+package org.jetbrains.jps.builders.java.dependencyView;
import com.intellij.openapi.util.Pair;
import gnu.trove.TIntHashSet;
diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/CollectionFactory.java b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/CollectionFactory.java
similarity index 73%
rename from jps/model/src/org/jetbrains/ether/dependencyView/CollectionFactory.java
rename to jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/CollectionFactory.java
index dc0f4a0b8952..879507f76e81 100644
--- a/jps/model/src/org/jetbrains/ether/dependencyView/CollectionFactory.java
+++ b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/CollectionFactory.java
@@ -1,4 +1,4 @@
-package org.jetbrains.ether.dependencyView;
+package org.jetbrains.jps.builders.java.dependencyView;
import java.util.Collection;
diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/DependencyContext.java b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/DependencyContext.java
similarity index 94%
rename from jps/model/src/org/jetbrains/ether/dependencyView/DependencyContext.java
rename to jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/DependencyContext.java
index bebf0d5ecfed..dac4794f6484 100644
--- a/jps/model/src/org/jetbrains/ether/dependencyView/DependencyContext.java
+++ b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/DependencyContext.java
@@ -1,122 +1,122 @@
-package org.jetbrains.ether.dependencyView;
-
-import com.intellij.openapi.util.io.FileUtil;
-import com.intellij.util.io.PersistentStringEnumerator;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Created by IntelliJ IDEA.
- * User: db
- * Date: 14.02.11
- * Time: 2:03
- * To change this template use File | Settings | File Templates.
- */
-class DependencyContext {
- private final static String STRING_TABLE_NAME = "strings.tab";
- private final PersistentStringEnumerator myEnumerator;
-
- private final Map myTypeMap = new HashMap();
- private final Map myUsageMap = new HashMap();
-
- UsageRepr.Usage getUsage(final UsageRepr.Usage u) {
- final UsageRepr.Usage r = myUsageMap.get(u);
-
- if (r == null) {
- myUsageMap.put(u, u);
- return u;
- }
-
- return r;
- }
-
- TypeRepr.AbstractType getType(final TypeRepr.AbstractType t) {
- final TypeRepr.AbstractType r = myTypeMap.get(t);
-
- if (r != null) {
- return r;
- }
-
- myTypeMap.put(t, t);
-
- return t;
- }
-
- void clearMemoryCaches() {
- myTypeMap.clear();
- myUsageMap.clear();
- }
-
- static File getTableFile (final File rootDir, final String name) {
- final File file = new File(FileUtil.toSystemIndependentName(rootDir.getAbsoluteFile() + File.separator + name));
- FileUtil.createIfDoesntExist(file);
- return file;
- }
-
- DependencyContext(final File rootDir) throws IOException {
- final File file = getTableFile(rootDir, STRING_TABLE_NAME);
-
- myEnumerator = new PersistentStringEnumerator(file, true);
- }
-
- public String getValue(final int s) {
- try {
- return myEnumerator.valueOf(s);
- }
- catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- public int get(final String s) {
- try {
- final int i = s == null ? myEnumerator.enumerate("") : myEnumerator.enumerate(s);
-
- return i;
- }
- catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- public void close() {
- try {
- myEnumerator.close();
- }
- catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- public void flush() {
- myEnumerator.force();
- }
-
- public Logger getLogger(final com.intellij.openapi.diagnostic.Logger log) {
- return new Logger() {
- @Override
- public void debug(String comment, Integer s) {
- if (log.isDebugEnabled()) {
- log.debug(comment + getValue(s));
- }
- }
-
- @Override
- public void debug(String comment, String t) {
- if (log.isDebugEnabled()){
- log.debug(comment + t);
- }
- }
-
- @Override
- public void debug(String comment, boolean t) {
- if (log.isDebugEnabled()) {
- log.debug(comment + Boolean.toString(t));
- }
- }
- };
- }
-}
+package org.jetbrains.jps.builders.java.dependencyView;
+
+import com.intellij.openapi.util.io.FileUtil;
+import com.intellij.util.io.PersistentStringEnumerator;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: db
+ * Date: 14.02.11
+ * Time: 2:03
+ * To change this template use File | Settings | File Templates.
+ */
+class DependencyContext {
+ private final static String STRING_TABLE_NAME = "strings.tab";
+ private final PersistentStringEnumerator myEnumerator;
+
+ private final Map myTypeMap = new HashMap();
+ private final Map myUsageMap = new HashMap();
+
+ UsageRepr.Usage getUsage(final UsageRepr.Usage u) {
+ final UsageRepr.Usage r = myUsageMap.get(u);
+
+ if (r == null) {
+ myUsageMap.put(u, u);
+ return u;
+ }
+
+ return r;
+ }
+
+ TypeRepr.AbstractType getType(final TypeRepr.AbstractType t) {
+ final TypeRepr.AbstractType r = myTypeMap.get(t);
+
+ if (r != null) {
+ return r;
+ }
+
+ myTypeMap.put(t, t);
+
+ return t;
+ }
+
+ void clearMemoryCaches() {
+ myTypeMap.clear();
+ myUsageMap.clear();
+ }
+
+ static File getTableFile (final File rootDir, final String name) {
+ final File file = new File(FileUtil.toSystemIndependentName(rootDir.getAbsoluteFile() + File.separator + name));
+ FileUtil.createIfDoesntExist(file);
+ return file;
+ }
+
+ DependencyContext(final File rootDir) throws IOException {
+ final File file = getTableFile(rootDir, STRING_TABLE_NAME);
+
+ myEnumerator = new PersistentStringEnumerator(file, true);
+ }
+
+ public String getValue(final int s) {
+ try {
+ return myEnumerator.valueOf(s);
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public int get(final String s) {
+ try {
+ final int i = s == null ? myEnumerator.enumerate("") : myEnumerator.enumerate(s);
+
+ return i;
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public void close() {
+ try {
+ myEnumerator.close();
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public void flush() {
+ myEnumerator.force();
+ }
+
+ public Logger getLogger(final com.intellij.openapi.diagnostic.Logger log) {
+ return new Logger() {
+ @Override
+ public void debug(String comment, Integer s) {
+ if (log.isDebugEnabled()) {
+ log.debug(comment + getValue(s));
+ }
+ }
+
+ @Override
+ public void debug(String comment, String t) {
+ if (log.isDebugEnabled()){
+ log.debug(comment + t);
+ }
+ }
+
+ @Override
+ public void debug(String comment, boolean t) {
+ if (log.isDebugEnabled()) {
+ log.debug(comment + Boolean.toString(t));
+ }
+ }
+ };
+ }
+}
diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/Difference.java b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/Difference.java
similarity index 94%
rename from jps/model/src/org/jetbrains/ether/dependencyView/Difference.java
rename to jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/Difference.java
index c7e5027c576d..cc16299e7d7a 100644
--- a/jps/model/src/org/jetbrains/ether/dependencyView/Difference.java
+++ b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/Difference.java
@@ -1,132 +1,132 @@
-package org.jetbrains.ether.dependencyView;
-
-import com.intellij.openapi.util.Pair;
-import org.jetbrains.asm4.Opcodes;
-
-import java.util.*;
-
-/**
- * Created by IntelliJ IDEA.
- * User: db
- * Date: 01.03.11
- * Time: 17:39
- * To change this template use File | Settings | File Templates.
- */
-abstract class Difference {
- public static boolean isPackageLocal(final int access) {
- return (access & (Opcodes.ACC_PRIVATE | Opcodes.ACC_PROTECTED | Opcodes.ACC_PUBLIC)) == 0;
- }
-
- public static boolean weakerAccess(final int me, final int then) {
- return ((me & Opcodes.ACC_PRIVATE) > 0 && (then & Opcodes.ACC_PRIVATE) == 0) ||
- ((me & Opcodes.ACC_PROTECTED) > 0 && (then & Opcodes.ACC_PUBLIC) > 0) ||
- (isPackageLocal(me) && (then & Opcodes.ACC_PROTECTED) > 0);
- }
-
- public static final int NONE = 0;
- public static final int ACCESS = 1;
- public static final int TYPE = 2;
- public static final int VALUE = 4;
- public static final int SIGNATURE = 8;
- public static final int SUPERCLASS = 16;
- public static final int USAGES = 32;
-
- public interface Specifier {
- Collection added();
-
- Collection removed();
-
- Collection> changed();
-
- boolean unchanged();
- }
-
- public static Specifier make(final Set past, final Set now) {
- if (past == null) {
- final Collection _now = Collections.unmodifiableCollection(now);
- return new Specifier() {
- public Collection added() {
- return _now;
- }
-
- public Collection removed() {
- return Collections.emptyList();
- }
-
- public Collection> changed() {
- return Collections.emptyList();
- }
-
- public boolean unchanged() {
- return false;
- }
- };
- }
-
- final Set added = new HashSet(now);
-
- added.removeAll(past);
-
- final Set removed = new HashSet(past);
-
- removed.removeAll(now);
-
- final Set> changed = new HashSet>();
- final Set intersect = new HashSet(past);
- final Map nowMap = new HashMap();
-
- for (T s : now) {
- if (intersect.contains(s)) {
- nowMap.put(s, s);
- }
- }
-
- intersect.retainAll(now);
-
- for (T x : intersect) {
- final T y = nowMap.get(x);
-
- if (x instanceof Proto) {
- final Proto px = (Proto)x;
- final Proto py = (Proto)y;
- final Difference diff = py.difference(px);
-
- if (!diff.no()) {
- changed.add(new Pair(x, diff));
- }
- }
- }
-
- return new Specifier() {
- public Collection added() {
- return added;
- }
-
- public Collection removed() {
- return removed;
- }
-
- public Collection> changed() {
- return changed;
- }
-
- public boolean unchanged() {
- return changed.isEmpty() && added.isEmpty() && removed.isEmpty();
- }
- };
- }
-
- public abstract int base();
-
- public abstract boolean no();
-
- public abstract boolean weakedAccess();
-
- public abstract int addedModifiers();
-
- public abstract int removedModifiers();
-
- public abstract boolean packageLocalOn();
-
- public abstract boolean hadValue();
-}
+package org.jetbrains.jps.builders.java.dependencyView;
+
+import com.intellij.openapi.util.Pair;
+import org.jetbrains.asm4.Opcodes;
+
+import java.util.*;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: db
+ * Date: 01.03.11
+ * Time: 17:39
+ * To change this template use File | Settings | File Templates.
+ */
+abstract class Difference {
+ public static boolean isPackageLocal(final int access) {
+ return (access & (Opcodes.ACC_PRIVATE | Opcodes.ACC_PROTECTED | Opcodes.ACC_PUBLIC)) == 0;
+ }
+
+ public static boolean weakerAccess(final int me, final int then) {
+ return ((me & Opcodes.ACC_PRIVATE) > 0 && (then & Opcodes.ACC_PRIVATE) == 0) ||
+ ((me & Opcodes.ACC_PROTECTED) > 0 && (then & Opcodes.ACC_PUBLIC) > 0) ||
+ (isPackageLocal(me) && (then & Opcodes.ACC_PROTECTED) > 0);
+ }
+
+ public static final int NONE = 0;
+ public static final int ACCESS = 1;
+ public static final int TYPE = 2;
+ public static final int VALUE = 4;
+ public static final int SIGNATURE = 8;
+ public static final int SUPERCLASS = 16;
+ public static final int USAGES = 32;
+
+ public interface Specifier {
+ Collection added();
+
+ Collection removed();
+
+ Collection> changed();
+
+ boolean unchanged();
+ }
+
+ public static Specifier make(final Set past, final Set now) {
+ if (past == null) {
+ final Collection _now = Collections.unmodifiableCollection(now);
+ return new Specifier() {
+ public Collection added() {
+ return _now;
+ }
+
+ public Collection removed() {
+ return Collections.emptyList();
+ }
+
+ public Collection> changed() {
+ return Collections.emptyList();
+ }
+
+ public boolean unchanged() {
+ return false;
+ }
+ };
+ }
+
+ final Set added = new HashSet(now);
+
+ added.removeAll(past);
+
+ final Set removed = new HashSet(past);
+
+ removed.removeAll(now);
+
+ final Set> changed = new HashSet>();
+ final Set intersect = new HashSet(past);
+ final Map nowMap = new HashMap();
+
+ for (T s : now) {
+ if (intersect.contains(s)) {
+ nowMap.put(s, s);
+ }
+ }
+
+ intersect.retainAll(now);
+
+ for (T x : intersect) {
+ final T y = nowMap.get(x);
+
+ if (x instanceof Proto) {
+ final Proto px = (Proto)x;
+ final Proto py = (Proto)y;
+ final Difference diff = py.difference(px);
+
+ if (!diff.no()) {
+ changed.add(new Pair(x, diff));
+ }
+ }
+ }
+
+ return new Specifier() {
+ public Collection added() {
+ return added;
+ }
+
+ public Collection removed() {
+ return removed;
+ }
+
+ public Collection> changed() {
+ return changed;
+ }
+
+ public boolean unchanged() {
+ return changed.isEmpty() && added.isEmpty() && removed.isEmpty();
+ }
+ };
+ }
+
+ public abstract int base();
+
+ public abstract boolean no();
+
+ public abstract boolean weakedAccess();
+
+ public abstract int addedModifiers();
+
+ public abstract int removedModifiers();
+
+ public abstract boolean packageLocalOn();
+
+ public abstract boolean hadValue();
+}
diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/ElemType.java b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/ElemType.java
similarity index 89%
rename from jps/model/src/org/jetbrains/ether/dependencyView/ElemType.java
rename to jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/ElemType.java
index 038cbe4e6b83..b38c1ad15eb2 100644
--- a/jps/model/src/org/jetbrains/ether/dependencyView/ElemType.java
+++ b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/ElemType.java
@@ -1,4 +1,4 @@
-package org.jetbrains.ether.dependencyView;
+package org.jetbrains.jps.builders.java.dependencyView;
public enum ElemType {
/** Class, interface (including annotation type), or enum declaration */
diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/FieldRepr.java b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/FieldRepr.java
similarity index 94%
rename from jps/model/src/org/jetbrains/ether/dependencyView/FieldRepr.java
rename to jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/FieldRepr.java
index 55f65321b969..4e88c31c20c9 100644
--- a/jps/model/src/org/jetbrains/ether/dependencyView/FieldRepr.java
+++ b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/FieldRepr.java
@@ -1,66 +1,66 @@
-package org.jetbrains.ether.dependencyView;
-
-import com.intellij.util.io.DataExternalizer;
-
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.IOException;
-import java.util.Set;
-
-/**
- * Created by IntelliJ IDEA.
- * User: db
- * Date: 01.02.11
- * Time: 4:56
- * To change this template use File | Settings | File Templates.
- */
-class FieldRepr extends ProtoMember {
- public void updateClassUsages(final DependencyContext context, final int owner, final Set s) {
- myType.updateClassUsages(context, owner, s);
- }
-
- public FieldRepr(final DependencyContext context, final int a, final int n, final int d, final int s, final Object v) {
- super(a, s, n, TypeRepr.getType(context, d), v);
- }
-
- public FieldRepr(final DependencyContext context, final DataInput in) {
- super(context, in);
- }
-
- @Override
- public boolean equals(final Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- final FieldRepr fieldRepr = (FieldRepr)o;
-
- return name == fieldRepr.name;
- }
-
- @Override
- public int hashCode() {
- return 31 * name;
- }
-
- public static DataExternalizer externalizer(final DependencyContext context) {
- return new DataExternalizer() {
- @Override
- public void save(final DataOutput out, final FieldRepr value) throws IOException {
- value.save(out);
- }
-
- @Override
- public FieldRepr read(final DataInput in) throws IOException {
- return new FieldRepr(context, in);
- }
- };
- }
-
- public UsageRepr.Usage createUsage(final DependencyContext context, final int owner) {
- return UsageRepr.createFieldUsage(context, name, owner, context.get(myType.getDescr(context)));
- }
-
- public UsageRepr.Usage createAssignUsage(final DependencyContext context, final int owner) {
- return UsageRepr.createFieldAssignUsage(context, name, owner, context.get(myType.getDescr(context)));
- }
-}
+package org.jetbrains.jps.builders.java.dependencyView;
+
+import com.intellij.util.io.DataExternalizer;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+import java.util.Set;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: db
+ * Date: 01.02.11
+ * Time: 4:56
+ * To change this template use File | Settings | File Templates.
+ */
+class FieldRepr extends ProtoMember {
+ public void updateClassUsages(final DependencyContext context, final int owner, final Set s) {
+ myType.updateClassUsages(context, owner, s);
+ }
+
+ public FieldRepr(final DependencyContext context, final int a, final int n, final int d, final int s, final Object v) {
+ super(a, s, n, TypeRepr.getType(context, d), v);
+ }
+
+ public FieldRepr(final DependencyContext context, final DataInput in) {
+ super(context, in);
+ }
+
+ @Override
+ public boolean equals(final Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ final FieldRepr fieldRepr = (FieldRepr)o;
+
+ return name == fieldRepr.name;
+ }
+
+ @Override
+ public int hashCode() {
+ return 31 * name;
+ }
+
+ public static DataExternalizer externalizer(final DependencyContext context) {
+ return new DataExternalizer() {
+ @Override
+ public void save(final DataOutput out, final FieldRepr value) throws IOException {
+ value.save(out);
+ }
+
+ @Override
+ public FieldRepr read(final DataInput in) throws IOException {
+ return new FieldRepr(context, in);
+ }
+ };
+ }
+
+ public UsageRepr.Usage createUsage(final DependencyContext context, final int owner) {
+ return UsageRepr.createFieldUsage(context, name, owner, context.get(myType.getDescr(context)));
+ }
+
+ public UsageRepr.Usage createAssignUsage(final DependencyContext context, final int owner) {
+ return UsageRepr.createFieldAssignUsage(context, name, owner, context.get(myType.getDescr(context)));
+ }
+}
diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/IntIntMaplet.java b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/IntIntMaplet.java
similarity index 96%
rename from jps/model/src/org/jetbrains/ether/dependencyView/IntIntMaplet.java
rename to jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/IntIntMaplet.java
index 5f41a26c090d..fd6267389dd1 100644
--- a/jps/model/src/org/jetbrains/ether/dependencyView/IntIntMaplet.java
+++ b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/IntIntMaplet.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.jetbrains.ether.dependencyView;
+package org.jetbrains.jps.builders.java.dependencyView;
import gnu.trove.TIntIntProcedure;
diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/IntIntMultiMaplet.java b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/IntIntMultiMaplet.java
similarity index 94%
rename from jps/model/src/org/jetbrains/ether/dependencyView/IntIntMultiMaplet.java
rename to jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/IntIntMultiMaplet.java
index a3fcd178aba3..e57356909a82 100644
--- a/jps/model/src/org/jetbrains/ether/dependencyView/IntIntMultiMaplet.java
+++ b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/IntIntMultiMaplet.java
@@ -1,101 +1,101 @@
-/*
- * Copyright 2000-2011 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 org.jetbrains.ether.dependencyView;
-
-import gnu.trove.TIntHashSet;
-import gnu.trove.TIntObjectProcedure;
-import gnu.trove.TIntProcedure;
-
-import java.io.PrintStream;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * Created by IntelliJ IDEA.
- * User: db
- * Date: 03.11.11
- * Time: 21:01
- * To change this template use File | Settings | File Templates.
- */
-abstract class IntIntMultiMaplet implements Streamable {
- abstract boolean containsKey(final int key);
-
- abstract TIntHashSet get(final int key);
-
- abstract void put(final int key, final int value);
-
- abstract void put(final int key, final TIntHashSet value);
-
- abstract void replace(final int key, final TIntHashSet value);
-
- abstract void putAll(IntIntMultiMaplet m);
-
- abstract void replaceAll(IntIntMultiMaplet m);
-
- abstract void remove(final int key);
-
- abstract void removeFrom(final int key, final int value);
-
- abstract void removeAll(final int key, final TIntHashSet values);
-
- abstract void close();
-
- abstract void forEachEntry(TIntObjectProcedure proc);
-
- abstract void flush(boolean memoryCachesOnly);
-
- public void toStream(final DependencyContext context, final PrintStream stream) {
- final OrderProvider op = new OrderProvider(context);
-
- forEachEntry(new TIntObjectProcedure() {
- @Override
- public boolean execute(final int a, final TIntHashSet b) {
- op.register(a);
- return true;
- }
- });
-
- final int[] keys = op.get();
-
- for (final int a : keys) {
- final TIntHashSet b = get(a);
-
- stream.print(" Key: ");
- stream.println(context.getValue(a));
- stream.println(" Values:");
-
- final List list = new LinkedList();
-
- b.forEach(new TIntProcedure() {
- @Override
- public boolean execute(final int value) {
- list.add(context.getValue(value));
- return true;
- }
- });
-
- Collections.sort(list);
-
- for (final String l : list) {
- stream.print(" ");
- stream.println(l);
- }
-
- stream.println(" End Of Values");
- }
- }
-}
+/*
+ * Copyright 2000-2011 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 org.jetbrains.jps.builders.java.dependencyView;
+
+import gnu.trove.TIntHashSet;
+import gnu.trove.TIntObjectProcedure;
+import gnu.trove.TIntProcedure;
+
+import java.io.PrintStream;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: db
+ * Date: 03.11.11
+ * Time: 21:01
+ * To change this template use File | Settings | File Templates.
+ */
+abstract class IntIntMultiMaplet implements Streamable {
+ abstract boolean containsKey(final int key);
+
+ abstract TIntHashSet get(final int key);
+
+ abstract void put(final int key, final int value);
+
+ abstract void put(final int key, final TIntHashSet value);
+
+ abstract void replace(final int key, final TIntHashSet value);
+
+ abstract void putAll(IntIntMultiMaplet m);
+
+ abstract void replaceAll(IntIntMultiMaplet m);
+
+ abstract void remove(final int key);
+
+ abstract void removeFrom(final int key, final int value);
+
+ abstract void removeAll(final int key, final TIntHashSet values);
+
+ abstract void close();
+
+ abstract void forEachEntry(TIntObjectProcedure proc);
+
+ abstract void flush(boolean memoryCachesOnly);
+
+ public void toStream(final DependencyContext context, final PrintStream stream) {
+ final OrderProvider op = new OrderProvider(context);
+
+ forEachEntry(new TIntObjectProcedure() {
+ @Override
+ public boolean execute(final int a, final TIntHashSet b) {
+ op.register(a);
+ return true;
+ }
+ });
+
+ final int[] keys = op.get();
+
+ for (final int a : keys) {
+ final TIntHashSet b = get(a);
+
+ stream.print(" Key: ");
+ stream.println(context.getValue(a));
+ stream.println(" Values:");
+
+ final List list = new LinkedList();
+
+ b.forEach(new TIntProcedure() {
+ @Override
+ public boolean execute(final int value) {
+ list.add(context.getValue(value));
+ return true;
+ }
+ });
+
+ Collections.sort(list);
+
+ for (final String l : list) {
+ stream.print(" ");
+ stream.println(l);
+ }
+
+ stream.println(" End Of Values");
+ }
+ }
+}
diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/IntIntPersistentMaplet.java b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/IntIntPersistentMaplet.java
similarity index 98%
rename from jps/model/src/org/jetbrains/ether/dependencyView/IntIntPersistentMaplet.java
rename to jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/IntIntPersistentMaplet.java
index 6a814bfde0ca..86c774faad47 100644
--- a/jps/model/src/org/jetbrains/ether/dependencyView/IntIntPersistentMaplet.java
+++ b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/IntIntPersistentMaplet.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.jetbrains.ether.dependencyView;
+package org.jetbrains.jps.builders.java.dependencyView;
import com.intellij.util.Processor;
import com.intellij.util.containers.SLRUCache;
diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/IntIntPersistentMultiMaplet.java b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/IntIntPersistentMultiMaplet.java
similarity index 95%
rename from jps/model/src/org/jetbrains/ether/dependencyView/IntIntPersistentMultiMaplet.java
rename to jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/IntIntPersistentMultiMaplet.java
index e46676091852..4c4b089b314a 100644
--- a/jps/model/src/org/jetbrains/ether/dependencyView/IntIntPersistentMultiMaplet.java
+++ b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/IntIntPersistentMultiMaplet.java
@@ -1,291 +1,291 @@
-/*
- * Copyright 2000-2011 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 org.jetbrains.ether.dependencyView;
-
-import com.intellij.openapi.util.Ref;
-import com.intellij.util.Processor;
-import com.intellij.util.containers.SLRUCache;
-import com.intellij.util.io.DataExternalizer;
-import com.intellij.util.io.KeyDescriptor;
-import com.intellij.util.io.PersistentHashMap;
-import gnu.trove.TIntHashSet;
-import gnu.trove.TIntObjectProcedure;
-import gnu.trove.TIntProcedure;
-import org.jetbrains.annotations.NotNull;
-
-import java.io.*;
-
-/**
- * Created by IntelliJ IDEA.
- * User: db
- * Date: 08.03.11
- * Time: 15:38
- * To change this template use File | Settings | File Templates.
- */
-class IntIntPersistentMultiMaplet extends IntIntMultiMaplet {
- private static final TIntHashSet NULL_COLLECTION = new TIntHashSet();
- private static final int CACHE_SIZE = 128;
- private final PersistentHashMap myMap;
- private final SLRUCache myCache;
-
- public IntIntPersistentMultiMaplet(final File file, final KeyDescriptor keyExternalizer) throws IOException {
- myMap = new PersistentHashMap(file, keyExternalizer, new IntSetExternalizer());
- myCache = new SLRUCache(CACHE_SIZE, CACHE_SIZE) {
- @NotNull
- @Override
- public TIntHashSet createValue(Integer key) {
- try {
- final TIntHashSet collection = myMap.get(key);
- return collection == null? NULL_COLLECTION : collection;
- }
- catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
- };
- }
-
- @Override
- public boolean containsKey(final int key) {
- try {
- return myMap.containsMapping(key);
- }
- catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public TIntHashSet get(final int key) {
- final TIntHashSet collection = myCache.get(key);
- return collection == NULL_COLLECTION? null : collection;
- }
-
- @Override
- public void replace(int key, TIntHashSet value) {
- try {
- myCache.remove(key);
- if (value == null || value.isEmpty()) {
- myMap.remove(key);
- }
- else {
- myMap.put(key, value);
- }
- }
- catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public void put(final int key, final TIntHashSet value) {
- try {
- myCache.remove(key);
- myMap.appendData(key, new PersistentHashMap.ValueDataAppender() {
- public void append(final DataOutput out) throws IOException {
- final Ref exRef = new Ref();
- value.forEach(new TIntProcedure() {
- @Override
- public boolean execute(int value) {
- try {
- out.writeInt(value);
- }
- catch (IOException e) {
- exRef.set(e);
- return false;
- }
- return true;
- }
- });
- final IOException exception = exRef.get();
- if (exception != null) {
- throw exception;
- }
- }
- });
- }
- catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public void put(final int key, final int value) {
- try {
- myCache.remove(key);
- myMap.appendData(key, new PersistentHashMap.ValueDataAppender() {
- public void append(final DataOutput out) throws IOException {
- out.writeInt(value);
- }
- });
- }
- catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public void removeAll(int key, TIntHashSet values) {
- try {
- final TIntHashSet collection = myCache.get(key);
-
- if (collection != NULL_COLLECTION) {
- if (collection.removeAll(values.toArray())) {
- myCache.remove(key);
- if (collection.isEmpty()) {
- myMap.remove(key);
- }
- else {
- myMap.put(key, collection);
- }
- }
- }
- }
- catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public void removeFrom(final int key, final int value) {
- try {
- final TIntHashSet collection = myCache.get(key);
- if (collection != NULL_COLLECTION) {
- if (collection.remove(value)) {
- myCache.remove(key);
- if (collection.isEmpty()) {
- myMap.remove(key);
- }
- else {
- myMap.put(key, collection);
- }
- }
- }
- }
- catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public void remove(final int key) {
- try {
- myCache.remove(key);
- myMap.remove(key);
- }
- catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public void putAll(IntIntMultiMaplet m) {
- m.forEachEntry(new TIntObjectProcedure() {
- @Override
- public boolean execute(int key, TIntHashSet value) {
- put(key, value);
- return true;
- }
- });
- }
-
- @Override
- public void replaceAll(IntIntMultiMaplet m) {
- m.forEachEntry(new TIntObjectProcedure() {
- @Override
- public boolean execute(int key, TIntHashSet value) {
- replace(key, value);
- return true;
- }
- });
- }
-
- @Override
- public void close() {
- try {
- myCache.clear();
- myMap.close();
- }
- catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- public void flush(boolean memoryCachesOnly) {
- if (memoryCachesOnly) {
- if (myMap.isDirty()) {
- myMap.dropMemoryCaches();
- }
- }
- else {
- myMap.force();
- }
- }
-
- @Override
- public void forEachEntry(final TIntObjectProcedure procedure) {
- try {
- myMap.processKeysWithExistingMapping(new Processor() {
- @Override
- public boolean process(Integer key) {
- try {
- return procedure.execute(key, myMap.get(key));
- }
- catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
- });
- }
- catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- private static class IntSetExternalizer implements DataExternalizer {
- @Override
- public void save(final DataOutput out, final TIntHashSet value) throws IOException {
- final Ref exRef = new Ref(null);
- value.forEach(new TIntProcedure() {
- @Override
- public boolean execute(int elem) {
- try {
- out.writeInt(elem);
- }
- catch (IOException e) {
- exRef.set(e);
- return false;
- }
- return true;
- }
- });
- final IOException exception = exRef.get();
- if (exception != null) {
- throw exception;
- }
- }
-
- @Override
- public TIntHashSet read(final DataInput in) throws IOException {
- final TIntHashSet result = new TIntHashSet();
- final DataInputStream stream = (DataInputStream)in;
- while (stream.available() > 0) {
- result.add(in.readInt());
- }
- return result;
- }
- }
-}
+/*
+ * Copyright 2000-2011 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 org.jetbrains.jps.builders.java.dependencyView;
+
+import com.intellij.openapi.util.Ref;
+import com.intellij.util.Processor;
+import com.intellij.util.containers.SLRUCache;
+import com.intellij.util.io.DataExternalizer;
+import com.intellij.util.io.KeyDescriptor;
+import com.intellij.util.io.PersistentHashMap;
+import gnu.trove.TIntHashSet;
+import gnu.trove.TIntObjectProcedure;
+import gnu.trove.TIntProcedure;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.*;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: db
+ * Date: 08.03.11
+ * Time: 15:38
+ * To change this template use File | Settings | File Templates.
+ */
+class IntIntPersistentMultiMaplet extends IntIntMultiMaplet {
+ private static final TIntHashSet NULL_COLLECTION = new TIntHashSet();
+ private static final int CACHE_SIZE = 128;
+ private final PersistentHashMap myMap;
+ private final SLRUCache myCache;
+
+ public IntIntPersistentMultiMaplet(final File file, final KeyDescriptor keyExternalizer) throws IOException {
+ myMap = new PersistentHashMap(file, keyExternalizer, new IntSetExternalizer());
+ myCache = new SLRUCache(CACHE_SIZE, CACHE_SIZE) {
+ @NotNull
+ @Override
+ public TIntHashSet createValue(Integer key) {
+ try {
+ final TIntHashSet collection = myMap.get(key);
+ return collection == null? NULL_COLLECTION : collection;
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ };
+ }
+
+ @Override
+ public boolean containsKey(final int key) {
+ try {
+ return myMap.containsMapping(key);
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public TIntHashSet get(final int key) {
+ final TIntHashSet collection = myCache.get(key);
+ return collection == NULL_COLLECTION? null : collection;
+ }
+
+ @Override
+ public void replace(int key, TIntHashSet value) {
+ try {
+ myCache.remove(key);
+ if (value == null || value.isEmpty()) {
+ myMap.remove(key);
+ }
+ else {
+ myMap.put(key, value);
+ }
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public void put(final int key, final TIntHashSet value) {
+ try {
+ myCache.remove(key);
+ myMap.appendData(key, new PersistentHashMap.ValueDataAppender() {
+ public void append(final DataOutput out) throws IOException {
+ final Ref exRef = new Ref();
+ value.forEach(new TIntProcedure() {
+ @Override
+ public boolean execute(int value) {
+ try {
+ out.writeInt(value);
+ }
+ catch (IOException e) {
+ exRef.set(e);
+ return false;
+ }
+ return true;
+ }
+ });
+ final IOException exception = exRef.get();
+ if (exception != null) {
+ throw exception;
+ }
+ }
+ });
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public void put(final int key, final int value) {
+ try {
+ myCache.remove(key);
+ myMap.appendData(key, new PersistentHashMap.ValueDataAppender() {
+ public void append(final DataOutput out) throws IOException {
+ out.writeInt(value);
+ }
+ });
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public void removeAll(int key, TIntHashSet values) {
+ try {
+ final TIntHashSet collection = myCache.get(key);
+
+ if (collection != NULL_COLLECTION) {
+ if (collection.removeAll(values.toArray())) {
+ myCache.remove(key);
+ if (collection.isEmpty()) {
+ myMap.remove(key);
+ }
+ else {
+ myMap.put(key, collection);
+ }
+ }
+ }
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public void removeFrom(final int key, final int value) {
+ try {
+ final TIntHashSet collection = myCache.get(key);
+ if (collection != NULL_COLLECTION) {
+ if (collection.remove(value)) {
+ myCache.remove(key);
+ if (collection.isEmpty()) {
+ myMap.remove(key);
+ }
+ else {
+ myMap.put(key, collection);
+ }
+ }
+ }
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public void remove(final int key) {
+ try {
+ myCache.remove(key);
+ myMap.remove(key);
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public void putAll(IntIntMultiMaplet m) {
+ m.forEachEntry(new TIntObjectProcedure() {
+ @Override
+ public boolean execute(int key, TIntHashSet value) {
+ put(key, value);
+ return true;
+ }
+ });
+ }
+
+ @Override
+ public void replaceAll(IntIntMultiMaplet m) {
+ m.forEachEntry(new TIntObjectProcedure() {
+ @Override
+ public boolean execute(int key, TIntHashSet value) {
+ replace(key, value);
+ return true;
+ }
+ });
+ }
+
+ @Override
+ public void close() {
+ try {
+ myCache.clear();
+ myMap.close();
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public void flush(boolean memoryCachesOnly) {
+ if (memoryCachesOnly) {
+ if (myMap.isDirty()) {
+ myMap.dropMemoryCaches();
+ }
+ }
+ else {
+ myMap.force();
+ }
+ }
+
+ @Override
+ public void forEachEntry(final TIntObjectProcedure procedure) {
+ try {
+ myMap.processKeysWithExistingMapping(new Processor() {
+ @Override
+ public boolean process(Integer key) {
+ try {
+ return procedure.execute(key, myMap.get(key));
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ });
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private static class IntSetExternalizer implements DataExternalizer {
+ @Override
+ public void save(final DataOutput out, final TIntHashSet value) throws IOException {
+ final Ref exRef = new Ref(null);
+ value.forEach(new TIntProcedure() {
+ @Override
+ public boolean execute(int elem) {
+ try {
+ out.writeInt(elem);
+ }
+ catch (IOException e) {
+ exRef.set(e);
+ return false;
+ }
+ return true;
+ }
+ });
+ final IOException exception = exRef.get();
+ if (exception != null) {
+ throw exception;
+ }
+ }
+
+ @Override
+ public TIntHashSet read(final DataInput in) throws IOException {
+ final TIntHashSet result = new TIntHashSet();
+ final DataInputStream stream = (DataInputStream)in;
+ while (stream.available() > 0) {
+ result.add(in.readInt());
+ }
+ return result;
+ }
+ }
+}
diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/IntIntTransientMaplet.java b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/IntIntTransientMaplet.java
similarity index 96%
rename from jps/model/src/org/jetbrains/ether/dependencyView/IntIntTransientMaplet.java
rename to jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/IntIntTransientMaplet.java
index 68d53a193846..b5485f12458e 100644
--- a/jps/model/src/org/jetbrains/ether/dependencyView/IntIntTransientMaplet.java
+++ b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/IntIntTransientMaplet.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.jetbrains.ether.dependencyView;
+package org.jetbrains.jps.builders.java.dependencyView;
import gnu.trove.TIntIntHashMap;
import gnu.trove.TIntIntProcedure;
diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/IntIntTransientMultiMaplet.java b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/IntIntTransientMultiMaplet.java
similarity index 94%
rename from jps/model/src/org/jetbrains/ether/dependencyView/IntIntTransientMultiMaplet.java
rename to jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/IntIntTransientMultiMaplet.java
index 5a7ea477fd9e..71e2abf6bc0f 100644
--- a/jps/model/src/org/jetbrains/ether/dependencyView/IntIntTransientMultiMaplet.java
+++ b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/IntIntTransientMultiMaplet.java
@@ -1,137 +1,137 @@
-package org.jetbrains.ether.dependencyView;
-
-import gnu.trove.TIntHashSet;
-import gnu.trove.TIntObjectHashMap;
-import gnu.trove.TIntObjectProcedure;
-import gnu.trove.TIntProcedure;
-
-/**
- * Created by IntelliJ IDEA.
- * User: db
- * Date: 08.03.11
- * Time: 15:38
- * To change this template use File | Settings | File Templates.
- */
-class IntIntTransientMultiMaplet extends IntIntMultiMaplet {
- private final TIntObjectHashMap myMap = new TIntObjectHashMap();
-
-
- @Override
- public boolean containsKey(final int key) {
- return myMap.containsKey(key);
- }
-
- @Override
- public TIntHashSet get(final int key) {
- return myMap.get(key);
- }
-
- @Override
- public void putAll(IntIntMultiMaplet m) {
- m.forEachEntry(new TIntObjectProcedure() {
- @Override
- public boolean execute(int key, TIntHashSet values) {
- put(key, values);
- return true;
- }
- });
- }
-
- @Override
- public void put(final int key, final TIntHashSet value) {
- final TIntHashSet x = myMap.get(key);
- if (x == null) {
- myMap.put(key, value);
- }
- else {
- value.forEach(new TIntProcedure() {
- @Override
- public boolean execute(int value) {
- x.add(value);
- return true;
- }
- });
- }
- }
-
- @Override
- public void replace(int key, TIntHashSet value) {
- if (value == null || value.isEmpty()) {
- myMap.remove(key);
- }
- else {
- myMap.put(key, value);
- }
- }
-
- @Override
- public void put(final int key, final int value) {
- final TIntHashSet collection = myMap.get(key);
- if (collection == null) {
- final TIntHashSet x = new TIntHashSet();
- x.add(value);
- myMap.put(key, x);
- }
- else {
- collection.add(value);
- }
- }
-
- @Override
- public void removeFrom(final int key, final int value) {
- final TIntHashSet collection = myMap.get(key);
- if (collection != null) {
- if (collection.remove(value)) {
- if (collection.isEmpty()) {
- myMap.remove(key);
- }
- }
- }
- }
-
- @Override
- public void removeAll(int key, TIntHashSet values) {
- final TIntHashSet collection = myMap.get(key);
- if (collection != null) {
- values.forEach(new TIntProcedure() {
- @Override
- public boolean execute(int value) {
- collection.remove(value);
- return true;
- }
- });
- if (collection.isEmpty()) {
- myMap.remove(key);
- }
- }
- }
-
- @Override
- public void remove(final int key) {
- myMap.remove(key);
- }
-
- @Override
- public void replaceAll(IntIntMultiMaplet m) {
- m.forEachEntry(new TIntObjectProcedure() {
- @Override
- public boolean execute(int key, TIntHashSet value) {
- replace(key, value);
- return true;
- }
- });
- }
-
- @Override
- public void forEachEntry(TIntObjectProcedure procedure) {
- myMap.forEachEntry(procedure);
- }
-
- @Override
- public void close(){
- myMap.clear(); // free memory
- }
-
- public void flush(boolean memoryCachesOnly) {
- }
-}
+package org.jetbrains.jps.builders.java.dependencyView;
+
+import gnu.trove.TIntHashSet;
+import gnu.trove.TIntObjectHashMap;
+import gnu.trove.TIntObjectProcedure;
+import gnu.trove.TIntProcedure;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: db
+ * Date: 08.03.11
+ * Time: 15:38
+ * To change this template use File | Settings | File Templates.
+ */
+class IntIntTransientMultiMaplet extends IntIntMultiMaplet {
+ private final TIntObjectHashMap myMap = new TIntObjectHashMap();
+
+
+ @Override
+ public boolean containsKey(final int key) {
+ return myMap.containsKey(key);
+ }
+
+ @Override
+ public TIntHashSet get(final int key) {
+ return myMap.get(key);
+ }
+
+ @Override
+ public void putAll(IntIntMultiMaplet m) {
+ m.forEachEntry(new TIntObjectProcedure() {
+ @Override
+ public boolean execute(int key, TIntHashSet values) {
+ put(key, values);
+ return true;
+ }
+ });
+ }
+
+ @Override
+ public void put(final int key, final TIntHashSet value) {
+ final TIntHashSet x = myMap.get(key);
+ if (x == null) {
+ myMap.put(key, value);
+ }
+ else {
+ value.forEach(new TIntProcedure() {
+ @Override
+ public boolean execute(int value) {
+ x.add(value);
+ return true;
+ }
+ });
+ }
+ }
+
+ @Override
+ public void replace(int key, TIntHashSet value) {
+ if (value == null || value.isEmpty()) {
+ myMap.remove(key);
+ }
+ else {
+ myMap.put(key, value);
+ }
+ }
+
+ @Override
+ public void put(final int key, final int value) {
+ final TIntHashSet collection = myMap.get(key);
+ if (collection == null) {
+ final TIntHashSet x = new TIntHashSet();
+ x.add(value);
+ myMap.put(key, x);
+ }
+ else {
+ collection.add(value);
+ }
+ }
+
+ @Override
+ public void removeFrom(final int key, final int value) {
+ final TIntHashSet collection = myMap.get(key);
+ if (collection != null) {
+ if (collection.remove(value)) {
+ if (collection.isEmpty()) {
+ myMap.remove(key);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void removeAll(int key, TIntHashSet values) {
+ final TIntHashSet collection = myMap.get(key);
+ if (collection != null) {
+ values.forEach(new TIntProcedure() {
+ @Override
+ public boolean execute(int value) {
+ collection.remove(value);
+ return true;
+ }
+ });
+ if (collection.isEmpty()) {
+ myMap.remove(key);
+ }
+ }
+ }
+
+ @Override
+ public void remove(final int key) {
+ myMap.remove(key);
+ }
+
+ @Override
+ public void replaceAll(IntIntMultiMaplet m) {
+ m.forEachEntry(new TIntObjectProcedure() {
+ @Override
+ public boolean execute(int key, TIntHashSet value) {
+ replace(key, value);
+ return true;
+ }
+ });
+ }
+
+ @Override
+ public void forEachEntry(TIntObjectProcedure procedure) {
+ myMap.forEachEntry(procedure);
+ }
+
+ @Override
+ public void close(){
+ myMap.clear(); // free memory
+ }
+
+ public void flush(boolean memoryCachesOnly) {
+ }
+}
diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/IntObjectMultiMaplet.java b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/IntObjectMultiMaplet.java
similarity index 95%
rename from jps/model/src/org/jetbrains/ether/dependencyView/IntObjectMultiMaplet.java
rename to jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/IntObjectMultiMaplet.java
index d0d6f71c0ca1..a6d5d8b395d5 100644
--- a/jps/model/src/org/jetbrains/ether/dependencyView/IntObjectMultiMaplet.java
+++ b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/IntObjectMultiMaplet.java
@@ -1,101 +1,101 @@
-/*
- * Copyright 2000-2011 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 org.jetbrains.ether.dependencyView;
-
-import gnu.trove.TIntObjectProcedure;
-
-import java.io.ByteArrayOutputStream;
-import java.io.PrintStream;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * Created by IntelliJ IDEA.
- * User: db
- * Date: 03.11.11
- * Time: 21:01
- * To change this template use File | Settings | File Templates.
- */
-abstract class IntObjectMultiMaplet implements Streamable {
- abstract boolean containsKey(final int key);
-
- abstract Collection get(final int key);
-
- abstract void put(final int key, final V value);
-
- abstract void put(final int key, final Collection value);
-
- abstract void replace(final int key, final Collection value);
-
- abstract void putAll(IntObjectMultiMaplet m);
-
- abstract void replaceAll(IntObjectMultiMaplet m);
-
- abstract void remove(final int key);
-
- abstract void removeFrom(final int key, final V value);
-
- abstract void removeAll(final int key, final Collection value);
-
- abstract void close();
-
- abstract void forEachEntry(TIntObjectProcedure> procedure);
-
- abstract void flush(boolean memoryCachesOnly);
-
- public void toStream(final DependencyContext context, final PrintStream stream) {
- final OrderProvider op = new OrderProvider(context);
-
- forEachEntry(new TIntObjectProcedure>() {
- @Override
- public boolean execute(final int a, final Collection b) {
- op.register(a);
- return true;
- }
- });
-
- final int[] keys = op.get();
-
- for (final int a : keys) {
- final Collection b = get(a);
-
- stream.print(" Key: ");
- stream.println(context.getValue(a));
- stream.println(" Values:");
-
- final List list = new LinkedList();
-
- for (final V value : b) {
- final ByteArrayOutputStream baos = new ByteArrayOutputStream();
- final PrintStream s = new PrintStream(baos);
-
- value.toStream(context, s);
-
- list.add(baos.toString());
- }
-
- Collections.sort(list);
-
- for (final String l : list) {
- stream.print(l);
- }
-
- stream.println(" End Of Values");
- }
- }
-}
+/*
+ * Copyright 2000-2011 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 org.jetbrains.jps.builders.java.dependencyView;
+
+import gnu.trove.TIntObjectProcedure;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: db
+ * Date: 03.11.11
+ * Time: 21:01
+ * To change this template use File | Settings | File Templates.
+ */
+abstract class IntObjectMultiMaplet implements Streamable {
+ abstract boolean containsKey(final int key);
+
+ abstract Collection get(final int key);
+
+ abstract void put(final int key, final V value);
+
+ abstract void put(final int key, final Collection value);
+
+ abstract void replace(final int key, final Collection value);
+
+ abstract void putAll(IntObjectMultiMaplet m);
+
+ abstract void replaceAll(IntObjectMultiMaplet m);
+
+ abstract void remove(final int key);
+
+ abstract void removeFrom(final int key, final V value);
+
+ abstract void removeAll(final int key, final Collection value);
+
+ abstract void close();
+
+ abstract void forEachEntry(TIntObjectProcedure> procedure);
+
+ abstract void flush(boolean memoryCachesOnly);
+
+ public void toStream(final DependencyContext context, final PrintStream stream) {
+ final OrderProvider op = new OrderProvider(context);
+
+ forEachEntry(new TIntObjectProcedure>() {
+ @Override
+ public boolean execute(final int a, final Collection b) {
+ op.register(a);
+ return true;
+ }
+ });
+
+ final int[] keys = op.get();
+
+ for (final int a : keys) {
+ final Collection b = get(a);
+
+ stream.print(" Key: ");
+ stream.println(context.getValue(a));
+ stream.println(" Values:");
+
+ final List list = new LinkedList();
+
+ for (final V value : b) {
+ final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ final PrintStream s = new PrintStream(baos);
+
+ value.toStream(context, s);
+
+ list.add(baos.toString());
+ }
+
+ Collections.sort(list);
+
+ for (final String l : list) {
+ stream.print(l);
+ }
+
+ stream.println(" End Of Values");
+ }
+ }
+}
diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/IntObjectPersistentMultiMaplet.java b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/IntObjectPersistentMultiMaplet.java
similarity index 95%
rename from jps/model/src/org/jetbrains/ether/dependencyView/IntObjectPersistentMultiMaplet.java
rename to jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/IntObjectPersistentMultiMaplet.java
index 683b3aca4cfb..eebf074dd817 100644
--- a/jps/model/src/org/jetbrains/ether/dependencyView/IntObjectPersistentMultiMaplet.java
+++ b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/IntObjectPersistentMultiMaplet.java
@@ -1,266 +1,266 @@
-/*
- * Copyright 2000-2011 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 org.jetbrains.ether.dependencyView;
-
-import com.intellij.util.Processor;
-import com.intellij.util.containers.SLRUCache;
-import com.intellij.util.io.DataExternalizer;
-import com.intellij.util.io.KeyDescriptor;
-import com.intellij.util.io.PersistentHashMap;
-import gnu.trove.TIntObjectProcedure;
-import org.jetbrains.annotations.NotNull;
-
-import java.io.*;
-import java.util.Collection;
-import java.util.Collections;
-
-/**
- * Created by IntelliJ IDEA.
- * User: db
- * Date: 08.03.11
- * Time: 15:38
- * To change this template use File | Settings | File Templates.
- */
-class IntObjectPersistentMultiMaplet extends IntObjectMultiMaplet {
- private static final Collection NULL_COLLECTION = Collections.emptySet();
- private static final int CACHE_SIZE = 128;
- private final PersistentHashMap> myMap;
- private final DataExternalizer myValueExternalizer;
- private final SLRUCache myCache;
-
- public IntObjectPersistentMultiMaplet(final File file,
- final KeyDescriptor keyExternalizer,
- final DataExternalizer valueExternalizer,
- final CollectionFactory collectionFactory) throws IOException {
- myValueExternalizer = valueExternalizer;
- myMap = new PersistentHashMap>(file, keyExternalizer, new CollectionDataExternalizer(valueExternalizer, collectionFactory));
- myCache = new SLRUCache(CACHE_SIZE, CACHE_SIZE) {
- @NotNull
- @Override
- public Collection createValue(Integer key) {
- try {
- final Collection collection = myMap.get(key);
- return collection == null? NULL_COLLECTION : collection;
- }
- catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
- };
- }
-
-
- @Override
- public boolean containsKey(final int key) {
- try {
- return myMap.containsMapping(key);
- }
- catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public Collection get(final int key) {
- final Collection collection = myCache.get(key);
- return collection == NULL_COLLECTION? null : collection;
- }
-
- @Override
- public void replace(int key, Collection value) {
- try {
- myCache.remove(key);
- if (value == null || value.isEmpty()) {
- myMap.remove(key);
- }
- else {
- myMap.put(key, value);
- }
- }
- catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public void put(final int key, final Collection value) {
- try {
- myCache.remove(key);
- myMap.appendData(key, new PersistentHashMap.ValueDataAppender() {
- public void append(DataOutput out) throws IOException {
- for (V v : value) {
- myValueExternalizer.save(out, v);
- }
- }
- });
- }
- catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public void put(final int key, final V value) {
- put(key, Collections.singleton(value));
- }
-
- @Override
- public void removeAll(int key, Collection values) {
- try {
- final Collection collection = myCache.get(key);
-
- if (collection != NULL_COLLECTION) {
- if (collection.removeAll(values)) {
- myCache.remove(key);
- if (collection.isEmpty()) {
- myMap.remove(key);
- }
- else {
- myMap.put(key, (Collection)collection);
- }
- }
- }
- }
- catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public void removeFrom(final int key, final V value) {
- try {
- final Collection collection = myCache.get(key);
-
- if (collection != NULL_COLLECTION) {
- if (collection.remove(value)) {
- myCache.remove(key);
- if (collection.isEmpty()) {
- myMap.remove(key);
- }
- else {
- myMap.put(key, (Collection)collection);
- }
- }
- }
- }
- catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public void remove(final int key) {
- try {
- myCache.remove(key);
- myMap.remove(key);
- }
- catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public void putAll(IntObjectMultiMaplet m) {
- m.forEachEntry(new TIntObjectProcedure>() {
- @Override
- public boolean execute(int key, Collection value) {
- put(key, value);
- return true;
- }
- });
- }
-
- @Override
- public void replaceAll(IntObjectMultiMaplet m) {
- m.forEachEntry(new TIntObjectProcedure>() {
- @Override
- public boolean execute(int key, Collection value) {
- replace(key, value);
- return true;
- }
- });
- }
-
- @Override
- public void close() {
- try {
- myCache.clear();
- myMap.close();
- }
- catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- public void flush(boolean memoryCachesOnly) {
- if (memoryCachesOnly) {
- if (myMap.isDirty()) {
- myMap.dropMemoryCaches();
- }
- }
- else {
- myMap.force();
- }
- }
-
- @Override
- public void forEachEntry(final TIntObjectProcedure> procedure) {
- try {
- myMap.processKeysWithExistingMapping(new Processor() {
- @Override
- public boolean process(Integer key) {
- try {
- return procedure.execute(key, myMap.get(key));
- }
- catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
- });
- }
- catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- private static class CollectionDataExternalizer implements DataExternalizer> {
- private final DataExternalizer myElementExternalizer;
- private final CollectionFactory myCollectionFactory;
-
- public CollectionDataExternalizer(DataExternalizer elementExternalizer,
- CollectionFactory collectionFactory) {
- myElementExternalizer = elementExternalizer;
- myCollectionFactory = collectionFactory;
- }
-
- @Override
- public void save(final DataOutput out, final Collection value) throws IOException {
- for (V x : value) {
- myElementExternalizer.save(out, x);
- }
- }
-
- @Override
- public Collection read(final DataInput in) throws IOException {
- final Collection result = myCollectionFactory.create();
- final DataInputStream stream = (DataInputStream)in;
- while (stream.available() > 0) {
- result.add(myElementExternalizer.read(in));
- }
- return result;
- }
- }
-}
+/*
+ * Copyright 2000-2011 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 org.jetbrains.jps.builders.java.dependencyView;
+
+import com.intellij.util.Processor;
+import com.intellij.util.containers.SLRUCache;
+import com.intellij.util.io.DataExternalizer;
+import com.intellij.util.io.KeyDescriptor;
+import com.intellij.util.io.PersistentHashMap;
+import gnu.trove.TIntObjectProcedure;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.*;
+import java.util.Collection;
+import java.util.Collections;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: db
+ * Date: 08.03.11
+ * Time: 15:38
+ * To change this template use File | Settings | File Templates.
+ */
+class IntObjectPersistentMultiMaplet extends IntObjectMultiMaplet {
+ private static final Collection NULL_COLLECTION = Collections.emptySet();
+ private static final int CACHE_SIZE = 128;
+ private final PersistentHashMap> myMap;
+ private final DataExternalizer myValueExternalizer;
+ private final SLRUCache myCache;
+
+ public IntObjectPersistentMultiMaplet(final File file,
+ final KeyDescriptor keyExternalizer,
+ final DataExternalizer valueExternalizer,
+ final CollectionFactory collectionFactory) throws IOException {
+ myValueExternalizer = valueExternalizer;
+ myMap = new PersistentHashMap>(file, keyExternalizer, new CollectionDataExternalizer(valueExternalizer, collectionFactory));
+ myCache = new SLRUCache(CACHE_SIZE, CACHE_SIZE) {
+ @NotNull
+ @Override
+ public Collection createValue(Integer key) {
+ try {
+ final Collection collection = myMap.get(key);
+ return collection == null? NULL_COLLECTION : collection;
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ };
+ }
+
+
+ @Override
+ public boolean containsKey(final int key) {
+ try {
+ return myMap.containsMapping(key);
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public Collection get(final int key) {
+ final Collection collection = myCache.get(key);
+ return collection == NULL_COLLECTION? null : collection;
+ }
+
+ @Override
+ public void replace(int key, Collection value) {
+ try {
+ myCache.remove(key);
+ if (value == null || value.isEmpty()) {
+ myMap.remove(key);
+ }
+ else {
+ myMap.put(key, value);
+ }
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public void put(final int key, final Collection value) {
+ try {
+ myCache.remove(key);
+ myMap.appendData(key, new PersistentHashMap.ValueDataAppender() {
+ public void append(DataOutput out) throws IOException {
+ for (V v : value) {
+ myValueExternalizer.save(out, v);
+ }
+ }
+ });
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public void put(final int key, final V value) {
+ put(key, Collections.singleton(value));
+ }
+
+ @Override
+ public void removeAll(int key, Collection values) {
+ try {
+ final Collection collection = myCache.get(key);
+
+ if (collection != NULL_COLLECTION) {
+ if (collection.removeAll(values)) {
+ myCache.remove(key);
+ if (collection.isEmpty()) {
+ myMap.remove(key);
+ }
+ else {
+ myMap.put(key, (Collection)collection);
+ }
+ }
+ }
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public void removeFrom(final int key, final V value) {
+ try {
+ final Collection collection = myCache.get(key);
+
+ if (collection != NULL_COLLECTION) {
+ if (collection.remove(value)) {
+ myCache.remove(key);
+ if (collection.isEmpty()) {
+ myMap.remove(key);
+ }
+ else {
+ myMap.put(key, (Collection)collection);
+ }
+ }
+ }
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public void remove(final int key) {
+ try {
+ myCache.remove(key);
+ myMap.remove(key);
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public void putAll(IntObjectMultiMaplet m) {
+ m.forEachEntry(new TIntObjectProcedure>() {
+ @Override
+ public boolean execute(int key, Collection value) {
+ put(key, value);
+ return true;
+ }
+ });
+ }
+
+ @Override
+ public void replaceAll(IntObjectMultiMaplet m) {
+ m.forEachEntry(new TIntObjectProcedure>() {
+ @Override
+ public boolean execute(int key, Collection value) {
+ replace(key, value);
+ return true;
+ }
+ });
+ }
+
+ @Override
+ public void close() {
+ try {
+ myCache.clear();
+ myMap.close();
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public void flush(boolean memoryCachesOnly) {
+ if (memoryCachesOnly) {
+ if (myMap.isDirty()) {
+ myMap.dropMemoryCaches();
+ }
+ }
+ else {
+ myMap.force();
+ }
+ }
+
+ @Override
+ public void forEachEntry(final TIntObjectProcedure> procedure) {
+ try {
+ myMap.processKeysWithExistingMapping(new Processor() {
+ @Override
+ public boolean process(Integer key) {
+ try {
+ return procedure.execute(key, myMap.get(key));
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ });
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private static class CollectionDataExternalizer implements DataExternalizer> {
+ private final DataExternalizer myElementExternalizer;
+ private final CollectionFactory myCollectionFactory;
+
+ public CollectionDataExternalizer(DataExternalizer elementExternalizer,
+ CollectionFactory collectionFactory) {
+ myElementExternalizer = elementExternalizer;
+ myCollectionFactory = collectionFactory;
+ }
+
+ @Override
+ public void save(final DataOutput out, final Collection value) throws IOException {
+ for (V x : value) {
+ myElementExternalizer.save(out, x);
+ }
+ }
+
+ @Override
+ public Collection read(final DataInput in) throws IOException {
+ final Collection result = myCollectionFactory.create();
+ final DataInputStream stream = (DataInputStream)in;
+ while (stream.available() > 0) {
+ result.add(myElementExternalizer.read(in));
+ }
+ return result;
+ }
+ }
+}
diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/IntObjectTransientMultiMaplet.java b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/IntObjectTransientMultiMaplet.java
similarity index 94%
rename from jps/model/src/org/jetbrains/ether/dependencyView/IntObjectTransientMultiMaplet.java
rename to jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/IntObjectTransientMultiMaplet.java
index 35e9ed2cbd9e..aa7ac1e3dd3c 100644
--- a/jps/model/src/org/jetbrains/ether/dependencyView/IntObjectTransientMultiMaplet.java
+++ b/jps/jps-builders/src/org/jetbrains/jps/builders/java/dependencyView/IntObjectTransientMultiMaplet.java
@@ -1,131 +1,131 @@
-package org.jetbrains.ether.dependencyView;
-
-import gnu.trove.TIntObjectHashMap;
-import gnu.trove.TIntObjectProcedure;
-
-import java.util.Collection;
-
-/**
- * Created by IntelliJ IDEA.
- * User: db
- * Date: 08.03.11
- * Time: 15:38
- * To change this template use File | Settings | File Templates.
- */
-class IntObjectTransientMultiMaplet extends IntObjectMultiMaplet {
-
- private final TIntObjectHashMap> myMap = new TIntObjectHashMap>();
- private final CollectionFactory myCollectionFactory;
-
- public IntObjectTransientMultiMaplet(CollectionFactory collectionFactory) {
- myCollectionFactory = collectionFactory;
- }
-
- @Override
- public boolean containsKey(final int key) {
- return myMap.containsKey(key);
- }
-
- @Override
- public Collection get(final int key) {
- return myMap.get(key);
- }
-
- @Override
- public void putAll(IntObjectMultiMaplet m) {
- m.forEachEntry(new TIntObjectProcedure>() {
- @Override
- public boolean execute(int key, Collection value) {
- put(key, value);
- return true;
- }
- });
- }
-
- @Override
- public void put(final int key, final Collection value) {
- final Collection x = myMap.get(key);
- if (x == null) {
- myMap.put(key, value);
- }
- else {
- x.addAll(value);
- }
- }
-
- @Override
- public void replace(int key, Collection value) {
- if (value == null || value.isEmpty()) {
- myMap.remove(key);
- }
- else {
- myMap.put(key, value);
- }
- }
-
- @Override
- public void put(final int key, final V value) {
- final Collection collection = myMap.get(key);
- if (collection == null) {
- final Collection x = myCollectionFactory.create();
- x.add(value);
- myMap.put(key, x);
- }
- else {
- collection.add(value);
- }
- }
-
- @Override
- public void removeFrom(final int key, final V value) {
- final Collection collection = myMap.get(key);
- if (collection != null) {
- if (collection.remove(value)) {
- if (collection.isEmpty()) {
- myMap.remove(key);
- }
- }
- }
- }
-
- @Override
- public void removeAll(int key, Collection values) {
- final Collection collection = myMap.get(key);
- if (collection != null) {
- if (collection.removeAll(values)) {
- if (collection.isEmpty()) {
- myMap.remove(key);
- }
- }
- }
- }
-
- @Override
- public void remove(final int key) {
- myMap.remove(key);
- }
-
- @Override
- public void replaceAll(IntObjectMultiMaplet m) {
- m.forEachEntry(new TIntObjectProcedure>() {
- @Override
- public boolean execute(int key, Collection value) {
- replace(key, value);
- return true;
- }
- });
- }
-
- @Override
- public void forEachEntry(TIntObjectProcedure> procedure) {
- myMap.forEachEntry(procedure);
- }
-
- @Override
- public void close(){
- myMap.clear(); // free memory
- }
-
- public void flush(boolean memoryCachesOnly) {
- }
-}
+package org.jetbrains.jps.builders.java.dependencyView;
+
+import gnu.trove.TIntObjectHashMap;
+import gnu.trove.TIntObjectProcedure;
+
+import java.util.Collection;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: db
+ * Date: 08.03.11
+ * Time: 15:38
+ * To change this template use File | Settings | File Templates.
+ */
+class IntObjectTransientMultiMaplet extends IntObjectMultiMaplet