Files
Nikolay Chashnikov 3bf01bc0c5 [platform api] remove ApiStatus.Internal for some extension bean classes (IJPL-172788)
(cherry picked from commit 47053cea099c77568fe1932ef62bfb0c01036a1e)

IJ-CR-150650

GitOrigin-RevId: 840658c19766957ee1e7a58e9df9811558c74abb
2024-12-03 14:24:47 +00:00

89 lines
3.7 KiB
Kotlin

// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.openapi.roots
import com.intellij.jps.impl.JpsIdePluginManagerImpl
import com.intellij.jps.impl.JpsPluginBean
import com.intellij.openapi.Disposable
import com.intellij.openapi.application.runWriteActionAndWait
import com.intellij.openapi.extensions.DefaultPluginDescriptor
import com.intellij.openapi.extensions.PluginId
import com.intellij.openapi.util.Disposer
import com.intellij.openapi.util.io.FileUtil
import com.intellij.util.lang.UrlClassLoader
import org.jdom.Element
import org.jetbrains.jps.model.ex.JpsElementBase
import org.jetbrains.jps.model.ex.JpsElementTypeBase
import org.jetbrains.jps.model.module.JpsModuleSourceRootType
import org.jetbrains.jps.model.serialization.JpsModelSerializerExtension
import org.jetbrains.jps.model.serialization.module.JpsModuleSourceRootPropertiesSerializer
import java.io.File
class TestCustomRootModelSerializerExtension : JpsModelSerializerExtension() {
override fun getModuleSourceRootPropertiesSerializers(): List<JpsModuleSourceRootPropertiesSerializer<*>> =
listOf(TestCustomSourceRootPropertiesSerializer(TestCustomSourceRootType.INSTANCE, TestCustomSourceRootType.TYPE_ID))
companion object {
fun registerTestCustomSourceRootType(tempPluginRoot: File, disposable: Disposable) {
val jpsPluginDisposable = Disposer.newDisposable()
Disposer.register(disposable, Disposable {
runWriteActionAndWait {
Disposer.dispose(jpsPluginDisposable)
}
})
FileUtil.writeToFile(File(tempPluginRoot, "META-INF/services/${JpsModelSerializerExtension::class.java.name}"),
TestCustomRootModelSerializerExtension::class.java.name)
val pluginClassLoader = UrlClassLoader.build()
.parent(TestCustomRootModelSerializerExtension::class.java.classLoader)
.files(listOf(tempPluginRoot.toPath()))
.get()
val pluginDescriptor = DefaultPluginDescriptor(PluginId.getId("com.intellij.custom.source.root.test"), pluginClassLoader)
JpsIdePluginManagerImpl.EP_NAME.point.registerExtension(JpsPluginBean(), pluginDescriptor, jpsPluginDisposable)
}
}
}
class TestCustomSourceRootType private constructor() : JpsElementTypeBase<TestCustomSourceRootProperties>(), JpsModuleSourceRootType<TestCustomSourceRootProperties> {
override fun isForTests(): Boolean = false
override fun createDefaultProperties(): TestCustomSourceRootProperties = TestCustomSourceRootProperties("default properties")
companion object {
val INSTANCE = TestCustomSourceRootType()
const val TYPE_ID = "custom-source-root-type"
}
}
class TestCustomSourceRootProperties(initialTestString: String?) : JpsElementBase<TestCustomSourceRootProperties>() {
var testString: String? = initialTestString
set(value) {
if (value != field) {
field = value
}
}
override fun createCopy(): TestCustomSourceRootProperties {
return TestCustomSourceRootProperties(testString)
}
}
class TestCustomSourceRootPropertiesSerializer(
type: JpsModuleSourceRootType<TestCustomSourceRootProperties>, typeId: String)
: JpsModuleSourceRootPropertiesSerializer<TestCustomSourceRootProperties>(type, typeId) {
override fun loadProperties(sourceRootTag: Element): TestCustomSourceRootProperties {
val testString = sourceRootTag.getAttributeValue("testString")
return TestCustomSourceRootProperties(testString)
}
override fun saveProperties(properties: TestCustomSourceRootProperties, sourceRootTag: Element) {
val testString = properties.testString
if (testString != null) {
sourceRootTag.setAttribute("testString", testString)
}
}
}