MetaPluginSyntax

interface MetaPluginSyntax : ConfigSyntax, AnalysisSyntax, ResolveSyntax, CodegenSyntax

Functions

additionalSources
Link copied to clipboard
open fun additionalSources(collectAdditionalSourcesAndUpdateConfiguration: CompilerContext.(knownSources: Collection<KtFile>, configuration: CompilerConfiguration, project: Project) -> Collection<KtFile>): CollectAdditionalSources

additionalSources is a function that is invoked before resolution and allows us to provide an additional set of KtFile files. These files will be considered part of the compilation unit alongside the user sources.

analysis
Link copied to clipboard
open fun analysis(doAnalysis: CompilerContext.(project: Project, module: ModuleDescriptor, projectContext: ProjectContext, files: Collection<KtFile>, bindingTrace: BindingTrace, componentProvider: ComponentProvider) -> AnalysisResult?, analysisCompleted: CompilerContext.(project: Project, module: ModuleDescriptor, bindingTrace: BindingTrace, files: Collection<KtFile>) -> AnalysisResult? = Noop.nullable5()): AnalysisHandler

The analysis function allows us to intercept analysis before and after it happens, altering the analysis inputs and outputs. Altering the inputs on @doAnalysis allows us to modify the compiler trees in the AST before they are considered for resolution. This allows us to build the Quote in this phase, which is Arrow Meta's higher level API. Altering the output with analysisCompleted allows us to modify the binding trace and all elements resulting from analysis.

callChecker
Link copied to clipboard
open fun callChecker(check: CompilerContext.(resolvedCall: ResolvedCall<*>, reportOn: PsiElement, context: CallCheckerContext) -> Unit): StorageComponentContainer
codegen
Link copied to clipboard
open fun codegen(applyFunction: CompilerContext.(receiver: StackValue, resolvedCall: ResolvedCall<*>, c: ExpressionCodegenExtension.Context) -> StackValue?, applyProperty: CompilerContext.(receiver: StackValue, resolvedCall: ResolvedCall<*>, c: ExpressionCodegenExtension.Context) -> StackValue?, generateClassSyntheticParts: CompilerContext.(codegen: ImplementationBodyCodegen) -> Unit): Codegen

The codegen function allows us to interact with applyFunction, applyProperty, and generateClassSyntheticParts. Each one of these functions are invoked as the compiled and type checked tree of KtElement and DeclarationDescriptor is processed for codegen. Here, we can alter the bytecode emitted using the Meta ASM DSL. This DSL mirrors the IR DSL offering a match + transform function that allows us to alter the codegen tree.

declarationAttributeAlterer
Link copied to clipboard
open fun declarationAttributeAlterer(refineDeclarationModality: CompilerContext.(modifierListOwner: KtModifierListOwner, declaration: DeclarationDescriptor?, containingDeclaration: DeclarationDescriptor?, currentModality: Modality, bindingContext: BindingContext, isImplicitModality: Boolean) -> Modality?): DeclarationAttributeAlterer
declarationChecker
Link copied to clipboard
open fun declarationChecker(check: CompilerContext.(declaration: KtDeclaration, descriptor: DeclarationDescriptor, context: DeclarationCheckerContext) -> Unit): StorageComponentContainer
enableIr
Link copied to clipboard
open fun enableIr(): ExtensionPhase

The enableIr function enables the Intermediate Representation Backend. The IR Backend is a part of the code generation phase and emits code in the IR format. The IR Format is a tree structure with significant indentation that contains all the information needed to generate bytecode for all platforms the Kotlin programming language targets. When the IR backend is disabled, which is the current default in the Kotlin Compiler, the JVM ASM Backend is used instead.

extraImports
Link copied to clipboard
open fun extraImports(extraImports: CompilerContext.(ktFile: KtFile) -> Collection<KtImportInfo>): ExtraImports

The extraImports function allows the user to provide an additional set of org.jetbrains.kotlin.psi.KtImportInfo imports for each individual KtFile considered as sources. This additional set of imports are taken into account when resolving symbols in the resolution phase of a KtFile.

