[java] Create index for unnamed classes

#IDEA-331209

GitOrigin-RevId: 938f5962a345939221baf00f237a8190a7d7dfa3
This commit is contained in:
Louis Vignier
2023-09-09 13:40:41 +02:00
committed by intellij-monorepo-bot
parent 7efe2b5431
commit 3a824750de
3 changed files with 53 additions and 4 deletions

View File

@@ -37,6 +37,7 @@
<fileBasedIndex implementation="com.intellij.psi.impl.java.stubs.index.JavaSourceModuleNameIndex"/>
<fileBasedIndex implementation="com.intellij.psi.impl.search.JavaNullMethodArgumentIndex"/>
<fileBasedIndex implementation="com.intellij.psi.impl.java.JavaFunctionalExpressionIndex"/>
<fileBasedIndex implementation="com.intellij.psi.impl.java.JavaUnnamedClassIndex"/>
<stubIndex implementation="com.intellij.psi.impl.java.stubs.index.JavaModuleNameIndex"/>
<stubIndex implementation="com.intellij.psi.impl.java.stubs.index.JavaMethodParameterTypesIndex"/>
<stubIndex implementation="com.intellij.psi.impl.java.stubs.index.JavaSuperClassNameOccurenceIndex"/>

View File

@@ -0,0 +1,41 @@
// 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
import com.intellij.ide.highlighter.JavaFileType
import com.intellij.psi.util.JavaUnnamedClassUtil
import com.intellij.util.indexing.*
import com.intellij.util.io.KeyDescriptor
import java.io.DataInput
import java.io.DataOutput
val id: ID<String, Void> = ID.create("java.unnamed.class")
class JavaUnnamedClassIndex: ScalarIndexExtension<String>() {
private object UnnamedClassIndexer: DataIndexer<String, Void, FileContent> {
override fun map(inputData: FileContent): MutableMap<String, Void?> {
return when {
JavaUnnamedClassUtil.isFileWithUnnamedClass(inputData.psiFile) -> {
mutableMapOf(inputData.fileName to null)
}
else -> mutableMapOf()
}
}
}
override fun getName(): ID<String, Void> = id
override fun getIndexer(): DataIndexer<String, Void, FileContent> = UnnamedClassIndexer
override fun getKeyDescriptor(): KeyDescriptor<String> = object: KeyDescriptor<String> {
override fun isEqual(val1: String?, val2: String?): Boolean = val1 == val2
override fun getHashCode(value: String?): Int = value.hashCode()
override fun save(out: DataOutput, value: String?) { if (value != null) { out.writeUTF(value) } }
override fun read(`in`: DataInput): String = `in`.readUTF()
}
override fun getVersion(): Int = 0
override fun getInputFilter(): FileBasedIndex.InputFilter = DefaultFileTypeSpecificInputFilter(JavaFileType.INSTANCE)
override fun dependsOnFileContent(): Boolean = true
}

View File

@@ -6,16 +6,23 @@ import com.intellij.psi.PsiFile;
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) {
if (file instanceof PsiJavaFile) {
PsiJavaFile javaFile = (PsiJavaFile)file;
PsiClass[] classes = javaFile.getClasses();
if (classes.length == 1 && classes[0] instanceof PsiUnnamedClass) {
return true;
}
if (getUnnamedClassFor(javaFile) != null) return true;
}
return false;
}
@Nullable
public static PsiUnnamedClass getUnnamedClassFor(PsiJavaFile javaFile) {
PsiClass[] classes = javaFile.getClasses();
if (classes.length == 1 && classes[0] instanceof PsiUnnamedClass) {
return (PsiUnnamedClass)classes[0];
}
return null;
}
}