[K/JS] Exclude kotlinx.serialization synthetic declarations from JsExport

^KT-57024 Fixed
This commit is contained in:
Artem Kobzar
2023-02-28 18:11:36 +00:00
committed by Space Team
parent 36ae6d1238
commit 50a462fed1
22 changed files with 359 additions and 49 deletions
@@ -175,8 +175,8 @@ class SerializationFirResolveExtension(session: FirSession) : FirDeclarationGene
symbol = FirNamedFunctionSymbol(callableId)
origin = SerializationPluginKey.origin
status = original.status.copy(modality = Modality.FINAL)
}
copy.excludeFromJsExport()
return listOf(copy.symbol)
}
@@ -208,6 +208,8 @@ class SerializationFirResolveExtension(session: FirSession) : FirDeclarationGene
}
}
function.excludeFromJsExport()
return function.symbol
}
@@ -224,6 +226,8 @@ class SerializationFirResolveExtension(session: FirSession) : FirDeclarationGene
target.resolvedReturnType
)
property.excludeFromJsExport()
return listOf(property.symbol)
}
@@ -270,6 +274,7 @@ class SerializationFirResolveExtension(session: FirSession) : FirDeclarationGene
}
// TODO: add deprecate hidden
// serializerFirClass.replaceAnnotations(listOf(Annotations.create(listOf(KSerializerDescriptorResolver.createDeprecatedHiddenAnnotation(thisDescriptor.module)))))
serializerFirClass.excludeFromJsExport()
return serializerFirClass.symbol
}
@@ -282,6 +287,7 @@ class SerializationFirResolveExtension(session: FirSession) : FirDeclarationGene
superType(serializerFactoryClassId.constructClassLikeType(emptyArray(), false))
}
}
return companion.symbol
}
@@ -6,7 +6,9 @@
package org.jetbrains.kotlinx.serialization.compiler.fir
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.fir.FirAnnotationContainer
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.expressions.*
@@ -14,15 +16,28 @@ import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.arguments
import org.jetbrains.kotlin.fir.resolve.createSubstitutionForSupertype
import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotationCall
import org.jetbrains.kotlin.fir.extensions.FirExtension
import org.jetbrains.kotlin.fir.extensions.predicateBasedProvider
import org.jetbrains.kotlin.fir.moduleData
import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference
import org.jetbrains.kotlin.fir.resolve.defaultType
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
import org.jetbrains.kotlin.fir.resolve.substitution.ChainedSubstitutor
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
import org.jetbrains.kotlin.fir.scopes.platformSpecificOverridabilityRules
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.platform.isJs
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
import org.jetbrains.kotlinx.serialization.compiler.fir.services.dependencySerializationInfoProvider
import org.jetbrains.kotlinx.serialization.compiler.resolve.SerialEntityNames
import org.jetbrains.kotlinx.serialization.compiler.resolve.SerializationAnnotations
@@ -30,6 +45,7 @@ import org.jetbrains.kotlinx.serialization.compiler.resolve.SerializationAnnotat
import org.jetbrains.kotlinx.serialization.compiler.resolve.SerializationAnnotations.metaSerializableAnnotationClassId
import org.jetbrains.kotlinx.serialization.compiler.resolve.SerializationAnnotations.serialInfoClassId
import org.jetbrains.kotlinx.serialization.compiler.resolve.SerializationAnnotations.serialNameAnnotationClassId
import org.jetbrains.kotlinx.serialization.compiler.resolve.SerializationJsDependenciesClassIds
object AnnotationParameterNames {
val VALUE = Name.identifier("value")
@@ -217,3 +233,27 @@ val ConeKotlinType.isTypeParameter: Boolean
context(FirSession)
val ConeKotlinType.isGeneratedSerializableObject: Boolean
get() = toRegularClassSymbol(this@FirSession)?.let { it.classKind.isObject && it.hasSerializableOrMetaAnnotationWithoutArgs } ?: false
context(FirExtension)
fun FirAnnotationContainer.excludeFromJsExport() {
if (!session.moduleData.platform.isJs()) {
return
}
val jsExportIgnore = session.symbolProvider.getClassLikeSymbolByClassId(SerializationJsDependenciesClassIds.jsExportIgnore)
val jsExportIgnoreAnnotation = jsExportIgnore as? FirRegularClassSymbol ?: return
val jsExportIgnoreConstructor = jsExportIgnoreAnnotation.declarationSymbols.firstIsInstanceOrNull<FirConstructorSymbol>() ?: return
val jsExportIgnoreAnnotationCall = buildAnnotationCall {
argumentList = buildResolvedArgumentList(linkedMapOf())
annotationTypeRef = buildResolvedTypeRef {
type = jsExportIgnoreAnnotation.defaultType()
}
calleeReference = buildResolvedNamedReference {
name = jsExportIgnoreAnnotation.name
resolvedSymbol = jsExportIgnoreConstructor
}
}
replaceAnnotations(annotations + jsExportIgnoreAnnotationCall)
}