IDEA-118970 (preparation, cleanup, minor optimization)

This commit is contained in:
Roman Shevchenko
2014-01-08 12:26:52 +01:00
parent fba5ecde71
commit a1870c6d98
4 changed files with 126 additions and 78 deletions
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2012 JetBrains s.r.o.
* Copyright 2000-2014 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.
@@ -13,11 +13,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.lang.java;
import com.intellij.codeInsight.CodeInsightBundle;
import com.intellij.codeInsight.documentation.DocumentationManager;
import com.intellij.codeInsight.documentation.DocumentationManagerProtocol;
import com.intellij.codeInsight.documentation.PlatformDocumentationUtil;
import com.intellij.codeInsight.editorActions.CodeDocumentationUtil;
import com.intellij.codeInsight.javadoc.JavaDocExternalFilter;
@@ -31,10 +30,11 @@ import com.intellij.lang.documentation.CompositeDocumentationProvider;
import com.intellij.lang.documentation.ExternalDocumentationProvider;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtil;
import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.project.IndexNotReadyException;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.*;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
@@ -49,12 +49,12 @@ import com.intellij.psi.javadoc.PsiDocComment;
import com.intellij.psi.javadoc.PsiDocTag;
import com.intellij.psi.util.PsiFormatUtil;
import com.intellij.psi.util.PsiFormatUtilBase;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.HashMap;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -157,7 +157,7 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
}
}
else {
final Module module = ModuleUtil.findModuleForPsiElement(file);
final Module module = ModuleUtilCore.findModuleForPsiElement(file);
if (module != null) {
buffer.append('[').append(module.getName()).append("] ");
}
@@ -533,7 +533,7 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
return null;
}
private String getMethodCandidateInfo(PsiMethodCallExpression expr) {
private static String getMethodCandidateInfo(PsiMethodCallExpression expr) {
final PsiResolveHelper rh = JavaPsiFacade.getInstance(expr.getProject()).getResolveHelper();
final CandidateInfo[] candidates = rh.getReferencedMethodCandidates(expr, true);
final String text = expr.getText();
@@ -562,7 +562,7 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
}
private static void createElementLink(@NonNls final StringBuilder sb, final PsiElement element, final String str) {
sb.append("&nbsp;&nbsp;<a href=\"" + DocumentationManager.PSI_ELEMENT_PROTOCOL);
sb.append("&nbsp;&nbsp;<a href=\"" + DocumentationManagerProtocol.PSI_ELEMENT_PROTOCOL);
sb.append(JavaDocUtil.getReferenceText(element.getProject(), element));
sb.append("\">");
sb.append(str);
@@ -593,19 +593,20 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
PsiMethod method = (PsiMethod)element;
PsiClass aClass = method.getContainingClass();
if (aClass != null) {
final List<String> classUrls = findUrlForClass(aClass);
List<String> classUrls = findUrlForClass(aClass);
if (classUrls != null) {
urls = new ArrayList<String>();
String signature = formatMethodSignature(method);
urls = ContainerUtil.newSmartList();
String rawSignature = formatMethodSignature(method, true);
for (String classUrl : classUrls) {
urls.add(classUrl + "#" + signature);
urls.add(classUrl + "#" + rawSignature);
}
signature = PsiFormatUtil.formatMethod(method, PsiSubstitutor.EMPTY,
PsiFormatUtilBase.SHOW_NAME | PsiFormatUtilBase.SHOW_PARAMETERS,
PsiFormatUtilBase.SHOW_TYPE | PsiFormatUtilBase.SHOW_FQ_CLASS_NAMES, 999);
for (String classUrl : classUrls) {
urls.add(classUrl + "#" + signature);
String signature = formatMethodSignature(method, false);
if (Comparing.compare(rawSignature, signature) != 0) {
for (String classUrl : classUrls) {
urls.add(classUrl + "#" + signature);
}
}
}
}
@@ -631,25 +632,28 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
}
}
public static String formatMethodSignature(PsiMethod method) {
return PsiFormatUtil.formatMethod(method, PsiSubstitutor.EMPTY,
PsiFormatUtilBase.SHOW_NAME |
PsiFormatUtilBase.SHOW_PARAMETERS |
PsiFormatUtilBase.SHOW_RAW_NON_TOP_TYPE,
PsiFormatUtilBase.SHOW_TYPE |
PsiFormatUtilBase.SHOW_FQ_CLASS_NAMES |
PsiFormatUtilBase.SHOW_RAW_NON_TOP_TYPE,
999);
private static String formatMethodSignature(PsiMethod method, boolean raw) {
int options = PsiFormatUtilBase.SHOW_NAME | PsiFormatUtilBase.SHOW_PARAMETERS;
int parameterOptions = PsiFormatUtilBase.SHOW_TYPE | PsiFormatUtilBase.SHOW_FQ_CLASS_NAMES;
if (raw) {
options |= PsiFormatUtilBase.SHOW_RAW_NON_TOP_TYPE;
parameterOptions |= PsiFormatUtilBase.SHOW_RAW_NON_TOP_TYPE;
}
return PsiFormatUtil.formatMethod(method, PsiSubstitutor.EMPTY, options, parameterOptions, 999);
}
@Nullable
public static List<String> findUrlForClass(PsiClass aClass) {
String qName = aClass.getQualifiedName();
if (qName == null) return null;
PsiFile file = aClass.getContainingFile();
if (!(file instanceof PsiJavaFile)) return null;
String packageName = ((PsiJavaFile)file).getPackageName();
VirtualFile virtualFile = file.getVirtualFile();
if (virtualFile == null) return null;
String packageName = ((PsiJavaFile)file).getPackageName();
String relPath;
if (packageName.length() > 0) {
relPath = packageName.replace('.', '/') + '/' + qName.substring(packageName.length() + 1) + HTML_EXTENSION;
@@ -658,12 +662,7 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
relPath = qName + HTML_EXTENSION;
}
final PsiFile containingFile = aClass.getContainingFile();
if (containingFile == null) return null;
final VirtualFile virtualFile = containingFile.getVirtualFile();
if (virtualFile == null) return null;
return findUrlForVirtualFile(containingFile.getProject(), virtualFile, relPath);
return findUrlForVirtualFile(file.getProject(), virtualFile, relPath);
}
@Nullable
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2011 JetBrains s.r.o.
* Copyright 2000-2014 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.
@@ -23,18 +23,31 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class PsiFormatUtil extends PsiFormatUtilBase {
@MagicConstant(flags = {SHOW_MODIFIERS, SHOW_TYPE, TYPE_AFTER, SHOW_CONTAINING_CLASS, SHOW_FQ_NAME, SHOW_NAME, SHOW_MODIFIERS, SHOW_INITIALIZER, SHOW_RAW_TYPE, SHOW_RAW_NON_TOP_TYPE, SHOW_FQ_CLASS_NAMES})
public @interface FormatVariableOptions {}
@MagicConstant(flags = {
SHOW_MODIFIERS, SHOW_TYPE, TYPE_AFTER, SHOW_CONTAINING_CLASS, SHOW_FQ_NAME, SHOW_NAME, SHOW_MODIFIERS,
SHOW_INITIALIZER, SHOW_RAW_TYPE, SHOW_RAW_NON_TOP_TYPE, SHOW_FQ_CLASS_NAMES})
public @interface FormatVariableOptions { }
public static String formatVariable(PsiVariable variable, @FormatVariableOptions int options, PsiSubstitutor substitutor){
@MagicConstant(flags = {
SHOW_MODIFIERS, MODIFIERS_AFTER, SHOW_TYPE, TYPE_AFTER, SHOW_CONTAINING_CLASS, SHOW_FQ_NAME, SHOW_NAME,
SHOW_PARAMETERS, SHOW_THROWS, SHOW_RAW_TYPE, SHOW_RAW_NON_TOP_TYPE, SHOW_FQ_CLASS_NAMES})
public @interface FormatMethodOptions { }
@MagicConstant(flags = {
SHOW_MODIFIERS, SHOW_NAME, SHOW_ANONYMOUS_CLASS_VERBOSE, SHOW_FQ_NAME, MODIFIERS_AFTER,
SHOW_EXTENDS_IMPLEMENTS, SHOW_REDUNDANT_MODIFIERS, JAVADOC_MODIFIERS_ONLY})
public @interface FormatClassOptions { }
public static String formatVariable(PsiVariable variable, @FormatVariableOptions int options, PsiSubstitutor substitutor) {
StringBuilder buffer = new StringBuilder();
formatVariable(variable, options, substitutor,buffer);
formatVariable(variable, options, substitutor, buffer);
return buffer.toString();
}
private static void formatVariable(PsiVariable variable,
@FormatVariableOptions int options,
PsiSubstitutor substitutor,
@NotNull StringBuilder buffer){
@NotNull StringBuilder buffer) {
if ((options & SHOW_MODIFIERS) != 0 && (options & MODIFIERS_AFTER) == 0){
formatModifiers(variable, options,buffer);
}
@@ -103,20 +116,29 @@ public class PsiFormatUtil extends PsiFormatUtilBase {
}
}
public static String formatMethod(PsiMethod method, PsiSubstitutor substitutor, @FormatMethodOptions int options, @FormatVariableOptions int parameterOptions){
public static String formatMethod(PsiMethod method,
PsiSubstitutor substitutor,
@FormatMethodOptions int options,
@FormatVariableOptions int parameterOptions) {
return formatMethod(method, substitutor, options, parameterOptions, MAX_PARAMS_TO_SHOW);
}
public static String formatMethod(PsiMethod method, PsiSubstitutor substitutor, @FormatMethodOptions int options, @FormatVariableOptions int parameterOptions, int maxParametersToShow){
public static String formatMethod(PsiMethod method,
PsiSubstitutor substitutor,
@FormatMethodOptions int options,
@FormatVariableOptions int parameterOptions,
int maxParametersToShow) {
StringBuilder buffer = new StringBuilder();
formatMethod(method, substitutor, options, parameterOptions, maxParametersToShow,buffer);
return buffer.toString();
}
@MagicConstant(flags = {SHOW_MODIFIERS, MODIFIERS_AFTER, SHOW_TYPE, TYPE_AFTER, SHOW_CONTAINING_CLASS, SHOW_FQ_NAME, SHOW_NAME, SHOW_PARAMETERS, SHOW_THROWS, SHOW_RAW_TYPE, SHOW_RAW_NON_TOP_TYPE, SHOW_FQ_CLASS_NAMES})
public @interface FormatMethodOptions {}
private static void formatMethod(PsiMethod method, PsiSubstitutor substitutor, @FormatMethodOptions int options, @FormatVariableOptions int parameterOptions, int maxParametersToShow, StringBuilder buffer){
private static void formatMethod(PsiMethod method,
PsiSubstitutor substitutor,
@FormatMethodOptions int options,
@FormatVariableOptions int parameterOptions,
int maxParametersToShow,
StringBuilder buffer) {
if ((options & SHOW_MODIFIERS) != 0 && (options & MODIFIERS_AFTER) == 0){
formatModifiers(method, options,buffer);
}
@@ -160,15 +182,15 @@ public class PsiFormatUtil extends PsiFormatUtilBase {
}
if ((options & SHOW_PARAMETERS) != 0){
buffer.append('(');
PsiParameter[] parms = method.getParameterList().getParameters();
for(int i = 0; i < Math.min(parms.length, maxParametersToShow); i++) {
PsiParameter parm = parms[i];
PsiParameter[] params = method.getParameterList().getParameters();
for(int i = 0; i < Math.min(params.length, maxParametersToShow); i++) {
PsiParameter parm = params[i];
if (i > 0){
buffer.append(", ");
}
buffer.append(formatVariable(parm, parameterOptions, substitutor));
}
if(parms.length > maxParametersToShow) {
if(params.length > maxParametersToShow) {
buffer.append (", ...");
}
buffer.append(')');
@@ -196,12 +218,8 @@ public class PsiFormatUtil extends PsiFormatUtilBase {
}
}
@MagicConstant(flags = {SHOW_MODIFIERS, SHOW_NAME, SHOW_ANONYMOUS_CLASS_VERBOSE, SHOW_FQ_NAME, MODIFIERS_AFTER, SHOW_EXTENDS_IMPLEMENTS, SHOW_REDUNDANT_MODIFIERS, JAVADOC_MODIFIERS_ONLY})
public @interface FormatClassOptions {}
@NotNull
public static String formatClass(@NotNull PsiClass aClass, @FormatClassOptions int options){
public static String formatClass(@NotNull PsiClass aClass, @FormatClassOptions int options) {
StringBuilder buffer = new StringBuilder();
if ((options & SHOW_MODIFIERS) != 0 && (options & MODIFIERS_AFTER) == 0){
formatModifiers(aClass, options,buffer);
@@ -254,12 +272,13 @@ public class PsiFormatUtil extends PsiFormatUtilBase {
return buffer.toString();
}
public static String formatModifiers(PsiElement element, int options) throws IllegalArgumentException{
public static String formatModifiers(PsiElement element, int options) throws IllegalArgumentException {
StringBuilder buffer = new StringBuilder();
formatModifiers(element, options,buffer);
formatModifiers(element, options, buffer);
return buffer.toString();
}
private static void formatModifiers(PsiElement element, int options, StringBuilder buffer) throws IllegalArgumentException{
private static void formatModifiers(PsiElement element, int options, StringBuilder buffer) throws IllegalArgumentException {
PsiModifierList list;
boolean isInterface = false;
if (element instanceof PsiVariable){
@@ -342,7 +361,7 @@ public class PsiFormatUtil extends PsiFormatUtilBase {
buffer.append(modifier);
}
public static String formatReferenceList(PsiReferenceList list, int options){
public static String formatReferenceList(PsiReferenceList list, int options) {
StringBuilder buffer = new StringBuilder();
PsiJavaCodeReferenceElement[] refs = list.getReferenceElements();
for(int i = 0; i < refs.length; i++) {
@@ -355,7 +374,7 @@ public class PsiFormatUtil extends PsiFormatUtilBase {
return buffer.toString();
}
public static String formatType(@Nullable PsiType type, int options, @NotNull PsiSubstitutor substitutor){
public static String formatType(@Nullable PsiType type, int options, @NotNull PsiSubstitutor substitutor) {
type = substitutor.substitute(type);
if ((options & SHOW_RAW_TYPE) != 0) {
type = TypeConversionUtil.erasure(type);
@@ -372,7 +391,7 @@ public class PsiFormatUtil extends PsiFormatUtilBase {
return (options & SHOW_FQ_CLASS_NAMES) == 0 ? type.getPresentableText() : type.getInternalCanonicalText();
}
public static String formatReference(PsiJavaCodeReferenceElement ref, int options){
public static String formatReference(PsiJavaCodeReferenceElement ref, int options) {
return (options & SHOW_FQ_CLASS_NAMES) == 0 ? ref.getText() : ref.getCanonicalText();
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2011 JetBrains s.r.o.
* Copyright 2000-2014 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,34 +19,55 @@ import com.intellij.lang.java.JavaDocumentationProvider;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.testFramework.PsiTestUtil;
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase;
import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil;
import java.util.List;
/**
* User: anna
* Date: 11/27/11
* @author anna
* @since 11/27/11
*/
public class ExternalJavadocUrlsTest extends LightCodeInsightFixtureTestCase {
private void doTest(String text, String... expectedSignature) {
myFixture.configureByText("Test.java", text);
final PsiElement elementAtCaret = myFixture.getElementAtCaret();
final PsiMethod member = PsiTreeUtil.getParentOfType(elementAtCaret, PsiMethod.class, false);
assertNotNull(member);
final String signature = JavaDocumentationProvider.formatMethodSignature(member);
assertNotNull(signature);
assertEquals("found:" + signature, expectedSignature[0], signature);
@Override
protected void setUp() throws Exception {
super.setUp();
PsiTestUtil.setJavadocUrls(myModule, "http://doc");
}
public void testVarargs() {
doTest("class Test {\n" +
" void fo<caret>o(Class<?>... cl){}\n" +
"}", "foo(java.lang.Class...)");
" void <caret>foo(Class<?>... cl) { }\n" +
"}",
"foo(java.lang.Class...)", "foo(java.lang.Class<?>...)");
}
public void testTypeParams() {
doTest("class Test {\n" +
" <T> void so<caret>rt(T[] a, Comparator<? super T> c) {}\n" +
" <T> void <caret>sort(T[] a, Comparator<? super T> c) { }\n" +
"}\n" +
" class Comparator<X>{}", "sort(T[], Comparator)");
"class Comparator<X>{}",
"sort(T[], Comparator)", "sort(T[], Comparator<? super T>)");
}
private void doTest(String text, String... expected) {
myFixture.configureByText("Test.java", text);
PsiElement elementAtCaret = myFixture.getElementAtCaret();
PsiMethod member = PsiTreeUtil.getParentOfType(elementAtCaret, PsiMethod.class, false);
assertNotNull(member);
List<String> urls = JavaDocumentationProvider.getExternalJavaDocUrl(member);
assertNotNull(urls);
List<String> actual = ContainerUtil.map(urls, new Function<String, String>() {
@Override
public String fun(String url) {
return url.substring(url.indexOf('#') + 1);
}
});
assertOrderedEquals(actual, expected);
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2013 JetBrains s.r.o.
* Copyright 2000-2014 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.
@@ -404,4 +404,13 @@ public class PsiTestUtil {
}
});
}
public static void setJavadocUrls(Module module, final String... urls) {
updateModel(module, new Consumer<ModifiableRootModel>() {
@Override
public void consume(ModifiableRootModel model) {
model.getModuleExtension(JavaModuleExternalPaths.class).setJavadocUrls(urls);
}
});
}
}