Add several subclasses of BinaryVersion

To simplify comparison of expected vs actual versions in the future
This commit is contained in:
Alexander Udalov
2015-12-25 22:44:23 +03:00
parent 4cd2ff040d
commit 2f64680b63
13 changed files with 133 additions and 34 deletions
@@ -21,16 +21,17 @@ import com.intellij.util.indexing.DataIndexer
import com.intellij.util.indexing.FileBasedIndex
import com.intellij.util.indexing.FileContent
import org.jetbrains.kotlin.codegen.AsmUtil.asmDescByFqNameWithoutInnerClasses
import org.jetbrains.kotlin.load.java.AbiVersionUtil
import org.jetbrains.kotlin.load.java.JvmAnnotationNames.*
import org.jetbrains.kotlin.load.java.JvmBytecodeBinaryVersion
import org.jetbrains.kotlin.serialization.deserialization.BinaryVersion
import org.jetbrains.org.objectweb.asm.AnnotationVisitor
import org.jetbrains.org.objectweb.asm.ClassReader
import org.jetbrains.org.objectweb.asm.ClassVisitor
import org.jetbrains.org.objectweb.asm.Opcodes
object KotlinAbiVersionIndex : KotlinAbiVersionIndexBase<KotlinAbiVersionIndex>(KotlinAbiVersionIndex::class.java) {
object KotlinAbiVersionIndex : KotlinAbiVersionIndexBase<KotlinAbiVersionIndex>(
KotlinAbiVersionIndex::class.java, { JvmBytecodeBinaryVersion.create(it) }
) {
override fun getIndexer() = INDEXER
override fun getInputFilter() = FileBasedIndex.InputFilter() { file -> file.fileType == StdFileTypes.CLASS }
@@ -60,7 +61,7 @@ object KotlinAbiVersionIndex : KotlinAbiVersionIndexBase<KotlinAbiVersionIndex>(
return object : AnnotationVisitor(Opcodes.ASM5) {
override fun visit(name: String, value: Any) {
if (name == VERSION_FIELD_NAME && value is IntArray) {
version = BinaryVersion.create(value)
version = JvmBytecodeBinaryVersion.create(value)
}
}
}
@@ -70,7 +71,7 @@ object KotlinAbiVersionIndex : KotlinAbiVersionIndexBase<KotlinAbiVersionIndex>(
if (annotationPresent && version == null) {
// No version at all because the class is too old, or version is set to something weird
version = AbiVersionUtil.INVALID_VERSION
version = JvmBytecodeBinaryVersion.INVALID_VERSION
}
if (version != null) mapOf(version!! to null) else mapOf()
@@ -29,7 +29,10 @@ import java.io.DataOutput
/**
* Important! This is not a stub-based index. And it has its own version
*/
abstract class KotlinAbiVersionIndexBase<T>(private val classOfIndex: Class<T>) : ScalarIndexExtension<BinaryVersion>() {
abstract class KotlinAbiVersionIndexBase<T>(
private val classOfIndex: Class<T>,
private val createBinaryVersion: (IntArray) -> BinaryVersion
) : ScalarIndexExtension<BinaryVersion>() {
override fun getName() = ID.create<BinaryVersion, Void>(classOfIndex.canonicalName)
@@ -40,7 +43,7 @@ abstract class KotlinAbiVersionIndexBase<T>(private val classOfIndex: Class<T>)
override fun read(input: DataInput): BinaryVersion {
val size = DataInputOutputUtil.readINT(input)
return BinaryVersion.create((0..size - 1).map { DataInputOutputUtil.readINT(input) }.toIntArray())
return createBinaryVersion((0..size - 1).map { DataInputOutputUtil.readINT(input) }.toIntArray())
}
override fun save(output: DataOutput, value: BinaryVersion) {
@@ -21,14 +21,15 @@ import com.intellij.util.indexing.DataIndexer
import com.intellij.util.indexing.FileBasedIndex
import com.intellij.util.indexing.FileContent
import org.jetbrains.kotlin.js.JavaScript
import org.jetbrains.kotlin.load.java.AbiVersionUtil
import org.jetbrains.kotlin.serialization.deserialization.BinaryVersion
import org.jetbrains.kotlin.utils.JsBinaryVersion
import org.jetbrains.kotlin.utils.KotlinJavascriptMetadata
import org.jetbrains.kotlin.utils.KotlinJavascriptMetadataUtils
import java.util.*
object KotlinJavaScriptAbiVersionIndex : KotlinAbiVersionIndexBase<KotlinJavaScriptAbiVersionIndex>(KotlinJavaScriptAbiVersionIndex::class.java) {
object KotlinJavaScriptAbiVersionIndex : KotlinAbiVersionIndexBase<KotlinJavaScriptAbiVersionIndex>(
KotlinJavaScriptAbiVersionIndex::class.java, { JsBinaryVersion.create(it) }
) {
override fun getIndexer() = INDEXER
override fun getInputFilter() = FileBasedIndex.InputFilter() { file -> JavaScript.EXTENSION == file.extension }
@@ -46,11 +47,11 @@ object KotlinJavaScriptAbiVersionIndex : KotlinAbiVersionIndexBase<KotlinJavaScr
KotlinJavascriptMetadataUtils.parseMetadata(text, metadataList)
for (metadata in metadataList) {
val version = if (KotlinJavascriptMetadataUtils.isAbiVersionCompatible(metadata.abiVersion)) {
BinaryVersion.create(0, metadata.abiVersion, 0)
JsBinaryVersion.create(0, metadata.abiVersion, 0)
}
else {
// Version is set to something weird
AbiVersionUtil.INVALID_VERSION
JsBinaryVersion.INVALID_VERSION
}
result[version] = null
}