irAnonymousInitializer
Link copied to clipboard
open fun Meta.irAnonymousInitializer(f: IrUtils.(IrAnonymousInitializer) -> IrStatement?): IRGeneration
irBlock
Link copied to clipboard
open fun Meta.irBlock(f: IrUtils.(IrBlock) -> IrExpression?): IRGeneration
irBlockBody
Link copied to clipboard
open fun Meta.irBlockBody(f: IrUtils.(IrBlockBody) -> IrBody?): IRGeneration
irBody
Link copied to clipboard
open fun Meta.irBody(f: IrUtils.(IrBody) -> IrBody?): IRGeneration
irBranch
Link copied to clipboard
open fun Meta.irBranch(f: IrUtils.(IrBranch) -> IrBranch?): IRGeneration
irBreak
Link copied to clipboard
open fun Meta.irBreak(f: IrUtils.(IrBreak) -> IrExpression?): IRGeneration
irBreakContinue
Link copied to clipboard
open fun Meta.irBreakContinue(f: IrUtils.(IrBreakContinue) -> IrExpression?): IRGeneration
irCall
Link copied to clipboard
open fun Meta.irCall(f: IrUtils.(IrCall) -> IrElement?): IRGeneration
irCallableReference
Link copied to clipboard
open fun Meta.irCallableReference(f: IrUtils.(IrCallableReference<*>) -> IrElement?): IRGeneration
irCatch
Link copied to clipboard
open fun Meta.irCatch(f: IrUtils.(IrCatch) -> IrCatch?): IRGeneration
irClass
Link copied to clipboard
open fun Meta.irClass(f: IrUtils.(IrClass) -> IrStatement?): IRGeneration
irClassReference
Link copied to clipboard
open fun Meta.irClassReference(f: IrUtils.(IrClassReference) -> IrExpression?): IRGeneration
irComposite
Link copied to clipboard
open fun Meta.irComposite(f: IrUtils.(IrComposite) -> IrExpression?): IRGeneration
irConst
Link copied to clipboard
open fun Meta.irConst(f: IrUtils.(IrConst<*>) -> IrExpression?): IRGeneration
irConstructor
Link copied to clipboard
open fun Meta.irConstructor(f: IrUtils.(IrConstructor) -> IrStatement?): IRGeneration
irConstructorCall
Link copied to clipboard
open fun Meta.irConstructorCall(f: IrUtils.(IrConstructorCall) -> IrElement?): IRGeneration
irContainerExpression
Link copied to clipboard
open fun Meta.irContainerExpression(f: IrUtils.(IrContainerExpression) -> IrExpression?): IRGeneration
irContinue
Link copied to clipboard
open fun Meta.irContinue(f: IrUtils.(IrContinue) -> IrExpression?): IRGeneration
irDeclaration
Link copied to clipboard
open fun Meta.irDeclaration(f: IrUtils.(IrDeclaration) -> IrStatement?): IRGeneration
irDeclarationReference
Link copied to clipboard
open fun Meta.irDeclarationReference(f: IrUtils.(IrDeclarationReference) -> IrExpression?): IRGeneration
irDelegatingConstructorCall
Link copied to clipboard
open fun Meta.irDelegatingConstructorCall(f: IrUtils.(IrDelegatingConstructorCall) -> IrElement?): IRGeneration
irDoWhileLoop
Link copied to clipboard
open fun Meta.irDoWhileLoop(f: IrUtils.(IrDoWhileLoop) -> IrExpression?): IRGeneration
irDump
Link copied to clipboard
open fun Meta.irDump(): IRGeneration
irDumpKotlinLike
Link copied to clipboard
open fun Meta.irDumpKotlinLike(options: KotlinLikeDumpOptions = KotlinLikeDumpOptions()): IRGeneration
irDynamicExpression
Link copied to clipboard
open fun Meta.irDynamicExpression(f: IrUtils.(IrDynamicExpression) -> IrExpression?): IRGeneration
irDynamicMemberExpression
Link copied to clipboard
open fun Meta.irDynamicMemberExpression(f: IrUtils.(IrDynamicMemberExpression) -> IrExpression?): IRGeneration
irDynamicOperatorExpression
Link copied to clipboard
open fun Meta.irDynamicOperatorExpression(f: IrUtils.(IrDynamicOperatorExpression) -> IrExpression?): IRGeneration
irElseBranch
Link copied to clipboard
open fun Meta.irElseBranch(f: IrUtils.(IrElseBranch) -> IrElseBranch?): IRGeneration
irEnumConstructorCall
Link copied to clipboard
open fun Meta.irEnumConstructorCall(f: IrUtils.(IrEnumConstructorCall) -> IrElement?): IRGeneration
irEnumEntry
Link copied to clipboard
open fun Meta.irEnumEntry(f: IrUtils.(IrEnumEntry) -> IrStatement?): IRGeneration
irErrorCallExpression
Link copied to clipboard
open fun Meta.irErrorCallExpression(f: IrUtils.(IrErrorCallExpression) -> IrExpression?): IRGeneration
irErrorDeclaration
Link copied to clipboard
open fun Meta.irErrorDeclaration(f: IrUtils.(IrErrorDeclaration) -> IrStatement?): IRGeneration
irErrorExpression
Link copied to clipboard
open fun Meta.irErrorExpression(f: IrUtils.(IrErrorExpression) -> IrExpression?): IRGeneration
irExpression
Link copied to clipboard
open fun Meta.irExpression(f: IrUtils.(IrExpression) -> IrExpression?): IRGeneration
irExpressionBody
Link copied to clipboard
open fun Meta.irExpressionBody(f: IrUtils.(IrExpressionBody) -> IrBody?): IRGeneration
irField
Link copied to clipboard
open fun Meta.irField(f: IrUtils.(IrField) -> IrStatement?): IRGeneration
irFieldAccess
Link copied to clipboard
open fun Meta.irFieldAccess(f: IrUtils.(IrFieldAccessExpression) -> IrExpression?): IRGeneration
irFile
Link copied to clipboard
open fun Meta.irFile(f: IrUtils.(IrFile) -> IrFile?): IRGeneration
irFunction
Link copied to clipboard
open fun Meta.irFunction(f: IrUtils.(IrFunction) -> IrStatement?): IRGeneration
irFunctionAccess
Link copied to clipboard
open fun Meta.irFunctionAccess(f: IrUtils.(IrFunctionAccessExpression) -> IrElement?): IRGeneration
irFunctionReference
Link copied to clipboard
open fun Meta.irFunctionReference(f: IrUtils.(IrFunctionReference) -> IrElement?): IRGeneration
IrGeneration
Link copied to clipboard
open fun IrSyntax.IrGeneration(generate: (compilerContext: CompilerContext, moduleFragment: IrModuleFragment, pluginContext: IrPluginContext) -> Unit): IRGeneration

