Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,42 +15,42 @@
*/
package com.intellij.java.language.impl.codeInsight;

import consulo.language.editor.ui.PsiElementListCellRenderer;
import com.intellij.java.language.impl.psi.presentation.java.ClassPresentationUtil;
import com.intellij.java.language.psi.PsiClass;
import com.intellij.java.language.psi.PsiClassOwner;
import consulo.annotation.access.RequiredReadAction;
import consulo.language.editor.ui.PsiElementListCellRenderer;
import consulo.language.psi.PsiElement;
import consulo.language.psi.PsiFile;
import org.jspecify.annotations.Nullable;

public class PsiClassListCellRenderer extends PsiElementListCellRenderer<PsiClass> {
public static final PsiClassListCellRenderer INSTANCE = new PsiClassListCellRenderer();
public static final PsiClassListCellRenderer INSTANCE = new PsiClassListCellRenderer();

@Override
public String getElementText(PsiClass element) {
return ClassPresentationUtil.getNameForClass(element, false);
}
@Override
@RequiredReadAction
public String getElementText(PsiClass element) {
return ClassPresentationUtil.getNameForClass(element, false).get();
}

@Override
protected String getContainerText(PsiClass element, final String name) {
return getContainerTextStatic(element);
}
@Override
protected String getContainerText(PsiClass element, String name) {
return getContainerTextStatic(element);
}

@Nullable
public static String getContainerTextStatic(final PsiElement element) {
PsiFile file = element.getContainingFile();
if (file instanceof PsiClassOwner) {
String packageName = ((PsiClassOwner) file).getPackageName();
if (packageName.isEmpty()) {
@Nullable
public static String getContainerTextStatic(PsiElement element) {
if (element.getContainingFile() instanceof PsiClassOwner classOwner) {
String packageName = classOwner.getPackageName();
if (packageName.isEmpty()) {
return null;
}
return "(" + packageName + ")";
}
return null;
}
return "(" + packageName + ")";
}
return null;
}

@Override
public int getIconFlags() {
return 0;
}
@Override
public int getIconFlags() {
return 0;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

import com.intellij.java.language.psi.PsiClass;
import com.intellij.java.language.psi.PsiClassOwner;
import consulo.annotation.access.RequiredReadAction;
import consulo.annotation.component.ExtensionImpl;
import consulo.codeEditor.CodeInsightColors;
import consulo.colorScheme.TextAttributesKey;
Expand All @@ -33,43 +34,43 @@
*/
@ExtensionImpl
public class ClassPresentationProvider implements ItemPresentationProvider<PsiClass> {
@Override
public Class<PsiClass> getItemClass() {
return PsiClass.class;
}
@Override
public Class<PsiClass> getItemClass() {
return PsiClass.class;
}

@Override
public ItemPresentation getPresentation(final PsiClass psiClass) {
return new ColoredItemPresentation() {
@Override
public String getPresentableText() {
return ClassPresentationUtil.getNameForClass(psiClass, false);
}
@Override
public ItemPresentation getPresentation(final PsiClass psiClass) {
return new ColoredItemPresentation() {
@Override
@RequiredReadAction
public String getPresentableText() {
return ClassPresentationUtil.getNameForClass(psiClass, false).get();
}

@Override
public String getLocationString() {
PsiFile file = psiClass.getContainingFile();
if (file instanceof PsiClassOwner) {
PsiClassOwner classOwner = (PsiClassOwner) file;
String packageName = classOwner.getPackageName();
if (packageName.length() == 0) return null;
return "(" + packageName + ")";
}
return null;
}
@Override
public String getLocationString() {
PsiFile file = psiClass.getContainingFile();
if (file instanceof PsiClassOwner classOwner) {
String packageName = classOwner.getPackageName();
return packageName.isEmpty() ? null : "(" + packageName + ")";
}
return null;
}

@Override
public TextAttributesKey getTextAttributesKey() {
if (psiClass.isDeprecated()) {
return CodeInsightColors.DEPRECATED_ATTRIBUTES;
}
return null;
}
@Override
public TextAttributesKey getTextAttributesKey() {
if (psiClass.isDeprecated()) {
return CodeInsightColors.DEPRECATED_ATTRIBUTES;
}
return null;
}

@Override
public Image getIcon() {
return IconDescriptorUpdaters.getIcon(psiClass, Iconable.ICON_FLAG_VISIBILITY | Iconable.ICON_FLAG_READ_STATUS);
}
};
}
@Override
@RequiredReadAction
public Image getIcon() {
return IconDescriptorUpdaters.getIcon(psiClass, Iconable.ICON_FLAG_VISIBILITY | Iconable.ICON_FLAG_READ_STATUS);
}
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,75 +16,93 @@
package com.intellij.java.language.impl.psi.presentation.java;

import com.intellij.java.language.psi.*;
import consulo.language.psi.PsiBundle;
import consulo.annotation.access.RequiredReadAction;
import consulo.language.localize.LanguageLocalize;
import consulo.language.psi.PsiElement;
import consulo.language.psi.PsiFile;
import consulo.language.psi.util.PsiTreeUtil;
import consulo.localize.LocalizeValue;
import consulo.util.lang.StringUtil;
import org.jspecify.annotations.Nullable;

public class ClassPresentationUtil {
private ClassPresentationUtil() {
}

public static String getNameForClass(PsiClass aClass, boolean qualified) {
if (aClass instanceof PsiAnonymousClass) {
if (aClass instanceof PsiEnumConstantInitializer) {
PsiEnumConstant enumConstant = ((PsiEnumConstantInitializer) aClass).getEnumConstant();
String name = enumConstant.getName();
return PsiBundle.message("enum.constant.context", name, getContextName(enumConstant, qualified));
}
return PsiBundle.message("anonymous.class.context.display", getContextName(aClass, qualified));
}
if (qualified) {
String qName = aClass.getQualifiedName();
if (qName != null) {
return qName;
}
private ClassPresentationUtil() {
}

String className = aClass.getName();
String contextName = getContextName(aClass, qualified);
return contextName != null ? PsiBundle.message("class.context.display", className, contextName) : className;
}
@RequiredReadAction
public static LocalizeValue getNameForClass(PsiClass aClass, boolean qualified) {
if (aClass instanceof PsiAnonymousClass) {
if (aClass instanceof PsiEnumConstantInitializer enumInitializer) {
PsiEnumConstant enumConstant = enumInitializer.getEnumConstant();
return LanguageLocalize.enumConstantContext(
StringUtil.notNullize(enumConstant.getName()),
StringUtil.notNullize(getContextName(enumConstant, qualified))
);
}
return LanguageLocalize.anonymousClassContextDisplay(StringUtil.notNullize(getContextName(aClass, qualified)));
}
if (qualified) {
String qName = aClass.getQualifiedName();
if (qName != null) {
return LocalizeValue.of(qName);
}
}

private static String getNameForElement(PsiElement element, boolean qualified) {
if (element instanceof PsiClass) {
return getNameForClass((PsiClass) element, qualified);
} else if (element instanceof PsiMethod) {
PsiMethod method = (PsiMethod) element;
String methodName = method.getName();
return PsiBundle.message("method.context.display", methodName, getContextName(method, qualified));
} else if (element instanceof PsiClassOwner) {
return null;
} else if (element instanceof PsiFile) {
return ((PsiFile) element).getName();
} else if (element instanceof PsiField) {
return ((PsiField) element).getName();
} else {
return null;
String className = aClass.getName();
String contextName = getContextName(aClass, qualified);
return contextName != null
? LanguageLocalize.classContextDisplay(StringUtil.notNullize(className), contextName)
: LocalizeValue.ofNullable(className);
}
}

public static String getContextName(PsiElement element, boolean qualified) {
PsiElement parent = PsiTreeUtil.getStubOrPsiParentOfType(element, PsiMember.class);
if (parent == null) {
parent = element.getContainingFile();
@RequiredReadAction
private static LocalizeValue getNameForElement(PsiElement element, boolean qualified) {
if (element instanceof PsiClass psiClass) {
return getNameForClass(psiClass, qualified);
}
else if (element instanceof PsiMethod method) {
return LanguageLocalize.methodContextDisplay(
StringUtil.notNullize(method.getName()),
StringUtil.notNullize(getContextName(method, qualified))
);
}
else if (element instanceof PsiClassOwner) {
return LocalizeValue.empty();
}
else if (element instanceof PsiFile file) {
return LocalizeValue.of(file.getName());
}
else if (element instanceof PsiField field) {
return LocalizeValue.ofNullable(field.getName());
}
else {
return LocalizeValue.empty();
}
}
while (true) {
if (parent == null) {
return null;
}
String name = getNameForElement(parent, qualified);
if (name != null) {
return name;
}
if (parent instanceof PsiFile) {
return null;
}
parent = PsiTreeUtil.getStubOrPsiParent(parent);

@RequiredReadAction
public static @Nullable String getContextName(PsiElement element, boolean qualified) {
PsiElement parent = PsiTreeUtil.getStubOrPsiParentOfType(element, PsiMember.class);
if (parent == null) {
parent = element.getContainingFile();
}
while (true) {
if (parent == null) {
return null;
}
LocalizeValue name = getNameForElement(parent, qualified);
if (name.isNotEmpty()) {
return name.get();
}
if (parent instanceof PsiFile) {
return null;
}
parent = PsiTreeUtil.getStubOrPsiParent(parent);
}
}
}

public static String getFunctionalExpressionPresentation(PsiFunctionalExpression functionalExpression, boolean qualified) {
return "Functional expression in " + getContextName(functionalExpression, qualified);
}
@RequiredReadAction
public static LocalizeValue getFunctionalExpressionPresentation(PsiFunctionalExpression functionalExpression, boolean qualified) {
return LocalizeValue.localizeTODO("Functional expression in " + getContextName(functionalExpression, qualified));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: localizeTODO with a concatenated string bakes the context name into the untranslated text. Leaving this as a TODO is fine. When a key is added, it should take the context name as an argument (e.g. functional.expression.in.context, with getContextName passed through StringUtil.notNullize) so translators get one stable template. A small related point: if getContextName returns null, this still renders "Functional expression in null". That's how it behaved before this PR too.

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -65,14 +65,14 @@ public static HtmlChunk.Element composeText(
Set<LocalizeValue> names = new LinkedHashSet<>();
for (PsiElement element : elements) {
if (element instanceof PsiClass psiClass) {
String className = ClassPresentationUtil.getNameForClass(psiClass, true);
names.add(pattern.apply("", className));
LocalizeValue className = ClassPresentationUtil.getNameForClass(psiClass, true);
names.add(pattern.apply("", className.get()));
}
else if (element instanceof PsiMethod method) {
String methodName = method.getName();
PsiClass aClass = method.getContainingClass();
String className = aClass == null ? "" : ClassPresentationUtil.getNameForClass(aClass, true);
names.add(pattern.apply(methodName, className));
LocalizeValue className = aClass == null ? LocalizeValue.empty() : ClassPresentationUtil.getNameForClass(aClass, true);
names.add(pattern.apply(methodName, className.get()));
}
else if (element instanceof PsiFile file) {
names.add(pattern.apply("", file.getName()));
Expand Down
Loading
Loading