allow for jdk annotations to reside inside jar

This commit is contained in:
Alexey Kudravtsev
2012-01-17 15:42:09 +04:00
parent 705e3debe4
commit c88b72e01b
5 changed files with 51 additions and 31 deletions
@@ -20,7 +20,7 @@
*/
package com.intellij.openapi.roots.ui.configuration.libraryEditor;
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.project.ProjectBundle;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.projectRoots.ui.SdkPathEditor;
@@ -45,6 +45,6 @@ public class AnnotationsOrderRootTypeUIFactory implements OrderRootTypeUIFactory
public SdkPathEditor createPathEditor(Sdk sdk) {
return new SdkPathEditor(ProjectBundle.message("sdk.configure.annotations.tab"), AnnotationOrderRootType.getInstance(),
FileChooserDescriptorFactory.createSingleFolderDescriptor());
new FileChooserDescriptor(false, true, true, false, true, false));
}
}
@@ -202,7 +202,9 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager {
}
for (final OrderEntry entry : entries) {
if (entry instanceof ModuleOrderEntry) continue;
final VirtualFile[] virtualFiles = AnnotationOrderRootType.getFiles(entry);
VirtualFile[] virtualFiles = AnnotationOrderRootType.getFiles(entry);
virtualFiles = filterByReadOnliness(virtualFiles);
if (virtualFiles.length > 0) {
chooseRootAndAnnotateExternally(listOwner, annotationFQName, fromFile, project, packageName, virtualFile, virtualFiles, value);
}
@@ -255,7 +257,7 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager {
final Project project, final String packageName, final VirtualFile virtualFile,
final VirtualFile[] virtualFiles, final PsiNameValuePair[] value) {
if (virtualFiles.length > 1) {
JBPopupFactory.getInstance().createListPopup(new BaseListPopupStep<VirtualFile>("Annotation Roots", virtualFiles){
JBPopupFactory.getInstance().createListPopup(new BaseListPopupStep<VirtualFile>("Annotation Roots", virtualFiles) {
@Override
public PopupStep onChosen(final VirtualFile file, final boolean finalChoice) {
annotateExternally(file, listOwner, project, packageName, virtualFile, annotationFQName, fromFile, value);
@@ -273,11 +275,23 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager {
return ICON;
}
}).showInBestPositionFor(DataManager.getInstance().getDataContext());
} else {
}
else {
annotateExternally(virtualFiles[0], listOwner, project, packageName, virtualFile, annotationFQName, fromFile, value);
}
}
@NotNull
private static VirtualFile[] filterByReadOnliness(@NotNull VirtualFile[] files) {
List<VirtualFile> result = new ArrayList<VirtualFile>();
for (VirtualFile file : files) {
if (file.isInLocalFileSystem()) {
result.add(file);
}
}
return VfsUtil.toVirtualFileArray(result);
}
private void annotateExternally(final VirtualFile file, final PsiModifierListOwner listOwner, final Project project,
final String packageName,
final VirtualFile virtualFile,
@@ -562,28 +576,28 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager {
}
final List<OrderEntry> entries = ProjectRootManager.getInstance(project).getFileIndex().getOrderEntriesForFile(virtualFile);
for (OrderEntry entry : entries) {
if (!(entry instanceof ModuleOrderEntry)) {
List<XmlFile> possibleAnnotationsXmls = null;
final String[] externalUrls = AnnotationOrderRootType.getUrls(entry);
for (String url : externalUrls) {
final VirtualFile ext = LocalFileSystem.getInstance()
.findFileByPath(VfsUtil.urlToPath(url) + "/" + packageName.replace(".", "/") + "/" + ANNOTATIONS_XML);
if (ext != null) {
final PsiFile psiFile = myPsiManager.findFile(ext);
if (psiFile instanceof XmlFile) {
if (possibleAnnotationsXmls == null) {
possibleAnnotationsXmls = new ArrayList<XmlFile>();
}
possibleAnnotationsXmls.add((XmlFile)psiFile);
}
}
}
if (possibleAnnotationsXmls != null) {
myExternalAnnotations.put(fqn, possibleAnnotationsXmls);
return possibleAnnotationsXmls;
}
break;
if (entry instanceof ModuleOrderEntry) {
continue;
}
List<XmlFile> possibleAnnotationsXmls = null;
final String[] externalUrls = AnnotationOrderRootType.getUrls(entry);
for (String url : externalUrls) {
VirtualFile root = VirtualFileManager.getInstance().findFileByUrl(url);
if (root == null) continue;
final VirtualFile ext = root.findFileByRelativePath(packageName.replace(".", "/") + "/" + ANNOTATIONS_XML);
if (ext == null) continue;
final PsiFile psiFile = myPsiManager.findFile(ext);
if (!(psiFile instanceof XmlFile)) continue;
if (possibleAnnotationsXmls == null) {
possibleAnnotationsXmls = new ArrayList<XmlFile>();
}
possibleAnnotationsXmls.add((XmlFile)psiFile);
}
if (possibleAnnotationsXmls != null) {
myExternalAnnotations.put(fqn, possibleAnnotationsXmls);
return possibleAnnotationsXmls;
}
break;
}
myExternalAnnotations.put(fqn, NULL);
}
@@ -18,6 +18,7 @@ package com.intellij.openapi.roots;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.ArrayUtil;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Collections;
@@ -43,7 +44,8 @@ public class AnnotationOrderRootType extends PersistentOrderRootType {
return true;
}
public static VirtualFile[] getFiles(OrderEntry entry) {
@NotNull
public static VirtualFile[] getFiles(@NotNull OrderEntry entry) {
List<VirtualFile> result = new ArrayList<VirtualFile>();
RootPolicy<List<VirtualFile>> policy = new RootPolicy<List<VirtualFile>>() {
@Override
@@ -69,7 +71,8 @@ public class AnnotationOrderRootType extends PersistentOrderRootType {
return VfsUtil.toVirtualFileArray(result);
}
public static String[] getUrls(OrderEntry entry) {
@NotNull
public static String[] getUrls(@NotNull OrderEntry entry) {
List<String> result = new ArrayList<String>();
RootPolicy<List<String>> policy = new RootPolicy<List<String>>() {
@Override
@@ -22,18 +22,20 @@ package com.intellij.codeInspection;
import com.intellij.openapi.util.UserDataHolderBase;
import com.intellij.psi.PsiFile;
import org.jetbrains.annotations.NotNull;
public class LocalInspectionToolSession extends UserDataHolderBase {
private final PsiFile myFile;
private final int myStartOffset;
private final int myEndOffset;
public LocalInspectionToolSession(final PsiFile file, final int startOffset, final int endOffset) {
public LocalInspectionToolSession(@NotNull PsiFile file, final int startOffset, final int endOffset) {
myFile = file;
myStartOffset = startOffset;
myEndOffset = endOffset;
}
@NotNull
public PsiFile getFile() {
return myFile;
}
@@ -2,8 +2,9 @@
<body>
<font face="verdana" size="-1">Report occurrences where usages of "magic" constants only are allowed
but other expressions are used instead.<br>
E.g. <b><font color="#000080">new </font></b> Font("Arial", <b><font color="#000080">42</font></b>) <br>
instead of <b><font color="#000080">new </font></b> Font("Arial", Font.<b><font color="#000080">BOLD</font></b>) <br>
E.g.<br>
<b><font color="#000080">new </font></b> Font("Arial", <b><font color="#000080">2</font></b>) // not allowed<br>
instead of <b><font color="#000080">new </font></b> Font("Arial", Font.<b><font color="#000080">ITALIC</font></b>) // OK<br>
<br><br>