IR, The intermediate representation format, is a structured text format with significant indentation that contains all the information the compiler knows about a program. At this point, the compiler knows the structure of a program based on its sources, what the typed expressions are, and how each of the generic type arguments gets applied. The compiler emits information in this phase that is processed by interpreters and compilers targeting any platform. IR Example

irGetClass
Link copied to clipboard
open fun Meta.irGetClass(f: IrUtils.(IrGetClass) -> IrExpression?): IRGeneration
irGetEnumValue
Link copied to clipboard
open fun Meta.irGetEnumValue(f: IrUtils.(IrGetEnumValue) -> IrExpression?): IRGeneration
irGetField
Link copied to clipboard
open fun Meta.irGetField(f: IrUtils.(IrGetField) -> IrExpression?): IRGeneration
irGetObjectValue
Link copied to clipboard
open fun Meta.irGetObjectValue(f: IrUtils.(IrGetObjectValue) -> IrExpression?): IRGeneration
irGetValue
Link copied to clipboard
open fun Meta.irGetValue(f: IrUtils.(IrGetValue) -> IrExpression?): IRGeneration
irInstanceInitializerCall
Link copied to clipboard
open fun Meta.irInstanceInitializerCall(f: IrUtils.(IrInstanceInitializerCall) -> IrExpression?): IRGeneration
irLocalDelegatedProperty
Link copied to clipboard
open fun Meta.irLocalDelegatedProperty(f: IrUtils.(IrLocalDelegatedProperty) -> IrStatement?): IRGeneration
irLocalDelegatedPropertyReference
Link copied to clipboard
open fun Meta.irLocalDelegatedPropertyReference(f: IrUtils.(IrLocalDelegatedPropertyReference) -> IrElement?): IRGeneration
irLoop
Link copied to clipboard
open fun Meta.irLoop(f: IrUtils.(IrLoop) -> IrExpression?): IRGeneration
irMemberAccess
Link copied to clipboard
open fun Meta.irMemberAccess(f: IrUtils.(IrMemberAccessExpression<*>) -> IrElement?): IRGeneration
irModuleFragment
Link copied to clipboard
open fun Meta.irModuleFragment(f: IrUtils.(IrModuleFragment) -> IrModuleFragment?): IRGeneration
irProperty
Link copied to clipboard
open fun Meta.irProperty(f: IrUtils.(IrProperty) -> IrStatement?): IRGeneration
irPropertyReference
Link copied to clipboard
open fun Meta.irPropertyReference(f: IrUtils.(IrPropertyReference) -> IrElement?): IRGeneration
irReturn
Link copied to clipboard
open fun Meta.irReturn(f: IrUtils.(IrReturn) -> IrExpression?): IRGeneration
irSetField
Link copied to clipboard
open fun Meta.irSetField(f: IrUtils.(IrSetField) -> IrExpression?): IRGeneration
irSetValue
Link copied to clipboard
open fun Meta.irSetValue(f: IrUtils.(IrSetValue) -> IrExpression?): IRGeneration
irSimpleFunction
Link copied to clipboard
open fun Meta.irSimpleFunction(f: IrUtils.(IrSimpleFunction) -> IrStatement?): IRGeneration
irSingletonReference
Link copied to clipboard
open fun Meta.irSingletonReference(f: IrUtils.(IrGetSingletonValue) -> IrExpression?): IRGeneration
irSpreadElement
Link copied to clipboard
open fun Meta.irSpreadElement(f: IrUtils.(IrSpreadElement) -> IrSpreadElement?): IRGeneration
irStringConcatenation
Link copied to clipboard
open fun Meta.irStringConcatenation(f: IrUtils.(IrStringConcatenation) -> IrExpression?): IRGeneration
irSuspendableExpression
Link copied to clipboard
open fun Meta.irSuspendableExpression(f: IrUtils.(IrSuspendableExpression) -> IrExpression?): IRGeneration
irSuspensionPoint
Link copied to clipboard
open fun Meta.irSuspensionPoint(f: IrUtils.(IrSuspensionPoint) -> IrExpression?): IRGeneration
irSyntheticBody
Link copied to clipboard
open fun Meta.irSyntheticBody(f: IrUtils.(IrSyntheticBody) -> IrBody?): IRGeneration
irThrow
Link copied to clipboard
open fun Meta.irThrow(f: IrUtils.(IrThrow) -> IrExpression?): IRGeneration
irTry
Link copied to clipboard
open fun Meta.irTry(f: IrUtils.(IrTry) -> IrExpression?): IRGeneration
irTypeAlias
Link copied to clipboard
open fun Meta.irTypeAlias(f: IrUtils.(IrTypeAlias) -> IrTypeAlias?): IRGeneration
irTypeOperator
Link copied to clipboard
open fun Meta.irTypeOperator(f: IrUtils.(IrTypeOperatorCall) -> IrExpression?): IRGeneration
irTypeParameter
Link copied to clipboard
open fun Meta.irTypeParameter(f: IrUtils.(IrTypeParameter) -> IrStatement?): IRGeneration
irValueAccess
Link copied to clipboard
open fun Meta.irValueAccess(f: IrUtils.(IrValueAccessExpression) -> IrExpression?): IRGeneration
irValueParameter
Link copied to clipboard
open fun Meta.irValueParameter(f: IrUtils.(IrValueParameter) -> IrStatement?): IRGeneration
irVararg
Link copied to clipboard
open fun Meta.irVararg(f: IrUtils.(IrVararg) -> IrExpression?): IRGeneration
irVariable
Link copied to clipboard
open fun Meta.irVariable(f: IrUtils.(IrVariable) -> IrStatement?): IRGeneration
irWhen
Link copied to clipboard
open fun Meta.irWhen(f: IrUtils.(IrWhen) -> IrExpression?): IRGeneration
irWhileLoop
Link copied to clipboard
open fun Meta.irWhileLoop(f: IrUtils.(IrWhileLoop) -> IrExpression?): IRGeneration
packageFragmentProvider
Link copied to clipboard
open fun packageFragmentProvider(getPackageFragmentProvider: CompilerContext.(project: Project, module: ModuleDescriptor, storageManager: StorageManager, trace: BindingTrace, moduleInfo: ModuleInfo?, lookupTracker: LookupTracker) -> PackageFragmentProvider?): PackageProvider

