mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-03-22 23:31:05 +07:00
213 lines
6.2 KiB
Java
213 lines
6.2 KiB
Java
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
|
|
package com.intellij.psi.util;
|
|
|
|
import com.intellij.core.JavaPsiBundle;
|
|
import com.intellij.psi.*;
|
|
import com.intellij.psi.javadoc.PsiSnippetDocTagBody;
|
|
import org.jetbrains.annotations.Nls;
|
|
import org.jetbrains.annotations.NotNull;
|
|
import org.jetbrains.annotations.PropertyKey;
|
|
|
|
/**
|
|
* Represents a kind of element that appears in Java source code.
|
|
* The main purpose of this enum is to be able to display localized element name in UI
|
|
*/
|
|
public enum JavaElementKind {
|
|
ABSTRACT_METHOD("element.abstract_method"),
|
|
ANNOTATION("element.annotation"),
|
|
ANONYMOUS_CLASS("element.anonymous_class"),
|
|
CLASS("element.class"),
|
|
CONSTANT("element.constant"),
|
|
CONSTRUCTOR("element.constructor"),
|
|
ENUM("element.enum"),
|
|
ENUM_CONSTANT("element.enum_constant"),
|
|
EXPRESSION("element.expression"),
|
|
EXTENDS_LIST("element.extends.list"),
|
|
FIELD("element.field"),
|
|
INITIALIZER("element.initializer"),
|
|
INTERFACE("element.interface"),
|
|
LABEL("element.label"),
|
|
LOCAL_VARIABLE("element.local_variable"),
|
|
METHOD("element.method"),
|
|
METHOD_CALL("element.method.call"),
|
|
MODULE("element.module"),
|
|
PACKAGE("element.package"),
|
|
PACKAGE_STATEMENT("element.package.statement"),
|
|
PARAMETER("element.parameter"),
|
|
PATTERN_VARIABLE("element.pattern_variable"),
|
|
PERMITS_LIST("element.permits.list"),
|
|
RECEIVER_PARAMETER("element.receiver.parameter"),
|
|
RECORD("element.record"),
|
|
RECORD_COMPONENT("element.record_component"),
|
|
SEMICOLON("element.type.semicolon"),
|
|
SNIPPET_BODY("element.snippet_body"),
|
|
STATEMENT("element.statement"),
|
|
THROWS_LIST("element.throws.list"),
|
|
TYPE_ARGUMENTS("element.type.arguments"),
|
|
TYPE_PARAMETER("element.type.parameter"),
|
|
TYPE_PARAMETERS("element.type.parameters"),
|
|
UNKNOWN("element.unknown"),
|
|
VARIABLE("element.variable");
|
|
|
|
private final @PropertyKey(resourceBundle = JavaPsiBundle.BUNDLE) String propertyKey;
|
|
|
|
JavaElementKind(@PropertyKey(resourceBundle = JavaPsiBundle.BUNDLE) String key) {
|
|
propertyKey = key;
|
|
}
|
|
|
|
/**
|
|
* @return human-readable name of the item having the subject role in the sentence (nominative case)
|
|
*/
|
|
@Nls
|
|
public @NotNull String subject() {
|
|
return JavaPsiBundle.message(propertyKey, 0);
|
|
}
|
|
|
|
/**
|
|
* @return human-readable name of the item having the object role in the sentence (accusative case)
|
|
*/
|
|
@Nls
|
|
public @NotNull String object() {
|
|
return JavaPsiBundle.message(propertyKey, 1);
|
|
}
|
|
|
|
/**
|
|
* @return less descriptive type for this type; usually result can be described in a single word
|
|
* (e.g. LOCAL_VARIABLE is replaced with VARIABLE).
|
|
*/
|
|
public @NotNull JavaElementKind lessDescriptive() {
|
|
switch (this) {
|
|
case ABSTRACT_METHOD:
|
|
return METHOD;
|
|
case LOCAL_VARIABLE:
|
|
case PATTERN_VARIABLE:
|
|
return VARIABLE;
|
|
case CONSTANT:
|
|
return FIELD;
|
|
case TYPE_PARAMETER:
|
|
case ANONYMOUS_CLASS:
|
|
return CLASS;
|
|
default:
|
|
return this;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param element element to get the kind from
|
|
* @return resulting kind
|
|
*/
|
|
public static JavaElementKind fromElement(@NotNull PsiElement element) {
|
|
if (element instanceof PsiClass) {
|
|
PsiClass psiClass = (PsiClass)element;
|
|
if (psiClass instanceof PsiAnonymousClass) {
|
|
return ANONYMOUS_CLASS;
|
|
}
|
|
if (psiClass.isEnum()) {
|
|
return ENUM;
|
|
}
|
|
if (psiClass.isRecord()) {
|
|
return RECORD;
|
|
}
|
|
if (psiClass.isAnnotationType()) {
|
|
return ANNOTATION;
|
|
}
|
|
if (psiClass.isInterface()) {
|
|
return INTERFACE;
|
|
}
|
|
if (psiClass instanceof PsiTypeParameter) {
|
|
return TYPE_PARAMETER;
|
|
}
|
|
return CLASS;
|
|
}
|
|
if (element instanceof PsiMethod) {
|
|
if (((PsiMethod)element).isConstructor()) {
|
|
return CONSTRUCTOR;
|
|
}
|
|
if (((PsiMethod)element).hasModifierProperty(PsiModifier.ABSTRACT)) {
|
|
return ABSTRACT_METHOD;
|
|
}
|
|
return METHOD;
|
|
}
|
|
if (element instanceof PsiField) {
|
|
PsiField field = (PsiField)element;
|
|
if (field instanceof PsiEnumConstant) {
|
|
return ENUM_CONSTANT;
|
|
}
|
|
if (field.hasModifierProperty(PsiModifier.STATIC) && field.hasModifierProperty(PsiModifier.FINAL)) {
|
|
return CONSTANT;
|
|
}
|
|
return FIELD;
|
|
}
|
|
if (element instanceof PsiTypeParameterList) {
|
|
return TYPE_PARAMETERS;
|
|
}
|
|
if (element instanceof PsiReferenceParameterList) {
|
|
return TYPE_ARGUMENTS;
|
|
}
|
|
if (element instanceof PsiReferenceList) {
|
|
PsiReferenceList.Role role = ((PsiReferenceList)element).getRole();
|
|
if (role == PsiReferenceList.Role.THROWS_LIST) {
|
|
return THROWS_LIST;
|
|
}
|
|
else if (role == PsiReferenceList.Role.EXTENDS_LIST) {
|
|
return EXTENDS_LIST;
|
|
}
|
|
else if (role == PsiReferenceList.Role.PERMITS_LIST) {
|
|
return PERMITS_LIST;
|
|
}
|
|
}
|
|
if (element instanceof PsiAnnotation) {
|
|
return ANNOTATION;
|
|
}
|
|
if (element instanceof PsiRecordComponent) {
|
|
return RECORD_COMPONENT;
|
|
}
|
|
if (element instanceof PsiLocalVariable) {
|
|
return LOCAL_VARIABLE;
|
|
}
|
|
if (element instanceof PsiPatternVariable) {
|
|
return PATTERN_VARIABLE;
|
|
}
|
|
if (element instanceof PsiParameter) {
|
|
return PARAMETER;
|
|
}
|
|
if (element instanceof PsiReceiverParameter) {
|
|
return RECEIVER_PARAMETER;
|
|
}
|
|
if (element instanceof PsiVariable) {
|
|
return VARIABLE;
|
|
}
|
|
if (element instanceof PsiPackage) {
|
|
return PACKAGE;
|
|
}
|
|
if (element instanceof PsiPackageStatement) {
|
|
return PACKAGE_STATEMENT;
|
|
}
|
|
if (element instanceof PsiJavaModule) {
|
|
return MODULE;
|
|
}
|
|
if (element instanceof PsiClassInitializer) {
|
|
return INITIALIZER;
|
|
}
|
|
if (element instanceof PsiLabeledStatement) {
|
|
return LABEL;
|
|
}
|
|
if (element instanceof PsiStatement) {
|
|
return STATEMENT;
|
|
}
|
|
if (element instanceof PsiMethodCallExpression) {
|
|
return METHOD_CALL;
|
|
}
|
|
if (element instanceof PsiExpression) {
|
|
return EXPRESSION;
|
|
}
|
|
if (element instanceof PsiSnippetDocTagBody) {
|
|
return SNIPPET_BODY;
|
|
}
|
|
if (PsiUtil.isJavaToken(element, JavaTokenType.SEMICOLON)) {
|
|
return SEMICOLON;
|
|
}
|
|
return UNKNOWN;
|
|
}
|
|
}
|