From 56285bb2d6299efb7e4aa81afdde988786e78c78 Mon Sep 17 00:00:00 2001 From: Nikolay Lunyak Date: Wed, 4 Jan 2023 16:23:42 +0200 Subject: [PATCH] [FIR JS] Report CALL_TO_DEFINED_EXTERNALLY_FROM_NON_EXTERNAL_DECLARATION --- .../diagnostics/KtFirDataClassConverters.kt | 6 ++++ .../api/fir/diagnostics/KtFirDiagnostics.kt | 4 +++ .../fir/diagnostics/KtFirDiagnosticsImpl.kt | 5 +++ .../diagnostics/FirJsDiagnosticsList.kt | 2 ++ .../analysis/diagnostics/js/FirJsErrors.kt | 2 ++ .../js/FirJsErrorsDefaultMessages.kt | 2 ++ .../fir/analysis/js/checkers/FirJsHelpers.kt | 31 ++++++++++++++++- .../js/checkers/JsExpressionCheckers.kt | 7 +++- .../FirJsDefinedExternallyCallChecker.kt | 34 +++++++++++++++++++ .../fir/analysis/checkers/FirHelpers.kt | 2 ++ .../testsWithJsStdLib/noImpl.fir.kt | 29 ---------------- .../diagnostics/testsWithJsStdLib/noImpl.kt | 10 ++++++ .../diagnostics/testsWithJsStdLib/noImpl.txt | 2 ++ .../kotlin/js/PredefinedAnnotation.kt | 16 +++++---- .../kotlin/name/JsStandardClassIds.kt | 13 +++++++ js/js.frontend/build.gradle.kts | 1 + 16 files changed, 128 insertions(+), 38 deletions(-) create mode 100644 compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/expression/FirJsDefinedExternallyCallChecker.kt delete mode 100644 compiler/testData/diagnostics/testsWithJsStdLib/noImpl.fir.kt rename {js/js.frontend => core/compiler.common.js}/src/org/jetbrains/kotlin/js/PredefinedAnnotation.kt (60%) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt index 3cc1e43d849..89f2c72b04e 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -4667,6 +4667,12 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirJsErrors.CALL_TO_DEFINED_EXTERNALLY_FROM_NON_EXTERNAL_DECLARATION) { firDiagnostic -> + CallToDefinedExternallyFromNonExternalDeclarationImpl( + firDiagnostic as KtPsiDiagnostic, + token, + ) + } add(FirJsErrors.DELEGATION_BY_DYNAMIC) { firDiagnostic -> DelegationByDynamicImpl( firDiagnostic as KtPsiDiagnostic, diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt index 68bfd193d25..8d192db81b7 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt @@ -3246,6 +3246,10 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { abstract val function: KtFunctionLikeSymbol } + abstract class CallToDefinedExternallyFromNonExternalDeclaration : KtFirDiagnostic() { + override val diagnosticClass get() = CallToDefinedExternallyFromNonExternalDeclaration::class + } + abstract class DelegationByDynamic : KtFirDiagnostic() { override val diagnosticClass get() = DelegationByDynamic::class } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index 34ad7a8c355..4fea5e1402f 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -3927,6 +3927,11 @@ internal class OverridingExternalFunWithOptionalParamsWithFakeImpl( override val token: KtLifetimeToken, ) : KtFirDiagnostic.OverridingExternalFunWithOptionalParamsWithFake(), KtAbstractFirDiagnostic +internal class CallToDefinedExternallyFromNonExternalDeclarationImpl( + override val firDiagnostic: KtPsiDiagnostic, + override val token: KtLifetimeToken, +) : KtFirDiagnostic.CallToDefinedExternallyFromNonExternalDeclaration(), KtAbstractFirDiagnostic + internal class DelegationByDynamicImpl( override val firDiagnostic: KtPsiDiagnostic, override val token: KtLifetimeToken, diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJsDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJsDiagnosticsList.kt index 4be8eaafc5f..5f1843c8964 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJsDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJsDiagnosticsList.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir.checkers.generator.diagnostics +import com.intellij.psi.PsiElement import org.jetbrains.kotlin.fir.PrivateForInline import org.jetbrains.kotlin.fir.checkers.generator.diagnostics.model.DiagnosticList import org.jetbrains.kotlin.fir.checkers.generator.diagnostics.model.PositioningStrategy @@ -38,6 +39,7 @@ object JS_DIAGNOSTICS_LIST : DiagnosticList("FirJsErrors") { val OVERRIDING_EXTERNAL_FUN_WITH_OPTIONAL_PARAMS_WITH_FAKE by error(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT) { parameter("function") } + val CALL_TO_DEFINED_EXTERNALLY_FROM_NON_EXTERNAL_DECLARATION by error() } val DYNAMICS by object : DiagnosticGroup("Dynamics") { diff --git a/compiler/fir/checkers/checkers.js/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/js/FirJsErrors.kt b/compiler/fir/checkers/checkers.js/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/js/FirJsErrors.kt index 7aa7b325f20..2854eed3b99 100644 --- a/compiler/fir/checkers/checkers.js/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/js/FirJsErrors.kt +++ b/compiler/fir/checkers/checkers.js/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/js/FirJsErrors.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir.analysis.diagnostics.js +import com.intellij.psi.PsiElement import org.jetbrains.kotlin.diagnostics.* import org.jetbrains.kotlin.diagnostics.SourceElementPositioningStrategies import org.jetbrains.kotlin.diagnostics.rendering.RootDiagnosticRendererFactory @@ -35,6 +36,7 @@ object FirJsErrors { // External val OVERRIDING_EXTERNAL_FUN_WITH_OPTIONAL_PARAMS by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) val OVERRIDING_EXTERNAL_FUN_WITH_OPTIONAL_PARAMS_WITH_FAKE by error1(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) + val CALL_TO_DEFINED_EXTERNALLY_FROM_NON_EXTERNAL_DECLARATION by error0() // Dynamics val DELEGATION_BY_DYNAMIC by error0() diff --git a/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/diagnostics/js/FirJsErrorsDefaultMessages.kt b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/diagnostics/js/FirJsErrorsDefaultMessages.kt index 7f12e2f0a6f..4a796db3e72 100644 --- a/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/diagnostics/js/FirJsErrorsDefaultMessages.kt +++ b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/diagnostics/js/FirJsErrorsDefaultMessages.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.diagnostics.KtDiagnosticFactoryToRendererMap import org.jetbrains.kotlin.diagnostics.rendering.BaseDiagnosticRendererFactory import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers import org.jetbrains.kotlin.fir.analysis.diagnostics.checkMissingMessages +import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors.CALL_TO_DEFINED_EXTERNALLY_FROM_NON_EXTERNAL_DECLARATION import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors.DELEGATION_BY_DYNAMIC import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors.IMPLEMENTING_FUNCTION_INTERFACE import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors.JS_MODULE_PROHIBITED_ON_NON_NATIVE @@ -42,6 +43,7 @@ object FirJsErrorsDefaultMessages : BaseDiagnosticRendererFactory() { "Overriding `external` function with optional parameters by declaration from superclass: {0}", FirDiagnosticRenderers.SYMBOL ) + map.put(CALL_TO_DEFINED_EXTERNALLY_FROM_NON_EXTERNAL_DECLARATION, "This property can only be used from external declarations") map.checkMissingMessages(FirJsErrors) } diff --git a/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/FirJsHelpers.kt b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/FirJsHelpers.kt index 75c0d7f0603..ce89f3c0f2e 100644 --- a/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/FirJsHelpers.kt +++ b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/FirJsHelpers.kt @@ -14,12 +14,14 @@ import org.jetbrains.kotlin.fir.analysis.checkers.directOverriddenFunctions import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol import org.jetbrains.kotlin.fir.analysis.checkers.hasAnnotationOrInsideAnnotatedClass import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.declarations.utils.isExpect import org.jetbrains.kotlin.fir.declarations.utils.isExternal import org.jetbrains.kotlin.fir.declarations.utils.modality import org.jetbrains.kotlin.fir.isSubstitutionOrIntersectionOverride import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.SymbolInternals import org.jetbrains.kotlin.fir.symbols.impl.* +import org.jetbrains.kotlin.js.PredefinedAnnotation import org.jetbrains.kotlin.name.JsStandardClassIds private val FirBasedSymbol<*>.isExternal @@ -46,6 +48,10 @@ fun FirBasedSymbol<*>.isEffectivelyExternal(session: FirSession): Boolean { return getContainingClassSymbol(session)?.isEffectivelyExternal(session) == true } +fun FirBasedSymbol<*>.isEffectivelyExternalMember(session: FirSession): Boolean { + return fir is FirMemberDeclaration && isEffectivelyExternal(session) +} + fun FirBasedSymbol<*>.isEffectivelyExternal(context: CheckerContext) = isEffectivelyExternal(context.session) fun FirFunctionSymbol<*>.isOverridingExternalWithOptionalParams(context: CheckerContext): Boolean { @@ -66,10 +72,33 @@ fun FirBasedSymbol<*>.isNativeObject(session: FirSession): Boolean { } if (this is FirPropertyAccessorSymbol) { - return propertySymbol.hasAnnotationOrInsideAnnotatedClass(JsStandardClassIds.Annotations.JsNative, session) + val property = propertySymbol + return property.hasAnnotationOrInsideAnnotatedClass(JsStandardClassIds.Annotations.JsNative, session) + } + + return false +} + +private val FirBasedSymbol<*>.isExpect + get() = when (this) { + is FirCallableSymbol<*> -> isExpect + is FirClassSymbol<*> -> isExpect + else -> false + } + +fun FirBasedSymbol<*>.isPredefinedObject(session: FirSession): Boolean { + if (fir is FirMemberDeclaration && isExpect) return true + if (isEffectivelyExternalMember(session)) return true + + for (annotation in PredefinedAnnotation.values()) { + if (hasAnnotationOrInsideAnnotatedClass(annotation.classId, session)) { + return true + } } return false } fun FirBasedSymbol<*>.isNativeObject(context: CheckerContext) = isNativeObject(context.session) + +fun FirBasedSymbol<*>.isPredefinedObject(context: CheckerContext) = isPredefinedObject(context.session) diff --git a/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/JsExpressionCheckers.kt b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/JsExpressionCheckers.kt index c4002263d2b..0fd414ab8e6 100644 --- a/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/JsExpressionCheckers.kt +++ b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/JsExpressionCheckers.kt @@ -6,11 +6,16 @@ package org.jetbrains.kotlin.fir.analysis.js.checkers import org.jetbrains.kotlin.fir.analysis.checkers.expression.* -import org.jetbrains.kotlin.fir.analysis.js.checkers.expression.FirJsQualifierChecker +import org.jetbrains.kotlin.fir.analysis.js.checkers.expression.* object JsExpressionCheckers : ExpressionCheckers() { override val annotationCallCheckers: Set get() = setOf( FirJsQualifierChecker, ) + + override val qualifiedAccessCheckers: Set + get() = setOf( + FirJsDefinedExternallyCallChecker, + ) } diff --git a/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/expression/FirJsDefinedExternallyCallChecker.kt b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/expression/FirJsDefinedExternallyCallChecker.kt new file mode 100644 index 00000000000..949c162129a --- /dev/null +++ b/compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/expression/FirJsDefinedExternallyCallChecker.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.analysis.js.checkers.expression + +import org.jetbrains.kotlin.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.diagnostics.reportOn +import org.jetbrains.kotlin.fir.analysis.checkers.closestNonLocal +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirQualifiedAccessChecker +import org.jetbrains.kotlin.fir.analysis.js.checkers.isNativeObject +import org.jetbrains.kotlin.fir.analysis.js.checkers.isPredefinedObject +import org.jetbrains.kotlin.fir.analysis.diagnostics.js.FirJsErrors +import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess +import org.jetbrains.kotlin.fir.references.toResolvedCallableSymbol +import org.jetbrains.kotlin.name.JsStandardClassIds + +object FirJsDefinedExternallyCallChecker : FirQualifiedAccessChecker() { + override fun check(expression: FirQualifiedAccess, context: CheckerContext, reporter: DiagnosticReporter) { + val symbol = expression.calleeReference.toResolvedCallableSymbol() ?: return + + if (symbol.callableId !in JsStandardClassIds.Callables.definedExternallyPropertyNames) { + return + } + + val container = context.closestNonLocal?.symbol ?: return + + if (!container.isNativeObject(context) && !container.isPredefinedObject(context)) { + reporter.reportOn(expression.source, FirJsErrors.CALL_TO_DEFINED_EXTERNALLY_FROM_NON_EXTERNAL_DECLARATION, context) + } + } +} \ No newline at end of file diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt index 2a72cdb8243..1f6c28e9f15 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt @@ -713,6 +713,8 @@ fun FirNamedFunctionSymbol.directOverriddenFunctions(session: FirSession, scopeS fun FirNamedFunctionSymbol.directOverriddenFunctions(context: CheckerContext) = directOverriddenFunctions(context.session, context.sessionHolder.scopeSession) +val CheckerContext.closestNonLocal get() = containingDeclarations.takeWhile { it.isNonLocal }.lastOrNull() + fun CheckerContext.closestNonLocalWith(declaration: FirDeclaration) = (containingDeclarations + declaration).takeWhile { it.isNonLocal }.lastOrNull() diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/noImpl.fir.kt b/compiler/testData/diagnostics/testsWithJsStdLib/noImpl.fir.kt deleted file mode 100644 index 8d0d6a6b33f..00000000000 --- a/compiler/testData/diagnostics/testsWithJsStdLib/noImpl.fir.kt +++ /dev/null @@ -1,29 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_ANONYMOUS_PARAMETER -UNUSED_PARAMETER, -UNREACHABLE_CODE - -val prop: String = definedExternally - -val prop2: String - get() = definedExternally - -fun foo(x: Int, y: String = definedExternally) { - println("Hello") - println("world") - - object { - fun bar(): Any = definedExternally - } - - listOf() - .map { definedExternally } - .filter(fun(x: String): Boolean { definedExternally }) - - definedExternally -} - -open class A(val x: Int) - -open class B() : A(definedExternally) { - constructor(y: String) : this() - - constructor(y: String, z: String) : this(y + z + definedExternally) -} diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/noImpl.kt b/compiler/testData/diagnostics/testsWithJsStdLib/noImpl.kt index 161bf5dab35..dc69e84ef9b 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/noImpl.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/noImpl.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_ANONYMOUS_PARAMETER -UNUSED_PARAMETER, -UNREACHABLE_CODE val prop: String = definedExternally @@ -27,3 +28,12 @@ open class B() : A(d constructor(y: String, z: String) : this(y + z + definedExternally) } + +private fun exposeClassS() = run { + class S { + inner class W { + val v: String = definedExternally + } + } + S() +} diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/noImpl.txt b/compiler/testData/diagnostics/testsWithJsStdLib/noImpl.txt index d7294493b1b..3894bc23a65 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/noImpl.txt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/noImpl.txt @@ -2,6 +2,7 @@ package public val prop: kotlin.String public val prop2: kotlin.String +private fun exposeClassS(): exposeClassS.``.S public fun foo(/*0*/ x: kotlin.Int, /*1*/ y: kotlin.String = ...): kotlin.Unit public open class A { @@ -21,3 +22,4 @@ public open class B : A { public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } + diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/PredefinedAnnotation.kt b/core/compiler.common.js/src/org/jetbrains/kotlin/js/PredefinedAnnotation.kt similarity index 60% rename from js/js.frontend/src/org/jetbrains/kotlin/js/PredefinedAnnotation.kt rename to core/compiler.common.js/src/org/jetbrains/kotlin/js/PredefinedAnnotation.kt index 112df9a087b..830e1882e46 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/PredefinedAnnotation.kt +++ b/core/compiler.common.js/src/org/jetbrains/kotlin/js/PredefinedAnnotation.kt @@ -16,16 +16,18 @@ package org.jetbrains.kotlin.js +import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.JsStandardClassIds -enum class PredefinedAnnotation(fqName: String) { - LIBRARY("kotlin.js.library"), - NATIVE("kotlin.js.native"), - NATIVE_INVOKE("kotlin.js.nativeInvoke"), - NATIVE_GETTER("kotlin.js.nativeGetter"), - NATIVE_SETTER("kotlin.js.nativeSetter"); +enum class PredefinedAnnotation(val classId: ClassId) { + LIBRARY(JsStandardClassIds.Annotations.JsLibrary), + NATIVE(JsStandardClassIds.Annotations.JsNative), + NATIVE_INVOKE(JsStandardClassIds.Annotations.JsNativeInvoke), + NATIVE_GETTER(JsStandardClassIds.Annotations.JsNativeGetter), + NATIVE_SETTER(JsStandardClassIds.Annotations.JsNativeSetter); - val fqName: FqName = FqName(fqName) + val fqName: FqName = classId.asSingleFqName() companion object { val WITH_CUSTOM_NAME = setOf(LIBRARY, NATIVE) diff --git a/core/compiler.common.js/src/org/jetbrains/kotlin/name/JsStandardClassIds.kt b/core/compiler.common.js/src/org/jetbrains/kotlin/name/JsStandardClassIds.kt index e3c68f95681..1217c3e564d 100644 --- a/core/compiler.common.js/src/org/jetbrains/kotlin/name/JsStandardClassIds.kt +++ b/core/compiler.common.js/src/org/jetbrains/kotlin/name/JsStandardClassIds.kt @@ -16,7 +16,20 @@ object JsStandardClassIds { val JsNonModule = "JsNonModule".jsId() val JsNative = "native".jsId() + val JsLibrary = "library".jsId() + val JsNativeInvoke = "nativeInvoke".jsId() + val JsNativeGetter = "nativeGetter".jsId() + val JsNativeSetter = "nativeSetter".jsId() + } + + object Callables { + val JsDefinedExternally = "definedExternally".callableId(BASE_JS_PACKAGE) + val JsNoImpl = "noImpl".callableId(BASE_JS_PACKAGE) + + val definedExternallyPropertyNames = setOf(JsNoImpl, JsDefinedExternally) } } private fun String.jsId() = ClassId(JsStandardClassIds.BASE_JS_PACKAGE, Name.identifier(this)) + +private fun String.callableId(packageName: FqName) = CallableId(packageName, Name.identifier(this)) diff --git a/js/js.frontend/build.gradle.kts b/js/js.frontend/build.gradle.kts index 7dbb9fee75d..28ea0d21eff 100644 --- a/js/js.frontend/build.gradle.kts +++ b/js/js.frontend/build.gradle.kts @@ -6,6 +6,7 @@ plugins { dependencies { api(project(":compiler:util")) api(project(":compiler:frontend")) + api(project(":core:compiler.common.js")) api(project(":js:js.ast")) api(project(":js:js.parser")) api(project(":js:js.serializer"))