[Wasm] Suppress unused parameters warning for functions with JS body
These parameters can be used in js(code)
This commit is contained in:
committed by
Space Team
parent
71e6b19760
commit
60ef7fcb49
+1
-1
@@ -731,7 +731,7 @@ class ControlFlowInformationProviderImpl private constructor(
|
|||||||
|
|
||||||
if (functionDescriptor.isExpect || functionDescriptor.isActual ||
|
if (functionDescriptor.isExpect || functionDescriptor.isActual ||
|
||||||
functionDescriptor.isEffectivelyExternal() ||
|
functionDescriptor.isEffectivelyExternal() ||
|
||||||
!diagnosticSuppressor.shouldReportUnusedParameter(variableDescriptor)
|
!diagnosticSuppressor.shouldReportUnusedParameter(variableDescriptor, trace.bindingContext)
|
||||||
) return
|
) return
|
||||||
|
|
||||||
when (val owner = element.parent.parent) {
|
when (val owner = element.parent.parent) {
|
||||||
|
|||||||
+5
-4
@@ -21,23 +21,24 @@ import org.jetbrains.kotlin.container.PlatformExtensionsClashResolver
|
|||||||
import org.jetbrains.kotlin.container.PlatformSpecificExtension
|
import org.jetbrains.kotlin.container.PlatformSpecificExtension
|
||||||
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.VariableDescriptor
|
import org.jetbrains.kotlin.descriptors.VariableDescriptor
|
||||||
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
|
|
||||||
@DefaultImplementation(PlatformDiagnosticSuppressor.Default::class)
|
@DefaultImplementation(PlatformDiagnosticSuppressor.Default::class)
|
||||||
interface PlatformDiagnosticSuppressor : PlatformSpecificExtension<PlatformDiagnosticSuppressor>{
|
interface PlatformDiagnosticSuppressor : PlatformSpecificExtension<PlatformDiagnosticSuppressor>{
|
||||||
fun shouldReportUnusedParameter(parameter: VariableDescriptor): Boolean
|
fun shouldReportUnusedParameter(parameter: VariableDescriptor, bindingContext: BindingContext): Boolean
|
||||||
|
|
||||||
fun shouldReportNoBody(descriptor: CallableMemberDescriptor): Boolean
|
fun shouldReportNoBody(descriptor: CallableMemberDescriptor): Boolean
|
||||||
|
|
||||||
object Default : PlatformDiagnosticSuppressor {
|
object Default : PlatformDiagnosticSuppressor {
|
||||||
override fun shouldReportUnusedParameter(parameter: VariableDescriptor): Boolean = true
|
override fun shouldReportUnusedParameter(parameter: VariableDescriptor, bindingContext: BindingContext): Boolean = true
|
||||||
|
|
||||||
override fun shouldReportNoBody(descriptor: CallableMemberDescriptor): Boolean = true
|
override fun shouldReportNoBody(descriptor: CallableMemberDescriptor): Boolean = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class CompositePlatformDiagnosticSuppressor(private val suppressors: List<PlatformDiagnosticSuppressor>) : PlatformDiagnosticSuppressor {
|
class CompositePlatformDiagnosticSuppressor(private val suppressors: List<PlatformDiagnosticSuppressor>) : PlatformDiagnosticSuppressor {
|
||||||
override fun shouldReportUnusedParameter(parameter: VariableDescriptor): Boolean =
|
override fun shouldReportUnusedParameter(parameter: VariableDescriptor, bindingContext: BindingContext): Boolean =
|
||||||
suppressors.all { it.shouldReportUnusedParameter(parameter) }
|
suppressors.all { it.shouldReportUnusedParameter(parameter, bindingContext) }
|
||||||
|
|
||||||
override fun shouldReportNoBody(descriptor: CallableMemberDescriptor): Boolean =
|
override fun shouldReportNoBody(descriptor: CallableMemberDescriptor): Boolean =
|
||||||
suppressors.all { it.shouldReportNoBody(descriptor) }
|
suppressors.all { it.shouldReportNoBody(descriptor) }
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ 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.name.JsStandardClassIds
|
import org.jetbrains.kotlin.name.JsStandardClassIds
|
||||||
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.resolve.checkers.PlatformDiagnosticSuppressor
|
import org.jetbrains.kotlin.resolve.checkers.PlatformDiagnosticSuppressor
|
||||||
|
|
||||||
private val nativeAnnotations = JsStandardClassIds.Annotations.nativeAnnotations.map { it.asSingleFqName() }
|
private val nativeAnnotations = JsStandardClassIds.Annotations.nativeAnnotations.map { it.asSingleFqName() }
|
||||||
@@ -35,7 +36,8 @@ private fun DeclarationDescriptor.isLexicallyInsideJsNative(): Boolean {
|
|||||||
}
|
}
|
||||||
|
|
||||||
object JsNativeDiagnosticSuppressor : PlatformDiagnosticSuppressor {
|
object JsNativeDiagnosticSuppressor : PlatformDiagnosticSuppressor {
|
||||||
override fun shouldReportUnusedParameter(parameter: VariableDescriptor): Boolean = !parameter.isLexicallyInsideJsNative()
|
override fun shouldReportUnusedParameter(parameter: VariableDescriptor, bindingContext: BindingContext): Boolean =
|
||||||
|
!parameter.isLexicallyInsideJsNative()
|
||||||
|
|
||||||
override fun shouldReportNoBody(descriptor: CallableMemberDescriptor): Boolean = !descriptor.isLexicallyInsideJsNative()
|
override fun shouldReportNoBody(descriptor: CallableMemberDescriptor): Boolean = !descriptor.isLexicallyInsideJsNative()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
/*
|
||||||
|
* 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.wasm.analyze
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.VariableDescriptor
|
||||||
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
import org.jetbrains.kotlin.name.JsStandardClassIds
|
||||||
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
|
import org.jetbrains.kotlin.resolve.checkers.PlatformDiagnosticSuppressor
|
||||||
|
import org.jetbrains.kotlin.wasm.util.hasValidJsCodeBody
|
||||||
|
|
||||||
|
|
||||||
|
object WasmDiagnosticSuppressor : PlatformDiagnosticSuppressor {
|
||||||
|
override fun shouldReportUnusedParameter(parameter: VariableDescriptor, bindingContext: BindingContext): Boolean {
|
||||||
|
val containingDeclaration = parameter.containingDeclaration
|
||||||
|
if (containingDeclaration is FunctionDescriptor) {
|
||||||
|
return !containingDeclaration.hasValidJsCodeBody(bindingContext)
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun shouldReportNoBody(descriptor: CallableMemberDescriptor): Boolean = true
|
||||||
|
}
|
||||||
+2
-2
@@ -8,13 +8,13 @@ package org.jetbrains.kotlin.wasm.resolve
|
|||||||
import org.jetbrains.kotlin.container.StorageComponentContainer
|
import org.jetbrains.kotlin.container.StorageComponentContainer
|
||||||
import org.jetbrains.kotlin.container.useImpl
|
import org.jetbrains.kotlin.container.useImpl
|
||||||
import org.jetbrains.kotlin.container.useInstance
|
import org.jetbrains.kotlin.container.useInstance
|
||||||
import org.jetbrains.kotlin.js.analyze.JsNativeDiagnosticSuppressor
|
|
||||||
import org.jetbrains.kotlin.js.naming.NameSuggestion
|
import org.jetbrains.kotlin.js.naming.NameSuggestion
|
||||||
import org.jetbrains.kotlin.js.resolve.ExtensionFunctionToExternalIsInlinable
|
import org.jetbrains.kotlin.js.resolve.ExtensionFunctionToExternalIsInlinable
|
||||||
import org.jetbrains.kotlin.js.resolve.diagnostics.*
|
import org.jetbrains.kotlin.js.resolve.diagnostics.*
|
||||||
import org.jetbrains.kotlin.resolve.PlatformConfiguratorBase
|
import org.jetbrains.kotlin.resolve.PlatformConfiguratorBase
|
||||||
import org.jetbrains.kotlin.resolve.calls.checkers.LateinitIntrinsicApplicabilityChecker
|
import org.jetbrains.kotlin.resolve.calls.checkers.LateinitIntrinsicApplicabilityChecker
|
||||||
import org.jetbrains.kotlin.resolve.checkers.ExpectedActualDeclarationChecker
|
import org.jetbrains.kotlin.resolve.checkers.ExpectedActualDeclarationChecker
|
||||||
|
import org.jetbrains.kotlin.wasm.analyze.WasmDiagnosticSuppressor
|
||||||
import org.jetbrains.kotlin.wasm.resolve.diagnostics.WasmExternalDeclarationChecker
|
import org.jetbrains.kotlin.wasm.resolve.diagnostics.WasmExternalDeclarationChecker
|
||||||
import org.jetbrains.kotlin.wasm.resolve.diagnostics.WasmExternalInheritanceChecker
|
import org.jetbrains.kotlin.wasm.resolve.diagnostics.WasmExternalInheritanceChecker
|
||||||
import org.jetbrains.kotlin.wasm.resolve.diagnostics.WasmImportAnnotationChecker
|
import org.jetbrains.kotlin.wasm.resolve.diagnostics.WasmImportAnnotationChecker
|
||||||
@@ -50,7 +50,7 @@ object WasmPlatformConfigurator : PlatformConfiguratorBase(
|
|||||||
container.useImpl<JsReifiedNativeChecker>()
|
container.useImpl<JsReifiedNativeChecker>()
|
||||||
container.useInstance(ExtensionFunctionToExternalIsInlinable)
|
container.useInstance(ExtensionFunctionToExternalIsInlinable)
|
||||||
container.useInstance(JsQualifierChecker)
|
container.useInstance(JsQualifierChecker)
|
||||||
container.useInstance(JsNativeDiagnosticSuppressor)
|
container.useInstance(WasmDiagnosticSuppressor)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun configureModuleDependentCheckers(container: StorageComponentContainer) {
|
override fun configureModuleDependentCheckers(container: StorageComponentContainer) {
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* 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.wasm.util
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
|
import org.jetbrains.kotlin.js.resolve.diagnostics.JsCallChecker.Companion.isJsCall
|
||||||
|
import org.jetbrains.kotlin.psi.*
|
||||||
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall
|
||||||
|
import org.jetbrains.kotlin.resolve.source.getPsi
|
||||||
|
|
||||||
|
fun FunctionDescriptor.hasValidJsCodeBody(bindingContext: BindingContext): Boolean {
|
||||||
|
val psi = source.getPsi() as? KtNamedFunction ?: return false
|
||||||
|
return psi.hasValidJsCodeBody(bindingContext)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun KtDeclarationWithBody.hasValidJsCodeBody(bindingContext: BindingContext): Boolean {
|
||||||
|
if (!hasBody()) return true
|
||||||
|
val body = bodyExpression!!
|
||||||
|
return when {
|
||||||
|
!hasBlockBody() -> body.isJsCall(bindingContext)
|
||||||
|
body is KtBlockExpression -> {
|
||||||
|
val statement = body.statements.singleOrNull() ?: return false
|
||||||
|
statement.isJsCall(bindingContext)
|
||||||
|
}
|
||||||
|
else -> false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun KtExpression.isJsCall(bindingContext: BindingContext): Boolean {
|
||||||
|
return getResolvedCall(bindingContext)?.isJsCall() ?: false
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user