This commit is contained in:
Alexey Kudravtsev
2016-11-11 14:00:11 +03:00
parent f497719e14
commit 97e38ad11d
3 changed files with 29 additions and 35 deletions
@@ -22,7 +22,6 @@ import com.intellij.diagnostic.LogMessageEx;
import com.intellij.icons.AllIcons;
import com.intellij.ide.DataManager;
import com.intellij.ide.highlighter.XmlFileType;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.Result;
@@ -57,7 +56,6 @@ import com.intellij.openapi.ui.popup.JBPopupFactory;
import com.intellij.openapi.ui.popup.PopupStep;
import com.intellij.openapi.ui.popup.util.BaseListPopupStep;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.text.StringUtil;
@@ -68,7 +66,10 @@ import com.intellij.psi.impl.PsiModificationTrackerImpl;
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.ArrayUtil;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.Processor;
import com.intellij.util.SmartList;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.messages.MessageBus;
import com.intellij.util.messages.MessageBusConnection;
@@ -82,8 +83,10 @@ import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.io.IOException;
import java.util.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
/**
* @author anna
@@ -107,12 +110,7 @@ public class ExternalAnnotationsManagerImpl extends ReadableExternalAnnotationsM
final MyVirtualFileListener fileListener = new MyVirtualFileListener();
VirtualFileManager.getInstance().addVirtualFileListener(fileListener);
Disposer.register(myPsiManager.getProject(), new Disposable() {
@Override
public void dispose() {
VirtualFileManager.getInstance().removeVirtualFileListener(fileListener);
}
});
Disposer.register(myPsiManager.getProject(), () -> VirtualFileManager.getInstance().removeVirtualFileListener(fileListener));
}
private void notifyAfterAnnotationChanging(@NotNull PsiModifierListOwner owner, @NotNull String annotationFQName, boolean successful) {
@@ -167,7 +165,7 @@ public class ExternalAnnotationsManagerImpl extends ReadableExternalAnnotationsM
}
@Nullable
protected List<XmlFile> findExternalAnnotationsXmlFiles(@NotNull PsiModifierListOwner listOwner) {
private List<XmlFile> findExternalAnnotationsXmlFiles(@NotNull PsiModifierListOwner listOwner) {
List<PsiFile> psiFiles = findExternalAnnotationsFiles(listOwner);
if (psiFiles == null) {
return null;
@@ -274,7 +272,7 @@ public class ExternalAnnotationsManagerImpl extends ReadableExternalAnnotationsM
@NotNull
private static VirtualFile[] filterByReadOnliness(@NotNull VirtualFile[] files) {
List<VirtualFile> result = ContainerUtil.filter(files, file -> file.isInLocalFileSystem());
List<VirtualFile> result = ContainerUtil.filter(files, VirtualFile::isInLocalFileSystem);
return VfsUtilCore.toVirtualFileArray(result);
}
@@ -694,7 +692,7 @@ public class ExternalAnnotationsManagerImpl extends ReadableExternalAnnotationsM
private static final String ADD_IN_CODE = ProjectBundle.message("external.annotations.in.code.option");
private static final String MESSAGE = ProjectBundle.message("external.annotations.suggestion.message");
public MyExternalPromptDialog(final Project project) {
MyExternalPromptDialog(final Project project) {
super(project, MESSAGE, ProjectBundle.message("external.annotation.prompt"), Messages.getQuestionIcon());
myProject = project;
init();
@@ -713,7 +711,7 @@ public class ExternalAnnotationsManagerImpl extends ReadableExternalAnnotationsM
@Override
@NotNull
@SuppressWarnings({"NonStaticInitializer"})
@SuppressWarnings("NonStaticInitializer")
protected Action[] createActions() {
final Action okAction = getOKAction();
assignMnemonic(ADD_IN_CODE, okAction);
@@ -25,10 +25,6 @@ import org.jetbrains.annotations.Nullable;
import java.util.List;
/**
* @authot anna
* @since 26-Jun-2007
*/
public abstract class ExternalAnnotationsManager {
public static final String ANNOTATIONS_XML = "annotations.xml";
@@ -61,7 +61,7 @@ public abstract class BaseExternalAnnotationsManager extends ExternalAnnotations
protected final PsiManager myPsiManager;
private final ConcurrentMap<VirtualFile, List<PsiFile>> myExternalAnnotationsCache = ContainerUtil.createConcurrentWeakKeySoftValueMap();
private final Map<AnnotationData, AnnotationData> myAnnotationDataCache = new WeakKeyWeakValueHashMap<AnnotationData, AnnotationData>();
private final Map<AnnotationData, AnnotationData> myAnnotationDataCache = new WeakKeyWeakValueHashMap<AnnotationData, AnnotationData>(); // guarded by myAnnotationDataCache
private final ConcurrentMap<PsiFile, Pair<MostlySingularMultiMap<String, AnnotationData>, Long>> myAnnotationFileToDataAndModStampCache = ContainerUtil.createConcurrentSoftMap();
public BaseExternalAnnotationsManager(@NotNull PsiManager psiManager) {
@@ -105,7 +105,7 @@ public abstract class BaseExternalAnnotationsManager extends ExternalAnnotations
return ContainerUtil.find(map, new Condition<AnnotationData>() {
@Override
public boolean value(AnnotationData data) {
return data.myFqName.equals(annotationFQN);
return data.annotationClassFqName.equals(annotationFQN);
}
});
}
@@ -243,24 +243,24 @@ public abstract class BaseExternalAnnotationsManager extends ExternalAnnotations
}
}
Set<PsiFile> possibleAnnotations = new THashSet<PsiFile>();
Set<PsiFile> possibleAnnotationXmls = new THashSet<PsiFile>();
String relativePath = ((PsiJavaFile)containingFile).getPackageName().replace('.', '/') + '/' + ANNOTATIONS_XML;
for (VirtualFile root : getExternalAnnotationsRoots(virtualFile)) {
VirtualFile ext = root.findFileByRelativePath(relativePath);
if (ext != null && ext.isValid()) {
PsiFile psiFile = myPsiManager.findFile(ext);
if (psiFile != null) {
possibleAnnotations.add(psiFile);
possibleAnnotationXmls.add(psiFile);
}
}
}
if (possibleAnnotations.isEmpty()) {
if (possibleAnnotationXmls.isEmpty()) {
myExternalAnnotationsCache.put(virtualFile, NULL_LIST);
return null;
}
List<PsiFile> result = new SmartList<PsiFile>(possibleAnnotations);
List<PsiFile> result = new SmartList<PsiFile>(possibleAnnotationXmls);
// writable go first
Collections.sort(result, new Comparator<PsiFile>() {
@Override
@@ -346,22 +346,22 @@ public abstract class BaseExternalAnnotationsManager extends ExternalAnnotations
}
private static class AnnotationData {
private final String myFqName;
private final String myParameters;
private final String annotationClassFqName;
private final String annotationParameters;
private volatile PsiAnnotation myAnnotation;
private AnnotationData(@NotNull String fqn, @NotNull String parameters) {
myFqName = fqn;
myParameters = parameters;
annotationClassFqName = fqn;
annotationParameters = parameters;
}
@NotNull
private PsiAnnotation getAnnotation(@NotNull BaseExternalAnnotationsManager context) {
PsiAnnotation a = myAnnotation;
if (a == null) {
String text = "@" + myFqName + (myParameters.isEmpty() ? "" : "(" + myParameters + ")");
myAnnotation = a = markAsExternalAnnotation(context.createAnnotationFromText(text));
String text = "@" + annotationClassFqName + (annotationParameters.isEmpty() ? "" : "(" + annotationParameters + ")");
myAnnotation = a = context.createAnnotationFromText(text);
}
return a;
}
@@ -373,19 +373,19 @@ public abstract class BaseExternalAnnotationsManager extends ExternalAnnotations
AnnotationData data = (AnnotationData)o;
return myFqName.equals(data.myFqName) && myParameters.equals(data.myParameters);
return annotationClassFqName.equals(data.annotationClassFqName) && annotationParameters.equals(data.annotationParameters);
}
@Override
public int hashCode() {
int result = myFqName.hashCode();
result = 31 * result + myParameters.hashCode();
int result = annotationClassFqName.hashCode();
result = 31 * result + annotationParameters.hashCode();
return result;
}
@Override
public String toString() {
return myFqName + "(" + myParameters + ")";
return annotationClassFqName + "(" + annotationParameters + ")";
}
}
@@ -457,7 +457,7 @@ public abstract class BaseExternalAnnotationsManager extends ExternalAnnotations
else if ("annotation".equals(qName) && myExternalName != null && myAnnotationFqn != null) {
String argumentsString = myArguments.length() == 0 ? "" : intern(myArguments.toString());
for (AnnotationData existingData : myData.get(myExternalName)) {
if (existingData.myFqName.equals(myAnnotationFqn)) {
if (existingData.annotationClassFqName.equals(myAnnotationFqn)) {
duplicateError(myFile, myExternalName, "Duplicate annotation '" + myAnnotationFqn + "'");
}
}