The packageFragmentProvider function allows us to provide synthetic descriptors for declarations of a PackageFragmentDescriptor. A PackageFragmentDescriptor holds all the information about declared members in a package fragment such as top level typealiases, functions, properties, and class-like constructs such as object and interface.

preprocessedVirtualFileFactory
Link copied to clipboard
open fun preprocessedVirtualFileFactory(createPreprocessedFile: CompilerContext.(file: VirtualFile?) -> VirtualFile?, createPreprocessedLightFile: CompilerContext.(file: LightVirtualFile?) -> LightVirtualFile? = Noop.nullable2()): PreprocessedVirtualFileFactory
storageComponent
Link copied to clipboard
open fun storageComponent(registerModuleComponents: CompilerContext.(container: StorageComponentContainer, moduleDescriptor: ModuleDescriptor) -> Unit, check: CompilerContext.(declaration: KtDeclaration, descriptor: DeclarationDescriptor, context: DeclarationCheckerContext) -> Unit = Noop.effect4): StorageComponentContainer

The storageComponent function allows access to the StorageComponentContributor. This is the Dependency Injector and service registry the compiler uses in all phases. In this function, you can register new services or modify existing ones before the container is composed and sealed prior to compilation.

suppressDiagnostic
Link copied to clipboard
open fun suppressDiagnostic(f: (Diagnostic) -> Boolean): ExtensionPhase

