From 2536615e0e161cac56da707b4689b062e7c67f5d Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Mon, 7 Aug 2017 11:39:34 +0200 Subject: [PATCH] detect valid extension main functions (#1227) Fixes #KT-18083 --- .../kotlin/idea/MainFunctionDetector.kt | 19 ++++++++++++++----- .../UnusedReceiverParameterInspection.kt | 5 ++++- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/idea/MainFunctionDetector.kt b/compiler/frontend/src/org/jetbrains/kotlin/idea/MainFunctionDetector.kt index 87e36868a6a..c3d17e3cef4 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/idea/MainFunctionDetector.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/idea/MainFunctionDetector.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -52,7 +52,15 @@ class MainFunctionDetector { return false } - if (function.valueParameters.size != 1 || !function.typeParameters.isEmpty()) { + + var parametersCount = function.valueParameters.size + if (function.receiverTypeReference != null) parametersCount++ + + if (parametersCount != 1) { + return false + } + + if (!function.typeParameters.isEmpty()) { return false } @@ -98,11 +106,12 @@ class MainFunctionDetector { return false } - val parameters = descriptor.valueParameters + val parameters = descriptor.valueParameters.mapTo(mutableListOf()) { it.type } + descriptor.extensionReceiverParameter?.type?.let {parameters += it} + if (parameters.size != 1 || !descriptor.typeParameters.isEmpty()) return false - val parameter = parameters[0] - val parameterType = parameter.type + val parameterType = parameters[0] if (!KotlinBuiltIns.isArray(parameterType)) return false val typeArguments = parameterType.arguments diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedReceiverParameterInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedReceiverParameterInspection.kt index c4203d82b80..90646adfced 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedReceiverParameterInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedReceiverParameterInspection.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 JetBrains s.r.o. + * Copyright 2010-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,6 +24,7 @@ import com.intellij.psi.PsiElementVisitor import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor import org.jetbrains.kotlin.idea.KotlinBundle +import org.jetbrains.kotlin.idea.MainFunctionDetector import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.core.isOverridable import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinChangeSignatureConfiguration @@ -54,6 +55,8 @@ class UnusedReceiverParameterInspection : AbstractKotlinInspection() { val callable = callableDeclaration.descriptor + if (callable != null && MainFunctionDetector.isMain(callable)) return + var used = false callableDeclaration.acceptChildren(object : KtVisitorVoid() { override fun visitKtElement(element: KtElement) {