diff --git a/.idea/modules.xml b/.idea/modules.xml
index 553b6854a1ac..cb457d298f4a 100644
--- a/.idea/modules.xml
+++ b/.idea/modules.xml
@@ -10,6 +10,7 @@
+
diff --git a/build/scripts/layouts.gant b/build/scripts/layouts.gant
index 1985a382aaa9..734760c5262c 100644
--- a/build/scripts/layouts.gant
+++ b/build/scripts/layouts.gant
@@ -383,7 +383,10 @@ public def layoutCommunityPlugins(String home) {
exclude(name: "**/ddmlib_1.jar")
}
- jar("android_rt.jar") {module("android-rt")}
+ jar("android-common.jar") {
+ module("android-rt")
+ module("android-common")
+ }
dir("jps") {
jar("android-jps-plugin.jar") { module("android-jps-plugin") }
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerEditorImpl.java b/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerEditorImpl.java
index 5f9eaa4801df..68c6049d4cdc 100644
--- a/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerEditorImpl.java
+++ b/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerEditorImpl.java
@@ -69,13 +69,13 @@ public abstract class DebuggerEditorImpl extends CompletionEditor{
private WeakReference myPopup;
private final PsiTreeChangeListener myPsiListener = new PsiTreeChangeAdapter() {
- public void childRemoved(PsiTreeChangeEvent event) {
+ public void childRemoved(@NotNull PsiTreeChangeEvent event) {
checkContext();
}
- public void childReplaced(PsiTreeChangeEvent event) {
+ public void childReplaced(@NotNull PsiTreeChangeEvent event) {
checkContext();
}
- public void childMoved(PsiTreeChangeEvent event) {
+ public void childMoved(@NotNull PsiTreeChangeEvent event) {
checkContext();
}
private void checkContext() {
diff --git a/java/execution/impl/src/com/intellij/execution/junit2/segments/Extractor.java b/java/execution/impl/src/com/intellij/execution/junit2/segments/Extractor.java
index 1b087e5ef4d1..de2266aa74dd 100644
--- a/java/execution/impl/src/com/intellij/execution/junit2/segments/Extractor.java
+++ b/java/execution/impl/src/com/intellij/execution/junit2/segments/Extractor.java
@@ -30,6 +30,7 @@ import org.jetbrains.annotations.NotNull;
import java.io.InputStream;
import java.io.Reader;
import java.nio.charset.Charset;
+import java.util.concurrent.atomic.AtomicInteger;
/**
* @author dyoma
@@ -40,7 +41,7 @@ public class Extractor implements Disposable {
private OutputPacketProcessor myEventsDispatcher;
private static final Logger LOG = Logger.getInstance("#" + Extractor.class.getName());
private final MergingUpdateQueue myQueue = new MergingUpdateQueue("Test Extractor", 20, true, MergingUpdateQueue.ANY_COMPONENT);
- private int myOrder = -1;
+ private AtomicInteger myOrder = new AtomicInteger(-1);
public Extractor(@NotNull InputStream stream, @NotNull Charset charset) {
myStream = new SegmentedInputStream(stream, charset);
@@ -66,7 +67,7 @@ public class Extractor implements Disposable {
myFulfilledWorkGate = new DeferredActionsQueue() { //todo make it all later
@Override
public void addLast(final Runnable runnable) {
- myQueue.queue(new MyUpdate(runnable, queue, myOrder++));
+ myQueue.queue(new MyUpdate(runnable, queue, myOrder.incrementAndGet()));
}
@Override
diff --git a/java/idea-ui/src/com/intellij/util/descriptors/impl/ConfigFileImpl.java b/java/idea-ui/src/com/intellij/util/descriptors/impl/ConfigFileImpl.java
index a64cc6c8a313..b8a262df7993 100644
--- a/java/idea-ui/src/com/intellij/util/descriptors/impl/ConfigFileImpl.java
+++ b/java/idea-ui/src/com/intellij/util/descriptors/impl/ConfigFileImpl.java
@@ -33,11 +33,11 @@ public class ConfigFileImpl implements ConfigFile {
final VirtualFilePointerManager pointerManager = VirtualFilePointerManager.getInstance();
myFilePointer = pointerManager.create(configuration.getUrl(), this, new VirtualFilePointerListener() {
@Override
- public void beforeValidityChanged(final VirtualFilePointer[] pointers) {
+ public void beforeValidityChanged(@NotNull final VirtualFilePointer[] pointers) {
}
@Override
- public void validityChanged(final VirtualFilePointer[] pointers) {
+ public void validityChanged(@NotNull final VirtualFilePointer[] pointers) {
myPsiFile = null;
onChange();
}
diff --git a/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java b/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java
index 2a9bd85eee2c..258ac5a02d18 100644
--- a/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java
+++ b/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java
@@ -576,7 +576,7 @@ public class ExpectedTypesProvider {
@Override
public void visitPolyadicExpression(PsiPolyadicExpression expr) {
PsiExpression[] operands = expr.getOperands();
- int index = Arrays.asList(operands).indexOf(myExpr);
+ final int index = Arrays.asList(operands).indexOf(myExpr);
assert index >= 0;
if (myForCompletion && index == 0) {
@@ -591,7 +591,7 @@ public class ExpectedTypesProvider {
}
return;
}
- PsiExpression anotherExpr = index > 0 ? operands[0] : index < operands.length ? operands[1] : null;
+ PsiExpression anotherExpr = index > 0 ? operands[0] : 1 < operands.length ? operands[1] : null;
PsiType anotherType = anotherExpr != null ? anotherExpr.getType() : null;
IElementType i = expr.getOperationTokenType();
if (i == JavaTokenType.MINUS ||
diff --git a/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java b/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java
index 8722fdfd04be..a6790e8bb7e8 100644
--- a/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java
+++ b/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java
@@ -65,6 +65,7 @@ import com.intellij.psi.xml.XmlDocument;
import com.intellij.psi.xml.XmlFile;
import com.intellij.psi.xml.XmlTag;
import com.intellij.util.*;
+import com.intellij.util.containers.ConcurrentWeakHashMap;
import com.intellij.util.containers.ConcurrentWeakValueHashMap;
import com.intellij.util.messages.MessageBusConnection;
import com.intellij.util.ui.OptionsMessageDialog;
@@ -135,9 +136,20 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager {
return result.isEmpty() ? null : result.values().toArray(new PsiAnnotation[result.size()]);
}
+ private final Map> cache = new ConcurrentWeakHashMap>();
@NotNull
private Map collectExternalAnnotations(@NotNull final PsiModifierListOwner listOwner) {
if (hasAnyAnnotationsRoots() == ThreeState.NO) return Collections.emptyMap();
+
+ Map map = cache.get(listOwner);
+ if (map == null) {
+ map = doCollect(listOwner);
+ cache.put(listOwner, map);
+ }
+ return map;
+ }
+
+ private Map doCollect(@NotNull PsiModifierListOwner listOwner) {
final List files = findExternalAnnotationsFiles(listOwner);
if (files == null) {
return Collections.emptyMap();
@@ -313,10 +325,12 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager {
return VfsUtil.toVirtualFileArray(result);
}
- private void annotateExternally(@NotNull final VirtualFile file, @NotNull final PsiModifierListOwner listOwner, final Project project,
+ private void annotateExternally(@NotNull final VirtualFile file,
+ @NotNull final PsiModifierListOwner listOwner,
+ @NotNull Project project,
@NotNull final String packageName,
final VirtualFile virtualFile,
- final String annotationFQName,
+ @NotNull final String annotationFQName,
@NotNull final PsiFile fromFile,
final PsiNameValuePair[] value) {
final XmlFile[] annotationsXml = new XmlFile[1];
@@ -352,46 +366,61 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager {
@Override
public boolean deannotate(@NotNull final PsiModifierListOwner listOwner, @NotNull final String annotationFQN) {
- final List files = findExternalAnnotationsFiles(listOwner);
- if (files != null) {
+ try {
+ final List files = findExternalAnnotationsFiles(listOwner);
+ if (files == null) {
+ return false;
+ }
for (XmlFile file : files) {
- if (file.isValid()) {
- final XmlDocument document = file.getDocument();
- if (document != null) {
- final XmlTag rootTag = document.getRootTag();
- if (rootTag != null) {
- final String externalName = getExternalName(listOwner, false);
- final String oldExternalName = getNormalizedExternalName(listOwner);
- for (final XmlTag tag : rootTag.getSubTags()) {
- final String className = tag.getAttributeValue("name");
- if (Comparing.strEqual(className, externalName) || Comparing.strEqual(className, oldExternalName)) {
- for (XmlTag annotationTag : tag.getSubTags()) {
- if (Comparing.strEqual(annotationTag.getAttributeValue("name"), annotationFQN)) {
- if (ReadonlyStatusHandler.getInstance(myPsiManager.getProject())
- .ensureFilesWritable(file.getVirtualFile()).hasReadonlyFiles()) {
- return false;
- }
- try {
- annotationTag.delete();
- if (tag.getSubTags().length == 0) {
- tag.delete();
- }
- }
- catch (IncorrectOperationException e) {
- LOG.error(e);
- }
- return true;
- }
- }
- return false;
- }
+ if (!file.isValid()) {
+ continue;
+ }
+ final XmlDocument document = file.getDocument();
+ if (document == null) {
+ continue;
+ }
+ final XmlTag rootTag = document.getRootTag();
+ if (rootTag == null) {
+ continue;
+ }
+ final String externalName = getExternalName(listOwner, false);
+ final String oldExternalName = getNormalizedExternalName(listOwner);
+ for (final XmlTag tag : rootTag.getSubTags()) {
+ final String className = tag.getAttributeValue("name");
+ if (!Comparing.strEqual(className, externalName) && !Comparing.strEqual(className, oldExternalName)) {
+ continue;
+ }
+ for (XmlTag annotationTag : tag.getSubTags()) {
+ if (!Comparing.strEqual(annotationTag.getAttributeValue("name"), annotationFQN)) {
+ continue;
+ }
+ if (ReadonlyStatusHandler.getInstance(myPsiManager.getProject())
+ .ensureFilesWritable(file.getVirtualFile()).hasReadonlyFiles()) {
+ return false;
+ }
+ try {
+ annotationTag.delete();
+ if (tag.getSubTags().length == 0) {
+ tag.delete();
}
}
+ catch (IncorrectOperationException e) {
+ LOG.error(e);
+ }
+ return true;
}
+ return false;
}
}
+ return false;
}
- return false;
+ finally {
+ dropCache();
+ }
+ }
+
+ private void dropCache() {
+ cache.clear();
}
@Override
@@ -481,11 +510,11 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager {
myExternalAnnotations.clear();
}
- private void annotateExternally(final PsiModifierListOwner listOwner,
- final String annotationFQName,
- @Nullable final XmlFile xmlFile,
- @NotNull PsiFile codeUsageFile,
- PsiNameValuePair[] values) {
+ private void annotateExternally(@NotNull PsiModifierListOwner listOwner,
+ @NotNull String annotationFQName,
+ @Nullable final XmlFile xmlFile,
+ @NotNull PsiFile codeUsageFile,
+ PsiNameValuePair[] values) {
if (xmlFile == null) return;
try {
final XmlDocument document = xmlFile.getDocument();
@@ -518,6 +547,7 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager {
LOG.error(e);
}
finally {
+ dropCache();
if (codeUsageFile.getVirtualFile().isInLocalFileSystem()) {
UndoUtil.markPsiFileForUndo(codeUsageFile);
}
@@ -525,7 +555,8 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager {
}
@NonNls
- private static String createAnnotationTag(String annotationFQName, @Nullable PsiNameValuePair[] values) {
+ @NotNull
+ private static String createAnnotationTag(@NotNull String annotationFQName, @Nullable PsiNameValuePair[] values) {
@NonNls String text;
if (values != null) {
text = " \n";
diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateConstructorParameterFromFieldFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateConstructorParameterFromFieldFix.java
index 1f4e18cb3a7e..07d7a31be90d 100644
--- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateConstructorParameterFromFieldFix.java
+++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateConstructorParameterFromFieldFix.java
@@ -150,7 +150,8 @@ public class CreateConstructorParameterFromFieldFix implements IntentionAction {
final Collection> fieldsToFix = getFieldsToFix();
try {
final PsiMethod constructor = constrs.get(0);
- final List fields = new ArrayList();
+ final LinkedHashSet fields = new LinkedHashSet();
+ getFieldsToFix().add(myField);
for (SmartPsiElementPointer elementPointer : fieldsToFix) {
final PsiField field = elementPointer.getElement();
if (field != null && isAvailable(field) && filterConstructorsIfFieldAlreadyAssigned(new PsiMethod[]{constructor}, field).contains(constructor)) {
diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateInnerClassFromUsageFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateInnerClassFromUsageFix.java
index f9a72b4bdebb..a0109f289642 100644
--- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateInnerClassFromUsageFix.java
+++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateInnerClassFromUsageFix.java
@@ -16,9 +16,6 @@
package com.intellij.codeInsight.daemon.impl.quickfix;
import com.intellij.codeInsight.daemon.QuickFixBundle;
-import static com.intellij.codeInsight.daemon.impl.quickfix.CreateClassKind.CLASS;
-import static com.intellij.codeInsight.daemon.impl.quickfix.CreateClassKind.INTERFACE;
-
import com.intellij.ide.util.PsiClassListCellRenderer;
import com.intellij.ide.util.PsiElementListCellRenderer;
import com.intellij.openapi.application.ApplicationManager;
@@ -37,6 +34,9 @@ import javax.swing.*;
import java.util.ArrayList;
import java.util.List;
+import static com.intellij.codeInsight.daemon.impl.quickfix.CreateClassKind.CLASS;
+import static com.intellij.codeInsight.daemon.impl.quickfix.CreateClassKind.INTERFACE;
+
/**
* @author ven
*/
@@ -78,7 +78,7 @@ public class CreateInnerClassFromUsageFix extends CreateClassFromUsageBaseFix {
PsiMember contextMember = PsiTreeUtil.getParentOfType(run, PsiMember.class);
while (contextMember != null) {
- if (contextMember instanceof PsiClass) {
+ if (contextMember instanceof PsiClass && !(contextMember instanceof PsiTypeParameter)) {
result.add((PsiClass)contextMember);
}
run = contextMember;
diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreatePropertyFromUsageFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreatePropertyFromUsageFix.java
index 4952ac69b480..e296214ef7a6 100644
--- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreatePropertyFromUsageFix.java
+++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreatePropertyFromUsageFix.java
@@ -247,6 +247,7 @@ public class CreatePropertyFromUsageFix extends CreateFromUsageBaseFix {
builder.setEndVariableAfter(body.getLBrace());
accessor = CodeInsightUtilBase.forcePsiPostprocessAndRestoreElement(accessor);
+ LOG.assertTrue(accessor != null);
targetClass = accessor.getContainingClass();
LOG.assertTrue(targetClass != null);
Template template = builder.buildTemplate();
diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/DelegateWithDefaultParamValueIntentionAction.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/DelegateWithDefaultParamValueIntentionAction.java
index ea0419f6b474..dc09b28a11e4 100644
--- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/DelegateWithDefaultParamValueIntentionAction.java
+++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/DelegateWithDefaultParamValueIntentionAction.java
@@ -30,11 +30,14 @@ import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.psi.util.PsiTreeUtil;
+import com.intellij.refactoring.util.RefactoringUtil;
import com.intellij.util.Function;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
+import java.util.Arrays;
+import java.util.HashSet;
/**
* User: anna
@@ -84,7 +87,7 @@ public class DelegateWithDefaultParamValueIntentionAction extends PsiElementBase
final PsiParameter parameter = PsiTreeUtil.getParentOfType(element, PsiParameter.class);
final PsiMethod method = (PsiMethod)parameter.getDeclarationScope();
final PsiMethod prototype = (PsiMethod)method.getContainingClass().addBefore(generateMethodPrototype(method, parameter), method);
-
+ RefactoringUtil.fixJavadocsForParams(prototype, new HashSet(Arrays.asList(prototype.getParameterList().getParameters())));
TemplateBuilderImpl builder = new TemplateBuilderImpl(prototype);
PsiCodeBlock body = prototype.getBody();
diff --git a/java/java-impl/src/com/intellij/codeInspection/accessStaticViaInstance/AccessStaticViaInstance.java b/java/java-impl/src/com/intellij/codeInspection/accessStaticViaInstance/AccessStaticViaInstance.java
index fab03cbb389b..5ae5d0c47e1a 100644
--- a/java/java-impl/src/com/intellij/codeInspection/accessStaticViaInstance/AccessStaticViaInstance.java
+++ b/java/java-impl/src/com/intellij/codeInspection/accessStaticViaInstance/AccessStaticViaInstance.java
@@ -19,6 +19,7 @@ import com.intellij.codeInsight.daemon.JavaErrorMessages;
import com.intellij.codeInsight.daemon.impl.analysis.HighlightMessageUtil;
import com.intellij.codeInsight.daemon.impl.analysis.HighlightUtil;
import com.intellij.codeInsight.daemon.impl.quickfix.AccessStaticViaInstanceFix;
+import com.intellij.codeInsight.daemon.impl.quickfix.RemoveUnusedVariableFix;
import com.intellij.codeInspection.BaseJavaLocalInspectionTool;
import com.intellij.codeInspection.InspectionsBundle;
import com.intellij.codeInspection.ProblemsHolder;
@@ -26,6 +27,8 @@ import com.intellij.psi.*;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
+import java.util.ArrayList;
+
/**
* User: anna
* Date: 15-Nov-2005
@@ -87,6 +90,12 @@ public class AccessStaticViaInstance extends BaseJavaLocalInspectionTool {
String description = JavaErrorMessages.message("static.member.accessed.via.instance.reference",
HighlightUtil.formatType(qualifierExpression.getType()),
HighlightMessageUtil.getSymbolName(resolved, result.getSubstitutor()));
+ if (!onTheFly) {
+ if (RemoveUnusedVariableFix.checkSideEffects(qualifierExpression, null, new ArrayList())) {
+ holder.registerProblem(expr, description);
+ return;
+ }
+ }
holder.registerProblem(expr, description, new AccessStaticViaInstanceFix(expr, result, onTheFly));
}
}
diff --git a/java/java-impl/src/com/intellij/codeInspection/defaultFileTemplateUsage/MethodBodyChecker.java b/java/java-impl/src/com/intellij/codeInspection/defaultFileTemplateUsage/MethodBodyChecker.java
index 1b97ed3a6912..5ee8cadb7ffd 100644
--- a/java/java-impl/src/com/intellij/codeInspection/defaultFileTemplateUsage/MethodBodyChecker.java
+++ b/java/java-impl/src/com/intellij/codeInspection/defaultFileTemplateUsage/MethodBodyChecker.java
@@ -27,12 +27,13 @@ import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.Pair;
-import com.intellij.openapi.util.UserDataHolderEx;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.PsiTreeUtil;
+import com.intellij.reference.SoftReference;
import com.intellij.util.IncorrectOperationException;
+import com.intellij.util.PatchedSoftReference;
import com.intellij.util.containers.ConcurrentHashMap;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -75,12 +76,13 @@ public class MethodBodyChecker {
}
}
- private static final Key