Skip to content

Commit 291371c

Browse files
committed
Setup compiler plugin that makes API overloads internal
1 parent c7b1004 commit 291371c

File tree

6 files changed

+95
-0
lines changed

6 files changed

+95
-0
lines changed

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/annotations/Plugin.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,12 @@ public annotation class ScopeProperty
4343

4444
@Target(AnnotationTarget.FUNCTION)
4545
internal annotation class Check
46+
47+
/**
48+
* One of the design goals of the library is typed access to columns.
49+
* That's why all operations that have "column" parameters have 4 overloads: https://kotlin.github.io/dataframe/apilevels.html
50+
* In Kotlin Notebook and in Gradle project with the compiler plugin, Column Accessors API and KProperties API become redundant and
51+
* clutter API scope of DataFrame. This annotation indicates such functions so that they can be excluded from public API
52+
*/
53+
@Target(AnnotationTarget.FUNCTION)
54+
internal annotation class AccessApiOverload

plugins/public-api-modifier/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
## :plugins:public-api-modifier
2+
3+
This plugin makes annotated functions internal.
4+
Helps to produce two artifacts from the same code: one with full API, one with reduced API.
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
plugins {
2+
alias(libs.plugins.kotlin.jvm)
3+
alias(libs.plugins.ktlint)
4+
}
5+
6+
group = "org.jetbrains.kotlinx.dataframe"
7+
8+
repositories {
9+
mavenCentral()
10+
}
11+
12+
dependencies {
13+
compileOnly(libs.kotlin.compiler)
14+
}
15+
16+
sourceSets {
17+
main {
18+
java.setSrcDirs(listOf("src"))
19+
resources.setSrcDirs(listOf("resources"))
20+
}
21+
test {
22+
java.setSrcDirs(listOf("tests", "tests-gen"))
23+
resources.setSrcDirs(listOf("testResources"))
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#
2+
# Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
3+
# Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
4+
#
5+
6+
org.jetbrains.kotlinx.dataframe.PublicApiModifierRegistrar
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package org.jetbrains.kotlinx.dataframe
2+
3+
import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar
4+
import org.jetbrains.kotlin.compiler.plugin.ExperimentalCompilerApi
5+
import org.jetbrains.kotlin.config.CompilerConfiguration
6+
import org.jetbrains.kotlin.descriptors.Visibilities
7+
import org.jetbrains.kotlin.fir.FirSession
8+
import org.jetbrains.kotlin.fir.copy
9+
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
10+
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
11+
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
12+
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar
13+
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrarAdapter
14+
import org.jetbrains.kotlin.fir.extensions.FirStatusTransformerExtension
15+
import org.jetbrains.kotlin.fir.resolve.fqName
16+
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
17+
import org.jetbrains.kotlin.name.FqName
18+
19+
@OptIn(ExperimentalCompilerApi::class)
20+
class PublicApiModifierRegistrar : CompilerPluginRegistrar() {
21+
override val supportsK2: Boolean = true
22+
23+
override fun ExtensionStorage.registerExtensions(configuration: CompilerConfiguration) {
24+
FirExtensionRegistrarAdapter.registerExtension(Extensions())
25+
}
26+
}
27+
28+
class Extensions : FirExtensionRegistrar() {
29+
override fun ExtensionRegistrarContext.configurePlugin() {
30+
+::StatusTransformer
31+
}
32+
}
33+
34+
class StatusTransformer(session: FirSession) : FirStatusTransformerExtension(session) {
35+
companion object {
36+
val apiOverload = FqName("org.jetbrains.kotlinx.dataframe.annotations.AccessApiOverload")
37+
}
38+
39+
override fun needTransformStatus(declaration: FirDeclaration): Boolean =
40+
declaration.annotations.any {
41+
it.fqName(session) == apiOverload
42+
}
43+
44+
override fun transformStatus(
45+
status: FirDeclarationStatus,
46+
function: FirSimpleFunction,
47+
containingClass: FirClassLikeSymbol<*>?,
48+
isLocal: Boolean,
49+
): FirDeclarationStatus = status.copy(visibility = Visibilities.Internal)
50+
}

settings.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,4 @@ include("dataframe-excel")
4343
include("core")
4444
include("dataframe-openapi-generator")
4545
include("dataframe-geo")
46+
include("plugins:public-api-modifier")

0 commit comments

Comments
 (0)