From 87c15107041e76f4c68f0c95cca072c0cb69c9f7 Mon Sep 17 00:00:00 2001 From: Ilya Vologin Date: Wed, 26 Jul 2023 16:38:06 +0200 Subject: [PATCH] Added visibility changer --- gradle-plugin-test/build.gradle.kts | 2 +- .../kotlin/test/AllPrimitiveTest.kt | 6 ++--- .../kotlin/test/ClassPrimitiveTest.kt | 8 +++--- .../kotlin/test/FilteringPrimitiveTest.kt | 3 ++- .../kotlin/test/NumbersPrimitiveTest.kt | 3 ++- .../kotlin/test/ObjectPrimitiveTest.kt | 6 ++--- .../kotlin/test/cross/PrimitiveFirst.kt | 6 ++--- .../kotlin/test/cross/PrimitiveSecond.kt | 6 ++--- .../primitives/annotations/MakePublic.kt | 5 ++++ .../generator/PrimitiveGenerator.kt | 14 +++++++++++ .../kinference/primitives/generator/Utils.kt | 3 ++- .../processor/ReplacementProcessor.kt | 25 +++++++++++++++++++ 12 files changed, 67 insertions(+), 20 deletions(-) create mode 100644 primitives-annotations/src/commonMain/kotlin/io/kinference/primitives/annotations/MakePublic.kt diff --git a/gradle-plugin-test/build.gradle.kts b/gradle-plugin-test/build.gradle.kts index db076ca..cdb913d 100644 --- a/gradle-plugin-test/build.gradle.kts +++ b/gradle-plugin-test/build.gradle.kts @@ -25,7 +25,7 @@ kotlin { sourceSets { val commonMain by getting { dependencies { - api("io.kinference.primitives:primitives-annotations:0.1.24") + api("io.kinference.primitives:primitives-annotations:0.1.25-dev-2") } } } diff --git a/gradle-plugin-test/src/commonMain/kotlin/test/AllPrimitiveTest.kt b/gradle-plugin-test/src/commonMain/kotlin/test/AllPrimitiveTest.kt index e15b1de..83d522f 100644 --- a/gradle-plugin-test/src/commonMain/kotlin/test/AllPrimitiveTest.kt +++ b/gradle-plugin-test/src/commonMain/kotlin/test/AllPrimitiveTest.kt @@ -1,12 +1,12 @@ @file:GeneratePrimitives(DataType.ALL) package test -import io.kinference.primitives.annotations.GenerateNameFromPrimitives -import io.kinference.primitives.annotations.GeneratePrimitives +import io.kinference.primitives.annotations.* import io.kinference.primitives.types.DataType import io.kinference.primitives.types.PrimitiveType @GenerateNameFromPrimitives -class AllPrimitiveTest { +@MakePublic +internal class AllPrimitiveTest { val x: PrimitiveType? = null } diff --git a/gradle-plugin-test/src/commonMain/kotlin/test/ClassPrimitiveTest.kt b/gradle-plugin-test/src/commonMain/kotlin/test/ClassPrimitiveTest.kt index d60a845..30a463e 100644 --- a/gradle-plugin-test/src/commonMain/kotlin/test/ClassPrimitiveTest.kt +++ b/gradle-plugin-test/src/commonMain/kotlin/test/ClassPrimitiveTest.kt @@ -1,12 +1,12 @@ @file:GeneratePrimitives(DataType.FLOAT, DataType.INT) package test -import io.kinference.primitives.annotations.GenerateNameFromPrimitives -import io.kinference.primitives.annotations.GeneratePrimitives +import io.kinference.primitives.annotations.* import io.kinference.primitives.types.* @GenerateNameFromPrimitives -class ClassPrimitiveTest { +@MakePublic +internal class ClassPrimitiveTest { val a = PrimitiveType.MIN_VALUE companion object { @@ -16,6 +16,6 @@ class ClassPrimitiveTest { } } -fun ClassPrimitiveTest.v() = Unit +internal fun ClassPrimitiveTest.v() = Unit diff --git a/gradle-plugin-test/src/commonMain/kotlin/test/FilteringPrimitiveTest.kt b/gradle-plugin-test/src/commonMain/kotlin/test/FilteringPrimitiveTest.kt index dd04812..3c5c399 100644 --- a/gradle-plugin-test/src/commonMain/kotlin/test/FilteringPrimitiveTest.kt +++ b/gradle-plugin-test/src/commonMain/kotlin/test/FilteringPrimitiveTest.kt @@ -6,7 +6,8 @@ import io.kinference.primitives.annotations.* import io.kinference.primitives.types.* @GenerateNameFromPrimitives -class FilteringPrimitiveTest { +@MakePublic +internal class FilteringPrimitiveTest { fun all(x: PrimitiveType) : PrimitiveType { val y = x return y diff --git a/gradle-plugin-test/src/commonMain/kotlin/test/NumbersPrimitiveTest.kt b/gradle-plugin-test/src/commonMain/kotlin/test/NumbersPrimitiveTest.kt index 5862c0b..a82d5b2 100644 --- a/gradle-plugin-test/src/commonMain/kotlin/test/NumbersPrimitiveTest.kt +++ b/gradle-plugin-test/src/commonMain/kotlin/test/NumbersPrimitiveTest.kt @@ -8,7 +8,8 @@ import io.kinference.primitives.types.* import io.kinference.primitives.types.toPrimitive @GenerateNameFromPrimitives -class NumbersPrimitiveTest { +@MakePublic +internal class NumbersPrimitiveTest { fun test(): PrimitiveType { val x: PrimitiveType = (0).toPrimitive() val y: PrimitiveType = (x + x).toPrimitive() diff --git a/gradle-plugin-test/src/commonMain/kotlin/test/ObjectPrimitiveTest.kt b/gradle-plugin-test/src/commonMain/kotlin/test/ObjectPrimitiveTest.kt index 9695556..cedc682 100644 --- a/gradle-plugin-test/src/commonMain/kotlin/test/ObjectPrimitiveTest.kt +++ b/gradle-plugin-test/src/commonMain/kotlin/test/ObjectPrimitiveTest.kt @@ -1,12 +1,12 @@ @file:GeneratePrimitives(DataType.NUMBER) package test -import io.kinference.primitives.annotations.GenerateNameFromPrimitives -import io.kinference.primitives.annotations.GeneratePrimitives +import io.kinference.primitives.annotations.* import io.kinference.primitives.types.DataType @GenerateNameFromPrimitives -object ObjectPrimitiveTest { +@MakePublic +internal object ObjectPrimitiveTest { } diff --git a/gradle-plugin-test/src/commonMain/kotlin/test/cross/PrimitiveFirst.kt b/gradle-plugin-test/src/commonMain/kotlin/test/cross/PrimitiveFirst.kt index 7eb687d..466c256 100644 --- a/gradle-plugin-test/src/commonMain/kotlin/test/cross/PrimitiveFirst.kt +++ b/gradle-plugin-test/src/commonMain/kotlin/test/cross/PrimitiveFirst.kt @@ -2,11 +2,11 @@ package test.cross -import io.kinference.primitives.annotations.GenerateNameFromPrimitives -import io.kinference.primitives.annotations.GeneratePrimitives +import io.kinference.primitives.annotations.* import io.kinference.primitives.types.DataType @GenerateNameFromPrimitives -class PrimitiveFirst { +@MakePublic +internal class PrimitiveFirst { val second = PrimitiveSecond() } diff --git a/gradle-plugin-test/src/commonMain/kotlin/test/cross/PrimitiveSecond.kt b/gradle-plugin-test/src/commonMain/kotlin/test/cross/PrimitiveSecond.kt index f0f6b34..a419cef 100644 --- a/gradle-plugin-test/src/commonMain/kotlin/test/cross/PrimitiveSecond.kt +++ b/gradle-plugin-test/src/commonMain/kotlin/test/cross/PrimitiveSecond.kt @@ -2,11 +2,11 @@ package test.cross -import io.kinference.primitives.annotations.GenerateNameFromPrimitives -import io.kinference.primitives.annotations.GeneratePrimitives +import io.kinference.primitives.annotations.* import io.kinference.primitives.types.DataType @GenerateNameFromPrimitives -class PrimitiveSecond { +@MakePublic +internal class PrimitiveSecond { val first = PrimitiveFirst() } diff --git a/primitives-annotations/src/commonMain/kotlin/io/kinference/primitives/annotations/MakePublic.kt b/primitives-annotations/src/commonMain/kotlin/io/kinference/primitives/annotations/MakePublic.kt new file mode 100644 index 0000000..ce679b5 --- /dev/null +++ b/primitives-annotations/src/commonMain/kotlin/io/kinference/primitives/annotations/MakePublic.kt @@ -0,0 +1,5 @@ +package io.kinference.primitives.annotations + +@Target(AnnotationTarget.FUNCTION, AnnotationTarget.CLASS) +@Retention(AnnotationRetention.SOURCE) +annotation class MakePublic() diff --git a/primitives-plugin/kotlin-plugin/src/jvmMain/kotlin/io/kinference/primitives/generator/PrimitiveGenerator.kt b/primitives-plugin/kotlin-plugin/src/jvmMain/kotlin/io/kinference/primitives/generator/PrimitiveGenerator.kt index cc1c646..22731ad 100644 --- a/primitives-plugin/kotlin-plugin/src/jvmMain/kotlin/io/kinference/primitives/generator/PrimitiveGenerator.kt +++ b/primitives-plugin/kotlin-plugin/src/jvmMain/kotlin/io/kinference/primitives/generator/PrimitiveGenerator.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.com.intellij.psi.PsiWhiteSpace import org.jetbrains.kotlin.com.intellij.psi.impl.source.tree.LeafPsiElement import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.visibilityModifier import org.jetbrains.kotlin.resolve.BindingContext import java.io.File @@ -60,6 +61,14 @@ internal class PrimitiveGenerator( primitiveContext = tmp } + override fun visitModifierList(list: KtModifierList) { + if (replacementProcessor.shouldChangeVisibilityModifier(list)) { + replacementProcessor.prepareReplaceText(list.visibilityModifier(), "public") + } + + super.visitModifierList(list) + } + override fun visitWhiteSpace(space: PsiWhiteSpace) { if (removalProcessor.shouldRemoveWhiteSpace(space)) return @@ -160,6 +169,11 @@ internal class PrimitiveGenerator( } override fun visitLeafElement(element: LeafPsiElement) { + if (replacementProcessor.haveReplaceText(element)) { + builder.append(replacementProcessor.getReplacement(element)) + return + } + if (element.elementType != KtTokens.IDENTIFIER) { builder.append(element.text) return diff --git a/primitives-plugin/kotlin-plugin/src/jvmMain/kotlin/io/kinference/primitives/generator/Utils.kt b/primitives-plugin/kotlin-plugin/src/jvmMain/kotlin/io/kinference/primitives/generator/Utils.kt index b22b7ab..3cf51a3 100644 --- a/primitives-plugin/kotlin-plugin/src/jvmMain/kotlin/io/kinference/primitives/generator/Utils.kt +++ b/primitives-plugin/kotlin-plugin/src/jvmMain/kotlin/io/kinference/primitives/generator/Utils.kt @@ -43,7 +43,8 @@ internal fun KtAnnotationEntry.isPluginAnnotation(context: BindingContext): Bool isAnnotation(context) || isAnnotation(context) || isAnnotation(context) || - isAnnotation(context) + isAnnotation(context) || + isAnnotation(context) } internal fun DeclarationDescriptor.isNamedFunction() = findPsi() is KtNamedFunction diff --git a/primitives-plugin/kotlin-plugin/src/jvmMain/kotlin/io/kinference/primitives/generator/processor/ReplacementProcessor.kt b/primitives-plugin/kotlin-plugin/src/jvmMain/kotlin/io/kinference/primitives/generator/processor/ReplacementProcessor.kt index de8ad7a..018df6f 100644 --- a/primitives-plugin/kotlin-plugin/src/jvmMain/kotlin/io/kinference/primitives/generator/processor/ReplacementProcessor.kt +++ b/primitives-plugin/kotlin-plugin/src/jvmMain/kotlin/io/kinference/primitives/generator/processor/ReplacementProcessor.kt @@ -1,6 +1,7 @@ package io.kinference.primitives.generator.processor import io.kinference.primitives.annotations.GenerateNameFromPrimitives +import io.kinference.primitives.annotations.MakePublic import io.kinference.primitives.generator.* import io.kinference.primitives.generator.errors.require import io.kinference.primitives.handler.Primitive @@ -9,8 +10,12 @@ import io.kinference.primitives.utils.psi.forced import io.kinference.primitives.utils.psi.isAnnotatedWith import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity import org.jetbrains.kotlin.cli.common.messages.MessageCollector +import org.jetbrains.kotlin.com.intellij.openapi.util.Key +import org.jetbrains.kotlin.com.intellij.psi.PsiElement +import org.jetbrains.kotlin.com.intellij.psi.impl.source.tree.LeafPsiElement import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.isExtensionDeclaration +import org.jetbrains.kotlin.psi.psiUtil.visibilityModifier import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe @@ -24,6 +29,8 @@ internal class ReplacementProcessor(private val context: BindingContext, private } } + private val REPLACE_TEXT: Key = Key.create("REPLACE_TEXT_IN_MODIFIER") + private val defaultReplacements: Map) -> String> = mapOf( (DataType::class.qualifiedName!! + ".Companion.${DataType.Companion::CurrentPrimitive.name}") to { it.dataType.name }, (PrimitiveType::class.java.`package`.name + ".toPrimitive") to this::toType, @@ -83,4 +90,22 @@ internal class ReplacementProcessor(private val context: BindingContext, private } } + fun shouldChangeVisibilityModifier(list: KtModifierList): Boolean { + val owner = list.owner + val visibilityModifier = list.visibilityModifier() + + return visibilityModifier != null && owner is KtAnnotated && owner.isAnnotatedWith(context) + } + + fun prepareReplaceText(psi: PsiElement?, newText: String) { + psi?.putUserData(REPLACE_TEXT, newText) + } + + fun haveReplaceText(psi: LeafPsiElement): Boolean { + return psi.getUserData(REPLACE_TEXT) != null + } + + fun getReplacement(psi: LeafPsiElement): String { + return psi.getUserData(REPLACE_TEXT)!! + } }