[FIR JS] Reuse declarations from JsStandardClassIds in both frontends

This commit is contained in:
Nikolay Lunyak
2023-01-05 15:36:09 +02:00
committed by Space Team
parent 5817155616
commit e6efde76dc
4 changed files with 40 additions and 12 deletions
@@ -11,26 +11,54 @@ object JsStandardClassIds {
val BASE_JS_PACKAGE = BASE_KOTLIN_PACKAGE.child(Name.identifier("js")) val BASE_JS_PACKAGE = BASE_KOTLIN_PACKAGE.child(Name.identifier("js"))
object Annotations { object Annotations {
@JvmField
val JsQualifier = "JsQualifier".jsId() val JsQualifier = "JsQualifier".jsId()
@JvmField
val JsModule = "JsModule".jsId() val JsModule = "JsModule".jsId()
@JvmField
val JsNonModule = "JsNonModule".jsId() val JsNonModule = "JsNonModule".jsId()
@JvmField
val JsNative = "native".jsId() val JsNative = "native".jsId()
@JvmField
val JsLibrary = "library".jsId() val JsLibrary = "library".jsId()
@JvmField
val JsNativeInvoke = "nativeInvoke".jsId() val JsNativeInvoke = "nativeInvoke".jsId()
@JvmField
val JsNativeGetter = "nativeGetter".jsId() val JsNativeGetter = "nativeGetter".jsId()
@JvmField
val JsNativeSetter = "nativeSetter".jsId() val JsNativeSetter = "nativeSetter".jsId()
@JvmField
val JsName = "JsName".jsId() val JsName = "JsName".jsId()
@JvmField
val JsExport = "JsExport".jsId()
@JvmField
val JsExportIgnore = ClassId(JsExport.asSingleFqName(), Name.identifier("Ignore"))
@JvmField
val annotationsRequiringExternal = setOf(JsModule, JsQualifier) val annotationsRequiringExternal = setOf(JsModule, JsQualifier)
@JvmField
val nativeAnnotations = setOf(JsNative, JsNativeInvoke, JsNativeGetter, JsNativeSetter) val nativeAnnotations = setOf(JsNative, JsNativeInvoke, JsNativeGetter, JsNativeSetter)
} }
object Callables { object Callables {
@JvmField
val JsDefinedExternally = "definedExternally".callableId(BASE_JS_PACKAGE) val JsDefinedExternally = "definedExternally".callableId(BASE_JS_PACKAGE)
@JvmField
val JsNoImpl = "noImpl".callableId(BASE_JS_PACKAGE) val JsNoImpl = "noImpl".callableId(BASE_JS_PACKAGE)
@JvmField
val definedExternallyPropertyNames = setOf(JsNoImpl, JsDefinedExternally) val definedExternallyPropertyNames = setOf(JsNoImpl, JsDefinedExternally)
} }
} }
@@ -19,16 +19,16 @@ package org.jetbrains.kotlin.js.analyze
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.VariableDescriptor import org.jetbrains.kotlin.descriptors.VariableDescriptor
import org.jetbrains.kotlin.js.PredefinedAnnotation.* import org.jetbrains.kotlin.name.JsStandardClassIds
import org.jetbrains.kotlin.resolve.checkers.PlatformDiagnosticSuppressor import org.jetbrains.kotlin.resolve.checkers.PlatformDiagnosticSuppressor
private val NATIVE_ANNOTATIONS = arrayOf(NATIVE.fqName, NATIVE_INVOKE.fqName, NATIVE_GETTER.fqName, NATIVE_SETTER.fqName) private val nativeAnnotations = JsStandardClassIds.Annotations.nativeAnnotations.map { it.asSingleFqName() }
private fun DeclarationDescriptor.isLexicallyInsideJsNative(): Boolean { private fun DeclarationDescriptor.isLexicallyInsideJsNative(): Boolean {
var descriptor: DeclarationDescriptor = this var descriptor: DeclarationDescriptor = this
while (true) { while (true) {
val annotations = descriptor.annotations val annotations = descriptor.annotations
if (!annotations.isEmpty() && NATIVE_ANNOTATIONS.any(annotations::hasAnnotation)) return true if (!annotations.isEmpty() && nativeAnnotations.any(annotations::hasAnnotation)) return true
descriptor = descriptor.containingDeclaration ?: break descriptor = descriptor.containingDeclaration ?: break
} }
return false return false
@@ -18,7 +18,7 @@ package org.jetbrains.kotlin.js.resolve.diagnostics
import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget
import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils import org.jetbrains.kotlin.name.JsStandardClassIds
import org.jetbrains.kotlin.js.validateQualifier import org.jetbrains.kotlin.js.validateQualifier
import org.jetbrains.kotlin.psi.KtAnnotated import org.jetbrains.kotlin.psi.KtAnnotated
import org.jetbrains.kotlin.psi.KtAnnotationEntry import org.jetbrains.kotlin.psi.KtAnnotationEntry
@@ -37,7 +37,7 @@ object JsQualifierChecker : AdditionalAnnotationChecker {
val bindingContext = trace.bindingContext val bindingContext = trace.bindingContext
for (entry in entries) { for (entry in entries) {
val annotation = bindingContext[BindingContext.ANNOTATION, entry] ?: continue val annotation = bindingContext[BindingContext.ANNOTATION, entry] ?: continue
if (annotation.fqName != AnnotationsUtils.JS_QUALIFIER_ANNOTATION) continue if (annotation.fqName != JsStandardClassIds.Annotations.JsQualifier.asSingleFqName()) continue
val argument = annotation.allValueArguments.values.singleOrNull()?.value as? String ?: continue val argument = annotation.allValueArguments.values.singleOrNull()?.value as? String ?: continue
if (!validateQualifier(argument)) { if (!validateQualifier(argument)) {
val argumentPsi = entry.valueArgumentList!!.arguments[0] val argumentPsi = entry.valueArgumentList!!.arguments[0]
@@ -22,9 +22,9 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.kotlin.descriptors.annotations.Annotations;
import org.jetbrains.kotlin.js.PredefinedAnnotation; import org.jetbrains.kotlin.js.PredefinedAnnotation;
import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.name.JsStandardClassIds.Annotations;
import org.jetbrains.kotlin.psi.KtAnnotationEntry; import org.jetbrains.kotlin.psi.KtAnnotationEntry;
import org.jetbrains.kotlin.psi.KtFile; import org.jetbrains.kotlin.psi.KtFile;
import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.resolve.BindingContext;
@@ -40,12 +40,12 @@ import java.util.List;
import static org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt.isEffectivelyExternal; import static org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt.isEffectivelyExternal;
public final class AnnotationsUtils { public final class AnnotationsUtils {
public static final FqName JS_NAME = new FqName("kotlin.js.JsName"); private static final FqName JS_NAME = Annotations.JsName.asSingleFqName();
private static final FqName JS_EXPORT = new FqName("kotlin.js.JsExport"); private static final FqName JS_EXPORT = Annotations.JsExport.asSingleFqName();
private static final FqName JS_EXPORT_IGNORE = new FqName("kotlin.js.JsExport.Ignore"); private static final FqName JS_EXPORT_IGNORE = Annotations.JsExportIgnore.asSingleFqName();
public static final FqName JS_MODULE_ANNOTATION = new FqName("kotlin.js.JsModule"); private static final FqName JS_MODULE_ANNOTATION = Annotations.JsModule.asSingleFqName();
private static final FqName JS_NON_MODULE_ANNOTATION = new FqName("kotlin.js.JsNonModule"); private static final FqName JS_NON_MODULE_ANNOTATION = Annotations.JsNonModule.asSingleFqName();
public static final FqName JS_QUALIFIER_ANNOTATION = new FqName("kotlin.js.JsQualifier"); private static final FqName JS_QUALIFIER_ANNOTATION = Annotations.JsQualifier.asSingleFqName();
private AnnotationsUtils() { private AnnotationsUtils() {
} }