The suppressDiagnostic function allows selectively determining whether a diagnostic emitted by the compiler affects compilation. As the compiler performs resolution, it will generate diagnostic of type Diagnostic with different Severity levels: Severity.INFO, Severity.ERROR, and Severity.WARNING. When the suppressDiagnostic returns true, the emitted diagnostic is suppressed and removed from the BindingTrace. This will cause the Diagnostic to not be considered in further compilation phases.

suppressDiagnosticWithTrace
Link copied to clipboard
open fun suppressDiagnosticWithTrace(f: BindingTrace.(Diagnostic) -> Boolean): ExtensionPhase
syntheticResolver
Link copied to clipboard
open fun syntheticResolver(addSyntheticSupertypes: CompilerContext.(thisDescriptor: ClassDescriptor, supertypes: MutableList<KotlinType>) -> Unit = Noop.effect3, generatePackageSyntheticClasses: CompilerContext.(thisDescriptor: PackageFragmentDescriptor, name: Name, ctx: LazyClassContext, declarationProvider: PackageMemberDeclarationProvider, result: MutableSet<ClassDescriptor>) -> Unit = Noop.effect6, generateSyntheticClasses: CompilerContext.(thisDescriptor: ClassDescriptor, name: Name, ctx: LazyClassContext, declarationProvider: ClassMemberDeclarationProvider, result: MutableSet<ClassDescriptor>) -> Unit = Noop.effect6, generateSyntheticMethods: CompilerContext.(thisDescriptor: ClassDescriptor, name: Name, bindingContext: BindingContext, fromSupertypes: List<SimpleFunctionDescriptor>, result: MutableCollection<SimpleFunctionDescriptor>) -> Unit = Noop.effect6, generateSyntheticProperties: CompilerContext.(thisDescriptor: ClassDescriptor, name: Name, bindingContext: BindingContext, ArrayList<PropertyDescriptor>, result: MutableSet<PropertyDescriptor>) -> Unit = Noop.effect6, generateSyntheticSecondaryConstructors: CompilerContext.(thisDescriptor: ClassDescriptor, bindingContext: BindingContext, result: MutableCollection<ClassConstructorDescriptor>) -> Unit = Noop.effect4, getSyntheticCompanionObjectNameIfNeeded: CompilerContext.(thisDescriptor: ClassDescriptor) -> Name? = Noop.nullable2(), getSyntheticFunctionNames: CompilerContext.(thisDescriptor: ClassDescriptor) -> List<Name>? = Noop.nullable2(), getSyntheticNestedClassNames: CompilerContext.(thisDescriptor: ClassDescriptor) -> List<Name>? = Noop.nullable2()): SyntheticResolver

