Merge branch 'master' of git@git.labs.intellij.net:idea/community

This commit is contained in:
Kirill Kalishev
2010-11-18 14:31:32 +03:00
5 changed files with 34 additions and 47 deletions
@@ -27,7 +27,6 @@ package com.intellij.codeInspection.ex;
import com.intellij.ExtensionPoints;
import com.intellij.codeInspection.reference.*;
import com.intellij.codeInspection.util.SpecialAnnotationsUtil;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.PersistentStateComponent;
import com.intellij.openapi.components.ServiceManager;
@@ -56,7 +55,7 @@ import java.util.*;
name = "EntryPointsManager",
storages = {@Storage(id = "default", file = "$PROJECT_FILE$")}
)
public class EntryPointsManagerImpl implements PersistentStateComponent<Element>, EntryPointsManager, Disposable {
public class EntryPointsManagerImpl implements PersistentStateComponent<Element>, EntryPointsManager {
@NonNls private static final String[] STANDARD_ANNOS = {
"javax.ws.rs.*",
"javax.annotation.Resource",
@@ -99,9 +98,9 @@ public class EntryPointsManagerImpl implements PersistentStateComponent<Element>
myTemporaryEntryPoints = new HashSet<RefElement>();
myPersistentEntryPoints =
new LinkedHashMap<String, SmartRefElementPointer>(); // To keep the order between readExternal to writeExternal
Disposer.register(project, this);
final ExtensionPoint<EntryPoint> point = Extensions.getRootArea().getExtensionPoint(ExtensionPoints.DEAD_CODE_TOOL);
myExtensionPointListener = new ExtensionPointListener<EntryPoint>() {
point.addExtensionPointListener(new ExtensionPointListener<EntryPoint>() {
@Override
public void extensionAdded(@NotNull EntryPoint extension, @Nullable PluginDescriptor pluginDescriptor) {
extensionRemoved(extension, pluginDescriptor);
@@ -120,8 +119,7 @@ public class EntryPointsManagerImpl implements PersistentStateComponent<Element>
});
}
}
};
point.addExtensionPointListener(myExtensionPointListener);
}, this);
}
public static EntryPointsManagerImpl getInstance(Project project) {
@@ -133,7 +131,7 @@ public class EntryPointsManagerImpl implements PersistentStateComponent<Element>
Element entryPointsElement = element.getChild("entry_points");
final String version = entryPointsElement.getAttributeValue(VERSION_ATTR);
if (!Comparing.strEqual(version, VERSION)) {
convert(entryPointsElement);
convert(entryPointsElement, myPersistentEntryPoints);
}
else {
List content = entryPointsElement.getChildren();
@@ -146,7 +144,7 @@ public class EntryPointsManagerImpl implements PersistentStateComponent<Element>
}
}
try {
DefaultJDOMExternalizer.readExternal(this, element);
ADDITIONAL_ANNOTATIONS.readExternal(element);
}
catch (InvalidDataException ignored) {
}
@@ -155,23 +153,25 @@ public class EntryPointsManagerImpl implements PersistentStateComponent<Element>
@SuppressWarnings({"HardCodedStringLiteral"})
public Element getState() {
Element element = new Element("state");
writeExternal(element);
writeExternal(element, myPersistentEntryPoints, ADDITIONAL_ANNOTATIONS);
return element;
}
@SuppressWarnings({"HardCodedStringLiteral"})
public void writeExternal(final Element element) {
public static void writeExternal(final Element element,
final Map<String, SmartRefElementPointer> persistentEntryPoints,
final JDOMExternalizableStringList additional_annotations) {
Element entryPointsElement = new Element("entry_points");
entryPointsElement.setAttribute(VERSION_ATTR, VERSION);
for (SmartRefElementPointer entryPoint : myPersistentEntryPoints.values()) {
for (SmartRefElementPointer entryPoint : persistentEntryPoints.values()) {
assert entryPoint.isPersistent();
entryPoint.writeExternal(entryPointsElement);
}
element.addContent(entryPointsElement);
if (!ADDITIONAL_ANNOTATIONS.isEmpty()) {
if (!additional_annotations.isEmpty()) {
try {
DefaultJDOMExternalizer.writeExternal(this, element);
additional_annotations.writeExternal(element);
}
catch (WriteExternalException ignored) {
}
@@ -302,8 +302,6 @@ public class EntryPointsManagerImpl implements PersistentStateComponent<Element>
}
public void dispose() {
final ExtensionPoint<EntryPoint> extensionPoint = Extensions.getRootArea().getExtensionPoint(ExtensionPoints.DEAD_CODE_TOOL);
extensionPoint.removeExtensionPointListener(myExtensionPointListener);
cleanup();
}
@@ -362,7 +360,7 @@ public class EntryPointsManagerImpl implements PersistentStateComponent<Element>
myPersistentEntryPoints.putAll(manager.myPersistentEntryPoints);
}
public void convert(Element element) {
public static void convert(Element element, final Map<String, SmartRefElementPointer> persistentEntryPoints) {
List content = element.getChildren();
for (final Object aContent : content) {
Element entryElement = (Element)aContent;
@@ -401,7 +399,7 @@ public class EntryPointsManagerImpl implements PersistentStateComponent<Element>
}
}
SmartRefElementPointerImpl entryPoint = new SmartRefElementPointerImpl(type, fqName);
myPersistentEntryPoints.put(entryPoint.getFQName(), entryPoint);
persistentEntryPoints.put(entryPoint.getFQName(), entryPoint);
}
}
}
@@ -27,6 +27,7 @@ import com.intellij.codeInspection.ex.EntryPointsManagerImpl;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Disposer;
import com.intellij.psi.*;
import com.intellij.psi.javadoc.PsiDocComment;
import com.intellij.psi.javadoc.PsiDocTag;
@@ -147,7 +148,7 @@ public class RefJavaManagerImpl extends RefJavaManager {
public void cleanup() {
if (myEntryPointsManager != null) {
myEntryPointsManager.cleanup();
Disposer.dispose(myEntryPointsManager);
myEntryPointsManager = null;
}
myPackages = null;
@@ -1,36 +1,14 @@
package com.intellij.codeInspection;
import com.intellij.ExtensionPoints;
import com.intellij.codeInspection.ex.EntryPointsManagerImpl;
import com.intellij.codeInspection.reference.EntryPoint;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.codeInspection.reference.SmartRefElementPointer;
import com.intellij.openapi.util.JDOMExternalizableStringList;
import com.intellij.openapi.util.JDOMUtil;
import com.intellij.util.containers.HashMap;
import junit.framework.TestCase;
import org.jdom.Element;
public class EntryPointsConverterTest extends TestCase {
private boolean myUnregisterExtensionPoint = false;
@Override
protected void setUp() throws Exception {
super.setUp();
try {
Extensions.getExtensions(ExtensionPoints.DEAD_CODE_TOOL, null);
}
catch (IllegalArgumentException e) {
myUnregisterExtensionPoint = true;
Extensions.getRootArea().registerExtensionPoint(ExtensionPoints.DEAD_CODE_TOOL, EntryPoint.class.getName());
}
}
@Override
protected void tearDown() throws Exception {
if (myUnregisterExtensionPoint) {
Extensions.getRootArea().unregisterExtensionPoint(ExtensionPoints.DEAD_CODE_TOOL);
}
super.tearDown();
}
public void testMethodConverter1() throws Exception {
doTest("method", "String java.lang.String.replace(char oldChar, char newChar)", "java.lang.String String replace(char oldChar, char newChar)");
}
@@ -50,11 +28,11 @@ public class EntryPointsConverterTest extends TestCase {
private static void doTest(String type, String fqName, String expectedFQName) throws Exception {
final Element entryPoints = setUpEntryPoint(type, fqName);
final EntryPointsManagerImpl manager = new EntryPointsManagerImpl(null);
manager.convert(entryPoints);
final HashMap<String, SmartRefElementPointer> persistentEntryPoints = new HashMap<String, SmartRefElementPointer>();
EntryPointsManagerImpl.convert(entryPoints, persistentEntryPoints);
final Element testElement = new Element("comp");
manager.writeExternal(testElement);
EntryPointsManagerImpl.writeExternal(testElement, persistentEntryPoints, new JDOMExternalizableStringList());
final Element expectedEntryPoints = setUpEntryPoint(type, expectedFQName);
expectedEntryPoints.setAttribute("version", "2.0");
@@ -22,8 +22,9 @@ package com.intellij.codeInspection.ex;
import com.intellij.codeInspection.reference.RefElement;
import com.intellij.codeInspection.reference.RefManager;
import com.intellij.openapi.Disposable;
public interface EntryPointsManager {
public interface EntryPointsManager extends Disposable {
void resolveEntryPoints(RefManager manager);
void addEntryPoint(RefElement newEntryPoint, boolean isPersistent);
@@ -36,6 +36,7 @@ public class FileReferenceContextUtil {
public static Map<String, PsiFileSystemItem> encodeFileReferences(PsiElement element) {
final Map<String,PsiFileSystemItem> map = new HashMap<String, PsiFileSystemItem>();
if (isBinary(element)) return map;
element.accept(new PsiRecursiveElementWalkingVisitor(true) {
@Override public void visitElement(PsiElement element) {
final PsiReference[] refs = element.getReferences();
@@ -59,7 +60,14 @@ public class FileReferenceContextUtil {
return map;
}
private static boolean isBinary(PsiElement element) {
final PsiFile containingFile = element.getContainingFile();
if (containingFile == null || containingFile.getFileType().isBinary()) return true;
return false;
}
public static void decodeFileReferences(PsiElement element) {
if (isBinary(element)) return;
element.accept(new PsiRecursiveElementVisitor(true) {
@Override public void visitElement(PsiElement element) {
final PsiFileSystemItem item = element.getCopyableUserData(REF_FILE_SYSTEM_ITEM_KEY);
@@ -73,6 +81,7 @@ public class FileReferenceContextUtil {
}
public static void decodeFileReferences(PsiElement element, final Map<String, PsiFileSystemItem> map, final TextRange range) {
if (isBinary(element)) return;
element.accept(new PsiRecursiveElementVisitor(true) {
@Override public void visitElement(PsiElement element) {
if (!range.intersects(element.getTextRange())) return;