[Plugin API] Provide diagnostic API for IR plugins

This commit is contained in:
Roman Artemev
2021-01-25 23:39:50 +03:00
parent 9fa5feeeea
commit 59551eb037
4 changed files with 25 additions and 3 deletions
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.builders.IrGeneratorContext
import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.util.IrMessageLogger
import org.jetbrains.kotlin.ir.util.ReferenceSymbolTable
import org.jetbrains.kotlin.ir.util.TypeTranslator
import org.jetbrains.kotlin.name.FqName
@@ -36,6 +37,14 @@ interface IrPluginContext : IrGeneratorContext {
val platform: TargetPlatform?
/**
* Returns a logger instance to post diagnostic messages from plugin
*
* @param pluginId the unique plugin ID to make it easy to distinguish in log
* @return the logger associated with specified ID
*/
fun createDiagnosticReporter(pluginId: String): IrMessageLogger
// The following API is experimental
fun referenceClass(fqName: FqName): IrClassSymbol?
fun referenceTypeAlias(fqName: FqName): IrTypeAliasSymbol?
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.ir.declarations.IrConstructor
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
import org.jetbrains.kotlin.ir.linkage.IrDeserializer
import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.util.IrMessageLogger
import org.jetbrains.kotlin.ir.util.ReferenceSymbolTable
import org.jetbrains.kotlin.ir.util.TypeTranslator
import org.jetbrains.kotlin.name.FqName
@@ -33,6 +34,7 @@ open class IrPluginContextImpl constructor(
override val typeTranslator: TypeTranslator,
override val irBuiltIns: IrBuiltIns,
val linker: IrDeserializer,
private val diagnosticReporter: IrMessageLogger,
override val symbols: BuiltinSymbolsBase = BuiltinSymbolsBase(irBuiltIns, irBuiltIns.builtIns, st)
) : IrPluginContext {
@@ -68,6 +70,18 @@ open class IrPluginContextImpl constructor(
return symbol
}
override fun createDiagnosticReporter(pluginId: String): IrMessageLogger {
return object : IrMessageLogger {
override fun report(
severity: IrMessageLogger.Severity,
message: String,
location: IrMessageLogger.Location?
) {
diagnosticReporter.report(severity, "[Plugin $pluginId] $message", location)
}
}
}
private fun <S : IrSymbol> resolveSymbolCollection(fqName: FqName, referencer: (MemberScope) -> Collection<S>): Collection<S> {
val memberScope = resolveMemberScope(fqName) ?: return emptyList()
@@ -21,7 +21,6 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.konan.DeserializedKlibModuleOrigin
import org.jetbrains.kotlin.descriptors.konan.KlibModuleOrigin
import org.jetbrains.kotlin.idea.MainFunctionDetector
import org.jetbrains.kotlin.ir.backend.jvm.serialization.EmptyLoggingContext
import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmIrLinker
import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmManglerDesc
import org.jetbrains.kotlin.ir.builders.TranslationPluginContext
@@ -10,7 +10,6 @@ import com.intellij.openapi.vfs.VfsUtilCore
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.analyzer.AbstractAnalyzerWithCompilerReport
import org.jetbrains.kotlin.analyzer.AnalysisResult
import org.jetbrains.kotlin.backend.common.LoggingContext
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContextImpl
import org.jetbrains.kotlin.backend.common.overrides.FakeOverrideChecker
@@ -328,7 +327,8 @@ fun GeneratorContext.generateModuleFragmentWithPlugins(
symbolTable,
typeTranslator,
irBuiltIns,
linker = irLinker
linker = irLinker,
messageLogger
)
for (extension in extensions) {