The syntheticResolver extension allows the user to change the top level class and nested class descriptors requested by IntelliJ and some parts of the CLI compiler. This interface will be incomplete if your plugin is producing top level declarations that are typealiases, functions, or properties. For the above cases, we would need to combine it or entirely replace it with a packageFragmentProvider that can provide descriptors for those top level declarations.

syntheticScopes
Link copied to clipboard
open fun syntheticScopes(syntheticConstructor: CompilerContext.(constructor: ConstructorDescriptor) -> ConstructorDescriptor? = Noop.nullable2(), syntheticConstructors: CompilerContext.(classifierDescriptors: Collection<DeclarationDescriptor>) -> Collection<FunctionDescriptor> = Noop.emptyCollection2(), syntheticConstructorsForName: CompilerContext.(contributedClassifier: ClassifierDescriptor, location: LookupLocation) -> Collection<FunctionDescriptor> = Noop.emptyCollection3(), syntheticExtensionProperties: CompilerContext.(receiverTypes: Collection<KotlinType>, location: LookupLocation) -> Collection<PropertyDescriptor> = Noop.emptyCollection3(), syntheticExtensionPropertiesForName: CompilerContext.(receiverTypes: Collection<KotlinType>, name: Name, location: LookupLocation) -> Collection<PropertyDescriptor> = Noop.emptyCollection4(), syntheticMemberFunctions: CompilerContext.(receiverTypes: Collection<KotlinType>) -> Collection<FunctionDescriptor> = Noop.emptyCollection2(), syntheticMemberFunctionsForName: CompilerContext.(receiverTypes: Collection<KotlinType>, name: Name, location: LookupLocation) -> Collection<FunctionDescriptor> = Noop.emptyCollection4(), syntheticStaticFunctions: CompilerContext.(functionDescriptors: Collection<DeclarationDescriptor>) -> Collection<FunctionDescriptor> = Noop.emptyCollection2(), syntheticStaticFunctionsForName: CompilerContext.(contributedFunctions: Collection<FunctionDescriptor>, location: LookupLocation) -> Collection<FunctionDescriptor> = Noop.emptyCollection3()): ExtensionPhase

The syntheticScopes function encapsulates a powerful interface that lets you peak and modify the resolution scope of constructors, extension functions, properties, and static functions. Altering the synthetic scope, we can provide our own descriptors to IntelliJ. These descriptors are required for IntelliJ IDEA to enable synthetic generated code required by IDE features such as autocompletion and code refactoring.

updateConfig
Link copied to clipboard
open fun updateConfig(updateConfiguration: CompilerContext.(configuration: CompilerConfiguration) -> Unit): Config

The updateConfig function provides access to the CompilerConfiguration that contains the map of properties used to enable/disable the different features in compilation.

Inheritors

Meta
Link copied to clipboard