mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 09:34:34 +07:00
[java-highlighting] IDEA-339935 JEP 463
- rename unnamed classes to implicitly declared classes GitOrigin-RevId: 2c6d7f16a1dc6d2371b8f8b5f5675246c9bc99f9
This commit is contained in:
committed by
intellij-monorepo-bot
parent
9e479dc1a2
commit
3f86cf9292
@@ -281,7 +281,7 @@ public final class JVMNameUtil {
|
||||
if (PsiUtil.isLocalOrAnonymousClass(aClass)) {
|
||||
return null;
|
||||
}
|
||||
if (aClass instanceof PsiUnnamedClass a) {
|
||||
if (aClass instanceof PsiImplicitClass a) {
|
||||
return ClassUtil.getJVMClassName(a);
|
||||
}
|
||||
String name = aClass.getName();
|
||||
|
||||
+2
-2
@@ -59,8 +59,8 @@ public abstract class AbstractApplicationConfigurationProducer<T extends Applica
|
||||
}
|
||||
|
||||
private void setupConfiguration(T configuration, final PsiClass aClass, final ConfigurationContext context) {
|
||||
if (aClass instanceof PsiUnnamedClass) {
|
||||
configuration.setUnnamedClassConfiguration(true);
|
||||
if (aClass instanceof PsiImplicitClass) {
|
||||
configuration.setImplicitClassConfiguration(true);
|
||||
}
|
||||
configuration.setMainClassName(JavaExecutionUtil.getRuntimeQualifiedName(aClass));
|
||||
configuration.setGeneratedName();
|
||||
|
||||
+5
-5
@@ -34,7 +34,7 @@ import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.openapi.vfs.VirtualFileManager;
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.impl.java.stubs.index.JavaUnnamedClassIndex;
|
||||
import com.intellij.psi.impl.java.stubs.index.JavaImplicitClassIndex;
|
||||
import com.intellij.psi.util.PsiMethodUtil;
|
||||
import com.intellij.refactoring.listeners.RefactoringElementListener;
|
||||
import com.intellij.util.PathUtil;
|
||||
@@ -191,10 +191,10 @@ public class ApplicationConfiguration extends JavaRunConfigurationBase
|
||||
public JavaRunConfigurationModule checkClass() throws RuntimeConfigurationException {
|
||||
final JavaRunConfigurationModule configurationModule = getConfigurationModule();
|
||||
final String mainClass = getMainClassName();
|
||||
if (getOptions().isUnnamedClassConfiguration()) {
|
||||
if (getOptions().isImplicitClassConfiguration()) {
|
||||
if (mainClass != null && !DumbService.isDumb(getProject())) {
|
||||
try {
|
||||
final boolean matchingClass = !JavaUnnamedClassIndex.getInstance()
|
||||
final boolean matchingClass = !JavaImplicitClassIndex.getInstance()
|
||||
.getElements(mainClass, getProject(), configurationModule.getSearchScope())
|
||||
.isEmpty();
|
||||
if (!matchingClass) {
|
||||
@@ -367,9 +367,9 @@ public class ApplicationConfiguration extends JavaRunConfigurationBase
|
||||
getOptions().setIncludeProvidedScope(value);
|
||||
}
|
||||
|
||||
public boolean isUnnamedClassConfiguration() { return getOptions().isUnnamedClassConfiguration(); }
|
||||
public boolean isImplicitClassConfiguration() { return getOptions().isImplicitClassConfiguration(); }
|
||||
|
||||
public void setUnnamedClassConfiguration(boolean value) { getOptions().setUnnamedClassConfiguration(value); }
|
||||
public void setImplicitClassConfiguration(boolean value) { getOptions().setImplicitClassConfiguration(value); }
|
||||
|
||||
@Override
|
||||
public Collection<Module> getValidModules() {
|
||||
|
||||
+1
-2
@@ -22,7 +22,6 @@ import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class ApplicationRunLineMarkerProvider extends RunLineMarkerContributor {
|
||||
private final static Comparator<PsiMethod> mainCandidateComparator = (o1, o2) -> {
|
||||
boolean isO1Static = o1.hasModifierProperty(PsiModifier.STATIC);
|
||||
@@ -59,7 +58,7 @@ public class ApplicationRunLineMarkerProvider extends RunLineMarkerContributor {
|
||||
else if (parent instanceof PsiMethod method) {
|
||||
if (!"main".equals(method.getName()) || !PsiMethodUtil.isMainMethod(method)) return null;
|
||||
PsiClass containingClass = method.getContainingClass();
|
||||
if (!(containingClass instanceof PsiUnnamedClass) && PsiTreeUtil.getParentOfType(containingClass, PsiUnnamedClass.class) != null) return null;
|
||||
if (!(containingClass instanceof PsiImplicitClass) && PsiTreeUtil.getParentOfType(containingClass, PsiImplicitClass.class) != null) return null;
|
||||
if (containingClass == null || PsiUtil.isLocalOrAnonymousClass(containingClass)) return null;
|
||||
if (containingClass.isInterface() && !method.hasModifierProperty(PsiModifier.STATIC)) return null;
|
||||
Optional<PsiMethod> mainMethod =
|
||||
|
||||
+34
-34
@@ -31,11 +31,11 @@ import static com.intellij.execution.ui.CommandLinePanel.setMinimumWidth;
|
||||
|
||||
public final class JavaApplicationSettingsEditor extends JavaSettingsEditorBase<ApplicationConfiguration> {
|
||||
private SettingsEditorFragment<ApplicationConfiguration, MainClassPanel> myMainClassFragment;
|
||||
private final boolean myInitialIsUnnamedClass;
|
||||
private final boolean myInitialIsImplicitClass;
|
||||
|
||||
public JavaApplicationSettingsEditor(ApplicationConfiguration configuration) {
|
||||
super(configuration);
|
||||
myInitialIsUnnamedClass = configuration.isUnnamedClassConfiguration();
|
||||
myInitialIsImplicitClass = configuration.isImplicitClassConfiguration();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -53,14 +53,14 @@ public final class JavaApplicationSettingsEditor extends JavaSettingsEditorBase<
|
||||
configuration -> configuration.getOptions().isIncludeProvidedScope(),
|
||||
(configuration, value) -> configuration.getOptions().setIncludeProvidedScope(value)));
|
||||
fragments.add(SettingsEditorFragment.createTag("unnamed.class",
|
||||
ExecutionBundle.message("application.configuration.is.unnamed.class"),
|
||||
ExecutionBundle.message("application.configuration.is.implicit.class"),
|
||||
ExecutionBundle.message("group.java.options"),
|
||||
configuration -> {
|
||||
return configuration.isUnnamedClassConfiguration();
|
||||
return configuration.isImplicitClassConfiguration();
|
||||
},
|
||||
(configuration, value) -> {
|
||||
configuration.setUnnamedClassConfiguration(value);
|
||||
updateMainClassFragment(configuration.isUnnamedClassConfiguration());
|
||||
configuration.setImplicitClassConfiguration(value);
|
||||
updateMainClassFragment(configuration.isImplicitClassConfiguration());
|
||||
}));
|
||||
fragments.add(commonParameterFragments.programArguments());
|
||||
fragments.add(new TargetPathFragment<>());
|
||||
@@ -75,8 +75,8 @@ public final class JavaApplicationSettingsEditor extends JavaSettingsEditorBase<
|
||||
|
||||
private class MainClassPanel extends JPanel {
|
||||
private final ClassEditorField myClassEditorField;
|
||||
private final TextFieldWithAutoCompletion<String> myUnnamedClassField;
|
||||
private boolean myIsUnnamedClassConfiguration;
|
||||
private final TextFieldWithAutoCompletion<String> myImplicitClassField;
|
||||
private boolean myIsImplicitClassConfiguration;
|
||||
|
||||
private MainClassPanel(ModuleClasspathCombo classpathCombo) {
|
||||
super(new GridBagLayout());
|
||||
@@ -91,33 +91,33 @@ public final class JavaApplicationSettingsEditor extends JavaSettingsEditorBase<
|
||||
String placeholder = ExecutionBundle.message("application.configuration.main.class.placeholder");
|
||||
myClassEditorField.setPlaceholder(placeholder);
|
||||
myClassEditorField.getAccessibleContext().setAccessibleName(placeholder);
|
||||
myClassEditorField.setVisible(!myIsUnnamedClassConfiguration);
|
||||
myClassEditorField.setVisible(!myIsImplicitClassConfiguration);
|
||||
setMinimumWidth(myClassEditorField, 300);
|
||||
GridBag constraints = new GridBag().setDefaultFill(GridBagConstraints.HORIZONTAL).setDefaultWeightX(1.0);
|
||||
add(myClassEditorField, constraints.nextLine());
|
||||
|
||||
myUnnamedClassField = new TextFieldWithAutoCompletion<>(getProject(), new StringsCompletionProvider(null, AllIcons.FileTypes.JavaClass) {
|
||||
myImplicitClassField = new TextFieldWithAutoCompletion<>(getProject(), new StringsCompletionProvider(null, AllIcons.FileTypes.JavaClass) {
|
||||
@Override
|
||||
public @NotNull Collection<String> getItems(String prefix, boolean cached, CompletionParameters parameters) {
|
||||
return DumbService.isDumb(getProject())
|
||||
? List.of()
|
||||
: ReadAction.compute(() -> StubIndex.getInstance().getAllKeys(JavaStubIndexKeys.UNNAMED_CLASSES, getProject()));
|
||||
: ReadAction.compute(() -> StubIndex.getInstance().getAllKeys(JavaStubIndexKeys.IMPLICIT_CLASSES, getProject()));
|
||||
}
|
||||
}, true, null);
|
||||
CommonParameterFragments.setMonospaced(myUnnamedClassField);
|
||||
String unnamedClassPlaceholder = ExecutionBundle.message("application.configuration.main.unnamed.class.placeholder");
|
||||
myUnnamedClassField.setVisible(myIsUnnamedClassConfiguration);
|
||||
myUnnamedClassField.setPlaceholder(unnamedClassPlaceholder);
|
||||
myUnnamedClassField.getAccessibleContext().setAccessibleName(unnamedClassPlaceholder);
|
||||
setMinimumWidth(myUnnamedClassField, 300);
|
||||
add(myUnnamedClassField, constraints.nextLine());
|
||||
CommonParameterFragments.setMonospaced(myImplicitClassField);
|
||||
String implicitClassPlaceholder = ExecutionBundle.message("application.configuration.main.unnamed.class.placeholder");
|
||||
myImplicitClassField.setVisible(myIsImplicitClassConfiguration);
|
||||
myImplicitClassField.setPlaceholder(implicitClassPlaceholder);
|
||||
myImplicitClassField.getAccessibleContext().setAccessibleName(implicitClassPlaceholder);
|
||||
setMinimumWidth(myImplicitClassField, 300);
|
||||
add(myImplicitClassField, constraints.nextLine());
|
||||
}
|
||||
|
||||
public EditorTextField getEditorTextField() { return myClassEditorField; }
|
||||
|
||||
void setClassName(String name) {
|
||||
if (myIsUnnamedClassConfiguration) {
|
||||
myUnnamedClassField.setText(name);
|
||||
if (myIsImplicitClassConfiguration) {
|
||||
myImplicitClassField.setText(name);
|
||||
}
|
||||
else {
|
||||
myClassEditorField.setClassName(name);
|
||||
@@ -125,31 +125,31 @@ public final class JavaApplicationSettingsEditor extends JavaSettingsEditorBase<
|
||||
}
|
||||
|
||||
String getClassName() {
|
||||
return myIsUnnamedClassConfiguration ? myUnnamedClassField.getText() : myClassEditorField.getClassName();
|
||||
return myIsImplicitClassConfiguration ? myImplicitClassField.getText() : myClassEditorField.getClassName();
|
||||
}
|
||||
|
||||
boolean isReadyForApply() {
|
||||
return myIsUnnamedClassConfiguration || myClassEditorField.isReadyForApply();
|
||||
return myIsImplicitClassConfiguration || myClassEditorField.isReadyForApply();
|
||||
}
|
||||
|
||||
void setUnnamedClassConfiguration(boolean isUnnamedClassConfiguration) {
|
||||
myIsUnnamedClassConfiguration = isUnnamedClassConfiguration;
|
||||
void setImplicitClassConfiguration(boolean isImplicitClassConfiguration) {
|
||||
myIsImplicitClassConfiguration = isImplicitClassConfiguration;
|
||||
if (myClassEditorField != null) {
|
||||
myClassEditorField.setVisible(!isUnnamedClassConfiguration);
|
||||
myUnnamedClassField.setVisible(isUnnamedClassConfiguration);
|
||||
myClassEditorField.setVisible(!isImplicitClassConfiguration);
|
||||
myImplicitClassField.setVisible(isImplicitClassConfiguration);
|
||||
}
|
||||
}
|
||||
|
||||
List<ValidationInfo> getValidation(ApplicationConfiguration configuration) {
|
||||
return Collections.singletonList(RuntimeConfigurationException.validate(
|
||||
myIsUnnamedClassConfiguration ? myUnnamedClassField : myClassEditorField,
|
||||
myIsImplicitClassConfiguration ? myImplicitClassField : myClassEditorField,
|
||||
() -> { if (!isDefaultSettings()) configuration.checkClass(); }
|
||||
));
|
||||
}
|
||||
|
||||
JComponent getEditorComponent() {
|
||||
if (myIsUnnamedClassConfiguration) {
|
||||
return myUnnamedClassField;
|
||||
if (myIsImplicitClassConfiguration) {
|
||||
return myImplicitClassField;
|
||||
} else {
|
||||
Editor editor = myClassEditorField.getEditor();
|
||||
return editor == null ? myClassEditorField : editor.getContentComponent();
|
||||
@@ -158,7 +158,7 @@ public final class JavaApplicationSettingsEditor extends JavaSettingsEditorBase<
|
||||
|
||||
@Override
|
||||
public synchronized void addMouseListener(MouseListener l) {
|
||||
myUnnamedClassField.addMouseListener(l);
|
||||
myImplicitClassField.addMouseListener(l);
|
||||
myClassEditorField.addMouseListener(l);
|
||||
}
|
||||
}
|
||||
@@ -179,15 +179,15 @@ public final class JavaApplicationSettingsEditor extends JavaSettingsEditorBase<
|
||||
myMainClassFragment.setRemovable(false);
|
||||
myMainClassFragment.setEditorGetter(field -> field.getEditorComponent());
|
||||
myMainClassFragment.setValidation((configuration) -> mainClassPanel.getValidation(configuration));
|
||||
updateMainClassFragment(myInitialIsUnnamedClass);
|
||||
updateMainClassFragment(myInitialIsImplicitClass);
|
||||
return myMainClassFragment;
|
||||
}
|
||||
|
||||
private void updateMainClassFragment(boolean isUnnamedClass) {
|
||||
private void updateMainClassFragment(boolean isImplicitClass) {
|
||||
if (myMainClassFragment == null) return;
|
||||
myMainClassFragment.component().setUnnamedClassConfiguration(isUnnamedClass);
|
||||
myMainClassFragment.component().setImplicitClassConfiguration(isImplicitClass);
|
||||
|
||||
if (isUnnamedClass) {
|
||||
if (isImplicitClass) {
|
||||
myMainClassFragment.setHint(ExecutionBundle.message("application.configuration.main.class.unnamed.hint"));
|
||||
} else {
|
||||
myMainClassFragment.setHint(ExecutionBundle.message("application.configuration.main.class.hint"));
|
||||
|
||||
+1
-1
@@ -20,7 +20,7 @@ open class JvmMainMethodRunConfigurationOptions : JvmConfigurationOptions() {
|
||||
open var isIncludeProvidedScope by property(false)
|
||||
|
||||
@get:OptionTag("UNNAMED_CLASS_CONFIGURATION")
|
||||
open var isUnnamedClassConfiguration by property(false)
|
||||
open var isImplicitClassConfiguration by property(false)
|
||||
|
||||
@get:OptionTag("PASS_PARENT_ENVS")
|
||||
var isPassParentEnv by property(true)
|
||||
|
||||
@@ -136,7 +136,7 @@ feature.record.patterns.in.for.each=Record patterns in for-each loops
|
||||
feature.enum.qualified.name.in.switch=Qualified enum as a constant in switch
|
||||
feature.string.templates=String templates
|
||||
feature.unnamed.vars=Unnamed patterns and variables
|
||||
feature.unnamed.classes=Unnamed classes
|
||||
feature.implicit.classes=Implicitly declared classes
|
||||
|
||||
find.searching.for.references.to.class.progress=Searching for references to class {0}...
|
||||
find.usages.panel.title.derived.classes.cap=Derived classes
|
||||
|
||||
@@ -518,7 +518,7 @@ public abstract class QuickFixFactory {
|
||||
|
||||
/**
|
||||
* @deprecated error elements are not provided anymore for members declared out of class.
|
||||
* Now they are members of an unnamed class and can be moved as usual members.
|
||||
* Now they are members of an implicitly declared class and can be moved as usual members.
|
||||
*/
|
||||
@Deprecated
|
||||
public abstract @NotNull IntentionAction createMoveMemberIntoClassFix(@NotNull PsiErrorElement errorElement);
|
||||
@@ -640,5 +640,5 @@ public abstract class QuickFixFactory {
|
||||
|
||||
@ApiStatus.Experimental
|
||||
@NotNull
|
||||
public abstract IntentionAction createAddMainMethodFix(@NotNull PsiUnnamedClass unnamedClass);
|
||||
public abstract IntentionAction createAddMainMethodFix(@NotNull PsiImplicitClass implicitClass);
|
||||
}
|
||||
+7
-7
@@ -1350,19 +1350,19 @@ public final class HighlightClassUtil {
|
||||
return null;
|
||||
}
|
||||
|
||||
static HighlightInfo.Builder checkUnnamedClassMember(@NotNull PsiMember member, @NotNull LanguageLevel languageLevel,
|
||||
@NotNull PsiFile psiFile) {
|
||||
if (!(member.getContainingClass() instanceof PsiUnnamedClass unnamedClass)) {
|
||||
static HighlightInfo.Builder checkImplicitClassMember(@NotNull PsiMember member, @NotNull LanguageLevel languageLevel,
|
||||
@NotNull PsiFile psiFile) {
|
||||
if (!(member.getContainingClass() instanceof PsiImplicitClass implicitClass)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
HighlightInfo.Builder builder = HighlightUtil.checkFeature(member, HighlightingFeature.UNNAMED_CLASSES, languageLevel, psiFile);
|
||||
HighlightInfo.Builder builder = HighlightUtil.checkFeature(member, HighlightingFeature.IMPLICIT_CLASSES, languageLevel, psiFile);
|
||||
if (builder == null) return null;
|
||||
|
||||
if (!(member instanceof PsiClass) && !HighlightingFeature.UNNAMED_CLASSES.isAvailable(member)) {
|
||||
boolean hasClassToRelocate = PsiTreeUtil.findChildOfType(unnamedClass, PsiClass.class) != null;
|
||||
if (!(member instanceof PsiClass) && !HighlightingFeature.IMPLICIT_CLASSES.isAvailable(member)) {
|
||||
boolean hasClassToRelocate = PsiTreeUtil.findChildOfType(implicitClass, PsiClass.class) != null;
|
||||
if (hasClassToRelocate) {
|
||||
MoveMembersIntoClassFix fix = new MoveMembersIntoClassFix(unnamedClass);
|
||||
MoveMembersIntoClassFix fix = new MoveMembersIntoClassFix(implicitClass);
|
||||
builder.registerFix(fix, null, null, null, null);
|
||||
}
|
||||
}
|
||||
|
||||
+23
-23
@@ -7,60 +7,60 @@ import com.intellij.codeInsight.daemon.impl.HighlightInfoType;
|
||||
import com.intellij.codeInsight.intention.QuickFixFactory;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.util.ClassUtil;
|
||||
import com.intellij.psi.util.JavaUnnamedClassUtil;
|
||||
import com.intellij.psi.util.JavaImplicitClassUtil;
|
||||
import com.intellij.psi.util.PsiMethodUtil;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
/**
|
||||
* Checks and reports errors for unnamed classes {@link PsiUnnamedClass}.
|
||||
* Checks and reports errors for implicitly declared classes {@link PsiImplicitClass}.
|
||||
*/
|
||||
public final class HighlightUnnamedClassUtil {
|
||||
public final class HighlightImplicitClassUtil {
|
||||
|
||||
static HighlightInfo.@Nullable Builder checkUnnamedClassHasMainMethod(@NotNull PsiJavaFile file) {
|
||||
if (!HighlightingFeature.UNNAMED_CLASSES.isAvailable(file)) return null;
|
||||
PsiUnnamedClass unnamedClass = JavaUnnamedClassUtil.getUnnamedClassFor(file);
|
||||
if (unnamedClass == null) return null;
|
||||
PsiMethod[] methods = unnamedClass.getMethods();
|
||||
static HighlightInfo.@Nullable Builder checkImplicitClassHasMainMethod(@NotNull PsiJavaFile file) {
|
||||
if (!HighlightingFeature.IMPLICIT_CLASSES.isAvailable(file)) return null;
|
||||
PsiImplicitClass implicitClass = JavaImplicitClassUtil.getImplicitClassFor(file);
|
||||
if (implicitClass == null) return null;
|
||||
PsiMethod[] methods = implicitClass.getMethods();
|
||||
boolean hasMainMethod = ContainerUtil.exists(methods, method -> "main".equals(method.getName()) && PsiMethodUtil.isMainMethod(method));
|
||||
if (!hasMainMethod) {
|
||||
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR)
|
||||
.range(file)
|
||||
.fileLevelAnnotation()
|
||||
.registerFix(QuickFixFactory.getInstance().createAddMainMethodFix(unnamedClass), null, null, null, null)
|
||||
.description(JavaErrorBundle.message("error.unnamed.class.contains.no.main.method"));
|
||||
.registerFix(QuickFixFactory.getInstance().createAddMainMethodFix(implicitClass), null, null, null, null)
|
||||
.description(JavaErrorBundle.message("error.implicit.class.contains.no.main.method"));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
static HighlightInfo.@Nullable Builder checkUnnamedClassFileIsValidIdentifier(@NotNull PsiJavaFile file) {
|
||||
if (!HighlightingFeature.UNNAMED_CLASSES.isAvailable(file)) return null;
|
||||
PsiUnnamedClass unnamedClass = JavaUnnamedClassUtil.getUnnamedClassFor(file);
|
||||
if (unnamedClass == null) return null;
|
||||
String name = ClassUtil.getJVMClassName(unnamedClass);
|
||||
static HighlightInfo.@Nullable Builder checkImplicitClassFileIsValidIdentifier(@NotNull PsiJavaFile file) {
|
||||
if (!HighlightingFeature.IMPLICIT_CLASSES.isAvailable(file)) return null;
|
||||
PsiImplicitClass implicitClass = JavaImplicitClassUtil.getImplicitClassFor(file);
|
||||
if (implicitClass == null) return null;
|
||||
String name = ClassUtil.getJVMClassName(implicitClass);
|
||||
if (!PsiNameHelper.getInstance(file.getProject()).isQualifiedName(name)) {
|
||||
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR)
|
||||
.range(file)
|
||||
.fileLevelAnnotation()
|
||||
.description(JavaErrorBundle.message("error.unnamed.class.has.invalid.file.name"));
|
||||
.description(JavaErrorBundle.message("error.implicit.class.has.invalid.file.name"));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
static HighlightInfo.@Nullable Builder checkInitializersInUnnamedClass(@NotNull PsiClassInitializer initializer) {
|
||||
if (initializer.getContainingClass() instanceof PsiUnnamedClass && HighlightingFeature.UNNAMED_CLASSES.isAvailable(initializer)) {
|
||||
static HighlightInfo.@Nullable Builder checkInitializersInImplicitClass(@NotNull PsiClassInitializer initializer) {
|
||||
if (initializer.getContainingClass() instanceof PsiImplicitClass && HighlightingFeature.IMPLICIT_CLASSES.isAvailable(initializer)) {
|
||||
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(initializer).descriptionAndTooltip(
|
||||
JavaErrorBundle.message("error.initializers.are.not.allowed.in.unnamed.classes"));
|
||||
JavaErrorBundle.message("error.initializers.are.not.allowed.in.implicit.classes"));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
static HighlightInfo.@Nullable Builder checkPackageNotAllowedInUnnamedClass(@NotNull PsiPackageStatement statement,
|
||||
@NotNull PsiFile file) {
|
||||
if (HighlightingFeature.UNNAMED_CLASSES.isAvailable(file) && JavaUnnamedClassUtil.isFileWithUnnamedClass(file)) {
|
||||
static HighlightInfo.@Nullable Builder checkPackageNotAllowedInImplicitClass(@NotNull PsiPackageStatement statement,
|
||||
@NotNull PsiFile file) {
|
||||
if (HighlightingFeature.IMPLICIT_CLASSES.isAvailable(file) && JavaImplicitClassUtil.isFileWithImplicitClass(file)) {
|
||||
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(statement).descriptionAndTooltip(
|
||||
JavaErrorBundle.message("error.package.statement.not.allowed.for.unnamed.class"));
|
||||
JavaErrorBundle.message("error.package.statement.not.allowed.for.implicit.class"));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
+7
-7
@@ -373,8 +373,8 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh
|
||||
@Override
|
||||
public void visitJavaFile(@NotNull PsiJavaFile file) {
|
||||
super.visitJavaFile(file);
|
||||
if (!hasErrorResults()) add(HighlightUnnamedClassUtil.checkUnnamedClassHasMainMethod(file));
|
||||
if (!hasErrorResults()) add(HighlightUnnamedClassUtil.checkUnnamedClassFileIsValidIdentifier(file));
|
||||
if (!hasErrorResults()) add(HighlightImplicitClassUtil.checkImplicitClassHasMainMethod(file));
|
||||
if (!hasErrorResults()) add(HighlightImplicitClassUtil.checkImplicitClassFileIsValidIdentifier(file));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -553,14 +553,14 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh
|
||||
@Override
|
||||
public void visitClassInitializer(@NotNull PsiClassInitializer initializer) {
|
||||
super.visitClassInitializer(initializer);
|
||||
if (!hasErrorResults()) add(HighlightClassUtil.checkUnnamedClassMember(initializer, myLanguageLevel, myFile));
|
||||
if (!hasErrorResults()) add(HighlightClassUtil.checkImplicitClassMember(initializer, myLanguageLevel, myFile));
|
||||
if (!hasErrorResults()) add(HighlightClassUtil.checkIllegalInstanceMemberInRecord(initializer));
|
||||
if (!hasErrorResults()) add(HighlightControlFlowUtil.checkInitializerCompleteNormally(initializer));
|
||||
if (!hasErrorResults()) add(HighlightControlFlowUtil.checkUnreachableStatement(initializer.getBody()));
|
||||
if (!hasErrorResults()) {
|
||||
add(HighlightClassUtil.checkThingNotAllowedInInterface(initializer, initializer.getContainingClass()));
|
||||
}
|
||||
if (!hasErrorResults()) add(HighlightUnnamedClassUtil.checkInitializersInUnnamedClass(initializer));
|
||||
if (!hasErrorResults()) add(HighlightImplicitClassUtil.checkInitializersInImplicitClass(initializer));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -724,7 +724,7 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh
|
||||
@Override
|
||||
public void visitField(@NotNull PsiField field) {
|
||||
super.visitField(field);
|
||||
if (!hasErrorResults()) add(HighlightClassUtil.checkUnnamedClassMember(field, myLanguageLevel, myFile));
|
||||
if (!hasErrorResults()) add(HighlightClassUtil.checkImplicitClassMember(field, myLanguageLevel, myFile));
|
||||
if (!hasErrorResults()) add(HighlightClassUtil.checkIllegalInstanceMemberInRecord(field));
|
||||
if (!hasErrorResults()) add(HighlightControlFlowUtil.checkFinalFieldInitialized(field));
|
||||
}
|
||||
@@ -989,7 +989,7 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh
|
||||
@Override
|
||||
public void visitMethod(@NotNull PsiMethod method) {
|
||||
super.visitMethod(method);
|
||||
if (!hasErrorResults()) add(HighlightClassUtil.checkUnnamedClassMember(method, myLanguageLevel, myFile));
|
||||
if (!hasErrorResults()) add(HighlightClassUtil.checkImplicitClassMember(method, myLanguageLevel, myFile));
|
||||
if (!hasErrorResults()) add(HighlightControlFlowUtil.checkUnreachableStatement(method.getBody()));
|
||||
if (!hasErrorResults()) add(HighlightMethodUtil.checkConstructorHandleSuperClassExceptions(method));
|
||||
if (!hasErrorResults()) add(HighlightMethodUtil.checkRecursiveConstructorInvocation(method));
|
||||
@@ -1147,7 +1147,7 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh
|
||||
if (myLanguageLevel.isAtLeast(LanguageLevel.JDK_1_9)) {
|
||||
if (!hasErrorResults()) add(ModuleHighlightUtil.checkPackageStatement(statement, myFile, myJavaModule));
|
||||
}
|
||||
if (!hasErrorResults()) add(HighlightUnnamedClassUtil.checkPackageNotAllowedInUnnamedClass(statement, myFile));
|
||||
if (!hasErrorResults()) add(HighlightImplicitClassUtil.checkPackageNotAllowedInImplicitClass(statement, myFile));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+1
-1
@@ -95,7 +95,7 @@ public enum HighlightingFeature {
|
||||
return super.isSufficient(useSiteLevel) || LanguageLevel.JDK_21_PREVIEW == useSiteLevel;
|
||||
}
|
||||
},
|
||||
UNNAMED_CLASSES(LanguageLevel.JDK_21_PREVIEW, "feature.unnamed.classes");
|
||||
IMPLICIT_CLASSES(LanguageLevel.JDK_21_PREVIEW, "feature.implicit.classes");
|
||||
|
||||
public static final @NonNls String JDK_INTERNAL_PREVIEW_FEATURE = "jdk.internal.PreviewFeature";
|
||||
public static final @NonNls String JDK_INTERNAL_JAVAC_PREVIEW_FEATURE = "jdk.internal.javac.PreviewFeature";
|
||||
|
||||
+7
-7
@@ -13,10 +13,10 @@ import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
public class MoveMembersIntoClassFix implements ModCommandAction {
|
||||
private final SmartPsiElementPointer<PsiUnnamedClass> myUnnamedClass;
|
||||
private final SmartPsiElementPointer<PsiImplicitClass> myImplicitClass;
|
||||
|
||||
public MoveMembersIntoClassFix(PsiUnnamedClass unnamedClass) {
|
||||
myUnnamedClass = SmartPointerManager.createPointer(unnamedClass);
|
||||
public MoveMembersIntoClassFix(PsiImplicitClass implicitClass) {
|
||||
myImplicitClass = SmartPointerManager.createPointer(implicitClass);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -31,9 +31,9 @@ public class MoveMembersIntoClassFix implements ModCommandAction {
|
||||
|
||||
@Override
|
||||
public @NotNull ModCommand perform(@NotNull ActionContext context) {
|
||||
PsiUnnamedClass unnamedClass = myUnnamedClass.getElement();
|
||||
if (unnamedClass == null) return ModCommand.nop();
|
||||
PsiClass[] innerClasses = unnamedClass.getInnerClasses();
|
||||
PsiImplicitClass implicitClass = myImplicitClass.getElement();
|
||||
if (implicitClass == null) return ModCommand.nop();
|
||||
PsiClass[] innerClasses = implicitClass.getInnerClasses();
|
||||
|
||||
List<? extends ModCommandAction> actionsPerClass = Arrays.stream(innerClasses).map(MoveAllMembersToParticularClassAction::new).toList();
|
||||
|
||||
@@ -50,7 +50,7 @@ public class MoveMembersIntoClassFix implements ModCommandAction {
|
||||
|
||||
@Override
|
||||
protected void invoke(@NotNull ActionContext context, @NotNull PsiClass element, @NotNull ModPsiUpdater updater) {
|
||||
if (!(element.getContainingClass() instanceof PsiUnnamedClass unn)) return;
|
||||
if (!(element.getContainingClass() instanceof PsiImplicitClass unn)) return;
|
||||
PsiMember[] members = PsiTreeUtil.getChildrenOfType(unn, PsiMember.class);
|
||||
if (members == null) return;
|
||||
List<PsiMember> membersWithoutClasses = Arrays.stream(members).filter(member -> !(member instanceof PsiClass)).toList();
|
||||
|
||||
@@ -325,7 +325,7 @@ public abstract class CodeBlockSurrounder {
|
||||
return null;
|
||||
}
|
||||
if (parent instanceof PsiField) {
|
||||
if (parent.getParent() instanceof PsiUnnamedClass) {
|
||||
if (parent.getParent() instanceof PsiImplicitClass) {
|
||||
return null;
|
||||
}
|
||||
return new ExtractFieldInitializerSurrounder(expression, (PsiField)parent);
|
||||
|
||||
@@ -26,7 +26,7 @@ public class BasicFileParser {
|
||||
private final BasicJavaParser myParser;
|
||||
private final AbstractBasicJavaElementTypeFactory.JavaElementTypeContainer myJavaElementTypeContainer;
|
||||
|
||||
private final TokenSet UNNAMED_CLASS_INDICATORS;
|
||||
private final TokenSet IMPLICIT_CLASS_INDICATORS;
|
||||
|
||||
private final WhiteSpaceAndCommentSetHolder myWhiteSpaceAndCommentSetHolder = WhiteSpaceAndCommentSetHolder.INSTANCE;
|
||||
|
||||
@@ -36,7 +36,7 @@ public class BasicFileParser {
|
||||
IMPORT_LIST_STOPPER_SET = TokenSet.orSet(
|
||||
BasicElementTypes.BASIC_MODIFIER_BIT_SET,
|
||||
TokenSet.create(JavaTokenType.CLASS_KEYWORD, JavaTokenType.INTERFACE_KEYWORD, JavaTokenType.ENUM_KEYWORD, JavaTokenType.AT));
|
||||
UNNAMED_CLASS_INDICATORS =
|
||||
IMPLICIT_CLASS_INDICATORS =
|
||||
TokenSet.create(myJavaElementTypeContainer.METHOD, myJavaElementTypeContainer.FIELD, myJavaElementTypeContainer.CLASS_INITIALIZER);
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@ public class BasicFileParser {
|
||||
PsiBuilder.Marker firstDeclaration = null;
|
||||
|
||||
PsiBuilder.Marker invalidElements = null;
|
||||
boolean isUnnamedClass = false;
|
||||
boolean isImplicitClass = false;
|
||||
while (!builder.eof()) {
|
||||
if (builder.getTokenType() == JavaTokenType.SEMICOLON) {
|
||||
builder.advanceLexer();
|
||||
@@ -75,8 +75,8 @@ public class BasicFileParser {
|
||||
if (firstDeclaration == null) {
|
||||
firstDeclaration = declaration;
|
||||
}
|
||||
if (!isUnnamedClass && UNNAMED_CLASS_INDICATORS.contains(exprType(declaration))) {
|
||||
isUnnamedClass = true;
|
||||
if (!isImplicitClass && IMPLICIT_CLASS_INDICATORS.contains(exprType(declaration))) {
|
||||
isImplicitClass = true;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
@@ -96,9 +96,9 @@ public class BasicFileParser {
|
||||
impListInfo.first.setCustomEdgeTokenBinders(myWhiteSpaceAndCommentSetHolder.getPrecedingCommentBinder(), null); // pass comments behind fake import list
|
||||
firstDeclaration.setCustomEdgeTokenBinders(myWhiteSpaceAndCommentSetHolder.getSpecialPrecedingCommentBinder(), null);
|
||||
}
|
||||
if (isUnnamedClass) {
|
||||
if (isImplicitClass) {
|
||||
PsiBuilder.Marker beforeFirst = firstDeclaration.precede();
|
||||
done(beforeFirst, myJavaElementTypeContainer.UNNAMED_CLASS, myWhiteSpaceAndCommentSetHolder);
|
||||
done(beforeFirst, myJavaElementTypeContainer.IMPLICIT_CLASS, myWhiteSpaceAndCommentSetHolder);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -59,7 +59,7 @@ public abstract class AbstractBasicJavaElementTypeFactory {
|
||||
public final IElementType PERMITS_LIST;
|
||||
|
||||
public final IElementType CLASS;
|
||||
public final IElementType UNNAMED_CLASS;
|
||||
public final IElementType IMPLICIT_CLASS;
|
||||
|
||||
public final IElementType ANONYMOUS_CLASS;
|
||||
|
||||
@@ -258,7 +258,7 @@ public abstract class AbstractBasicJavaElementTypeFactory {
|
||||
IElementType RECORD_HEADER,
|
||||
IElementType PERMITS_LIST,
|
||||
IElementType CLASS,
|
||||
IElementType UNNAMED_CLASS,
|
||||
IElementType IMPLICIT_CLASS,
|
||||
IElementType ANONYMOUS_CLASS,
|
||||
IElementType ENUM_CONSTANT_INITIALIZER,
|
||||
IElementType TYPE_PARAMETER_LIST,
|
||||
@@ -371,7 +371,7 @@ public abstract class AbstractBasicJavaElementTypeFactory {
|
||||
this.RECORD_HEADER = RECORD_HEADER;
|
||||
this.PERMITS_LIST = PERMITS_LIST;
|
||||
this.CLASS = CLASS;
|
||||
this.UNNAMED_CLASS = UNNAMED_CLASS;
|
||||
this.IMPLICIT_CLASS = IMPLICIT_CLASS;
|
||||
this.ANONYMOUS_CLASS = ANONYMOUS_CLASS;
|
||||
this.ENUM_CONSTANT_INITIALIZER = ENUM_CONSTANT_INITIALIZER;
|
||||
this.TYPE_PARAMETER_LIST = TYPE_PARAMETER_LIST;
|
||||
|
||||
+1
-1
@@ -32,7 +32,7 @@ import java.util.function.Supplier;
|
||||
public interface BasicJavaElementType {
|
||||
|
||||
IElementType BASIC_CLASS = new IJavaElementType("CLASS");
|
||||
IElementType BASIC_UNNAMED_CLASS = new IJavaElementType("UNNAMED_CLASS");
|
||||
IElementType BASIC_IMPLICIT_CLASS = new IJavaElementType("IMPLICIT_CLASS");
|
||||
IElementType BASIC_ANONYMOUS_CLASS = new IJavaElementType("ANONYMOUS_CLASS");
|
||||
IElementType BASIC_ENUM_CONSTANT_INITIALIZER = new IJavaElementType("ENUM_CONSTANT_INITIALIZER");
|
||||
IElementType BASIC_TYPE_PARAMETER_LIST = new IJavaElementType("TYPE_PARAMETER_LIST", true);
|
||||
|
||||
+6
-6
@@ -119,22 +119,22 @@ public abstract class AbstractBasicClassParsingTest extends AbstractBasicJavaPar
|
||||
doTest(true);
|
||||
}
|
||||
|
||||
public void testUnnamedClass0() {
|
||||
public void testImplicitClass0() {
|
||||
doTest(true);
|
||||
}
|
||||
public void testUnnamedClass1() {
|
||||
public void testImplicitClass1() {
|
||||
doTest(true);
|
||||
}
|
||||
public void testUnnamedClass2() {
|
||||
public void testImplicitClass2() {
|
||||
doTest(true);
|
||||
}
|
||||
public void testUnnamedClass3() {
|
||||
public void testImplicitClass3() {
|
||||
doTest(true);
|
||||
}
|
||||
public void testUnnamedClass4() {
|
||||
public void testImplicitClass4() {
|
||||
doTest(true);
|
||||
}
|
||||
public void testUnnamedClass5() {
|
||||
public void testImplicitClass5() {
|
||||
doTest(true);
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -603,7 +603,7 @@ public class CopyClassesHandler extends CopyHandlerDelegateBase implements DumbA
|
||||
element.getParent() != null &&
|
||||
((PsiClass)element).getContainingClass() == null &&
|
||||
!(element instanceof PsiAnonymousClass) &&
|
||||
!(element instanceof PsiUnnamedClass)) {
|
||||
!(element instanceof PsiImplicitClass)) {
|
||||
break;
|
||||
}
|
||||
element = element.getParent();
|
||||
@@ -615,7 +615,7 @@ public class CopyClassesHandler extends CopyHandlerDelegateBase implements DumbA
|
||||
if (isSynthetic(aClass)) {
|
||||
return null;
|
||||
}
|
||||
if (aClass instanceof PsiUnnamedClass) {
|
||||
if (aClass instanceof PsiImplicitClass) {
|
||||
return null;
|
||||
}
|
||||
buffer.add(aClass);
|
||||
|
||||
+6
-3
@@ -29,7 +29,10 @@ import com.intellij.util.containers.MultiMap;
|
||||
import org.jetbrains.annotations.Nls;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public class ExtractInterfaceHandler implements ElementsHandler, ContextAwareActionHandler {
|
||||
|
||||
@@ -71,8 +74,8 @@ public class ExtractInterfaceHandler implements ElementsHandler, ContextAwareAct
|
||||
return;
|
||||
}
|
||||
|
||||
if (myClass instanceof PsiUnnamedClass) {
|
||||
String message = RefactoringBundle.message("error.interface.cannot.be.extracted.from.unnamed.class");
|
||||
if (myClass instanceof PsiImplicitClass) {
|
||||
String message = RefactoringBundle.message("error.interface.cannot.be.extracted.from.implicit.class");
|
||||
CommonRefactoringUtil.showErrorHint(project, null, message, getRefactoringName(), HelpID.EXTRACT_INTERFACE);
|
||||
return;
|
||||
}
|
||||
|
||||
+2
-2
@@ -70,8 +70,8 @@ public class ExtractSuperclassHandler implements ElementsHandler, ExtractSupercl
|
||||
return;
|
||||
}
|
||||
|
||||
if (mySubclass instanceof PsiUnnamedClass) {
|
||||
String message = RefactoringBundle.message("error.superclass.cannot.be.extracted.from.unnamed.class");
|
||||
if (mySubclass instanceof PsiImplicitClass) {
|
||||
String message = RefactoringBundle.message("error.superclass.cannot.be.extracted.from.implicit.class");
|
||||
CommonRefactoringUtil.showErrorHint(project, null, message, getRefactoringName(), HelpID.EXTRACT_SUPERCLASS);
|
||||
return;
|
||||
}
|
||||
|
||||
+2
-2
@@ -78,8 +78,8 @@ public class ExtractClassHandler implements ElementsHandler, ContextAwareActionH
|
||||
if (!containingClass.getManager().isInProject(containingClass)) {
|
||||
return RefactorJBundle.message("the.selected.class.should.belong.to.project.sources");
|
||||
}
|
||||
if (containingClass instanceof PsiUnnamedClass) {
|
||||
return RefactorJBundle.message("refactoring.cannot.be.done.in.unnamed.class");
|
||||
if (containingClass instanceof PsiImplicitClass) {
|
||||
return RefactorJBundle.message("refactoring.cannot.be.done.in.implicit.class");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
+1
-1
@@ -797,7 +797,7 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor {
|
||||
@Nullable
|
||||
private PsiLocalVariable declareThis(PsiSubstitutor callSubstitutor, PsiCodeBlock block) {
|
||||
PsiClass containingClass = myMethod.getContainingClass();
|
||||
if (myMethod.hasModifierProperty(PsiModifier.STATIC) || containingClass == null || containingClass instanceof PsiUnnamedClass) return null;
|
||||
if (myMethod.hasModifierProperty(PsiModifier.STATIC) || containingClass == null || containingClass instanceof PsiImplicitClass) return null;
|
||||
PsiType thisType = GenericsUtil.getVariableTypeByExpressionType(myFactory.createType(containingClass, callSubstitutor));
|
||||
String thisVarName = new VariableNameGenerator(myMethod.getFirstChild(), VariableKind.LOCAL_VARIABLE)
|
||||
.byType(thisType).byName("self").generate(true);
|
||||
|
||||
+1
-1
@@ -1297,7 +1297,7 @@ public final class JavaCompletionContributor extends CompletionContributor imple
|
||||
|
||||
if (PsiUtilCore.getElementType(at) == JavaTokenType.LPARENTH &&
|
||||
PsiTreeUtil.getParentOfType(ref, PsiExpression.class, PsiClass.class) == null &&
|
||||
PsiTreeUtil.getParentOfType(at, PsiUnnamedClass.class) == null) { // TODO check before it that there is record
|
||||
PsiTreeUtil.getParentOfType(at, PsiImplicitClass.class) == null) { // TODO check before it that there is record
|
||||
// looks like a method declaration, e.g. StringBui<caret>methodName() inside a class
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -6,13 +6,13 @@ import com.intellij.modcommand.ActionContext;
|
||||
import com.intellij.modcommand.ModPsiUpdater;
|
||||
import com.intellij.modcommand.PsiUpdateModCommandAction;
|
||||
import com.intellij.psi.JavaPsiFacade;
|
||||
import com.intellij.psi.PsiImplicitClass;
|
||||
import com.intellij.psi.PsiMethod;
|
||||
import com.intellij.psi.PsiTypes;
|
||||
import com.intellij.psi.PsiUnnamedClass;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class AddMainMethodFix extends PsiUpdateModCommandAction<PsiUnnamedClass> {
|
||||
public AddMainMethodFix(@NotNull PsiUnnamedClass element) {
|
||||
public class AddMainMethodFix extends PsiUpdateModCommandAction<PsiImplicitClass> {
|
||||
public AddMainMethodFix(@NotNull PsiImplicitClass element) {
|
||||
super(element);
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ public class AddMainMethodFix extends PsiUpdateModCommandAction<PsiUnnamedClass>
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void invoke(@NotNull ActionContext context, @NotNull PsiUnnamedClass element, @NotNull ModPsiUpdater updater) {
|
||||
protected void invoke(@NotNull ActionContext context, @NotNull PsiImplicitClass element, @NotNull ModPsiUpdater updater) {
|
||||
PsiMethod mainMethod = JavaPsiFacade.getInstance(context.project()).getElementFactory().createMethod("main", PsiTypes.voidType());
|
||||
element.add(mainMethod);
|
||||
}
|
||||
|
||||
+2
-2
@@ -1225,7 +1225,7 @@ public final class QuickFixFactoryImpl extends QuickFixFactory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull IntentionAction createAddMainMethodFix(@NotNull PsiUnnamedClass unnamedClass) {
|
||||
return new AddMainMethodFix(unnamedClass).asIntention();
|
||||
public @NotNull IntentionAction createAddMainMethodFix(@NotNull PsiImplicitClass implicitClass) {
|
||||
return new AddMainMethodFix(implicitClass).asIntention();
|
||||
}
|
||||
}
|
||||
|
||||
+4
-5
@@ -20,7 +20,7 @@ import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.impl.PsiImplUtil;
|
||||
import com.intellij.psi.util.ClassUtil;
|
||||
import com.intellij.psi.util.JavaUnnamedClassUtil;
|
||||
import com.intellij.psi.util.JavaImplicitClassUtil;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -170,10 +170,9 @@ public class ClassesTreeStructureProvider implements SelectableTreeStructureProv
|
||||
PsiFile value = getValue();
|
||||
if (value instanceof PsiClassOwner) {
|
||||
ViewSettings settings = getSettings();
|
||||
|
||||
PsiUnnamedClass unnamedClass = JavaUnnamedClassUtil.getUnnamedClassFor(value);
|
||||
if (unnamedClass != null) {
|
||||
result.addAll(ClassTreeNode.computeChildren(unnamedClass, settings, myProject, true));
|
||||
PsiImplicitClass implicitClass = JavaImplicitClassUtil.getImplicitClassFor(value);
|
||||
if (implicitClass != null) {
|
||||
result.addAll(ClassTreeNode.computeChildren(implicitClass, settings, myProject, true));
|
||||
} else {
|
||||
for (PsiClass aClass : ((PsiClassOwner)value).getClasses()) {
|
||||
if (!(aClass instanceof SyntheticElement)) {
|
||||
|
||||
@@ -186,7 +186,7 @@ public abstract class AbstractJavaBlock extends AbstractBlock implements JavaBlo
|
||||
return new PartialWhitespaceBlock(child, range, wrap, alignment, actualIndent, settings, javaSettings, myFormattingMode);
|
||||
}
|
||||
|
||||
if (childPsi instanceof PsiUnnamedClass) {
|
||||
if (childPsi instanceof PsiImplicitClass) {
|
||||
return new SimpleJavaBlock(child, wrap, alignmentStrategy, Indent.getNoneIndent(), settings, javaSettings, formattingMode);
|
||||
}
|
||||
if (childPsi instanceof PsiClass || childPsi instanceof PsiJavaModule) {
|
||||
@@ -370,7 +370,7 @@ public abstract class AbstractJavaBlock extends AbstractBlock implements JavaBlo
|
||||
if (parentType == JavaElementType.IMPORT_LIST) return Indent.getNoneIndent();
|
||||
if (parentType == JavaElementType.FIELD) return Indent.getContinuationWithoutFirstIndent(indentOptions.USE_RELATIVE_INDENTS);
|
||||
if (parentType == JavaElementType.EXPRESSION_STATEMENT) return Indent.getNoneIndent();
|
||||
if (parentType == JavaElementType.UNNAMED_CLASS) return Indent.getNoneIndent();
|
||||
if (parentType == JavaElementType.IMPLICIT_CLASS) return Indent.getNoneIndent();
|
||||
if (SourceTreeToPsiMap.treeElementToPsi(parent) instanceof PsiFile) {
|
||||
return Indent.getNoneIndent();
|
||||
}
|
||||
|
||||
@@ -289,8 +289,8 @@ public final class IntroduceVariableUtil {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (topLevelExpression.getParent() instanceof PsiField f && f.getParent() instanceof PsiUnnamedClass) {
|
||||
return JavaRefactoringBundle.message("introduce.variable.message.cannot.extract.in.unnamed.class");
|
||||
if (topLevelExpression.getParent() instanceof PsiField f && f.getParent() instanceof PsiImplicitClass) {
|
||||
return JavaRefactoringBundle.message("introduce.variable.message.cannot.extract.in.implicit.class");
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
||||
@@ -34,8 +34,8 @@ public class JavaUsageViewDescriptionProvider implements ElementDescriptionProvi
|
||||
boolean isStatic = initializer.hasModifierProperty(PsiModifier.STATIC);
|
||||
return isStatic ? CLINIT : INIT;
|
||||
}
|
||||
else if (element instanceof PsiUnnamedClass unnamedClass) {
|
||||
return unnamedClass.getContainingFile().getName();
|
||||
else if (element instanceof PsiImplicitClass implicitClass) {
|
||||
return implicitClass.getContainingFile().getName();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -16,9 +16,9 @@
|
||||
package com.siyeh.ig.naming;
|
||||
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.psi.PsiImplicitClass;
|
||||
import com.intellij.psi.PsiMethod;
|
||||
import com.intellij.psi.PsiModifier;
|
||||
import com.intellij.psi.PsiUnnamedClass;
|
||||
import com.intellij.psi.util.PsiMethodUtil;
|
||||
import com.siyeh.HardcodedMethodConstants;
|
||||
import com.siyeh.InspectionGadgetsBundle;
|
||||
@@ -68,7 +68,7 @@ public class ConfusingMainMethodInspection extends BaseInspection {
|
||||
return;
|
||||
}
|
||||
PsiClass containingClass = method.getContainingClass();
|
||||
if (!(containingClass instanceof PsiUnnamedClass) && containingClass != null && containingClass.getQualifiedName() == null) {
|
||||
if (!(containingClass instanceof PsiImplicitClass) && containingClass != null && containingClass.getQualifiedName() == null) {
|
||||
registerMethodError(method, Boolean.TRUE); // main method not runnable
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ the.selected.class.is.an.annotation.type=The selected class is an annotation int
|
||||
the.refactoring.is.not.supported.on.non.static.inner.classes=The refactoring is not supported on non-static inner classes.
|
||||
the.selected.class.has.no.members.to.extract=The selected class has no members to extract.
|
||||
the.selected.class.should.belong.to.project.sources=The selected class should belong to project sources
|
||||
refactoring.cannot.be.done.in.unnamed.class=Refactoring cannot be done in unnamed class
|
||||
refactoring.cannot.be.done.in.implicit.class=Refactoring cannot be done in implicitly declared class
|
||||
references.to.extract=References to extract ( {0, choice, 0#(Not found)|1#{0} reference|2#{0} references}{1, choice, 0#|1# in {1} file|2# in {1} files})
|
||||
extract.class.as.enum.column.title=As Enum
|
||||
extract.class.depends.on.0.from.1.tooltip=Depends on {0} from {1}
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
<stubIndex implementation="com.intellij.psi.impl.java.stubs.index.JavaFieldNameIndex"/>
|
||||
<stubIndex implementation="com.intellij.psi.impl.java.stubs.index.JavaAnonymousClassBaseRefOccurenceIndex"/>
|
||||
<stubIndex implementation="com.intellij.psi.impl.java.stubs.index.JavaAnnotationIndex"/>
|
||||
<stubIndex implementation="com.intellij.psi.impl.java.stubs.index.JavaUnnamedClassIndex"/>
|
||||
<stubIndex implementation="com.intellij.psi.impl.java.stubs.index.JavaImplicitClassIndex"/>
|
||||
<java.shortNamesCache implementation="com.intellij.psi.impl.PsiShortNamesCacheImpl"/>
|
||||
<java.staticMethodNamesCache implementation="com.intellij.psi.impl.JavaStaticMethodNameCacheImpl" order="first"/>
|
||||
<projectService serviceInterface="com.intellij.psi.search.PsiShortNamesCache"
|
||||
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
|
||||
package com.intellij.psi.impl.java.stubs.index;
|
||||
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.psi.PsiImplicitClass;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import com.intellij.psi.stubs.StringStubIndexExtension;
|
||||
import com.intellij.psi.stubs.StubIndex;
|
||||
import com.intellij.psi.stubs.StubIndexKey;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
public class JavaImplicitClassIndex extends StringStubIndexExtension<PsiImplicitClass> {
|
||||
private static final JavaImplicitClassIndex ourInstance = new JavaImplicitClassIndex();
|
||||
|
||||
public static JavaImplicitClassIndex getInstance() {
|
||||
return ourInstance;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull StubIndexKey<String, PsiImplicitClass> getKey() {
|
||||
return JavaStubIndexKeys.IMPLICIT_CLASSES;
|
||||
}
|
||||
|
||||
public Collection<String> getAllClasses(@NotNull Project project) {
|
||||
return StubIndex.getInstance().getAllKeys(getKey(), project);
|
||||
}
|
||||
|
||||
public @NotNull Collection<PsiImplicitClass> getElements(@NotNull String key,
|
||||
@NotNull Project project,
|
||||
@Nullable GlobalSearchScope scope) {
|
||||
return StubIndex.getElements(JavaStubIndexKeys.IMPLICIT_CLASSES, key, project, scope, PsiImplicitClass.class);
|
||||
}
|
||||
}
|
||||
-34
@@ -1,34 +0,0 @@
|
||||
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
|
||||
package com.intellij.psi.impl.java.stubs.index;
|
||||
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.psi.PsiUnnamedClass;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import com.intellij.psi.stubs.StringStubIndexExtension;
|
||||
import com.intellij.psi.stubs.StubIndex;
|
||||
import com.intellij.psi.stubs.StubIndexKey;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
public class JavaUnnamedClassIndex extends StringStubIndexExtension<PsiUnnamedClass> {
|
||||
private static final JavaUnnamedClassIndex ourInstance = new JavaUnnamedClassIndex();
|
||||
|
||||
public static JavaUnnamedClassIndex getInstance() {
|
||||
return ourInstance;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull StubIndexKey<String, PsiUnnamedClass> getKey() {
|
||||
return JavaStubIndexKeys.UNNAMED_CLASSES;
|
||||
}
|
||||
|
||||
public Collection<String> getAllClasses(@NotNull Project project) {
|
||||
return StubIndex.getInstance().getAllKeys(getKey(), project);
|
||||
}
|
||||
|
||||
public @NotNull Collection<PsiUnnamedClass> getElements(@NotNull String key, @NotNull Project project, @Nullable GlobalSearchScope scope) {
|
||||
return StubIndex.getElements(JavaStubIndexKeys.UNNAMED_CLASSES, key, project, scope, PsiUnnamedClass.class);
|
||||
}
|
||||
}
|
||||
@@ -185,6 +185,10 @@ public abstract class JavaElementVisitor extends PsiElementVisitor {
|
||||
visitStatement(statement);
|
||||
}
|
||||
|
||||
public void visitImplicitClass(@NotNull PsiImplicitClass aClass) {
|
||||
visitClass(aClass);
|
||||
}
|
||||
|
||||
public void visitImplicitVariable(@NotNull ImplicitVariable variable) {
|
||||
visitLocalVariable(variable);
|
||||
}
|
||||
@@ -480,10 +484,6 @@ public abstract class JavaElementVisitor extends PsiElementVisitor {
|
||||
visitExpression(expression);
|
||||
}
|
||||
|
||||
public void visitUnnamedClass(@NotNull PsiUnnamedClass aClass) {
|
||||
visitClass(aClass);
|
||||
}
|
||||
|
||||
public void visitUnnamedPattern(@NotNull PsiUnnamedPattern pattern) {
|
||||
visitPattern(pattern);
|
||||
}
|
||||
|
||||
+3
-3
@@ -6,12 +6,12 @@ import org.jetbrains.annotations.Contract;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
/**
|
||||
* Represents unnamed class from <a href="https://openjdk.org/jeps/445">JEP 445</a>.
|
||||
* Represents implicitly declared class from <a href="https://openjdk.org/jeps/463">JEP 463</a>.
|
||||
* Please note that it allows a bit more flexibility than the specification itself (e.g., it is allowed not to have the "main" method,
|
||||
* but have at least one member to be considered an unnamed class)
|
||||
* but have at least one member to be considered an implicitly declared class)
|
||||
*/
|
||||
@ApiStatus.Experimental
|
||||
public interface PsiUnnamedClass extends PsiClass {
|
||||
public interface PsiImplicitClass extends PsiClass {
|
||||
@Override
|
||||
@Nullable String getQualifiedName();
|
||||
|
||||
@@ -16,7 +16,7 @@ public final class JavaStubIndexKeys {
|
||||
public static final StubIndexKey<String, PsiClass> CLASS_SHORT_NAMES = StubIndexKey.createIndexKey("java.class.shortname");
|
||||
public static final StubIndexKey<CharSequence, PsiClass> CLASS_FQN = StubIndexKey.createIndexKey("java.class.fqn");
|
||||
public static final StubIndexKey<String, PsiJavaModule> MODULE_NAMES = StubIndexKey.createIndexKey("java.module.name");
|
||||
public static final StubIndexKey<String, PsiUnnamedClass> UNNAMED_CLASSES = StubIndexKey.createIndexKey("java.unnamed.class");
|
||||
public static final StubIndexKey<String, PsiImplicitClass> IMPLICIT_CLASSES = StubIndexKey.createIndexKey("java.unnamed.class"); //preserve old name for index
|
||||
|
||||
private JavaStubIndexKeys() { }
|
||||
}
|
||||
@@ -14,13 +14,13 @@ import com.intellij.psi.impl.java.stubs.index.JavaStubIndexKeys;
|
||||
import com.intellij.psi.impl.source.PsiAnonymousClassImpl;
|
||||
import com.intellij.psi.impl.source.PsiClassImpl;
|
||||
import com.intellij.psi.impl.source.PsiEnumConstantInitializerImpl;
|
||||
import com.intellij.psi.impl.source.PsiUnnamedClassImpl;
|
||||
import com.intellij.psi.impl.source.PsiImplicitClassImpl;
|
||||
import com.intellij.psi.impl.source.tree.JavaDocElementType;
|
||||
import com.intellij.psi.impl.source.tree.JavaElementType;
|
||||
import com.intellij.psi.impl.source.tree.LightTreeUtil;
|
||||
import com.intellij.psi.impl.source.tree.java.AnonymousClassElement;
|
||||
import com.intellij.psi.impl.source.tree.java.EnumConstantInitializerElement;
|
||||
import com.intellij.psi.impl.source.tree.java.UnnamedClassElement;
|
||||
import com.intellij.psi.impl.source.tree.java.ImplicitClassElement;
|
||||
import com.intellij.psi.stubs.IndexSink;
|
||||
import com.intellij.psi.stubs.StubElement;
|
||||
import com.intellij.psi.stubs.StubInputStream;
|
||||
@@ -48,8 +48,8 @@ public abstract class JavaClassElementType extends JavaStubElementType<PsiClassS
|
||||
if (node instanceof AnonymousClassElement) {
|
||||
return new PsiAnonymousClassImpl(node);
|
||||
}
|
||||
if (node instanceof UnnamedClassElement) {
|
||||
return new PsiUnnamedClassImpl(node);
|
||||
if (node instanceof ImplicitClassElement) {
|
||||
return new PsiImplicitClassImpl(node);
|
||||
}
|
||||
|
||||
return new PsiClassImpl(node);
|
||||
@@ -138,18 +138,18 @@ public abstract class JavaClassElementType extends JavaStubElementType<PsiClassS
|
||||
}
|
||||
|
||||
|
||||
boolean isUnnamed = node.getTokenType() == JavaElementType.UNNAMED_CLASS;
|
||||
boolean isImplicit = node.getTokenType() == JavaElementType.IMPLICIT_CLASS;
|
||||
final short flags = PsiClassStubImpl.packFlags(isDeprecatedByComment, isInterface, isEnum, isEnumConst, isAnonymous, isAnnotation,
|
||||
isInQualifiedNew, hasDeprecatedAnnotation, false, false, hasDocComment, isRecord, isUnnamed);
|
||||
final JavaClassElementType type = typeForClass(isAnonymous, isEnumConst, isUnnamed);
|
||||
isInQualifiedNew, hasDeprecatedAnnotation, false, false, hasDocComment, isRecord, isImplicit);
|
||||
final JavaClassElementType type = typeForClass(isAnonymous, isEnumConst, isImplicit);
|
||||
return new PsiClassStubImpl<>(type, parentStub, qualifiedName, name, baseRef, flags);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static JavaClassElementType typeForClass(final boolean anonymous, final boolean enumConst, final boolean unnamedClass) {
|
||||
private static JavaClassElementType typeForClass(final boolean anonymous, final boolean enumConst, final boolean implicitClass) {
|
||||
return enumConst
|
||||
? JavaStubElementTypes.ENUM_CONSTANT_INITIALIZER
|
||||
: unnamedClass ? JavaStubElementTypes.UNNAMED_CLASS
|
||||
: implicitClass ? JavaStubElementTypes.IMPLICIT_CLASS
|
||||
: anonymous ? JavaStubElementTypes.ANONYMOUS_CLASS : JavaStubElementTypes.CLASS;
|
||||
}
|
||||
|
||||
@@ -174,8 +174,8 @@ public abstract class JavaClassElementType extends JavaStubElementType<PsiClassS
|
||||
short flags = dataStream.readShort();
|
||||
boolean isAnonymous = PsiClassStubImpl.isAnonymous(flags);
|
||||
boolean isEnumConst = PsiClassStubImpl.isEnumConstInitializer(flags);
|
||||
boolean isUnnamed = PsiClassStubImpl.isUnnamed(flags);
|
||||
JavaClassElementType type = typeForClass(isAnonymous, isEnumConst, isUnnamed);
|
||||
boolean isImplicit = PsiClassStubImpl.isImplicit(flags);
|
||||
JavaClassElementType type = typeForClass(isAnonymous, isEnumConst, isImplicit);
|
||||
|
||||
if (!isAnonymous) {
|
||||
String name = dataStream.readNameString();
|
||||
|
||||
@@ -12,7 +12,7 @@ import com.intellij.psi.stubs.IndexSink;
|
||||
import com.intellij.psi.stubs.StubBase;
|
||||
import com.intellij.psi.stubs.StubElement;
|
||||
import com.intellij.psi.tree.IStubFileElementType;
|
||||
import com.intellij.psi.util.JavaUnnamedClassUtil;
|
||||
import com.intellij.psi.util.JavaImplicitClassUtil;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@@ -50,18 +50,18 @@ public interface JavaStubElementTypes {
|
||||
}
|
||||
};
|
||||
|
||||
JavaClassElementType UNNAMED_CLASS = new JavaClassElementType("UNNAMED_CLASS", BasicJavaElementType.BASIC_UNNAMED_CLASS) {
|
||||
JavaClassElementType IMPLICIT_CLASS = new JavaClassElementType("IMPLICIT_CLASS", BasicJavaElementType.BASIC_IMPLICIT_CLASS) {
|
||||
@NotNull
|
||||
@Override
|
||||
public ASTNode createCompositeNode() {
|
||||
return new UnnamedClassElement();
|
||||
return new ImplicitClassElement();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void indexStub(@NotNull PsiClassStub stub, @NotNull IndexSink sink) {
|
||||
StubElement parent = stub.getParentStub();
|
||||
if (parent instanceof PsiJavaFileStub) {
|
||||
sink.occurrence(JavaStubIndexKeys.UNNAMED_CLASSES, JavaUnnamedClassUtil.getJvmName(((PsiJavaFileStub)parent).getPsi().getName()));
|
||||
sink.occurrence(JavaStubIndexKeys.IMPLICIT_CLASSES, JavaImplicitClassUtil.getJvmName(((PsiJavaFileStub)parent).getPsi().getName()));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -19,7 +19,7 @@ public interface PsiClassStub<T extends PsiClass> extends PsiMemberStub<T> {
|
||||
return false;
|
||||
}
|
||||
|
||||
default boolean isUnnamed() {
|
||||
default boolean isImplicit() {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ public class SourceStubPsiFactory extends StubPsiFactory {
|
||||
public PsiClass createClass(PsiClassStub stub) {
|
||||
if (stub.isEnumConstantInitializer()) return new PsiEnumConstantInitializerImpl(stub);
|
||||
if (stub.isAnonymous()) return new PsiAnonymousClassImpl(stub);
|
||||
if (stub.isUnnamed()) return new PsiUnnamedClassImpl(stub);
|
||||
if (stub.isImplicit()) return new PsiImplicitClassImpl(stub);
|
||||
return new PsiClassImpl(stub);
|
||||
}
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ public class PsiClassStubImpl<T extends PsiClass> extends StubBase<T> implements
|
||||
private static final int LOCAL_CLASS_INNER = 0x200;
|
||||
private static final int HAS_DOC_COMMENT = 0x400;
|
||||
private static final int RECORD = 0x800;
|
||||
private static final int UNNAMED = 0x1000;
|
||||
private static final int IMPLICIT = 0x1000;
|
||||
|
||||
private final @NotNull TypeInfo myTypeInfo;
|
||||
private final String myQualifiedName;
|
||||
@@ -107,8 +107,8 @@ public class PsiClassStubImpl<T extends PsiClass> extends StubBase<T> implements
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isUnnamed() {
|
||||
return BitUtil.isSet(myFlags, UNNAMED);
|
||||
public boolean isImplicit() {
|
||||
return BitUtil.isSet(myFlags, IMPLICIT);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -120,8 +120,8 @@ public class PsiClassStubImpl<T extends PsiClass> extends StubBase<T> implements
|
||||
return BitUtil.isSet(flags, ENUM_CONSTANT_INITIALIZER);
|
||||
}
|
||||
|
||||
public static boolean isUnnamed(final short flags) {
|
||||
return BitUtil.isSet(flags, UNNAMED);
|
||||
public static boolean isImplicit(final short flags) {
|
||||
return BitUtil.isSet(flags, IMPLICIT);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -199,7 +199,7 @@ public class PsiClassStubImpl<T extends PsiClass> extends StubBase<T> implements
|
||||
boolean localClassInner,
|
||||
boolean hasDocComment,
|
||||
boolean isRecord,
|
||||
boolean isUnnamed) {
|
||||
boolean isImplicit) {
|
||||
short flags = 0;
|
||||
if (isDeprecated) flags |= DEPRECATED;
|
||||
if (isInterface) flags |= INTERFACE;
|
||||
@@ -213,7 +213,7 @@ public class PsiClassStubImpl<T extends PsiClass> extends StubBase<T> implements
|
||||
if (localClassInner) flags |= LOCAL_CLASS_INNER;
|
||||
if (hasDocComment) flags |= HAS_DOC_COMMENT;
|
||||
if (isRecord) flags |= RECORD;
|
||||
if (isUnnamed) flags |= UNNAMED;
|
||||
if (isImplicit) flags |= IMPLICIT;
|
||||
return flags;
|
||||
}
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ import com.intellij.psi.impl.source.tree.JavaElementType;
|
||||
import com.intellij.psi.tree.TokenSet;
|
||||
|
||||
public interface Constants extends ElementType {
|
||||
TokenSet CLASS_BIT_SET = TokenSet.create(JavaElementType.CLASS, JavaElementType.ANONYMOUS_CLASS, JavaElementType.ENUM_CONSTANT_INITIALIZER, JavaElementType.UNNAMED_CLASS);
|
||||
TokenSet CLASS_BIT_SET = TokenSet.create(JavaElementType.CLASS, JavaElementType.ANONYMOUS_CLASS, JavaElementType.ENUM_CONSTANT_INITIALIZER, JavaElementType.IMPLICIT_CLASS);
|
||||
TokenSet FIELD_BIT_SET = TokenSet.create(JavaElementType.FIELD, JavaElementType.ENUM_CONSTANT);
|
||||
TokenSet METHOD_BIT_SET = TokenSet.create(JavaElementType.METHOD, JavaElementType.ANNOTATION_METHOD);
|
||||
TokenSet CLASS_INITIALIZER_BIT_SET = TokenSet.create(JavaElementType.CLASS_INITIALIZER);
|
||||
|
||||
+9
-9
@@ -17,7 +17,7 @@ import com.intellij.psi.scope.PsiScopeProcessor;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import com.intellij.psi.search.LocalSearchScope;
|
||||
import com.intellij.psi.search.SearchScope;
|
||||
import com.intellij.psi.util.JavaUnnamedClassUtil;
|
||||
import com.intellij.psi.util.JavaImplicitClassUtil;
|
||||
import com.intellij.psi.util.PsiUtil;
|
||||
import com.intellij.util.IncorrectOperationException;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -28,14 +28,14 @@ import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
public class PsiUnnamedClassImpl extends JavaStubPsiElement<PsiClassStub<?>> implements PsiUnnamedClass, PsiExtensibleClass {
|
||||
public class PsiImplicitClassImpl extends JavaStubPsiElement<PsiClassStub<?>> implements PsiImplicitClass, PsiExtensibleClass {
|
||||
private final ClassInnerStuffCache myInnersCache = new ClassInnerStuffCache(this);
|
||||
|
||||
public PsiUnnamedClassImpl(@NotNull PsiClassStub<?> stub) {
|
||||
super(stub, JavaStubElementTypes.UNNAMED_CLASS);
|
||||
public PsiImplicitClassImpl(@NotNull PsiClassStub<?> stub) {
|
||||
super(stub, JavaStubElementTypes.IMPLICIT_CLASS);
|
||||
}
|
||||
|
||||
public PsiUnnamedClassImpl(@NotNull ASTNode node) {
|
||||
public PsiImplicitClassImpl(@NotNull ASTNode node) {
|
||||
super(node);
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@ public class PsiUnnamedClassImpl extends JavaStubPsiElement<PsiClassStub<?>> imp
|
||||
public @Nullable String getQualifiedName() {
|
||||
PsiElement parent = getParent();
|
||||
if (parent instanceof PsiJavaFile) {
|
||||
return JavaUnnamedClassUtil.getJvmName(((PsiJavaFile)parent).getName());
|
||||
return JavaImplicitClassUtil.getJvmName(((PsiJavaFile)parent).getName());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@@ -223,7 +223,7 @@ public class PsiUnnamedClassImpl extends JavaStubPsiElement<PsiClassStub<?>> imp
|
||||
|
||||
@Override
|
||||
public PsiElement setName(@NotNull String name) throws IncorrectOperationException {
|
||||
throw new IncorrectOperationException("Unnamed class may have no name");
|
||||
throw new IncorrectOperationException("Implicitly declared class may have no name");
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -284,7 +284,7 @@ public class PsiUnnamedClassImpl extends JavaStubPsiElement<PsiClassStub<?>> imp
|
||||
@Override
|
||||
public void accept(@NotNull PsiElementVisitor visitor) {
|
||||
if (visitor instanceof JavaElementVisitor) {
|
||||
((JavaElementVisitor)visitor).visitUnnamedClass(this);
|
||||
((JavaElementVisitor)visitor).visitImplicitClass(this);
|
||||
}
|
||||
else {
|
||||
visitor.visitElement(this);
|
||||
@@ -307,6 +307,6 @@ public class PsiUnnamedClassImpl extends JavaStubPsiElement<PsiClassStub<?>> imp
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "PsiUnnamedClass";
|
||||
return "PsiImplicitClass";
|
||||
}
|
||||
}
|
||||
@@ -37,7 +37,7 @@ public interface JavaElementType {
|
||||
}
|
||||
|
||||
IElementType CLASS = JavaStubElementTypes.CLASS;
|
||||
IElementType UNNAMED_CLASS = JavaStubElementTypes.UNNAMED_CLASS;
|
||||
IElementType IMPLICIT_CLASS = JavaStubElementTypes.IMPLICIT_CLASS;
|
||||
IElementType ANONYMOUS_CLASS = JavaStubElementTypes.ANONYMOUS_CLASS;
|
||||
IElementType ENUM_CONSTANT_INITIALIZER = JavaStubElementTypes.ENUM_CONSTANT_INITIALIZER;
|
||||
IElementType TYPE_PARAMETER_LIST = JavaStubElementTypes.TYPE_PARAMETER_LIST;
|
||||
|
||||
+1
-1
@@ -47,7 +47,7 @@ public class JavaElementTypeFactory extends AbstractBasicJavaElementTypeFactory
|
||||
JavaElementType.RECORD_HEADER,
|
||||
JavaElementType.PERMITS_LIST,
|
||||
JavaElementType.CLASS,
|
||||
JavaElementType.UNNAMED_CLASS,
|
||||
JavaElementType.IMPLICIT_CLASS,
|
||||
JavaElementType.ANONYMOUS_CLASS,
|
||||
JavaElementType.ENUM_CONSTANT_INITIALIZER,
|
||||
JavaElementType.TYPE_PARAMETER_LIST,
|
||||
|
||||
@@ -265,7 +265,7 @@ public class ClassElement extends CompositeElement implements Constants {
|
||||
return findChildByType(TYPE_PARAMETER_LIST);
|
||||
|
||||
case ChildRole.CLASS_OR_INTERFACE_KEYWORD:
|
||||
if (this instanceof UnnamedClassElement) {
|
||||
if (this instanceof ImplicitClassElement) {
|
||||
return null;
|
||||
}
|
||||
for (ASTNode child = getFirstChildNode(); child != null; child = child.getTreeNext()) {
|
||||
|
||||
+3
-3
@@ -1,8 +1,8 @@
|
||||
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
|
||||
package com.intellij.psi.impl.source.tree.java;
|
||||
|
||||
public class UnnamedClassElement extends ClassElement {
|
||||
public UnnamedClassElement() {
|
||||
super(UNNAMED_CLASS);
|
||||
public class ImplicitClassElement extends ClassElement {
|
||||
public ImplicitClassElement() {
|
||||
super(IMPLICIT_CLASS);
|
||||
}
|
||||
}
|
||||
+12
-12
@@ -4,41 +4,41 @@ package com.intellij.psi.util;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.intellij.psi.PsiImplicitClass;
|
||||
import com.intellij.psi.PsiJavaFile;
|
||||
import com.intellij.psi.PsiUnnamedClass;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public final class JavaUnnamedClassUtil {
|
||||
public static boolean isFileWithUnnamedClass(@NotNull PsiFile file) {
|
||||
public final class JavaImplicitClassUtil {
|
||||
public static boolean isFileWithImplicitClass(@NotNull PsiFile file) {
|
||||
if (file instanceof PsiJavaFile) {
|
||||
PsiJavaFile javaFile = (PsiJavaFile)file;
|
||||
if (getUnnamedClassFor(javaFile) != null) return true;
|
||||
if (getImplicitClassFor(javaFile) != null) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the unnamed class PSI element from the given PsiFile.
|
||||
* Retrieves the implicitly declared class PSI element from the given PsiFile.
|
||||
*
|
||||
* @param file the PsiFile from which to retrieve the unnamed class
|
||||
* @return the unnamed class if found, null otherwise
|
||||
* @param file the PsiFile from which to retrieve the implicitly declared class
|
||||
* @return the implicitly declared class if found, null otherwise
|
||||
*/
|
||||
@Nullable
|
||||
public static PsiUnnamedClass getUnnamedClassFor(@NotNull PsiFile file) {
|
||||
public static PsiImplicitClass getImplicitClassFor(@NotNull PsiFile file) {
|
||||
if (file instanceof PsiJavaFile) {
|
||||
final PsiJavaFile javaFile = (PsiJavaFile)file;
|
||||
PsiClass[] classes = javaFile.getClasses();
|
||||
if (classes.length == 1 && classes[0] instanceof PsiUnnamedClass) {
|
||||
return (PsiUnnamedClass)classes[0];
|
||||
if (classes.length == 1 && classes[0] instanceof PsiImplicitClass) {
|
||||
return (PsiImplicitClass)classes[0];
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param name the name of the unnamed class (might include the ".java" extension)
|
||||
* @return the JVM name of the unnamed class
|
||||
* @param name the name of the implicitly declared class (might include the ".java" extension)
|
||||
* @return the JVM name of the implicitly declared class
|
||||
*/
|
||||
public static String getJvmName(@NotNull String name) {
|
||||
return StringUtil.trimEnd(name, ".java", true);
|
||||
@@ -578,8 +578,8 @@ too.many.array.dimensions=Too many array dimensions
|
||||
error.cannot.infer.pattern.type=Cannot infer pattern type: {0}
|
||||
error.extra.semicolons.between.import.statements.not.allowed=Extra semicolons between import statements are not allowed
|
||||
error.guard.allowed.after.patterns.only=Guard is allowed after patterns only
|
||||
error.unnamed.class.contains.no.main.method=Unnamed class contains no 'main' method
|
||||
error.unnamed.class.has.invalid.file.name=Unnamed class's file name is not a valid identifier
|
||||
error.package.statement.not.allowed.for.unnamed.class=Package statement is not allowed for unnamed class
|
||||
error.initializers.are.not.allowed.in.unnamed.classes=Initializers are not allowed in unnamed classes
|
||||
error.implicit.class.contains.no.main.method=Implicitly declared class contains no 'main' method
|
||||
error.implicit.class.has.invalid.file.name=Implicitly declared class's file name is not a valid identifier
|
||||
error.package.statement.not.allowed.for.implicit.class=Package statement is not allowed for implicitly declared class
|
||||
error.initializers.are.not.allowed.in.implicit.classes=Initializers are not allowed in implicitly declared classes
|
||||
remove.unused.imports.quickfix.text=Remove unused imports
|
||||
+5
-6
@@ -20,8 +20,8 @@ import com.intellij.ide.structureView.impl.common.PsiTreeElementBase;
|
||||
import com.intellij.navigation.ItemPresentation;
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.psi.PsiClassOwner;
|
||||
import com.intellij.psi.PsiUnnamedClass;
|
||||
import com.intellij.psi.util.JavaUnnamedClassUtil;
|
||||
import com.intellij.psi.PsiImplicitClass;
|
||||
import com.intellij.psi.util.JavaImplicitClassUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -45,10 +45,9 @@ public class JavaFileTreeElement extends PsiTreeElementBase<PsiClassOwner> imple
|
||||
PsiClassOwner element = getElement();
|
||||
if (element == null) return Collections.emptyList();
|
||||
PsiClass[] classes = element.getClasses();
|
||||
|
||||
PsiUnnamedClass unnamedClass = JavaUnnamedClassUtil.getUnnamedClassFor(element);
|
||||
if (unnamedClass != null) {
|
||||
return JavaClassTreeElement.getClassChildren(unnamedClass);
|
||||
PsiImplicitClass implicitClass = JavaImplicitClassUtil.getImplicitClassFor(element);
|
||||
if (implicitClass != null) {
|
||||
return JavaClassTreeElement.getClassChildren(implicitClass);
|
||||
}
|
||||
|
||||
ArrayList<StructureViewTreeElement> result = new ArrayList<>();
|
||||
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
<error descr="Implicitly declared classes are not supported at language level '20'">void foo() {
|
||||
|
||||
}</error>
|
||||
|
||||
<error descr="Implicitly declared classes are not supported at language level '20'">String s = "asd";</error>
|
||||
|
||||
<error descr="Implicitly declared classes are not supported at language level '20'">static {
|
||||
|
||||
}</error>
|
||||
|
||||
class A {
|
||||
|
||||
}
|
||||
+1
@@ -0,0 +1 @@
|
||||
<error descr="Implicitly declared class's file name is not a valid identifier">void main() {}</error>
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
<error descr="Initializers are not allowed in implicitly declared classes" textAttributesKey="ERRORS_ATTRIBUTES">static {
|
||||
|
||||
}</error>
|
||||
|
||||
void main() {
|
||||
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
<error descr="Implicitly declared class contains no 'main' method"><error descr="Package statement is not allowed for implicitly declared class">package pack.bar;</error>
|
||||
|
||||
void foo() {
|
||||
|
||||
}</error>
|
||||
-13
@@ -1,13 +0,0 @@
|
||||
<error descr="Unnamed classes are not supported at language level '20'">void foo() {
|
||||
|
||||
}</error>
|
||||
|
||||
<error descr="Unnamed classes are not supported at language level '20'">String s = "asd";</error>
|
||||
|
||||
<error descr="Unnamed classes are not supported at language level '20'">static {
|
||||
|
||||
}</error>
|
||||
|
||||
class A {
|
||||
|
||||
}
|
||||
-1
@@ -1 +0,0 @@
|
||||
<error descr="Unnamed class's file name is not a valid identifier">void main() {}</error>
|
||||
-7
@@ -1,7 +0,0 @@
|
||||
<error descr="Initializers are not allowed in unnamed classes" textAttributesKey="ERRORS_ATTRIBUTES">static {
|
||||
|
||||
}</error>
|
||||
|
||||
void main() {
|
||||
|
||||
}
|
||||
-5
@@ -1,5 +0,0 @@
|
||||
<error descr="Unnamed class contains no 'main' method"><error descr="Package statement is not allowed for unnamed class">package pack.bar;</error>
|
||||
|
||||
void foo() {
|
||||
|
||||
}</error>
|
||||
@@ -1,7 +1,7 @@
|
||||
PsiJavaFile:Errors0.java
|
||||
PsiImportList
|
||||
<empty list>
|
||||
PsiUnnamedClass
|
||||
PsiImplicitClass
|
||||
PsiModifierList:public
|
||||
PsiKeyword:public('public')
|
||||
PsiWhiteSpace(' ')
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
java.FILE
|
||||
IMPORT_LIST
|
||||
<empty list>
|
||||
UNNAMED_CLASS
|
||||
IMPLICIT_CLASS
|
||||
MODIFIER_LIST
|
||||
PUBLIC_KEYWORD
|
||||
WHITE_SPACE
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
PsiJavaFile:ExtraClosingBraceInMethod.java
|
||||
PsiImportList
|
||||
<empty list>
|
||||
PsiUnnamedClass
|
||||
PsiImplicitClass
|
||||
PsiClass:Foo
|
||||
PsiModifierList:
|
||||
<empty list>
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
java.FILE
|
||||
IMPORT_LIST
|
||||
<empty list>
|
||||
UNNAMED_CLASS
|
||||
IMPLICIT_CLASS
|
||||
CLASS
|
||||
MODIFIER_LIST
|
||||
<empty list>
|
||||
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
PsiJavaFile:UnnamedClass0.java
|
||||
PsiJavaFile:ImplicitClass0.java
|
||||
PsiImportList
|
||||
<empty list>
|
||||
PsiUnnamedClass
|
||||
PsiImplicitClass
|
||||
PsiMethod:foo
|
||||
PsiModifierList:
|
||||
<empty list>
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
java.FILE
|
||||
IMPORT_LIST
|
||||
<empty list>
|
||||
UNNAMED_CLASS
|
||||
IMPLICIT_CLASS
|
||||
METHOD
|
||||
MODIFIER_LIST
|
||||
<empty list>
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
PsiJavaFile:UnnamedClass1.java
|
||||
PsiJavaFile:ImplicitClass1.java
|
||||
PsiImportList
|
||||
<empty list>
|
||||
PsiUnnamedClass
|
||||
PsiImplicitClass
|
||||
PsiField:x
|
||||
PsiModifierList:
|
||||
<empty list>
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
java.FILE
|
||||
IMPORT_LIST
|
||||
<empty list>
|
||||
UNNAMED_CLASS
|
||||
IMPLICIT_CLASS
|
||||
FIELD
|
||||
MODIFIER_LIST
|
||||
<empty list>
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
PsiJavaFile:UnnamedClass2.java
|
||||
PsiJavaFile:ImplicitClass2.java
|
||||
PsiImportList
|
||||
<empty list>
|
||||
PsiUnnamedClass
|
||||
PsiImplicitClass
|
||||
PsiClassInitializer
|
||||
PsiModifierList:static
|
||||
PsiKeyword:static('static')
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
java.FILE
|
||||
IMPORT_LIST
|
||||
<empty list>
|
||||
UNNAMED_CLASS
|
||||
IMPLICIT_CLASS
|
||||
CLASS_INITIALIZER
|
||||
MODIFIER_LIST
|
||||
STATIC_KEYWORD
|
||||
+2
-2
@@ -1,4 +1,4 @@
|
||||
PsiJavaFile:UnnamedClass3.java
|
||||
PsiJavaFile:ImplicitClass3.java
|
||||
PsiPackageStatement:pack1.pack2
|
||||
PsiKeyword:package('package')
|
||||
PsiWhiteSpace(' ')
|
||||
@@ -28,7 +28,7 @@ PsiJavaFile:UnnamedClass3.java
|
||||
<empty list>
|
||||
PsiJavaToken:SEMICOLON(';')
|
||||
PsiWhiteSpace('\n\n')
|
||||
PsiUnnamedClass
|
||||
PsiImplicitClass
|
||||
PsiMethod:foo
|
||||
PsiModifierList:
|
||||
<empty list>
|
||||
+1
-1
@@ -28,7 +28,7 @@ java.FILE
|
||||
<empty list>
|
||||
SEMICOLON
|
||||
WHITE_SPACE
|
||||
UNNAMED_CLASS
|
||||
IMPLICIT_CLASS
|
||||
METHOD
|
||||
MODIFIER_LIST
|
||||
<empty list>
|
||||
+2
-2
@@ -1,4 +1,4 @@
|
||||
PsiJavaFile:UnnamedClass4.java
|
||||
PsiJavaFile:ImplicitClass4.java
|
||||
PsiPackageStatement:pack1.pack2
|
||||
PsiKeyword:package('package')
|
||||
PsiWhiteSpace(' ')
|
||||
@@ -28,7 +28,7 @@ PsiJavaFile:UnnamedClass4.java
|
||||
<empty list>
|
||||
PsiJavaToken:SEMICOLON(';')
|
||||
PsiWhiteSpace('\n\n')
|
||||
PsiUnnamedClass
|
||||
PsiImplicitClass
|
||||
PsiClass:A
|
||||
PsiModifierList:
|
||||
<empty list>
|
||||
+1
-1
@@ -28,7 +28,7 @@ java.FILE
|
||||
<empty list>
|
||||
SEMICOLON
|
||||
WHITE_SPACE
|
||||
UNNAMED_CLASS
|
||||
IMPLICIT_CLASS
|
||||
CLASS
|
||||
MODIFIER_LIST
|
||||
<empty list>
|
||||
+2
-2
@@ -1,4 +1,4 @@
|
||||
PsiJavaFile:UnnamedClass5.java
|
||||
PsiJavaFile:ImplicitClass5.java
|
||||
PsiErrorElement:'class' or 'interface' expected
|
||||
PsiKeyword:package('package')
|
||||
PsiWhiteSpace(' ')
|
||||
@@ -6,7 +6,7 @@ PsiJavaFile:UnnamedClass5.java
|
||||
<empty list>
|
||||
PsiJavaToken:SEMICOLON(';')
|
||||
PsiWhiteSpace('\n\n')
|
||||
PsiUnnamedClass
|
||||
PsiImplicitClass
|
||||
PsiModifierList:native
|
||||
PsiKeyword:native('native')
|
||||
PsiErrorElement:Identifier or type expected
|
||||
+1
-1
@@ -6,7 +6,7 @@ java.FILE
|
||||
<empty list>
|
||||
SEMICOLON
|
||||
WHITE_SPACE
|
||||
UNNAMED_CLASS
|
||||
IMPLICIT_CLASS
|
||||
MODIFIER_LIST
|
||||
NATIVE_KEYWORD
|
||||
ERROR_ELEMENT
|
||||
@@ -14,7 +14,7 @@ PsiJavaFile:NoClass.java
|
||||
<empty list>
|
||||
PsiJavaToken:SEMICOLON(';')
|
||||
PsiWhiteSpace('\n\n')
|
||||
PsiUnnamedClass
|
||||
PsiImplicitClass
|
||||
PsiMethod:ClassName
|
||||
PsiModifierList:public
|
||||
PsiKeyword:public('public')
|
||||
|
||||
@@ -14,7 +14,7 @@ java.FILE
|
||||
<empty list>
|
||||
SEMICOLON
|
||||
WHITE_SPACE
|
||||
UNNAMED_CLASS
|
||||
IMPLICIT_CLASS
|
||||
METHOD
|
||||
MODIFIER_LIST
|
||||
PUBLIC_KEYWORD
|
||||
|
||||
+3
-3
@@ -6,9 +6,9 @@ import com.intellij.pom.java.LanguageLevel
|
||||
import com.intellij.testFramework.IdeaTestUtil
|
||||
import com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase
|
||||
|
||||
class UnnamedClassHighlightingTest : LightJavaCodeInsightFixtureTestCase() {
|
||||
class ImplicitClassHighlightingTest : LightJavaCodeInsightFixtureTestCase() {
|
||||
override fun getProjectDescriptor() = JAVA_21
|
||||
override fun getBasePath() = JavaTestUtil.getRelativeJavaTestDataPath() + "/codeInsight/daemonCodeAnalyzer/unnamedClass"
|
||||
override fun getBasePath() = JavaTestUtil.getRelativeJavaTestDataPath() + "/codeInsight/daemonCodeAnalyzer/implicitClass"
|
||||
|
||||
fun testHighlightInsufficientLevel() {
|
||||
IdeaTestUtil.withLevel(module, LanguageLevel.JDK_20, Runnable {
|
||||
@@ -28,7 +28,7 @@ class UnnamedClassHighlightingTest : LightJavaCodeInsightFixtureTestCase() {
|
||||
doTest()
|
||||
}
|
||||
|
||||
fun `testIncorrect unnamed class name with spaces`() {
|
||||
fun `testIncorrect implicit class name with spaces`() {
|
||||
doTest()
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ import com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase
|
||||
|
||||
class MoveMembersFixTest : LightJavaCodeInsightFixtureTestCase() {
|
||||
override fun getProjectDescriptor() = JAVA_21
|
||||
override fun getBasePath() = JavaTestUtil.getRelativeJavaTestDataPath() + "/codeInsight/daemonCodeAnalyzer/unnamedClass"
|
||||
override fun getBasePath() = JavaTestUtil.getRelativeJavaTestDataPath() + "/codeInsight/daemonCodeAnalyzer/implicitClass"
|
||||
|
||||
fun testHighlightInsufficientLevel() {
|
||||
IdeaTestUtil.withLevel(module, LanguageLevel.JDK_20, Runnable {
|
||||
|
||||
+1
-1
@@ -41,7 +41,7 @@ public class UnusedSymbolLocalTest extends DaemonAnalyzerTestCase {
|
||||
public void testInnerUsesSelf() throws Exception { doTest(); }
|
||||
public void testLocalClass() throws Exception { doTest(); }
|
||||
public void testPrivateConstructor() throws Exception { doTest(); }
|
||||
public void testUnnamedClassInstanceMainWithoutParams() {
|
||||
public void testImplicitClassInstanceMainWithoutParams() {
|
||||
IdeaTestUtil.withLevel(myModule, LanguageLevel.JDK_21_PREVIEW, () -> {
|
||||
try {
|
||||
doTest();
|
||||
|
||||
+2
-2
@@ -10,7 +10,7 @@ import java.util.List;
|
||||
|
||||
public class RunLineMarkerJava21Test extends LightJavaCodeInsightFixtureTestCase {
|
||||
|
||||
public void testUnnamedAllowsNonStatic() {
|
||||
public void testImplicitAllowsNonStatic() {
|
||||
IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_21_PREVIEW, () -> {
|
||||
myFixture.configureByText("MainTest.java", """
|
||||
void main<caret>() {
|
||||
@@ -59,7 +59,7 @@ public class RunLineMarkerJava21Test extends LightJavaCodeInsightFixtureTestCase
|
||||
});
|
||||
}
|
||||
|
||||
public void testMainInsideInnerClassInUnnamedClassHasNoGutter() {
|
||||
public void testMainInsideInnerClassInImplicitClassHasNoGutter() {
|
||||
IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_21_PREVIEW, () -> {
|
||||
myFixture.configureByText("MainTest.java", """
|
||||
void foo() {
|
||||
|
||||
+1
-1
@@ -277,7 +277,7 @@ public class UnusedDeclarationInspectionTest extends AbstractUnusedDeclarationTe
|
||||
|
||||
public void testJunitMethodSource() {doTest();}
|
||||
|
||||
public void testUnnamedClass() {
|
||||
public void testImplicitClass() {
|
||||
IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_21_PREVIEW, () -> {
|
||||
doTest();
|
||||
});
|
||||
|
||||
@@ -364,7 +364,7 @@ class B {}"""
|
||||
assertEquals("int", parameter.typeElement!!.text)
|
||||
}
|
||||
|
||||
fun testUnnamedFile() {
|
||||
fun testImplicitFile() {
|
||||
val file = configureFile(
|
||||
"""
|
||||
void myMethod() {
|
||||
@@ -377,17 +377,17 @@ class B {}"""
|
||||
|
||||
int field;
|
||||
""".trimIndent())
|
||||
val unnamedClass = file.classes.single() as PsiUnnamedClass
|
||||
TestCase.assertNull(unnamedClass.name)
|
||||
val method = unnamedClass.methods.single()
|
||||
val implicitClass = file.classes.single() as PsiImplicitClass
|
||||
TestCase.assertNull(implicitClass.name)
|
||||
val method = implicitClass.methods.single()
|
||||
TestCase.assertEquals("myMethod", method.name)
|
||||
val aClass = unnamedClass.innerClasses.single()
|
||||
val aClass = implicitClass.innerClasses.single()
|
||||
TestCase.assertEquals("A", aClass.name)
|
||||
val field = unnamedClass.fields.single()
|
||||
val field = implicitClass.fields.single()
|
||||
TestCase.assertEquals("field", field.name)
|
||||
TestCase.assertEquals(CommonClassNames.JAVA_LANG_OBJECT, unnamedClass.superClass!!.qualifiedName)
|
||||
TestCase.assertEquals("Object", unnamedClass.superClassType!!.name)
|
||||
InheritanceUtil.isInheritor(unnamedClass, CommonClassNames.JAVA_LANG_OBJECT)
|
||||
TestCase.assertEquals(CommonClassNames.JAVA_LANG_OBJECT, implicitClass.superClass!!.qualifiedName)
|
||||
TestCase.assertEquals("Object", implicitClass.superClassType!!.name)
|
||||
InheritanceUtil.isInheritor(implicitClass, CommonClassNames.JAVA_LANG_OBJECT)
|
||||
}
|
||||
|
||||
private fun configureFile(@Language("JAVA") text: String): PsiJavaFile {
|
||||
|
||||
@@ -387,7 +387,7 @@ class JavaStubsTest extends LightJavaCodeInsightFixtureTestCase {
|
||||
def file = myFixture.addFileToProject("a.java", "class A extends B. { int a; }")
|
||||
WriteCommandAction.runWriteCommandAction(project) {
|
||||
def javaFile = file as PsiJavaFile
|
||||
def clazz = (javaFile.classes[0] as PsiUnnamedClass).innerClasses[0]
|
||||
def clazz = (javaFile.classes[0] as PsiImplicitClass).innerClasses[0]
|
||||
clazz.extendsList.referenceElements[0].delete()
|
||||
}
|
||||
PsiTestUtil.checkStubsMatchText(file)
|
||||
@@ -418,7 +418,7 @@ class JavaStubsTest extends LightJavaCodeInsightFixtureTestCase {
|
||||
def file = myFixture.addFileToProject("a.java", "class A extends.ends Foo { int a; }")
|
||||
WriteCommandAction.runWriteCommandAction(project) {
|
||||
def javaFile = file as PsiJavaFile
|
||||
def clazz = (javaFile.classes[0] as PsiUnnamedClass).innerClasses[0]
|
||||
def clazz = (javaFile.classes[0] as PsiImplicitClass).innerClasses[0]
|
||||
clazz.extendsList.add(JavaPsiFacade.getElementFactory(project).createReferenceElementByFQClassName(CommonClassNames.JAVA_LANG_OBJECT, file.resolveScope))
|
||||
}
|
||||
PsiTestUtil.checkStubsMatchText(file)
|
||||
@@ -463,7 +463,8 @@ class JavaStubsTest extends LightJavaCodeInsightFixtureTestCase {
|
||||
assert !(file as PsiFileImpl).contentsLoaded
|
||||
}
|
||||
|
||||
void "test unnamed class"() {
|
||||
void "test implicit class"() {
|
||||
|
||||
def psiFile = myFixture.addFileToProject("a.java", """\
|
||||
void test() {
|
||||
}
|
||||
|
||||
@@ -4117,7 +4117,7 @@ public enum LevelCode {
|
||||
)
|
||||
}
|
||||
|
||||
fun testFormattingUnnamedClassMembers() {
|
||||
fun testFormattingImplicitClassMembers() {
|
||||
doTextTest(
|
||||
"""
|
||||
void before() {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user