90 lines
3.8 KiB
Kotlin
90 lines
3.8 KiB
Kotlin
/*
|
|
* Copyright 2010-2016 JetBrains s.r.o.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package org.jetbrains.kotlin.allopen
|
|
|
|
import com.intellij.mock.MockProject
|
|
import org.jetbrains.kotlin.allopen.AllOpenCommandLineProcessor.Companion.SUPPORTED_PRESETS
|
|
import org.jetbrains.kotlin.allopen.AllOpenConfigurationKeys.ANNOTATION
|
|
import org.jetbrains.kotlin.allopen.AllOpenConfigurationKeys.PRESET
|
|
import org.jetbrains.kotlin.compiler.plugin.*
|
|
import org.jetbrains.kotlin.config.CompilerConfiguration
|
|
import org.jetbrains.kotlin.config.CompilerConfigurationKey
|
|
import org.jetbrains.kotlin.extensions.DeclarationAttributeAltererExtension
|
|
|
|
object AllOpenConfigurationKeys {
|
|
val ANNOTATION: CompilerConfigurationKey<List<String>> = CompilerConfigurationKey.create("annotation qualified name")
|
|
val PRESET: CompilerConfigurationKey<List<String>> = CompilerConfigurationKey.create("annotation preset")
|
|
}
|
|
|
|
class AllOpenCommandLineProcessor : CommandLineProcessor {
|
|
companion object {
|
|
val SUPPORTED_PRESETS = mapOf(
|
|
"spring" to listOf(
|
|
"org.springframework.stereotype.Component",
|
|
"org.springframework.transaction.annotation.Transactional",
|
|
"org.springframework.scheduling.annotation.Async",
|
|
"org.springframework.cache.annotation.Cacheable",
|
|
"org.springframework.boot.test.context.SpringBootTest",
|
|
"org.springframework.validation.annotation.Validated"
|
|
),
|
|
"quarkus" to listOf(
|
|
"javax.enterprise.context.ApplicationScoped",
|
|
"javax.enterprise.context.RequestScoped"
|
|
),
|
|
"micronaut" to listOf(
|
|
"io.micronaut.aop.Around",
|
|
"io.micronaut.aop.Introduction",
|
|
"io.micronaut.aop.InterceptorBinding",
|
|
"io.micronaut.aop.InterceptorBindingDefinitions"
|
|
)
|
|
)
|
|
|
|
val ANNOTATION_OPTION = CliOption(
|
|
"annotation", "<fqname>", "Annotation qualified names",
|
|
required = false, allowMultipleOccurrences = true
|
|
)
|
|
|
|
val PRESET_OPTION = CliOption(
|
|
"preset", "<name>", "Preset name (${SUPPORTED_PRESETS.keys.joinToString()})",
|
|
required = false, allowMultipleOccurrences = true
|
|
)
|
|
|
|
const val PLUGIN_ID = "org.jetbrains.kotlin.allopen"
|
|
}
|
|
|
|
override val pluginId = PLUGIN_ID
|
|
override val pluginOptions = listOf(ANNOTATION_OPTION, PRESET_OPTION)
|
|
|
|
override fun processOption(option: AbstractCliOption, value: String, configuration: CompilerConfiguration) = when (option) {
|
|
ANNOTATION_OPTION -> configuration.appendList(ANNOTATION, value)
|
|
PRESET_OPTION -> configuration.appendList(PRESET, value)
|
|
else -> throw CliOptionProcessingException("Unknown option: ${option.optionName}")
|
|
}
|
|
}
|
|
|
|
class AllOpenComponentRegistrar : ComponentRegistrar {
|
|
override fun registerProjectComponents(project: MockProject, configuration: CompilerConfiguration) {
|
|
val annotations = configuration.get(ANNOTATION)?.toMutableList() ?: mutableListOf()
|
|
configuration.get(PRESET)?.forEach { preset ->
|
|
SUPPORTED_PRESETS[preset]?.let { annotations += it }
|
|
}
|
|
if (annotations.isEmpty()) return
|
|
|
|
DeclarationAttributeAltererExtension.registerExtension(project, CliAllOpenDeclarationAttributeAltererExtension(annotations))
|
|
}
|
|
}
|