convert to kotlin: KotlinAbiVersionIndex.kt

This commit is contained in:
Michael Nedzelsky
2015-06-08 19:21:16 +03:00
parent cec792c3d3
commit a396222652
@@ -14,139 +14,115 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.kotlin.idea.versions; package org.jetbrains.kotlin.idea.versions
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet
import com.google.common.collect.Maps; import com.google.common.collect.Maps
import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.fileTypes.StdFileTypes
import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.Ref
import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFile
import com.intellij.util.indexing.*; import com.intellij.util.indexing.*
import com.intellij.util.io.ExternalIntegerKeyDescriptor; import com.intellij.util.io.ExternalIntegerKeyDescriptor
import com.intellij.util.io.KeyDescriptor; import com.intellij.util.io.KeyDescriptor
import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.load.java.AbiVersionUtil
import org.jetbrains.kotlin.load.java.AbiVersionUtil; import org.jetbrains.org.objectweb.asm.AnnotationVisitor
import org.jetbrains.org.objectweb.asm.AnnotationVisitor; import org.jetbrains.org.objectweb.asm.ClassReader
import org.jetbrains.org.objectweb.asm.ClassReader; import org.jetbrains.org.objectweb.asm.ClassVisitor
import org.jetbrains.org.objectweb.asm.ClassVisitor; import org.jetbrains.org.objectweb.asm.Opcodes
import org.jetbrains.org.objectweb.asm.Opcodes;
import java.util.Map; import org.jetbrains.kotlin.codegen.AsmUtil.asmDescByFqNameWithoutInnerClasses
import java.util.Set; import org.jetbrains.kotlin.load.java.JvmAnnotationNames.*
import static org.jetbrains.kotlin.codegen.AsmUtil.asmDescByFqNameWithoutInnerClasses;
import static org.jetbrains.kotlin.load.java.JvmAnnotationNames.*;
/** /**
* Important! This is not a stub-based index. And it has its own version * Important! This is not a stub-based index. And it has its own version
*/ */
public class KotlinAbiVersionIndex extends ScalarIndexExtension<Integer> constructor { public class KotlinAbiVersionIndex private constructor() : ScalarIndexExtension<Int>() {
private static final Logger LOG = Logger.getInstance(KotlinAbiVersionIndex.class);
public static final KotlinAbiVersionIndex INSTANCE = new KotlinAbiVersionIndex(); override fun getName(): ID<Int, Void> {
return NAME
private static final int VERSION = 1;
private static final ID<Integer, Void> NAME = ID.create(KotlinAbiVersionIndex.class.getCanonicalName());
private static final ExternalIntegerKeyDescriptor KEY_DESCRIPTOR = new ExternalIntegerKeyDescriptor();
private static final FileBasedIndex.InputFilter INPUT_FILTER = new FileBasedIndex.InputFilter() {
@Override
public boolean acceptInput(VirtualFile file) {
return file.getFileType() == StdFileTypes.CLASS;
} }
};
private static final DataIndexer<Integer, Void, FileContent> INDEXER = new DataIndexer<Integer, Void, FileContent>() { override fun getIndexer(): DataIndexer<Int, Void, FileContent> {
@SuppressWarnings("deprecation") return INDEXER
private final Set<String> kotlinAnnotationsDesc = new ImmutableSet.Builder<String>() }
.add(asmDescByFqNameWithoutInnerClasses(OLD_JET_CLASS_ANNOTATION))
.add(asmDescByFqNameWithoutInnerClasses(OLD_JET_PACKAGE_CLASS_ANNOTATION))
.add(asmDescByFqNameWithoutInnerClasses(OLD_KOTLIN_CLASS))
.add(asmDescByFqNameWithoutInnerClasses(OLD_KOTLIN_PACKAGE))
.add(asmDescByFqNameWithoutInnerClasses(KOTLIN_CLASS))
.add(asmDescByFqNameWithoutInnerClasses(KOTLIN_PACKAGE))
.build();
@NotNull override fun getKeyDescriptor(): KeyDescriptor<Int> {
@Override return KEY_DESCRIPTOR
public Map<Integer, Void> map(FileContent inputData) { }
final Map<Integer, Void> result = Maps.newHashMap();
final Ref<Boolean> annotationPresent = new Ref<Boolean>(false); override fun getInputFilter(): FileBasedIndex.InputFilter {
return INPUT_FILTER
}
override fun dependsOnFileContent(): Boolean {
return true
}
override fun getVersion(): Int {
return VERSION
}
companion object {
private val LOG = Logger.getInstance(javaClass<KotlinAbiVersionIndex>())
public val INSTANCE: KotlinAbiVersionIndex = KotlinAbiVersionIndex()
private val VERSION = 1
private val NAME = ID.create<Int, Void>(javaClass<KotlinAbiVersionIndex>().getCanonicalName())
private val KEY_DESCRIPTOR = ExternalIntegerKeyDescriptor()
private val INPUT_FILTER = object : FileBasedIndex.InputFilter {
override fun acceptInput(file: VirtualFile): Boolean {
return file.getFileType() == StdFileTypes.CLASS
}
}
private val INDEXER = object : DataIndexer<Int, Void, FileContent> {
SuppressWarnings("deprecation")
private val kotlinAnnotationsDesc = ImmutableSet.Builder<String>().add(asmDescByFqNameWithoutInnerClasses(OLD_JET_CLASS_ANNOTATION)).add(asmDescByFqNameWithoutInnerClasses(OLD_JET_PACKAGE_CLASS_ANNOTATION)).add(asmDescByFqNameWithoutInnerClasses(OLD_KOTLIN_CLASS)).add(asmDescByFqNameWithoutInnerClasses(OLD_KOTLIN_PACKAGE)).add(asmDescByFqNameWithoutInnerClasses(KOTLIN_CLASS)).add(asmDescByFqNameWithoutInnerClasses(KOTLIN_PACKAGE)).build()
override fun map(inputData: FileContent): Map<Int, Void> {
val result = Maps.newHashMap<Int, Void>()
val annotationPresent = Ref(false)
try { try {
ClassReader classReader = new ClassReader(inputData.getContent()); val classReader = ClassReader(inputData.getContent())
classReader.accept(new ClassVisitor(Opcodes.ASM5) { classReader.accept(object : ClassVisitor(Opcodes.ASM5) {
@Override override fun visitAnnotation(desc: String, visible: Boolean): AnnotationVisitor? {
public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
if (!kotlinAnnotationsDesc.contains(desc)) { if (!kotlinAnnotationsDesc.contains(desc)) {
return null; return null
} }
annotationPresent.set(true); annotationPresent.set(true)
return new AnnotationVisitor(Opcodes.ASM5) { return object : AnnotationVisitor(Opcodes.ASM5) {
@Override override fun visit(name: String, value: Any) {
public void visit(String name, Object value) { if (ABI_VERSION_FIELD_NAME == name) {
if (ABI_VERSION_FIELD_NAME.equals(name)) { if (value is Int) {
if (value instanceof Integer) { result.put(value, null)
Integer abiVersion = (Integer) value;
result.put(abiVersion, null);
} }
else { else {
// Version is set to something weird // Version is set to something weird
result.put(AbiVersionUtil.INVALID_VERSION, null); result.put(AbiVersionUtil.INVALID_VERSION, null)
} }
} }
} }
};
} }
}, ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES);
} }
catch (Throwable e) { }, ClassReader.SKIP_CODE or ClassReader.SKIP_DEBUG or ClassReader.SKIP_FRAMES)
LOG.warn("Could not index ABI version for file " + inputData.getFile() + ": " + e.getMessage());
} }
catch (e: Throwable) {
LOG.warn("Could not index ABI version for file " + inputData.getFile() + ": " + e.getMessage())
}
if (annotationPresent.get() && result.isEmpty()) { if (annotationPresent.get() && result.isEmpty()) {
// No version at all: the class is too old // No version at all: the class is too old
result.put(AbiVersionUtil.INVALID_VERSION, null); result.put(AbiVersionUtil.INVALID_VERSION, null)
} }
return result; return result
} }
};
private KotlinAbiVersionIndex() {
} }
@NotNull
@Override
public ID<Integer, Void> getName() {
return NAME;
}
@NotNull
@Override
public DataIndexer<Integer, Void, FileContent> getIndexer() {
return INDEXER;
}
@Override
public KeyDescriptor<Integer> getKeyDescriptor() {
return KEY_DESCRIPTOR;
}
@Override
public FileBasedIndex.InputFilter getInputFilter() {
return INPUT_FILTER;
}
@Override
public boolean dependsOnFileContent() {
return true;
}
@Override
public int getVersion() {
return VERSION;
} }
} }