diff options
Diffstat (limited to 'plugins/kotlin/idea/src/org')
79 files changed, 577 insertions, 356 deletions
diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/KotlinDocumentationProvider.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/KotlinDocumentationProvider.kt index bc5a4811cf31..f32800eac41f 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/KotlinDocumentationProvider.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/KotlinDocumentationProvider.kt @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny +import org.jetbrains.kotlin.idea.caches.resolve.safeAnalyzeNonSourceRootCode import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde import org.jetbrains.kotlin.idea.core.completion.DeclarationLookupObject import org.jetbrains.kotlin.idea.decompiler.navigation.SourceNavigationHelper diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/KotlinIdeFileIconProviderService.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/KotlinIdeFileIconProviderService.kt index e6eed868b117..cf9b61482147 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/KotlinIdeFileIconProviderService.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/KotlinIdeFileIconProviderService.kt @@ -11,6 +11,8 @@ import javax.swing.Icon class KotlinIdeFileIconProviderService : KotlinIconProviderService() { override fun getFileIcon(): Icon = KotlinIcons.FILE + override fun getBuiltInFileIcon(): Icon = KotlinIcons.FILE + override fun getLightVariableIcon(element: PsiModifierListOwner, flags: Int): Icon { val iconManager = IconManager.getInstance() val elementFlags = ElementPresentationUtil.getFlags(element, false) diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/KotlinJpsClasspathProvider.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/KotlinJpsClasspathProvider.kt index 88eb49ebb26e..bde2d7de2515 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/KotlinJpsClasspathProvider.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/KotlinJpsClasspathProvider.kt @@ -1,30 +1,11 @@ // Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.kotlin.idea -import com.intellij.DynamicBundle import com.intellij.compiler.server.BuildProcessParametersProvider -import com.intellij.openapi.application.PathManager.getJarPathForClass +import org.jetbrains.kotlin.idea.compiler.configuration.KotlinPluginLayout class KotlinJpsClasspathProvider : BuildProcessParametersProvider() { - override fun getClassPath(): List<String?> { - return listOf( - // kotlin-reflect.jar - getJarPathForClass(kotlin.reflect.full.IllegalCallableAccessException::class.java), - - // kotlin-plugin.jar (aka kotlin-compiler-for-ide.jar) - // TODO: note it has to be compiler-components-for-jps.jar rather than kotlin-compiler-for-ide.jar - // as kotlin-compiler-for-ide.jar includes kotlin-jps-common.jar as well (+maybe smth else) - // kotlin-compiler-common-for-ide.jar - getJarPathForClass(org.jetbrains.kotlin.idea.KotlinFileType::class.java), - - // kotlin-compiler-fe10-for-ide.jar - getJarPathForClass(org.jetbrains.kotlin.descriptors.ClassDescriptor::class.java), - - // kotlin-compiler-ir-for-ide.jar - getJarPathForClass(org.jetbrains.kotlin.ir.IrElement::class.java), - - // Base of i18n - getJarPathForClass(DynamicBundle::class.java), - ) + override fun getClassPath(): List<String> { + return listOf(KotlinPluginLayout.instance.jpsPluginJar.canonicalPath) } }
\ No newline at end of file diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/PluginStartupActivity.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/PluginStartupActivity.kt index 25a3c5c5c836..c6279fd1ecb3 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/PluginStartupActivity.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/PluginStartupActivity.kt @@ -20,8 +20,10 @@ import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.idea.KotlinPluginCompatibilityVerifier.checkCompatibility import org.jetbrains.kotlin.idea.configuration.notifications.checkExternalKotlinCompilerVersion import org.jetbrains.kotlin.idea.configuration.notifications.notifyKotlinStyleUpdateIfNeeded +import org.jetbrains.kotlin.idea.configuration.notifications.showEapSurveyNotification import org.jetbrains.kotlin.idea.reporter.KotlinReportSubmitter.Companion.setupReportingFromRelease import org.jetbrains.kotlin.idea.search.containsKotlinFile +import org.jetbrains.kotlin.idea.util.application.isUnitTestMode import org.jetbrains.kotlin.js.resolve.diagnostics.ErrorsJs import org.jetbrains.kotlin.resolve.jvm.KotlinJavaPsiFacade import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm @@ -78,6 +80,10 @@ internal class PluginStartupActivity : StartupActivity.Background { if (!ApplicationManager.getApplication().isHeadlessEnvironment) { notifyKotlinStyleUpdateIfNeeded(project) + + if (!isUnitTestMode()) { + showEapSurveyNotification(project) + } } val daemonCodeAnalyzer = DaemonCodeAnalyzerImpl.getInstanceEx(project) as DaemonCodeAnalyzerImpl diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/caches/FileAttributeServiceImpl.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/caches/FileAttributeServiceImpl.kt index e9d54950e29f..def49798763d 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/caches/FileAttributeServiceImpl.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/caches/FileAttributeServiceImpl.kt @@ -6,6 +6,8 @@ import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFileWithId import com.intellij.openapi.vfs.newvfs.FileAttribute import com.intellij.util.io.DataInputOutputUtil +import org.jetbrains.kotlin.analysis.decompiler.stub.file.CachedAttributeData +import org.jetbrains.kotlin.analysis.decompiler.stub.file.FileAttributeService import java.io.DataInput import java.io.DataOutput import java.util.concurrent.ConcurrentHashMap diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/codeInliner/CodeToInlineBuilder.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/codeInliner/CodeToInlineBuilder.kt index ac3934214afc..98a828a58215 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/codeInliner/CodeToInlineBuilder.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/codeInliner/CodeToInlineBuilder.kt @@ -28,15 +28,15 @@ import org.jetbrains.kotlin.psi.psiUtil.* import org.jetbrains.kotlin.renderer.render import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.ImportedFromObjectCallableDescriptor -import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.calls.model.isReallySuccess +import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameOrNull import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitReceiver import org.jetbrains.kotlin.resolve.scopes.utils.findClassifier -import org.jetbrains.kotlin.types.ErrorUtils +import org.jetbrains.kotlin.types.error.ErrorUtils import org.jetbrains.kotlin.types.typeUtil.unCapture import org.jetbrains.kotlin.utils.addToStdlib.cast import org.jetbrains.kotlin.utils.addToStdlib.safeAs @@ -282,8 +282,8 @@ class CodeToInlineBuilder( } private fun processReferences(codeToInline: MutableCodeToInline, analyze: (KtExpression) -> BindingContext, reformat: Boolean) { - val targetDispatchReceiverType = targetCallable.dispatchReceiverParameter?.value?.type - val targetExtensionReceiverType = targetCallable.extensionReceiverParameter?.value?.type + val targetDispatchReceiverType = targetCallable.dispatchReceiverParameter?.value?.type?.unCapture() + val targetExtensionReceiverType = targetCallable.extensionReceiverParameter?.value?.type?.unCapture() val isAnonymousFunction = originalDeclaration?.isAnonymousFunction == true val isAnonymousFunctionWithReceiver = isAnonymousFunction && originalDeclaration.cast<KtNamedFunction>().receiverTypeReference != null @@ -357,8 +357,11 @@ class CodeToInlineBuilder( if (receiver is ImplicitReceiver) { val resolutionScope = expression.getResolutionScope(bindingContext, resolutionFacade) val receiverExpressionToInline = receiver.asExpression(resolutionScope, psiFactory) - if (receiverExpressionToInline != null) { - val receiverType = receiver.type.unCapture() + val receiverType = receiver.type.unCapture() + val isSameReceiverType = receiverType == targetDispatchReceiverType || receiverType == targetExtensionReceiverType + val receiverIsUnnecessary = + (receiverExpressionToInline as? KtThisExpression)?.labelQualifier != null && isSameReceiverType + if (receiverExpressionToInline != null && !receiverIsUnnecessary) { codeToInline.addPreCommitAction(expressionToResolve) { expr -> val expressionToReplace = expr.parent as? KtCallExpression ?: expr val replaced = codeToInline.replaceExpression( @@ -372,7 +375,7 @@ class CodeToInlineBuilder( val thisExpression = replaced?.receiverExpression ?: return@addPreCommitAction if (isAnonymousFunctionWithReceiver && receiverType == targetExtensionReceiverType) { thisExpression.putCopyableUserData(CodeToInline.PARAMETER_USAGE_KEY, getFirstParameterName()) - } else if (receiverType != targetDispatchReceiverType && receiverType != targetExtensionReceiverType) { + } else if (!isSameReceiverType) { thisExpression.putCopyableUserData(CodeToInline.SIDE_RECEIVER_USAGE_KEY, Unit) } } diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/codeInliner/introduceValue.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/codeInliner/introduceValue.kt index 5262d6183436..b40bce1d3869 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/codeInliner/introduceValue.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/codeInliner/introduceValue.kt @@ -23,7 +23,7 @@ import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoBefore import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.scopes.LexicalScope -import org.jetbrains.kotlin.types.ErrorUtils +import org.jetbrains.kotlin.types.error.ErrorUtils import org.jetbrains.kotlin.types.KotlinType /** diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteReferenceProcessor.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteReferenceProcessor.kt index 6a2214892f35..5ff1213692e1 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteReferenceProcessor.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteReferenceProcessor.kt @@ -59,7 +59,7 @@ import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.resolve.scopes.utils.findFunction import org.jetbrains.kotlin.resolve.scopes.utils.findVariable -import org.jetbrains.kotlin.types.ErrorUtils +import org.jetbrains.kotlin.types.error.ErrorUtils import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull import java.awt.datatransfer.Transferable import java.awt.datatransfer.UnsupportedFlavorException diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerConfigurableTab.java b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerConfigurableTab.java index 410eea2c2a76..7a45d13a72ba 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerConfigurableTab.java +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/compiler/configuration/KotlinCompilerConfigurableTab.java @@ -28,10 +28,7 @@ import kotlin.jvm.functions.Function1; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments; -import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments; -import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments; -import org.jetbrains.kotlin.cli.common.arguments.K2JsArgumentConstants; +import org.jetbrains.kotlin.cli.common.arguments.*; import org.jetbrains.kotlin.config.*; import org.jetbrains.kotlin.idea.KotlinBundle; import org.jetbrains.kotlin.idea.PluginStartupApplicationService; @@ -165,10 +162,10 @@ public class KotlinCompilerConfigurableTab implements SearchableConfigurable, Di @SuppressWarnings("unused") public KotlinCompilerConfigurableTab(Project project) { this(project, - (CommonCompilerArguments) KotlinCommonCompilerArgumentsHolder.Companion.getInstance(project).getSettings().unfrozen(), - (K2JSCompilerArguments) Kotlin2JsCompilerArgumentsHolder.Companion.getInstance(project).getSettings().unfrozen(), - (K2JVMCompilerArguments) Kotlin2JvmCompilerArgumentsHolder.Companion.getInstance(project).getSettings().unfrozen(), - (CompilerSettings) KotlinCompilerSettings.Companion.getInstance(project).getSettings().unfrozen(), + FreezableKt.unfrozen(KotlinCommonCompilerArgumentsHolder.Companion.getInstance(project).getSettings()), + FreezableKt.unfrozen(Kotlin2JsCompilerArgumentsHolder.Companion.getInstance(project).getSettings()), + FreezableKt.unfrozen(Kotlin2JvmCompilerArgumentsHolder.Companion.getInstance(project).getSettings()), + FreezableKt.unfrozen(KotlinCompilerSettings.Companion.getInstance(project).getSettings()), KotlinCompilerWorkspaceSettings.getInstance(project), true, false); @@ -390,7 +387,7 @@ public class KotlinCompilerConfigurableTab implements SearchableConfigurable, Di apiVersionComboBox.setRenderer(new DescriptionListCellRenderer()); } - public void setTargetPlatform(@Nullable IdePlatformKind<?> targetPlatform) { + public void setTargetPlatform(@Nullable IdePlatformKind targetPlatform) { k2jsPanel.setVisible(JsIdePlatformUtil.isJavaScript(targetPlatform)); scriptPanel.setVisible(JvmIdePlatformUtil.isJvm(targetPlatform)); } diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMigrationProjectService.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMigrationProjectService.kt index 813aa14edd35..31c9ebf2e550 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMigrationProjectService.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinMigrationProjectService.kt @@ -219,8 +219,8 @@ data class MigrationInfo( } } -fun MigrationInfo.isLanguageVersionUpdate(old: LanguageVersion, new: LanguageVersion): Boolean { - return oldLanguageVersion <= old && newLanguageVersion >= new +fun MigrationInfo.isLanguageVersionUpdate(untilOldVersion: LanguageVersion, sinceNewVersion: LanguageVersion): Boolean { + return oldLanguageVersion <= untilOldVersion && newLanguageVersion >= sinceNewVersion } diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/configuration/notifications/eapSurveyNotification.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/configuration/notifications/eapSurveyNotification.kt new file mode 100644 index 000000000000..7b9b534b924a --- /dev/null +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/configuration/notifications/eapSurveyNotification.kt @@ -0,0 +1,45 @@ +// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package org.jetbrains.kotlin.idea.configuration.notifications + +import com.intellij.ide.util.RunOnceUtil +import com.intellij.notification.BrowseNotificationAction +import com.intellij.notification.NotificationGroupManager +import com.intellij.notification.NotificationType +import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.idea.KotlinBundle +import org.jetbrains.kotlin.idea.KotlinIcons +import org.jetbrains.kotlin.idea.compiler.configuration.KotlinPluginLayout +import java.time.LocalDate +import java.util.* + +internal fun showEapSurveyNotification(project: Project) { + if (LocalDate.now() > LocalDate.of(/* year = */ 2022, /* month = */ 5, /* dayOfMonth = */ 8)) return + + val compilerVersion = KotlinPluginLayout.instance.ideCompilerVersion.lowercase(Locale.getDefault()) + if (!compilerVersion.contains("1.7.0-beta")) return + + // Only beta 1. Yes, it is a bit ugly, but we don't have nice IdeKotlinVersion in old kt branches. And yes, I hope we won't have beta3. + if (compilerVersion.contains("1.7.0-beta2")) return + + RunOnceUtil.runOnceForApp("kotlin.eap.survey.was.shown.once") { + @Suppress("DialogTitleCapitalization") + val action = NotificationGroupManager.getInstance() + .getNotificationGroup("Kotlin EAP Survey") + .createNotification( + KotlinBundle.message("kotlin.eap.survey.notification.title"), + KotlinBundle.message("kotlin.eap.survey.notification.text"), + NotificationType.INFORMATION, + ) + .addAction( + BrowseNotificationAction( + KotlinBundle.message("kotlin.eap.survey.notification.action"), + KotlinBundle.message("kotlin.eap.survey.notification.link"), + ) + ) + + action.setSuggestionType(true) + action.setIcon(KotlinIcons.SMALL_LOGO) + action.setImportant(true) + action.notify(project) + } +}
\ No newline at end of file diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetEditorGeneralTab.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetEditorGeneralTab.kt index 983971446ce0..5020acbd04de 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetEditorGeneralTab.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetEditorGeneralTab.kt @@ -11,10 +11,7 @@ import com.intellij.ui.HoverHyperlinkLabel import com.intellij.util.ui.FormBuilder import com.intellij.util.ui.ThreeStateCheckBox import org.jetbrains.kotlin.cli.common.arguments.* -import org.jetbrains.kotlin.config.CompilerSettings -import org.jetbrains.kotlin.config.createArguments -import org.jetbrains.kotlin.config.isHmpp -import org.jetbrains.kotlin.config.splitArgumentString +import org.jetbrains.kotlin.config.* import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.compiler.configuration.* import org.jetbrains.kotlin.idea.core.util.onTextChange @@ -119,9 +116,9 @@ class KotlinFacetEditorGeneralTab( } else { editableCommonArguments = configuration!!.settings.compilerArguments!! editableJvmArguments = editableCommonArguments as? K2JVMCompilerArguments - ?: Kotlin2JvmCompilerArgumentsHolder.getInstance(project).settings.unfrozen() as K2JVMCompilerArguments + ?: Kotlin2JvmCompilerArgumentsHolder.getInstance(project).settings.unfrozen() editableJsArguments = editableCommonArguments as? K2JSCompilerArguments - ?: Kotlin2JsCompilerArgumentsHolder.getInstance(project).settings.unfrozen() as K2JSCompilerArguments + ?: Kotlin2JsCompilerArgumentsHolder.getInstance(project).settings.unfrozen() editableCompilerSettings = configuration.settings.compilerSettings!! } @@ -201,13 +198,10 @@ class KotlinFacetEditorGeneralTab( compilerConfigurable.setTargetPlatform(getChosenPlatform()?.idePlatformKind) compilerConfigurable.setEnabled(!useProjectSettings) if (useProjectSettings) { - compilerConfigurable.commonCompilerArguments = - KotlinCommonCompilerArgumentsHolder.getInstance(project).settings.unfrozen() as CommonCompilerArguments? - compilerConfigurable.k2jvmCompilerArguments = - Kotlin2JvmCompilerArgumentsHolder.getInstance(project).settings.unfrozen() as K2JVMCompilerArguments? - compilerConfigurable.k2jsCompilerArguments = - Kotlin2JsCompilerArgumentsHolder.getInstance(project).settings.unfrozen() as K2JSCompilerArguments? - compilerConfigurable.compilerSettings = KotlinCompilerSettings.getInstance(project).settings.unfrozen() as CompilerSettings? + compilerConfigurable.commonCompilerArguments = KotlinCommonCompilerArgumentsHolder.getInstance(project).settings.unfrozen() + compilerConfigurable.k2jvmCompilerArguments = Kotlin2JvmCompilerArgumentsHolder.getInstance(project).settings.unfrozen() + compilerConfigurable.k2jsCompilerArguments = Kotlin2JsCompilerArgumentsHolder.getInstance(project).settings.unfrozen() + compilerConfigurable.compilerSettings = KotlinCompilerSettings.getInstance(project).settings.unfrozen() } else { compilerConfigurable.commonCompilerArguments = editableCommonArguments compilerConfigurable.k2jvmCompilerArguments = editableJvmArguments diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/facet/KotlinVersionInfoProviderByModuleDependencies.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/facet/KotlinVersionInfoProviderByModuleDependencies.kt index 9c01845b208b..16c12773aaf5 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/facet/KotlinVersionInfoProviderByModuleDependencies.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/facet/KotlinVersionInfoProviderByModuleDependencies.kt @@ -15,7 +15,7 @@ class KotlinVersionInfoProviderByModuleDependencies : KotlinVersionInfoProvider override fun getLibraryVersions( module: Module, - platformKind: IdePlatformKind<*>, + platformKind: IdePlatformKind, rootModel: ModuleRootModel? ): Collection<String> { if (module.isDisposed) { diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt index 688cb46979bd..55f551714d75 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt @@ -104,7 +104,7 @@ fun KotlinFacetSettings.initializeIfNeeded( } } -val mavenLibraryIdToPlatform: Map<String, IdePlatformKind<*>> by lazy { +val mavenLibraryIdToPlatform: Map<String, IdePlatformKind> by lazy { IdePlatformKind.ALL_KINDS .flatMap { platform -> platform.tooling.mavenLibraryIds.map { it to platform } } .sortedByDescending { it.first.length } diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/findUsages/KotlinFindUsagesSupportImpl.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/findUsages/KotlinFindUsagesSupportImpl.kt index 8bbe51caf6ff..67be98e4b3ce 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/findUsages/KotlinFindUsagesSupportImpl.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/findUsages/KotlinFindUsagesSupportImpl.kt @@ -9,7 +9,7 @@ import com.intellij.psi.search.GlobalSearchScope import com.intellij.util.Processor import org.jetbrains.kotlin.idea.search.usagesSearch.dataClassComponentFunction import org.jetbrains.kotlin.idea.search.usagesSearch.isCallReceiverRefersToCompanionObject -import org.jetbrains.kotlin.idea.search.usagesSearch.isConstructorUsage +import org.jetbrains.kotlin.idea.search.usagesSearch.isKotlinConstructorUsage import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.anyDescendantOfType import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType @@ -37,12 +37,12 @@ class KotlinFindUsagesSupportImpl : KotlinFindUsagesSupport { override fun tryRenderDeclarationCompactStyle(declaration: KtDeclaration): String? = org.jetbrains.kotlin.idea.search.usagesSearch.tryRenderDeclarationCompactStyle(declaration) - override fun isConstructorUsage(psiReference: PsiReference, ktClassOrObject: KtClassOrObject): Boolean = - psiReference.isConstructorUsage(ktClassOrObject) + override fun isKotlinConstructorUsage(psiReference: PsiReference, ktClassOrObject: KtClassOrObject): Boolean = + psiReference.isKotlinConstructorUsage(ktClassOrObject) override fun getSuperMethods(declaration: KtDeclaration, ignore: Collection<PsiElement>?): List<PsiElement> = org.jetbrains.kotlin.idea.refactoring.getSuperMethods(declaration, ignore) override fun sourcesAndLibraries(delegate: GlobalSearchScope, project: Project): GlobalSearchScope = org.jetbrains.kotlin.idea.stubindex.KotlinSourceFilterScope.sourcesAndLibraries(delegate, project) -}
\ No newline at end of file +} diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/goto/gotoContributors.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/goto/gotoContributors.kt index 0b2e1310e93a..e43f55de8201 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/goto/gotoContributors.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/goto/gotoContributors.kt @@ -8,9 +8,9 @@ import com.intellij.navigation.NavigationItem import com.intellij.openapi.project.Project import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.stubs.StubIndex +import org.jetbrains.kotlin.analysis.decompiler.psi.KotlinBuiltInFileType import org.jetbrains.kotlin.asJava.LightClassUtil import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil -import org.jetbrains.kotlin.idea.decompiler.builtIns.KotlinBuiltInFileType import org.jetbrains.kotlin.idea.stubindex.* import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.containingClass diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/highlighter/KotlinRainbowVisitor.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/highlighter/KotlinRainbowVisitor.kt index 5b29fce92054..77ffeb758288 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/highlighter/KotlinRainbowVisitor.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/highlighter/KotlinRainbowVisitor.kt @@ -10,7 +10,7 @@ import com.intellij.psi.PsiFile import com.intellij.psi.util.PsiTreeUtil import org.jetbrains.kotlin.idea.highlighter.KotlinHighlightingColors.* import org.jetbrains.kotlin.idea.references.mainReference -import org.jetbrains.kotlin.idea.search.ideaExtensions.KotlinTargetElementEvaluator +import org.jetbrains.kotlin.idea.search.ideaExtensions.FE10KotlinTargetElementEvaluator import org.jetbrains.kotlin.idea.util.isAnonymousFunction import org.jetbrains.kotlin.kdoc.psi.impl.KDocName import org.jetbrains.kotlin.psi.* @@ -20,7 +20,7 @@ import org.jetbrains.kotlin.psi.psiUtil.parents class KotlinRainbowVisitor : RainbowVisitor() { companion object { - val KOTLIN_TARGET_ELEMENT_EVALUATOR = KotlinTargetElementEvaluator() + val KOTLIN_TARGET_ELEMENT_EVALUATOR = FE10KotlinTargetElementEvaluator() } override fun suitableForFile(file: PsiFile) = file is KtFile diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/highlighter/KotlinRecursiveCallLineMarkerProvider.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/highlighter/KotlinRecursiveCallLineMarkerProvider.kt index faa5b7c60fd2..350dfdda91c5 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/highlighter/KotlinRecursiveCallLineMarkerProvider.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/highlighter/KotlinRecursiveCallLineMarkerProvider.kt @@ -16,7 +16,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.highlighter.markers.LineMarkerInfos import org.jetbrains.kotlin.idea.inspections.RecursivePropertyAccessorInspection import org.jetbrains.kotlin.idea.util.getReceiverTargetDescriptor -import org.jetbrains.kotlin.idea.util.safeAnalyzeNonSourceRootCode +import org.jetbrains.kotlin.idea.caches.resolve.safeAnalyzeNonSourceRootCode import org.jetbrains.kotlin.lexer.KtToken import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/highlighter/KotlinSuspendCallLineMarkerProvider.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/highlighter/KotlinSuspendCallLineMarkerProvider.kt index d18cdba7760e..0eb37a3823d7 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/highlighter/KotlinSuspendCallLineMarkerProvider.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/highlighter/KotlinSuspendCallLineMarkerProvider.kt @@ -16,7 +16,7 @@ import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.KotlinIcons import org.jetbrains.kotlin.idea.highlighter.markers.LineMarkerInfos import org.jetbrains.kotlin.idea.refactoring.getLineNumber -import org.jetbrains.kotlin.idea.util.safeAnalyzeNonSourceRootCode +import org.jetbrains.kotlin.idea.caches.resolve.safeAnalyzeNonSourceRootCode import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext.* diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/imports/KotlinImportOptimizer.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/imports/KotlinImportOptimizer.kt index bac5a47fedd4..c9c4a4d0a3fa 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/imports/KotlinImportOptimizer.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/imports/KotlinImportOptimizer.kt @@ -18,7 +18,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.formatter.kotlinCustomSettings import org.jetbrains.kotlin.idea.project.languageVersionSettings import org.jetbrains.kotlin.idea.references.* -import org.jetbrains.kotlin.idea.util.safeAnalyzeNonSourceRootCode +import org.jetbrains.kotlin.idea.caches.resolve.safeAnalyzeNonSourceRootCode import org.jetbrains.kotlin.idea.util.getResolutionScope import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.name.FqName @@ -31,7 +31,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.getImportableDescriptor import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.scopes.HierarchicalScope import org.jetbrains.kotlin.resolve.scopes.utils.* -import org.jetbrains.kotlin.types.error.ErrorSimpleFunctionDescriptorImpl +import org.jetbrains.kotlin.types.error.ErrorFunctionDescriptor class KotlinImportOptimizer : ImportOptimizer { override fun supports(file: PsiFile) = file is KtFile @@ -310,5 +310,5 @@ private fun hasResolvedDescriptor(element: KtElement, bindingContext: BindingCon element.getResolvedCall(bindingContext) != null else element.mainReference?.resolveToDescriptors(bindingContext)?.let { descriptors -> - descriptors.isNotEmpty() && descriptors.none { it is ErrorSimpleFunctionDescriptorImpl } + descriptors.isNotEmpty() && descriptors.none { it is ErrorFunctionDescriptor } } == true diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/JavaCollectionsStaticMethodInspection.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/JavaCollectionsStaticMethodInspection.kt index 27c51396015c..553b1ebc47b3 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/JavaCollectionsStaticMethodInspection.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/JavaCollectionsStaticMethodInspection.kt @@ -15,7 +15,7 @@ import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.imports.importableFqName import org.jetbrains.kotlin.idea.intentions.callExpression import org.jetbrains.kotlin.idea.project.languageVersionSettings -import org.jetbrains.kotlin.idea.util.safeAnalyzeNonSourceRootCode +import org.jetbrains.kotlin.idea.caches.resolve.safeAnalyzeNonSourceRootCode import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/LeakingThisInspection.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/LeakingThisInspection.kt index 7161322678be..ffb864443d6c 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/LeakingThisInspection.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/LeakingThisInspection.kt @@ -12,8 +12,8 @@ import org.jetbrains.annotations.Nls import org.jetbrains.kotlin.cfg.LeakingThisDescriptor.* import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.idea.KotlinBundle +import org.jetbrains.kotlin.idea.caches.resolve.safeAnalyzeWithContentNonSourceRootCode import org.jetbrains.kotlin.idea.quickfix.AddModifierFixFE10 -import org.jetbrains.kotlin.idea.util.safeAnalyzeWithContentNonSourceRootCode import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/NestedLambdaShadowedImplicitParameterInspection.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/NestedLambdaShadowedImplicitParameterInspection.kt index 3c87aba12adb..b2672713f588 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/NestedLambdaShadowedImplicitParameterInspection.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/NestedLambdaShadowedImplicitParameterInspection.kt @@ -13,7 +13,7 @@ import org.jetbrains.kotlin.idea.inspections.collections.isCalling import org.jetbrains.kotlin.idea.intentions.ReplaceItWithExplicitFunctionLiteralParamIntention import org.jetbrains.kotlin.idea.intentions.callExpression import org.jetbrains.kotlin.idea.refactoring.rename.KotlinVariableInplaceRenameHandler -import org.jetbrains.kotlin.idea.util.safeAnalyzeNonSourceRootCode +import org.jetbrains.kotlin.idea.caches.resolve.safeAnalyzeNonSourceRootCode import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.* diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantRequireNotNullCallInspection.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantRequireNotNullCallInspection.kt index b71323cd1f42..4c8dfe9ae96c 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantRequireNotNullCallInspection.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantRequireNotNullCallInspection.kt @@ -15,7 +15,7 @@ import org.jetbrains.kotlin.idea.inspections.collections.isCalling import org.jetbrains.kotlin.idea.project.languageVersionSettings import org.jetbrains.kotlin.idea.resolve.ResolutionFacade import org.jetbrains.kotlin.idea.resolve.getDataFlowValueFactory -import org.jetbrains.kotlin.idea.util.safeAnalyzeNonSourceRootCode +import org.jetbrains.kotlin.idea.caches.resolve.safeAnalyzeNonSourceRootCode import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtCallExpression import org.jetbrains.kotlin.psi.KtReferenceExpression diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/RemoveRedundantQualifierNameInspection.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/RemoveRedundantQualifierNameInspection.kt index feda48ca2f8b..b28f28520f9d 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/RemoveRedundantQualifierNameInspection.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/RemoveRedundantQualifierNameInspection.kt @@ -21,7 +21,7 @@ import org.jetbrains.kotlin.idea.imports.importableFqName import org.jetbrains.kotlin.idea.intentions.isReferenceToBuiltInEnumFunction import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.idea.references.resolveToDescriptors -import org.jetbrains.kotlin.idea.util.safeAnalyzeNonSourceRootCode +import org.jetbrains.kotlin.idea.caches.resolve.safeAnalyzeNonSourceRootCode import org.jetbrains.kotlin.idea.util.getResolutionScope import org.jetbrains.kotlin.idea.util.hasNotReceiver import org.jetbrains.kotlin.incremental.components.NoLookupLocation diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceArrayOfWithLiteralInspection.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceArrayOfWithLiteralInspection.kt index 657e5eb9419b..15b010bc1243 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceArrayOfWithLiteralInspection.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceArrayOfWithLiteralInspection.kt @@ -8,20 +8,13 @@ import com.intellij.codeInspection.ProblemHighlightType import com.intellij.codeInspection.ProblemsHolder import com.intellij.openapi.project.Project import com.intellij.psi.PsiElementVisitor -import org.jetbrains.kotlin.config.LanguageFeature.ArrayLiteralsInAnnotations import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.intentions.isArrayOfMethod -import org.jetbrains.kotlin.idea.project.languageVersionSettings -import org.jetbrains.kotlin.idea.util.application.isUnitTestMode import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getParentOfType class ReplaceArrayOfWithLiteralInspection : AbstractKotlinInspection() { override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor = callExpressionVisitor(fun(expression) { - if (!expression.languageVersionSettings.supportsFeature(ArrayLiteralsInAnnotations) && - !isUnitTestMode() - ) return - val calleeExpression = expression.calleeExpression as? KtNameReferenceExpression ?: return when (val parent = expression.parent) { @@ -74,4 +67,4 @@ class ReplaceArrayOfWithLiteralInspection : AbstractKotlinInspection() { callExpression.replace(arrayLiteral) } } -}
\ No newline at end of file +} diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceAssertBooleanWithAssertEqualityInspection.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceAssertBooleanWithAssertEqualityInspection.kt index b0c4966d8032..dc20fcee2e45 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceAssertBooleanWithAssertEqualityInspection.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceAssertBooleanWithAssertEqualityInspection.kt @@ -9,7 +9,7 @@ import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.core.ShortenReferences import org.jetbrains.kotlin.idea.core.replaced -import org.jetbrains.kotlin.idea.util.safeAnalyzeNonSourceRootCode +import org.jetbrains.kotlin.idea.caches.resolve.safeAnalyzeNonSourceRootCode import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.* diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceWithEnumMapInspection.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceWithEnumMapInspection.kt index 7b76b2dee233..2286b183691a 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceWithEnumMapInspection.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceWithEnumMapInspection.kt @@ -11,7 +11,7 @@ import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.caches.resolve.resolveImportReference import org.jetbrains.kotlin.idea.project.platform import org.jetbrains.kotlin.idea.util.ImportInsertHelper -import org.jetbrains.kotlin.idea.util.safeAnalyzeNonSourceRootCode +import org.jetbrains.kotlin.idea.caches.resolve.safeAnalyzeNonSourceRootCode import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.platform.jvm.isJvm import org.jetbrains.kotlin.psi.KtCallExpression diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/UnnecessaryOptInAnnotationInspection.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/UnnecessaryOptInAnnotationInspection.kt index 8ca03bda8664..732e1890ea23 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/UnnecessaryOptInAnnotationInspection.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/UnnecessaryOptInAnnotationInspection.kt @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.renderer.render import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.SINCE_KOTLIN_FQ_NAME import org.jetbrains.kotlin.resolve.checkers.OptInNames +import org.jetbrains.kotlin.resolve.checkers.OptInNames.OPT_IN_FQ_NAMES import org.jetbrains.kotlin.resolve.constants.ArrayValue import org.jetbrains.kotlin.resolve.constants.KClassValue import org.jetbrains.kotlin.resolve.constants.StringValue @@ -75,7 +76,7 @@ class UnnecessaryOptInAnnotationInspection : AbstractKotlinInspection() { ) // Short names for `kotlin.OptIn` and `kotlin.UseExperimental` for faster comparison without name resolution - private val USE_EXPERIMENTAL_SHORT_NAMES = OptInNames.USE_EXPERIMENTAL_FQ_NAMES.map { it.shortName().asString() }.toSet() + private val OPT_IN_SHORT_NAMES = OPT_IN_FQ_NAMES.map { it.shortName().asString() }.toSet() /** * Main inspection visitor to traverse all annotation entries. @@ -84,7 +85,7 @@ class UnnecessaryOptInAnnotationInspection : AbstractKotlinInspection() { val optInAliases = holder.file.safeAs<KtFile>() ?.aliasImportMap() ?.entries() - ?.filter { it.value in USE_EXPERIMENTAL_SHORT_NAMES } + ?.filter { it.value in OPT_IN_SHORT_NAMES } ?.mapNotNull { it.key } ?.toSet() ?: emptySet() @@ -92,7 +93,7 @@ class UnnecessaryOptInAnnotationInspection : AbstractKotlinInspection() { return annotationEntryVisitor { annotationEntry -> // Fast check if the annotation may be `@OptIn`/`@UseExperimental` or any of their import aliases val entryShortName = annotationEntry.shortName?.asString() - if (entryShortName != null && entryShortName !in USE_EXPERIMENTAL_SHORT_NAMES && entryShortName !in optInAliases) + if (entryShortName != null && entryShortName !in OPT_IN_SHORT_NAMES && entryShortName !in optInAliases) return@annotationEntryVisitor // Resolve the candidate annotation entry. If it is an `@OptIn`/`@UseExperimental` annotation, diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/UnsafeCastFromDynamicInspection.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/UnsafeCastFromDynamicInspection.kt index b0c1edbb5d2d..d49763e3a832 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/UnsafeCastFromDynamicInspection.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/UnsafeCastFromDynamicInspection.kt @@ -6,7 +6,7 @@ import com.intellij.codeInspection.* import com.intellij.openapi.project.Project import com.intellij.psi.PsiElementVisitor import org.jetbrains.kotlin.idea.KotlinBundle -import org.jetbrains.kotlin.idea.util.safeAnalyzeNonSourceRootCode +import org.jetbrains.kotlin.idea.caches.resolve.safeAnalyzeNonSourceRootCode import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtPsiFactory import org.jetbrains.kotlin.psi.createExpressionByPattern diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedLambdaExpressionBodyInspection.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedLambdaExpressionBodyInspection.kt index ec960c3f7e9e..f865025d75a8 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedLambdaExpressionBodyInspection.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedLambdaExpressionBodyInspection.kt @@ -12,7 +12,7 @@ import com.intellij.psi.PsiFile import org.jetbrains.kotlin.builtins.isFunctionType import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.idea.KotlinBundle -import org.jetbrains.kotlin.idea.util.safeAnalyzeNonSourceRootCode +import org.jetbrains.kotlin.idea.caches.resolve.safeAnalyzeNonSourceRootCode import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.allChildren import org.jetbrains.kotlin.resolve.BindingContext diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedUnaryOperatorInspection.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedUnaryOperatorInspection.kt index 0066ef4c1591..873604e8a182 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedUnaryOperatorInspection.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedUnaryOperatorInspection.kt @@ -9,7 +9,7 @@ import com.intellij.openapi.project.Project import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.idea.KotlinBundle -import org.jetbrains.kotlin.idea.util.safeAnalyzeNonSourceRootCode +import org.jetbrains.kotlin.idea.caches.resolve.safeAnalyzeNonSourceRootCode import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtAnnotationEntry import org.jetbrains.kotlin.psi.KtExpression diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/UseExpressionBodyInspection.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/UseExpressionBodyInspection.kt index 16a293ba11e2..365a11df6f97 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/UseExpressionBodyInspection.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/UseExpressionBodyInspection.kt @@ -15,12 +15,12 @@ import com.intellij.psi.PsiElement import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.idea.KotlinBundle +import org.jetbrains.kotlin.idea.caches.resolve.safeAnalyzeNonSourceRootCode import org.jetbrains.kotlin.idea.core.canOmitDeclaredType import org.jetbrains.kotlin.idea.core.replaced import org.jetbrains.kotlin.idea.core.setType import org.jetbrains.kotlin.idea.core.util.isOneLiner import org.jetbrains.kotlin.idea.intentions.hasResultingIfWithoutElse -import org.jetbrains.kotlin.idea.util.safeAnalyzeNonSourceRootCode import org.jetbrains.kotlin.idea.util.CommentSaver import org.jetbrains.kotlin.idea.util.resultingWhens import org.jetbrains.kotlin.lexer.KtTokens diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/collections/ConvertCallChainIntoSequenceInspection.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/collections/ConvertCallChainIntoSequenceInspection.kt index 04768b2b9d5c..411ef992c0d6 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/collections/ConvertCallChainIntoSequenceInspection.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/collections/ConvertCallChainIntoSequenceInspection.kt @@ -20,7 +20,7 @@ import org.jetbrains.kotlin.idea.core.replaced import org.jetbrains.kotlin.idea.inspections.AbstractKotlinInspection import org.jetbrains.kotlin.idea.intentions.callExpression import org.jetbrains.kotlin.idea.util.CommentSaver -import org.jetbrains.kotlin.idea.util.safeAnalyzeNonSourceRootCode +import org.jetbrains.kotlin.idea.caches.resolve.safeAnalyzeNonSourceRootCode import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.* diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/dfa/KtDfaHelpers.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/dfa/KtDfaHelpers.kt index 61e5dc046db7..0293f01ac02e 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/dfa/KtDfaHelpers.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/dfa/KtDfaHelpers.kt @@ -23,8 +23,8 @@ import org.jetbrains.kotlin.builtins.StandardNames.FqNames import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.resolveToCall +import org.jetbrains.kotlin.idea.caches.resolve.safeAnalyzeNonSourceRootCode import org.jetbrains.kotlin.idea.project.builtIns -import org.jetbrains.kotlin.idea.util.safeAnalyzeNonSourceRootCode import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.name.FqNameUnsafe import org.jetbrains.kotlin.psi.* diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/jdk2k/ReplaceJavaStaticMethodWithKotlinAnalogInspection.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/jdk2k/ReplaceJavaStaticMethodWithKotlinAnalogInspection.kt index 6a8481066f19..1c7ec4bf5c98 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/jdk2k/ReplaceJavaStaticMethodWithKotlinAnalogInspection.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/jdk2k/ReplaceJavaStaticMethodWithKotlinAnalogInspection.kt @@ -11,7 +11,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.resolveToCall import org.jetbrains.kotlin.idea.inspections.AbstractKotlinInspection import org.jetbrains.kotlin.idea.inspections.collections.isCalling -import org.jetbrains.kotlin.idea.util.safeAnalyzeNonSourceRootCode +import org.jetbrains.kotlin.idea.caches.resolve.safeAnalyzeNonSourceRootCode import org.jetbrains.kotlin.idea.util.textRangeIn import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtCallExpression diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/migration/AbstractDiagnosticBasedMigrationInspection.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/migration/AbstractDiagnosticBasedMigrationInspection.kt index e9677fb452c4..5a778dd406d2 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/migration/AbstractDiagnosticBasedMigrationInspection.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/migration/AbstractDiagnosticBasedMigrationInspection.kt @@ -8,6 +8,7 @@ import com.intellij.codeInspection.IntentionWrapper import com.intellij.codeInspection.ProblemDescriptor import com.intellij.codeInspection.ProblemHighlightType import com.intellij.openapi.util.TextRange +import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile import org.jetbrains.annotations.Nls import org.jetbrains.kotlin.diagnostics.Diagnostic @@ -16,12 +17,11 @@ import org.jetbrains.kotlin.diagnostics.rendering.DefaultErrorMessages import org.jetbrains.kotlin.idea.caches.resolve.analyzeWithAllCompilerChecks import org.jetbrains.kotlin.idea.inspections.AbstractKotlinInspection import org.jetbrains.kotlin.idea.quickfix.QuickFixes -import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtTreeVisitorVoid -abstract class AbstractDiagnosticBasedMigrationInspection<T : KtElement>(val elementType: Class<T>) : AbstractKotlinInspection() { +abstract class AbstractDiagnosticBasedMigrationInspection<T : PsiElement>(val elementType: Class<T>) : AbstractKotlinInspection() { abstract val diagnosticFactory: DiagnosticFactoryWithPsiElement<T, *> open fun customIntentionFactory(): ((Diagnostic) -> IntentionAction?)? = null open fun customHighlightRangeIn(element: T): TextRange? = null @@ -44,8 +44,8 @@ abstract class AbstractDiagnosticBasedMigrationInspection<T : KtElement>(val ele val actionFactory = getActionFactory() file.accept( object : KtTreeVisitorVoid() { - override fun visitKtElement(element: KtElement) { - super.visitKtElement(element) + override fun visitElement(element: PsiElement) { + super.visitElement(element) if (!elementType.isInstance(element) || element.textLength == 0) return val diagnostic = diagnostics.forElement(element) @@ -65,7 +65,7 @@ abstract class AbstractDiagnosticBasedMigrationInspection<T : KtElement>(val ele ProblemHighlightType.GENERIC_ERROR_OR_WARNING, false, IntentionWrapper(intentionAction), - ), + ) ) } }, diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/migration/AddConversionCallMigrationInspection.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/migration/AddConversionCallMigrationInspection.kt new file mode 100644 index 000000000000..6ae6146ded11 --- /dev/null +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/migration/AddConversionCallMigrationInspection.kt @@ -0,0 +1,28 @@ +// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. + +package org.jetbrains.kotlin.idea.inspections.migration + +import com.intellij.codeInspection.CleanupLocalInspectionTool +import org.jetbrains.kotlin.config.LanguageVersion +import org.jetbrains.kotlin.diagnostics.DiagnosticFactoryWithPsiElement +import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.idea.KotlinBundle +import org.jetbrains.kotlin.idea.configuration.MigrationInfo +import org.jetbrains.kotlin.idea.configuration.isLanguageVersionUpdate +import org.jetbrains.kotlin.idea.quickfix.migration.MigrationFix +import org.jetbrains.kotlin.psi.KtExpression + + +class AddConversionCallMigrationInspection : + AbstractDiagnosticBasedMigrationInspection<KtExpression>(KtExpression::class.java), + MigrationFix, + CleanupLocalInspectionTool { + override fun isApplicable(migrationInfo: MigrationInfo): Boolean { + return migrationInfo.isLanguageVersionUpdate(LanguageVersion.KOTLIN_1_6, LanguageVersion.KOTLIN_1_7) + } + + override fun descriptionMessage(): String = KotlinBundle.message("inspection.add.conversion.call.display.name") + + override val diagnosticFactory: DiagnosticFactoryWithPsiElement<KtExpression, *> + get() = Errors.INTEGER_OPERATOR_RESOLVE_WILL_CHANGE +}
\ No newline at end of file diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/migration/AmbiguousExpressionInWhenBranchMigrationInspection.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/migration/AmbiguousExpressionInWhenBranchMigrationInspection.kt new file mode 100644 index 000000000000..1fd4ee4933b2 --- /dev/null +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/migration/AmbiguousExpressionInWhenBranchMigrationInspection.kt @@ -0,0 +1,29 @@ +// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. + +package org.jetbrains.kotlin.idea.inspections.migration + +import com.intellij.codeInspection.CleanupLocalInspectionTool +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.config.LanguageVersion +import org.jetbrains.kotlin.diagnostics.DiagnosticFactoryWithPsiElement +import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.idea.KotlinBundle +import org.jetbrains.kotlin.idea.configuration.MigrationInfo +import org.jetbrains.kotlin.idea.configuration.isLanguageVersionUpdate +import org.jetbrains.kotlin.idea.quickfix.migration.MigrationFix + + +class AmbiguousExpressionInWhenBranchMigrationInspection : + AbstractDiagnosticBasedMigrationInspection<PsiElement>(PsiElement::class.java), + MigrationFix, + CleanupLocalInspectionTool { + + override fun isApplicable(migrationInfo: MigrationInfo): Boolean { + return migrationInfo.isLanguageVersionUpdate(LanguageVersion.KOTLIN_1_6, LanguageVersion.KOTLIN_1_7) + } + + override fun descriptionMessage(): String = KotlinBundle.message("inspection.ambiguous.expression.when.branch.migration.display.name") + + override val diagnosticFactory: DiagnosticFactoryWithPsiElement<PsiElement, *> + get() = Errors.CONFUSING_BRANCH_CONDITION.warningFactory +}
\ No newline at end of file diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/migration/InlineClassDeprecatedMigrationInspection.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/migration/InlineClassDeprecatedMigrationInspection.kt new file mode 100644 index 000000000000..030797caff1d --- /dev/null +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/migration/InlineClassDeprecatedMigrationInspection.kt @@ -0,0 +1,28 @@ +// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. + +package org.jetbrains.kotlin.idea.inspections.migration + +import com.intellij.codeInspection.CleanupLocalInspectionTool +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.config.LanguageVersion +import org.jetbrains.kotlin.diagnostics.DiagnosticFactoryWithPsiElement +import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.idea.KotlinBundle +import org.jetbrains.kotlin.idea.configuration.MigrationInfo +import org.jetbrains.kotlin.idea.configuration.isLanguageVersionUpdate +import org.jetbrains.kotlin.idea.quickfix.migration.MigrationFix + + +class InlineClassDeprecatedMigrationInspection : + AbstractDiagnosticBasedMigrationInspection<PsiElement>(PsiElement::class.java), + MigrationFix, + CleanupLocalInspectionTool { + override fun isApplicable(migrationInfo: MigrationInfo): Boolean { + return migrationInfo.isLanguageVersionUpdate(LanguageVersion.KOTLIN_1_4, LanguageVersion.KOTLIN_1_5) + } + + override fun descriptionMessage(): String = KotlinBundle.message("inspection.deprecated.inline.class.text") + + override val diagnosticFactory: DiagnosticFactoryWithPsiElement<PsiElement, *> + get() = Errors.INLINE_CLASS_DEPRECATED +}
\ No newline at end of file diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/migration/NoConstructorMigrationInspection.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/migration/NoConstructorMigrationInspection.kt new file mode 100644 index 000000000000..79d8389d36a2 --- /dev/null +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/migration/NoConstructorMigrationInspection.kt @@ -0,0 +1,21 @@ +// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package org.jetbrains.kotlin.idea.inspections.migration + +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.config.LanguageVersion +import org.jetbrains.kotlin.diagnostics.DiagnosticFactory0 +import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.idea.configuration.MigrationInfo +import org.jetbrains.kotlin.idea.configuration.isLanguageVersionUpdate +import org.jetbrains.kotlin.idea.quickfix.migration.MigrationFix + +class NoConstructorMigrationInspection : + AbstractDiagnosticBasedMigrationInspection<PsiElement>(PsiElement::class.java), + MigrationFix { + override fun isApplicable(migrationInfo: MigrationInfo): Boolean = migrationInfo.isLanguageVersionUpdate( + untilOldVersion = LanguageVersion.KOTLIN_1_8, + sinceNewVersion = LanguageVersion.KOTLIN_1_7, + ) + + override val diagnosticFactory: DiagnosticFactory0<PsiElement> get() = Errors.NO_CONSTRUCTOR_WARNING +} diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/migration/OverrideDeprecatedMigrationInspection.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/migration/OverrideDeprecatedMigrationInspection.kt new file mode 100644 index 000000000000..56ec3a204d37 --- /dev/null +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/migration/OverrideDeprecatedMigrationInspection.kt @@ -0,0 +1,21 @@ +// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package org.jetbrains.kotlin.idea.inspections.migration + +import org.jetbrains.kotlin.config.LanguageVersion +import org.jetbrains.kotlin.diagnostics.DiagnosticFactoryWithPsiElement +import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.idea.configuration.MigrationInfo +import org.jetbrains.kotlin.idea.configuration.isLanguageVersionUpdate +import org.jetbrains.kotlin.idea.quickfix.migration.MigrationFix +import org.jetbrains.kotlin.psi.KtNamedDeclaration + +class OverrideDeprecatedMigrationInspection : + AbstractDiagnosticBasedMigrationInspection<KtNamedDeclaration>(KtNamedDeclaration::class.java), + MigrationFix { + override fun isApplicable(migrationInfo: MigrationInfo): Boolean = migrationInfo.isLanguageVersionUpdate( + untilOldVersion = LanguageVersion.KOTLIN_1_8, + sinceNewVersion = LanguageVersion.KOTLIN_1_7, + ) + + override val diagnosticFactory: DiagnosticFactoryWithPsiElement<KtNamedDeclaration, *> get() = Errors.OVERRIDE_DEPRECATION +} diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/InsertExplicitTypeArgumentsIntention.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/InsertExplicitTypeArgumentsIntention.kt index 55ed23205399..43d800f23334 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/InsertExplicitTypeArgumentsIntention.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/InsertExplicitTypeArgumentsIntention.kt @@ -18,7 +18,7 @@ import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall import org.jetbrains.kotlin.resolve.calls.inference.CapturedType import org.jetbrains.kotlin.resolve.calls.tower.NewResolvedCallImpl import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode -import org.jetbrains.kotlin.types.ErrorUtils +import org.jetbrains.kotlin.types.error.ErrorUtils import org.jetbrains.kotlin.types.checker.NewCapturedType class InsertExplicitTypeArgumentsIntention : SelfTargetingRangeIntention<KtCallExpression>( diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/LambdaToAnonymousFunctionIntention.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/LambdaToAnonymousFunctionIntention.kt index e5d59d05cc01..733cdb26656d 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/LambdaToAnonymousFunctionIntention.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/LambdaToAnonymousFunctionIntention.kt @@ -28,9 +28,9 @@ import org.jetbrains.kotlin.resolve.bindingContextUtil.getTargetFunctionDescript import org.jetbrains.kotlin.resolve.calls.util.getParameterForArgument import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode -import org.jetbrains.kotlin.types.ErrorType import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeConstructor +import org.jetbrains.kotlin.types.error.ErrorType import org.jetbrains.kotlin.types.isFlexible import org.jetbrains.kotlin.types.typeUtil.isTypeParameter import org.jetbrains.kotlin.types.typeUtil.isUnit diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/RemoveExplicitSuperQualifierIntention.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/RemoveExplicitSuperQualifierIntention.kt index 8dba90de0614..2637e8dc6da2 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/RemoveExplicitSuperQualifierIntention.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/RemoveExplicitSuperQualifierIntention.kt @@ -19,7 +19,7 @@ import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForReceiver import org.jetbrains.kotlin.psi.psiUtil.startOffset import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode -import org.jetbrains.kotlin.types.ErrorUtils +import org.jetbrains.kotlin.types.error.ErrorUtils @Suppress("DEPRECATION") class RemoveExplicitSuperQualifierInspection : IntentionBasedInspection<KtSuperExpression>( diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/SimplifyBooleanWithConstantsIntention.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/SimplifyBooleanWithConstantsIntention.kt index 0e761455be84..9dd67f421e75 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/SimplifyBooleanWithConstantsIntention.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/SimplifyBooleanWithConstantsIntention.kt @@ -10,7 +10,7 @@ import org.jetbrains.kotlin.idea.core.copied import org.jetbrains.kotlin.idea.core.replaced import org.jetbrains.kotlin.idea.inspections.IntentionBasedInspection import org.jetbrains.kotlin.idea.intentions.loopToCallChain.isTrueConstant -import org.jetbrains.kotlin.idea.util.safeAnalyzeNonSourceRootCode +import org.jetbrains.kotlin.idea.caches.resolve.safeAnalyzeNonSourceRootCode import org.jetbrains.kotlin.lexer.KtTokens.* import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/SpecifyTypeExplicitlyIntention.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/SpecifyTypeExplicitlyIntention.kt index 2c9f759ae2cd..2e20c9e9f5a1 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/SpecifyTypeExplicitlyIntention.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/SpecifyTypeExplicitlyIntention.kt @@ -32,6 +32,8 @@ import org.jetbrains.kotlin.resolve.checkers.ExplicitApiDeclarationChecker import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameOrNull import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.types.* +import org.jetbrains.kotlin.types.error.ErrorUtils +import org.jetbrains.kotlin.types.error.ErrorTypeKind import org.jetbrains.kotlin.types.typeUtil.makeNotNullable import org.jetbrains.kotlin.utils.ifEmpty @@ -114,10 +116,10 @@ class SpecifyTypeExplicitlyIntention : SelfTargetingRangeIntention<KtCallableDec } if (type != null && type.isError && descriptor is PropertyDescriptor) { - return descriptor.setterType ?: ErrorUtils.createErrorType("null type") + return descriptor.setterType ?: ErrorUtils.createErrorType(ErrorTypeKind.NOT_FOUND_DESCRIPTOR_FOR_FUNCTION, declaration.text) } - return type ?: ErrorUtils.createErrorType("null type") + return type ?: ErrorUtils.createErrorType(ErrorTypeKind.NOT_FOUND_DESCRIPTOR_FOR_FUNCTION, declaration.text) } fun createTypeExpressionForTemplate( diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/UsePropertyAccessSyntaxIntention.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/UsePropertyAccessSyntaxIntention.kt index d5955e9b0269..e562007c6284 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/UsePropertyAccessSyntaxIntention.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/UsePropertyAccessSyntaxIntention.kt @@ -29,7 +29,7 @@ import org.jetbrains.kotlin.idea.resolve.getLanguageVersionSettings import org.jetbrains.kotlin.idea.util.application.runWriteActionIfPhysical import org.jetbrains.kotlin.idea.util.application.withPsiAttachment import org.jetbrains.kotlin.idea.util.getResolutionScope -import org.jetbrains.kotlin.idea.util.safeAnalyzeNonSourceRootCode +import org.jetbrains.kotlin.idea.caches.resolve.safeAnalyzeNonSourceRootCode import org.jetbrains.kotlin.idea.util.shouldNotConvertToProperty import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.name.FqNameUnsafe diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/Utils.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/Utils.kt index b1dfe4102f4c..5265fd9d76c7 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/Utils.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/Utils.kt @@ -33,6 +33,7 @@ import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinTypeFactory import org.jetbrains.kotlin.types.isFlexible +import org.jetbrains.kotlin.types.toDefaultAttributes import org.jetbrains.kotlin.types.typeUtil.builtIns import org.jetbrains.kotlin.types.typeUtil.isUnit import org.jetbrains.kotlin.util.OperatorChecks @@ -348,7 +349,7 @@ fun KotlinType.reflectToRegularFunctionType(): KotlinType { val parameterCount = if (isTypeAnnotatedWithExtensionFunctionType) arguments.size - 2 else arguments.size - 1 val classDescriptor = if (isKSuspendFunctionType) builtIns.getSuspendFunction(parameterCount) else builtIns.getFunction(parameterCount) - return KotlinTypeFactory.simpleNotNullType(annotations, classDescriptor, arguments) + return KotlinTypeFactory.simpleNotNullType(annotations.toDefaultAttributes(), classDescriptor, arguments) } private val KOTLIN_BUILTIN_ENUM_FUNCTIONS = listOf(FqName("kotlin.enumValues"), FqName("kotlin.enumValueOf")) diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/IfThenUtils.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/IfThenUtils.kt index 54dabc67f9ff..6beeeb766126 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/IfThenUtils.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/IfThenUtils.kt @@ -26,7 +26,7 @@ import org.jetbrains.kotlin.idea.util.application.invokeLater import org.jetbrains.kotlin.idea.util.application.isUnitTestMode import org.jetbrains.kotlin.idea.util.application.withPsiAttachment import org.jetbrains.kotlin.idea.util.getResolutionScope -import org.jetbrains.kotlin.idea.util.safeAnalyzeNonSourceRootCode +import org.jetbrains.kotlin.idea.caches.resolve.safeAnalyzeNonSourceRootCode import org.jetbrains.kotlin.idea.util.textRangeIn import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.lexer.KtTokens diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/parameterInfo/HintsTypeRenderer.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/parameterInfo/HintsTypeRenderer.kt index 54dbac5acaa9..5f322ab21b73 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/parameterInfo/HintsTypeRenderer.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/parameterInfo/HintsTypeRenderer.kt @@ -22,6 +22,9 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.isCompanionObject import org.jetbrains.kotlin.resolve.descriptorUtil.parentsWithSelf import org.jetbrains.kotlin.resolve.scopes.utils.findClassifier import org.jetbrains.kotlin.types.* +import org.jetbrains.kotlin.types.error.* +import org.jetbrains.kotlin.types.typeUtil.isUnresolvedType +import org.jetbrains.kotlin.types.error.ErrorUtils import org.jetbrains.kotlin.utils.addToStdlib.safeAs import java.util.ArrayList @@ -107,13 +110,13 @@ class HintsTypeRenderer private constructor(override val options: HintsDescripto } private fun SimpleType.renderSimpleTypeTo(list: MutableList<InlayInfoDetail>) { - if (this == TypeUtils.CANT_INFER_FUNCTION_PARAM_TYPE || TypeUtils.isDontCarePlaceholder(this)) { + if (this == TypeUtils.CANNOT_INFER_FUNCTION_PARAM_TYPE || TypeUtils.isDontCarePlaceholder(this)) { list.append("???") return } - if (ErrorUtils.isUninferredParameter(this)) { + if (ErrorUtils.isUninferredTypeVariable(this)) { if (options.uninferredTypeParameterAsName) { - list.append(renderError((this.constructor as ErrorUtils.UninferredParameterTypeConstructor).typeParameterDescriptor.name.toString())) + list.append(renderError((this.constructor as ErrorTypeConstructor).getParam(0))) } else { list.append("???") } @@ -143,11 +146,11 @@ class HintsTypeRenderer private constructor(override val options: HintsDescripto renderAnnotationsTo(list) if (this.isError) { - if (this is UnresolvedType && options.presentableUnresolvedTypes) { - list.append(this.presentableName) + if (isUnresolvedType(this) && options.presentableUnresolvedTypes) { + list.append(this.debugMessage) } else { if (this is ErrorType && !options.informativeErrorType) { - list.append(this.presentableName) + list.append(this.debugMessage) } else { list.append(this.constructor.toString()) // Debug name of an error type is more informative } @@ -162,7 +165,7 @@ class HintsTypeRenderer private constructor(override val options: HintsDescripto } if (this.isDefinitelyNotNullType) { - list.append("!!") + list.append("& Any") } } diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/parameterInfo/KotlinIdeDescriptorRenderer.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/parameterInfo/KotlinIdeDescriptorRenderer.kt index a36236396da2..baf9fac50119 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/parameterInfo/KotlinIdeDescriptorRenderer.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/parameterInfo/KotlinIdeDescriptorRenderer.kt @@ -23,8 +23,10 @@ import org.jetbrains.kotlin.resolve.constants.KClassValue import org.jetbrains.kotlin.resolve.descriptorUtil.annotationClass import org.jetbrains.kotlin.resolve.descriptorUtil.declaresOrInheritsDefaultValue import org.jetbrains.kotlin.types.* -import org.jetbrains.kotlin.types.ErrorUtils.UninferredParameterTypeConstructor -import org.jetbrains.kotlin.types.TypeUtils.CANT_INFER_FUNCTION_PARAM_TYPE +import org.jetbrains.kotlin.types.error.* +import org.jetbrains.kotlin.types.TypeUtils.CANNOT_INFER_FUNCTION_PARAM_TYPE +import org.jetbrains.kotlin.types.error.ErrorUtils +import org.jetbrains.kotlin.types.typeUtil.isUnresolvedType import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly import java.util.* @@ -236,13 +238,13 @@ open class KotlinIdeDescriptorRenderer( } private fun StringBuilder.appendSimpleType(type: SimpleType) { - if (type == CANT_INFER_FUNCTION_PARAM_TYPE || TypeUtils.isDontCarePlaceholder(type)) { + if (type == CANNOT_INFER_FUNCTION_PARAM_TYPE || TypeUtils.isDontCarePlaceholder(type)) { appendHighlighted("???") { asError } return } - if (ErrorUtils.isUninferredParameter(type)) { + if (ErrorUtils.isUninferredTypeVariable(type)) { if (uninferredTypeParameterAsName) { - append(renderError((type.constructor as UninferredParameterTypeConstructor).typeParameterDescriptor.name.toString())) + append(renderError((type.constructor as ErrorTypeConstructor).getParam(0))) } else { appendHighlighted("???") { asError } } @@ -334,11 +336,11 @@ open class KotlinIdeDescriptorRenderer( appendAnnotations(type) if (type.isError) { - if (type is UnresolvedType && presentableUnresolvedTypes) { - appendHighlighted(type.presentableName) { asError } + if (isUnresolvedType(type) && presentableUnresolvedTypes) { + appendHighlighted(type.debugMessage) { asError } } else { if (type is ErrorType && !informativeErrorType) { - appendHighlighted(type.presentableName) { asError } + appendHighlighted(type.debugMessage) { asError } } else { appendHighlighted(type.constructor.toString()) { asError } // Debug name of an error type is more informative } diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/platform/IdePlatformKindTooling.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/platform/IdePlatformKindTooling.kt index 662ade5be00c..4eb9061c2d8c 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/platform/IdePlatformKindTooling.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/platform/IdePlatformKindTooling.kt @@ -16,7 +16,7 @@ import org.jetbrains.kotlin.psi.KtNamedDeclaration import javax.swing.Icon abstract class IdePlatformKindTooling { - abstract val kind: IdePlatformKind<*> + abstract val kind: IdePlatformKind abstract fun compilerArgumentsForProject(project: Project): CommonCompilerArguments? @@ -61,7 +61,7 @@ abstract class IdePlatformKindTooling { ALL_TOOLING_SUPPORT.flatMap { tooling -> tooling.gradlePlatformIds.map { it to tooling } }.toMap() } - fun getTooling(kind: IdePlatformKind<*>): IdePlatformKindTooling { + fun getTooling(kind: IdePlatformKind): IdePlatformKindTooling { return TOOLING_SUPPORT_BY_KIND[kind] ?: error("Unknown platform $kind") } @@ -78,5 +78,5 @@ abstract class IdePlatformKindTooling { } } -val IdePlatformKind<*>.tooling: IdePlatformKindTooling +val IdePlatformKind.tooling: IdePlatformKindTooling get() = IdePlatformKindTooling.getTooling(this)
\ No newline at end of file diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/AddConversionCallFix.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/AddConversionCallFix.kt new file mode 100644 index 000000000000..344d4498e63f --- /dev/null +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/AddConversionCallFix.kt @@ -0,0 +1,49 @@ +// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. + +package org.jetbrains.kotlin.idea.quickfix + +import com.intellij.codeInsight.intention.IntentionAction +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.project.Project +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.idea.KotlinBundle +import org.jetbrains.kotlin.idea.caches.resolve.resolveToCall +import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers +import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.getParentOfType +import org.jetbrains.kotlin.resolve.calls.util.getParameterForArgument +import org.jetbrains.kotlin.utils.addToStdlib.safeAs + +class AddConversionCallFix(element: KtExpression, val targetType: String) : KotlinQuickFixAction<KtExpression>(element) { + + companion object : QuickFixesPsiBasedFactory<PsiElement>(PsiElement::class, PsiElementSuitabilityCheckers.ALWAYS_SUITABLE) { + override fun doCreateQuickFix(psiElement: PsiElement): List<IntentionAction> { + val expression = psiElement.safeAs<KtExpression>() ?: return emptyList() + val targetType = calculateTargetType(expression) ?: return emptyList() + return listOf(AddConversionCallFix(expression, targetType)) + } + + private fun calculateTargetType(expression: KtExpression): String? { + val valueArgument = expression.getParentOfType<KtValueArgument>(false) ?: return null + val callExpression = valueArgument.getParentOfType<KtCallExpression>(false) ?: return null + val resolvedCall = callExpression.resolveToCall() ?: return null + val parameterDescriptor = resolvedCall.getParameterForArgument(valueArgument) ?: return null + val type = parameterDescriptor.type + return IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_NO_ANNOTATIONS.renderType(type) + } + } + + override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean = element != null + + override fun invoke(project: Project, editor: Editor?, file: KtFile) { + val expression = element ?: return + val convertExpression = KtPsiFactory(file).createExpressionByPattern("($0).to$1()", expression, targetType) + expression.replace(convertExpression) + } + + override fun getText(): String { + return KotlinBundle.message("convert.expression.to.0", targetType) + } + + override fun getFamilyName(): String = text +}
\ No newline at end of file diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeCallableReturnTypeFix.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeCallableReturnTypeFix.kt index 379068cbc700..7e719b75c28c 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeCallableReturnTypeFix.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeCallableReturnTypeFix.kt @@ -29,7 +29,7 @@ import org.jetbrains.kotlin.resolve.DataClassDescriptorResolver import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode -import org.jetbrains.kotlin.types.ErrorUtils +import org.jetbrains.kotlin.types.error.ErrorUtils import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.checker.KotlinTypeChecker import org.jetbrains.kotlin.types.typeUtil.isUnit diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVariableTypeFix.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVariableTypeFix.kt index a3cf10017517..39b51ab40390 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVariableTypeFix.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVariableTypeFix.kt @@ -26,7 +26,7 @@ import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode -import org.jetbrains.kotlin.types.ErrorUtils +import org.jetbrains.kotlin.types.error.ErrorUtils import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.checker.KotlinTypeChecker import org.jetbrains.kotlin.types.typeUtil.makeNullable diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVisibilityOnExposureFactory.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVisibilityOnExposureFactory.kt index f073fd455db1..5c13aa603d86 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVisibilityOnExposureFactory.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVisibilityOnExposureFactory.kt @@ -1,11 +1,10 @@ -// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.kotlin.idea.quickfix import com.intellij.codeInsight.intention.IntentionAction import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.DescriptorVisibilities.* -import org.jetbrains.kotlin.descriptors.EffectiveVisibility.Permissiveness.LESS import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.DiagnosticFactory3 import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade @@ -14,19 +13,18 @@ import org.jetbrains.kotlin.idea.resolve.getLanguageVersionSettings import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtModifierListOwner import org.jetbrains.kotlin.psi.psiUtil.getParentOfType +import org.jetbrains.kotlin.psi.psiUtil.isPrivate import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils -import org.jetbrains.kotlin.types.checker.SimpleClassicTypeSystemContext -import java.util.* object ChangeVisibilityOnExposureFactory : KotlinIntentionActionsFactory() { private fun addFixToTargetVisibility( - modifierListOwner: KtModifierListOwner, - descriptor: DeclarationDescriptorWithVisibility, - targetVisibility: DescriptorVisibility, - boundVisibility: DescriptorVisibility, - protectedAllowed: Boolean, - fixes: MutableList<IntentionAction> + modifierListOwner: KtModifierListOwner, + descriptor: DeclarationDescriptorWithVisibility, + targetVisibility: DescriptorVisibility, + boundVisibility: DescriptorVisibility, + protectedAllowed: Boolean, + fixes: MutableList<IntentionAction>, ) { val possibleVisibilities = when (targetVisibility) { PROTECTED -> if (protectedAllowed) listOf(boundVisibility, PROTECTED) else listOf(boundVisibility) @@ -34,6 +32,7 @@ object ChangeVisibilityOnExposureFactory : KotlinIntentionActionsFactory() { boundVisibility -> listOf(boundVisibility) else -> listOf() } + possibleVisibilities.mapNotNullTo(fixes) { ChangeVisibilityFix.create(modifierListOwner, descriptor, it) } } @@ -42,33 +41,51 @@ object ChangeVisibilityOnExposureFactory : KotlinIntentionActionsFactory() { val factory = diagnostic.factory as DiagnosticFactory3<*, EffectiveVisibility, DescriptorWithRelation, EffectiveVisibility> // We have USER that uses some EXPOSED object. USER visibility must be same or less permissive. val exposedDiagnostic = factory.cast(diagnostic) - val exposedDescriptor = exposedDiagnostic.b.descriptor as? DeclarationDescriptorWithVisibility ?: return emptyList() - val exposedDeclaration = - DescriptorToSourceUtils.getSourceFromDescriptor(exposedDescriptor) as? KtModifierListOwner ?: return emptyList() - val exposedVisibility = exposedDiagnostic.c - val userVisibility = exposedDiagnostic.a - val (targetUserVisibility, targetExposedVisibility) = when (exposedVisibility.relation(userVisibility, SimpleClassicTypeSystemContext)) { - LESS -> Pair(exposedVisibility.toDescriptorVisibility(), userVisibility.toDescriptorVisibility()) - else -> Pair(PRIVATE, PUBLIC) - } + val exposedDescriptor = exposedDiagnostic.b.descriptor as? DeclarationDescriptorWithVisibility + ?: return emptyList() + + val exposedDeclaration = DescriptorToSourceUtils.getSourceFromDescriptor(exposedDescriptor) as? KtModifierListOwner + ?: return emptyList() + + val exposedVisibility = exposedDiagnostic.c.toDescriptorVisibility() + val userVisibility = exposedDiagnostic.a.toDescriptorVisibility() + val (targetUserVisibility, targetExposedVisibility) = + if (exposedVisibility.compareTo(userVisibility)?.let { it < 0 } == true) + Pair(exposedVisibility, userVisibility) + else + Pair(PRIVATE, PUBLIC) + val result = ArrayList<IntentionAction>() val userDeclaration = diagnostic.psiElement.getParentOfType<KtDeclaration>(true) val protectedAllowed = exposedDeclaration.parent == userDeclaration?.parent - if (userDeclaration != null) { + if (userDeclaration != null && !userDeclaration.isPrivate()) { val userDescriptor = userDeclaration.toDescriptor() as? DeclarationDescriptorWithVisibility - if (userDescriptor != null && DescriptorVisibilityUtils.isVisibleIgnoringReceiver(exposedDescriptor, userDescriptor, exposedDeclaration.getResolutionFacade().getLanguageVersionSettings())) { + if (userDescriptor != null && DescriptorVisibilityUtils.isVisibleIgnoringReceiver( + exposedDescriptor, + userDescriptor, + exposedDeclaration.getResolutionFacade().getLanguageVersionSettings(), + ) + ) { addFixToTargetVisibility( - userDeclaration, userDescriptor, - targetUserVisibility, PRIVATE, - protectedAllowed, result + modifierListOwner = userDeclaration, + descriptor = userDescriptor, + targetVisibility = targetUserVisibility, + boundVisibility = PRIVATE, + protectedAllowed = protectedAllowed, + fixes = result, ) } } + addFixToTargetVisibility( - exposedDeclaration, exposedDescriptor, - targetExposedVisibility, PUBLIC, - protectedAllowed, result + modifierListOwner = exposedDeclaration, + descriptor = exposedDescriptor, + targetVisibility = targetExposedVisibility, + boundVisibility = PUBLIC, + protectedAllowed = protectedAllowed, + fixes = result, ) + return result } } diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ConfusingExpressionInWhenBranchFix.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ConfusingExpressionInWhenBranchFix.kt new file mode 100644 index 000000000000..d84798885e4f --- /dev/null +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ConfusingExpressionInWhenBranchFix.kt @@ -0,0 +1,38 @@ +// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. + +package org.jetbrains.kotlin.idea.quickfix + +import com.intellij.codeInsight.intention.IntentionAction +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.project.Project +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.idea.KotlinBundle +import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.psi.KtPsiFactory +import org.jetbrains.kotlin.psi.createExpressionByPattern +import org.jetbrains.kotlin.utils.addToStdlib.safeAs + +class ConfusingExpressionInWhenBranchFix(element: KtExpression) : KotlinPsiOnlyQuickFixAction<KtExpression>(element) { + + companion object : QuickFixesPsiBasedFactory<PsiElement>(PsiElement::class, PsiElementSuitabilityCheckers.ALWAYS_SUITABLE) { + override fun doCreateQuickFix(psiElement: PsiElement): List<IntentionAction> { + val expression = psiElement.safeAs<KtExpression>() ?: return emptyList() + return listOf(ConfusingExpressionInWhenBranchFix(expression)) + } + } + + override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean = element != null + + override fun invoke(project: Project, editor: Editor?, file: KtFile) { + val expression = element ?: return + val wrapped = KtPsiFactory(file).createExpressionByPattern("($0)", expression) + expression.replace(wrapped) + } + + override fun getText(): String { + return KotlinBundle.message("wrap.expression.in.parentheses") + } + + override fun getFamilyName(): String = text +}
\ No newline at end of file diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ConverKClassToClassFix.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ConverKClassToClassFix.kt index c331b03140a6..47ac0c1c0687 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ConverKClassToClassFix.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ConverKClassToClassFix.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.psi.KtPsiFactory import org.jetbrains.kotlin.psi.createExpressionByPattern import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinTypeFactory +import org.jetbrains.kotlin.types.TypeAttributes import org.jetbrains.kotlin.types.TypeProjectionImpl import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf @@ -38,7 +39,7 @@ class ConvertKClassToClassFix(element: KtExpression) : KotlinQuickFixAction<KtEx val javaLangClassDescriptor = file.resolveImportReference(JAVA_LANG_CLASS_FQ_NAME) .singleOrNull() as? ClassDescriptor ?: return null val javaLangClassType = KotlinTypeFactory.simpleNotNullType( - Annotations.EMPTY, + TypeAttributes.Empty, javaLangClassDescriptor, listOf(TypeProjectionImpl(expressionTypeArgument)) ) diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt index 2217bc4ed91d..4b24fbb8319b 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt @@ -4,10 +4,18 @@ package org.jetbrains.kotlin.idea.quickfix import com.intellij.codeInsight.daemon.impl.ShowAutoImportPass import com.intellij.openapi.editor.Editor +import com.intellij.psi.PsiElement import org.jetbrains.kotlin.diagnostics.Diagnostic +import org.jetbrains.kotlin.psi.KtCallExpression import org.jetbrains.kotlin.psi.KtSimpleNameExpression internal class ImportFix(expression: KtSimpleNameExpression) : AbstractImportFix(expression, MyFactory) { + + override fun elementsToCheckDiagnostics(): Collection<PsiElement> { + val expression = element ?: return emptyList() + return listOfNotNull(expression, expression.parent?.takeIf { it is KtCallExpression }) + } + override fun fixSilently(editor: Editor): Boolean { if (isOutdated()) return false val element = element ?: return false @@ -22,7 +30,14 @@ internal class ImportFix(expression: KtSimpleNameExpression) : AbstractImportFix } companion object MyFactory : Factory() { - override fun createImportAction(diagnostic: Diagnostic) = - (diagnostic.psiElement as? KtSimpleNameExpression)?.let(::ImportFix) + override fun createImportAction(diagnostic: Diagnostic): ImportFix? { + val simpleNameExpression = when (val element = diagnostic.psiElement) { + is KtSimpleNameExpression -> element + is KtCallExpression -> element.calleeExpression + else -> null + } as? KtSimpleNameExpression ?: return null + + return ImportFix(simpleNameExpression) + } } }
\ No newline at end of file diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/MakeUpperBoundNonNullableFix.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/MakeUpperBoundNonNullableFix.kt index 7c8cea7d4304..fbfd0a6f69cd 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/MakeUpperBoundNonNullableFix.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/MakeUpperBoundNonNullableFix.kt @@ -6,12 +6,13 @@ import com.intellij.codeInsight.intention.IntentionAction import com.intellij.codeInspection.util.IntentionName import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project -import com.intellij.openapi.util.NlsContext -import com.intellij.openapi.util.NlsSafe -import org.jetbrains.annotations.Nls +import com.intellij.util.containers.addIfNotNull import org.jetbrains.kotlin.backend.jvm.ir.psiElement import org.jetbrains.kotlin.builtins.StandardNames -import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor +import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor +import org.jetbrains.kotlin.descriptors.isOverridable import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.idea.KotlinBundle @@ -20,7 +21,9 @@ import org.jetbrains.kotlin.idea.core.ShortenReferences import org.jetbrains.kotlin.idea.quickfix.createFromUsage.callableBuilder.getTypeParameters import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.incremental.components.NoLookupLocation -import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.psi.KtPsiFactory +import org.jetbrains.kotlin.psi.KtTypeParameter import org.jetbrains.kotlin.renderer.render import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm @@ -111,7 +114,12 @@ open class MakeUpperBoundNonNullableFix( return when (diagnostic.factory) { ErrorsJvm.NULLABLE_TYPE_PARAMETER_AGAINST_NOT_NULL_TYPE_PARAMETER -> { val info = ErrorsJvm.NULLABLE_TYPE_PARAMETER_AGAINST_NOT_NULL_TYPE_PARAMETER.cast(diagnostic) - createActionsForType(info.a) + listOfNotNull(createActionForTypeParameter(info.a)) + } + + ErrorsJvm.WRONG_TYPE_PARAMETER_NULLABILITY_FOR_JAVA_OVERRIDE -> { + val info = ErrorsJvm.WRONG_TYPE_PARAMETER_NULLABILITY_FOR_JAVA_OVERRIDE.cast(diagnostic) + listOfNotNull(createActionForTypeParameter(info.a)) } Errors.TYPE_MISMATCH -> { @@ -192,6 +200,17 @@ open class MakeUpperBoundNonNullableFix( } private fun createActionsForType(type: KotlinType, highPriority: Boolean = false): List<IntentionAction> { + val result = mutableListOf<IntentionAction>() + for (typeParameterDescriptor in type.getTypeParameters()) { + result.addIfNotNull(createActionForTypeParameter(typeParameterDescriptor, highPriority)) + } + return result + } + + private fun createActionForTypeParameter( + typeParameterDescriptor: TypeParameterDescriptor, + highPriority: Boolean = false, + ): IntentionAction? { fun makeAction(typeParameter: KtTypeParameter, kind: Kind): IntentionAction { return if (highPriority) HighPriorityMakeUpperBoundNonNullableFix(typeParameter, kind) @@ -199,22 +218,21 @@ open class MakeUpperBoundNonNullableFix( MakeUpperBoundNonNullableFix(typeParameter, kind) } - val result = mutableListOf<IntentionAction>() - for (typeParameterDescriptor in type.getTypeParameters()) { - val psiElement = typeParameterDescriptor.psiElement?.safeAs<KtTypeParameter>() ?: continue - val existingUpperBound = psiElement.extendsBound - if (existingUpperBound != null) { - val context = existingUpperBound.analyze(BodyResolveMode.PARTIAL) - val upperBoundType = context[BindingContext.TYPE, existingUpperBound] ?: continue - if (upperBoundType.isMarkedNullable) { - result.add(makeAction(psiElement, Kind.ReplaceExistingUpperBound(upperBoundType.makeNotNullable()))) - } - } else { - result.add(makeAction(psiElement, Kind.AddAnyAsUpperBound)) + val psiElement = typeParameterDescriptor.psiElement?.safeAs<KtTypeParameter>() ?: return null + val existingUpperBound = psiElement.extendsBound + if (existingUpperBound != null) { + val context = existingUpperBound.analyze(BodyResolveMode.PARTIAL) + val upperBoundType = context[BindingContext.TYPE, existingUpperBound] ?: return null + if (upperBoundType.isMarkedNullable) { + return makeAction(psiElement, Kind.ReplaceExistingUpperBound(upperBoundType.makeNotNullable())) } + } else { + return makeAction(psiElement, Kind.AddAnyAsUpperBound) } - return result + + return null } + } } diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixFactoryForTypeMismatchError.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixFactoryForTypeMismatchError.kt index cbcb50e9f02d..37e4c3457ae3 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixFactoryForTypeMismatchError.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixFactoryForTypeMismatchError.kt @@ -20,25 +20,23 @@ import org.jetbrains.kotlin.idea.intentions.reflectToRegularFunctionType import org.jetbrains.kotlin.idea.project.languageVersionSettings import org.jetbrains.kotlin.idea.util.approximateWithResolvableType import org.jetbrains.kotlin.idea.util.getResolutionScope +import org.jetbrains.kotlin.idea.util.module import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.psi.psiUtil.getParentOfType import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelectorOrThis import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.bindingContextUtil.getTargetFunction +import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.calls.util.getParameterForArgument import org.jetbrains.kotlin.resolve.calls.util.getParentResolvedCall import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall import org.jetbrains.kotlin.resolve.calls.util.getValueArgumentForExpression -import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.constants.IntegerValueTypeConstant import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe -import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm import org.jetbrains.kotlin.types.KotlinType -import org.jetbrains.kotlin.types.TypeProjection import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.types.TypeUtils.NO_EXPECTED_TYPE import org.jetbrains.kotlin.types.isDefinitelyNotNullType @@ -147,7 +145,6 @@ class QuickFixFactoryForTypeMismatchError : KotlinIntentionActionsFactory() { } } - actions.addAll(WrapWithCollectionLiteralCallFix.create(expectedType, expressionType, diagnosticElement)) ConvertCollectionFix.getConversionTypeOrNull(expressionType, expectedType)?.let { @@ -203,7 +200,13 @@ class QuickFixFactoryForTypeMismatchError : KotlinIntentionActionsFactory() { // Suggest replacing the parameter type `T` with its expected definitely non-nullable subtype `T & Any`. // Types that contain DNN types as arguments (like `(Mutable)Collection<T & Any>`) are currently not supported. - if (diagnosticElement is KtReferenceExpression && expectedType.isDefinitelyNotNullType) { + // The "Change parameter type" action is generated only if the `DefinitelyNonNullableTypes` language feature is enabled: + // if it is disabled, the `T & Any` intersection type is resolved as just `T`, so the fix would not have any effect. + if ( + diagnosticElement is KtReferenceExpression && + expectedType.isDefinitelyNotNullType && + diagnosticElement.module?.languageVersionSettings?.supportsFeature(LanguageFeature.DefinitelyNonNullableTypes) == true + ) { val descriptor = context[BindingContext.REFERENCE_TARGET, diagnosticElement]?.safeAs<CallableDescriptor>() when (val declaration = QuickFixUtil.safeGetDeclaration(descriptor)) { is KtParameter -> { @@ -233,7 +236,6 @@ class QuickFixFactoryForTypeMismatchError : KotlinIntentionActionsFactory() { val expressionParent = diagnosticElement.parent // Mismatch in returned expression: - val function = if (expressionParent is KtReturnExpression) expressionParent.getTargetFunction(context) else @@ -271,9 +273,7 @@ class QuickFixFactoryForTypeMismatchError : KotlinIntentionActionsFactory() { || KotlinBuiltIns.isPrimitiveArray(expectedType) ) { actions.add(AddArrayOfTypeFix(diagnosticElement, expectedType)) - if (diagnosticElement.languageVersionSettings.supportsFeature(LanguageFeature.ArrayLiteralsInAnnotations)) { - actions.add(WrapWithArrayLiteralFix(diagnosticElement)) - } + actions.add(WrapWithArrayLiteralFix(diagnosticElement)) } } diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index 088876cda67f..84e3809d9812 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -1,4 +1,4 @@ -// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.kotlin.idea.quickfix @@ -152,7 +152,10 @@ class QuickFixRegistrar : QuickFixContributor { NO_EXPLICIT_RETURN_TYPE_IN_API_MODE_WARNING.registerActions(SpecifyTypeExplicitlyFix()) + INVISIBLE_REFERENCE.registerFactory(ImportFix) + INVISIBLE_MEMBER.registerFactory(ImportFix) UNRESOLVED_REFERENCE.registerFactory(ImportFix) + UNRESOLVED_REFERENCE.registerFactory(ImportConstructorReferenceFix) DEPRECATED_ACCESS_BY_SHORT_NAME.registerFactory(AddExplicitImportForDeprecatedVisibilityFix.Factory) TYPE_INFERENCE_CANDIDATE_WITH_SAM_AND_VARARG.registerFactory(AddSpreadOperatorForArrayAsVarargAfterSamFixFactory) @@ -287,10 +290,16 @@ class QuickFixRegistrar : QuickFixContributor { SENSELESS_NULL_IN_WHEN.registerFactory(RemoveWhenBranchFix, RemoveWhenConditionFix) BREAK_OR_CONTINUE_IN_WHEN.registerFactory(AddLoopLabelFix) NO_ELSE_IN_WHEN.registerFactory(AddWhenElseBranchFix, AddWhenRemainingBranchesFix) + NO_ELSE_IN_WHEN_WARNING.registerFactory(AddWhenElseBranchFix, AddWhenRemainingBranchesFix) NON_EXHAUSTIVE_WHEN.registerFactory(AddWhenElseBranchFix, AddWhenRemainingBranchesFix) NON_EXHAUSTIVE_WHEN_ON_SEALED_CLASS.registerFactory(AddWhenElseBranchFix, AddWhenRemainingBranchesFix) NON_EXHAUSTIVE_WHEN_STATEMENT.registerFactory(AddWhenElseBranchFix, AddWhenRemainingBranchesFix) + INVALID_IF_AS_EXPRESSION.registerFactory(AddIfElseBranchFix) + INVALID_IF_AS_EXPRESSION_WARNING.registerFactory(AddIfElseBranchFix) + + INTEGER_OPERATOR_RESOLVE_WILL_CHANGE.registerFactory(AddConversionCallFix) + NO_TYPE_ARGUMENTS_ON_RHS.registerFactory(AddStarProjectionsFixFactory) TYPE_ARGUMENTS_REDUNDANT_IN_SUPER_QUALIFIER.registerFactory(RemovePsiElementSimpleFix.RemoveTypeArgumentsFactory) @@ -610,6 +619,7 @@ class QuickFixRegistrar : QuickFixContributor { NO_CONSTRUCTOR.registerFactory(RemoveNoConstructorFix) NO_CONSTRUCTOR.registerFactory(AddDefaultConstructorFix) + NO_CONSTRUCTOR_WARNING.registerFactory(RemoveNoConstructorFix) ANNOTATION_USED_AS_ANNOTATION_ARGUMENT.registerFactory(RemoveAtFromAnnotationArgument) @@ -717,11 +727,13 @@ class QuickFixRegistrar : QuickFixContributor { OVERRIDE_DEPRECATION.registerFactory(AddAnnotationWithArgumentsFix.CopyDeprecatedAnnotation) NULLABLE_TYPE_PARAMETER_AGAINST_NOT_NULL_TYPE_PARAMETER.registerFactory(MakeUpperBoundNonNullableFix) + WRONG_TYPE_PARAMETER_NULLABILITY_FOR_JAVA_OVERRIDE.registerFactory(MakeUpperBoundNonNullableFix) WRONG_NULLABILITY_FOR_JAVA_OVERRIDE.registerFactory(MakeUpperBoundNonNullableFix) TYPE_MISMATCH.registerFactory(MakeUpperBoundNonNullableFix) TYPE_MISMATCH_WARNING.registerFactory(MakeUpperBoundNonNullableFix) NOTHING_TO_OVERRIDE.registerFactory(MakeUpperBoundNonNullableFix) WRONG_NULLABILITY_FOR_JAVA_OVERRIDE.registerFactory(ChangeMemberFunctionSignatureFix) + CONFUSING_BRANCH_CONDITION.registerFactory(ConfusingExpressionInWhenBranchFix) } } diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/SpecifySuperTypeFix.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/SpecifySuperTypeFix.kt index 7e6e11517620..edeefabc4be1 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/SpecifySuperTypeFix.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/SpecifySuperTypeFix.kt @@ -29,7 +29,7 @@ class SpecifySuperTypeFix( private val superTypes: List<String> ) : KotlinQuickFixAction<KtSuperExpression>(superExpression) { - override fun getText() = KotlinIdeaCompletionBundle.message("intention.name.specify.supertype") + override fun getText() = KotlinBundle.message("intention.name.specify.supertype") override fun getFamilyName() = text @@ -49,14 +49,14 @@ class SpecifySuperTypeFix( } private fun KtSuperExpression.specifySuperType(superType: String) { - project.executeWriteCommand(KotlinIdeaCompletionBundle.message("intention.name.specify.supertype")) { + project.executeWriteCommand(KotlinBundle.message("intention.name.specify.supertype")) { val label = this.labelQualifier?.text ?: "" replace(KtPsiFactory(this).createExpression("super<$superType>$label")) } } private fun createListPopupStep(superExpression: KtSuperExpression, superTypes: List<String>): ListPopupStep<*> { - return object : BaseListPopupStep<String>(KotlinIdeaCompletionBundle.message("popup.title.choose.supertype"), superTypes) { + return object : BaseListPopupStep<String>(KotlinBundle.message("popup.title.choose.supertype"), superTypes) { override fun isAutoSelectionEnabled() = false override fun onChosen(selectedValue: String, finalChoice: Boolean): PopupStep<*>? { diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableInfo.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableInfo.kt index a56401da92aa..dbf8dc528ea9 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableInfo.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableInfo.kt @@ -19,7 +19,7 @@ import org.jetbrains.kotlin.psi.psiUtil.parents import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.scopes.LexicalScope -import org.jetbrains.kotlin.types.ErrorUtils +import org.jetbrains.kotlin.types.error.ErrorUtils import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.typeUtil.makeNotNullable diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/typeUtils.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/typeUtils.kt index 1075b875ec6c..9e2cd44e5ba5 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/typeUtils.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/typeUtils.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.resolveTopLevelClass import org.jetbrains.kotlin.resolve.scopes.HierarchicalScope import org.jetbrains.kotlin.resolve.scopes.utils.findClassifier import org.jetbrains.kotlin.types.* +import org.jetbrains.kotlin.types.error.ErrorUtils import org.jetbrains.kotlin.types.checker.KotlinTypeChecker import org.jetbrains.kotlin.types.typeUtil.makeNotNullable import org.jetbrains.kotlin.types.typeUtil.supertypes @@ -65,7 +66,7 @@ private fun KotlinType.renderSingle(typeParameterNameMap: Map<TypeParameterDescr val defaultType = typeParameter.defaultType val wrappingType = KotlinTypeFactory.simpleTypeWithNonTrivialMemberScope( - defaultType.annotations, + defaultType.annotations.toDefaultAttributes(), wrappingTypeConstructor, defaultType.arguments, defaultType.isMarkedNullable, @@ -300,7 +301,7 @@ internal fun KotlinType.substitute(substitution: KotlinTypeSubstitution, varianc val (projection, typeParameter) = pair TypeProjectionImpl(Variance.INVARIANT, projection.type.substitute(substitution, typeParameter.variance)) } - KotlinTypeFactory.simpleTypeWithNonTrivialMemberScope(annotations, constructor, newArguments, isMarkedNullable, memberScope) + KotlinTypeFactory.simpleTypeWithNonTrivialMemberScope(annotations.toDefaultAttributes(), constructor, newArguments, isMarkedNullable, memberScope) } } diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createCallable/CreateIteratorFunctionActionFactory.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createCallable/CreateIteratorFunctionActionFactory.kt index f448579592fa..696f72d3ebfd 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createCallable/CreateIteratorFunctionActionFactory.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createCallable/CreateIteratorFunctionActionFactory.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.psi.KtPsiFactory import org.jetbrains.kotlin.types.KotlinTypeFactory import org.jetbrains.kotlin.types.TypeProjectionImpl import org.jetbrains.kotlin.types.Variance +import org.jetbrains.kotlin.types.toDefaultAttributes import org.jetbrains.kotlin.util.OperatorNameConventions import java.util.* @@ -40,7 +41,7 @@ object CreateIteratorFunctionActionFactory : CreateCallableMemberFromUsageFactor val returnJetTypeParameterType = TypeProjectionImpl(returnJetTypeParameterTypes[0]) val returnJetTypeArguments = Collections.singletonList(returnJetTypeParameterType) val newReturnJetType = KotlinTypeFactory.simpleTypeWithNonTrivialMemberScope( - returnJetType.annotations, + returnJetType.annotations.toDefaultAttributes(), returnJetType.constructor, returnJetTypeArguments, returnJetType.isMarkedNullable, diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createCallable/CreateSetFunctionActionFactory.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createCallable/CreateSetFunctionActionFactory.kt index c7436ab4321b..cebc2923c65b 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createCallable/CreateSetFunctionActionFactory.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createCallable/CreateSetFunctionActionFactory.kt @@ -16,7 +16,7 @@ import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.calls.util.getType import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode -import org.jetbrains.kotlin.types.ErrorUtils +import org.jetbrains.kotlin.types.error.ErrorUtils import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.expressions.OperatorConventions import org.jetbrains.kotlin.util.OperatorNameConventions diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/changeSignatureUtils.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/changeSignatureUtils.kt index a04dae8c1ca8..3efc3b08ca6f 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/changeSignatureUtils.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/changeSignatureUtils.kt @@ -98,7 +98,7 @@ private object ForceTypeCopySubstitution : TypeSubstitution() { } private fun KotlinType.copyAsSimpleType(): SimpleType = KotlinTypeFactory.simpleTypeWithNonTrivialMemberScope( - annotations, + annotations.toDefaultAttributes(), constructor, arguments, isMarkedNullable, diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/extractableAnalysisUtil.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/extractableAnalysisUtil.kt index 7bbb5721a83f..863745df76c8 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/extractableAnalysisUtil.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/extractableAnalysisUtil.kt @@ -56,6 +56,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.resolve.descriptorUtil.getImportableDescriptor import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.types.* +import org.jetbrains.kotlin.types.error.ErrorUtils import org.jetbrains.kotlin.types.typeUtil.makeNullable import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly import org.jetbrains.kotlin.utils.DFS.* diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/kotlinRefactoringUtil.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/kotlinRefactoringUtil.kt index 0b52072c65f7..ed8523d92df3 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/kotlinRefactoringUtil.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/kotlinRefactoringUtil.kt @@ -51,6 +51,7 @@ import org.jetbrains.annotations.Nls import org.jetbrains.kotlin.asJava.LightClassUtil import org.jetbrains.kotlin.asJava.elements.KtLightMethod import org.jetbrains.kotlin.asJava.getAccessorLightMethods +import org.jetbrains.kotlin.asJava.isSyntheticValuesOrValueOfMethod import org.jetbrains.kotlin.asJava.namedUnwrappedElement import org.jetbrains.kotlin.asJava.toLightClass import org.jetbrains.kotlin.descriptors.* @@ -664,6 +665,8 @@ fun createJavaClass(klass: KtClass, targetClass: PsiClass?, forcePlainClass: Boo } for (method in template.methods) { + if (isSyntheticValuesOrValueOfMethod(method)) continue + val hasParams = method.parameterList.parametersCount > 0 val needSuperCall = !template.isEnum && (template.superClass?.constructors ?: PsiMethod.EMPTY_ARRAY).all { diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/renameConflictUtils.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/renameConflictUtils.kt index a5e65ccc7cbf..916371b7fa26 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/renameConflictUtils.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/renameConflictUtils.kt @@ -58,7 +58,7 @@ import org.jetbrains.kotlin.resolve.scopes.getDescriptorsFiltered import org.jetbrains.kotlin.resolve.scopes.utils.findClassifier import org.jetbrains.kotlin.resolve.scopes.utils.getImplicitReceiversHierarchy import org.jetbrains.kotlin.resolve.source.getPsi -import org.jetbrains.kotlin.types.ErrorUtils +import org.jetbrains.kotlin.types.error.ErrorUtils import org.jetbrains.kotlin.utils.SmartList import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addToStdlib.safeAs diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/search/KotlinSearchUsagesSupportImpl.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/search/KotlinSearchUsagesSupportImpl.kt index 94afe8ea7771..e8559374a53d 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/search/KotlinSearchUsagesSupportImpl.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/search/KotlinSearchUsagesSupportImpl.kt @@ -11,7 +11,6 @@ import org.jetbrains.kotlin.idea.caches.resolve.util.hasJavaResolutionFacade import org.jetbrains.kotlin.idea.core.isInheritable import org.jetbrains.kotlin.idea.core.isOverridable import org.jetbrains.kotlin.idea.search.declarationsSearch.forEachOverridingMethod -import org.jetbrains.kotlin.idea.search.ideaExtensions.KotlinReferencesSearchOptions import org.jetbrains.kotlin.idea.search.usagesSearch.* import org.jetbrains.kotlin.idea.stubindex.KotlinTypeAliasShortNameIndex import org.jetbrains.kotlin.idea.util.ProjectRootsUtil @@ -34,12 +33,6 @@ class KotlinSearchUsagesSupportImpl : KotlinSearchUsagesSupport { override fun isSamInterface(psiClass: PsiClass): Boolean = org.jetbrains.kotlin.idea.search.usagesSearch.isSamInterface(psiClass) - override fun <T : PsiNamedElement> filterDataClassComponentsIfDisabled( - elements: List<T>, - kotlinOptions: KotlinReferencesSearchOptions - ): List<T> = - elements.filterDataClassComponentsIfDisabled(kotlinOptions) - override fun isCallableOverrideUsage(reference: PsiReference, declaration: KtNamedDeclaration): Boolean = reference.isCallableOverrideUsage(declaration) @@ -117,4 +110,4 @@ class KotlinSearchUsagesSupportImpl : KotlinSearchUsagesSupport { override fun createConstructorHandle(psiMethod: PsiMethod): KotlinSearchUsagesSupport.ConstructorCallHandle = JavaConstructorCallLazyDescriptorHandle(psiMethod) -}
\ No newline at end of file +} diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/FE10KotlinTargetElementEvaluator.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/FE10KotlinTargetElementEvaluator.kt new file mode 100644 index 000000000000..809cc451cc07 --- /dev/null +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/FE10KotlinTargetElementEvaluator.kt @@ -0,0 +1,51 @@ +/* + * Copyright 2010-2021 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.idea.search.ideaExtensions + +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiReference +import org.jetbrains.kotlin.descriptors.CallableDescriptor +import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithSource +import org.jetbrains.kotlin.idea.refactoring.rename.RenameKotlinImplicitLambdaParameter.Companion.isAutoCreatedItUsage +import org.jetbrains.kotlin.idea.references.resolveMainReferenceToDescriptors +import org.jetbrains.kotlin.psi.KtCallableDeclaration +import org.jetbrains.kotlin.psi.KtLambdaExpression +import org.jetbrains.kotlin.psi.KtNameReferenceExpression +import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension +import org.jetbrains.kotlin.resolve.source.getPsi + +class FE10KotlinTargetElementEvaluator : KotlinTargetElementEvaluator() { + companion object { + fun findLambdaOpenLBraceForGeneratedIt(ref: PsiReference): PsiElement? { + val element: PsiElement = ref.element + if (element.text != "it") return null + + if (element !is KtNameReferenceExpression || !isAutoCreatedItUsage(element)) return null + + val itDescriptor = element.resolveMainReferenceToDescriptors().singleOrNull() ?: return null + val descriptorWithSource = itDescriptor.containingDeclaration as? DeclarationDescriptorWithSource ?: return null + val lambdaExpression = descriptorWithSource.source.getPsi()?.parent as? KtLambdaExpression ?: return null + return lambdaExpression.leftCurlyBrace.treeNext?.psi + } + } + + override fun findLambdaOpenLBraceForGeneratedIt(ref: PsiReference): PsiElement? = + Companion.findLambdaOpenLBraceForGeneratedIt(ref) + + override fun findReceiverForThisInExtensionFunction(ref: PsiReference): PsiElement? { + val element: PsiElement = ref.element + if (element.text != "this") return null + + if (element !is KtNameReferenceExpression) return null + val callableDescriptor = element.resolveMainReferenceToDescriptors().singleOrNull() as? CallableDescriptor ?: return null + + if (!callableDescriptor.isExtension) return null + val callableDeclaration = callableDescriptor.source.getPsi() as? KtCallableDeclaration ?: return null + + return callableDeclaration.receiverTypeReference + } + + +}
\ No newline at end of file diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinTargetElementEvaluator.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinTargetElementEvaluator.kt deleted file mode 100644 index f368899b617c..000000000000 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinTargetElementEvaluator.kt +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. - -package org.jetbrains.kotlin.idea.search.ideaExtensions - -import com.intellij.codeInsight.JavaTargetElementEvaluator -import com.intellij.codeInsight.TargetElementEvaluatorEx -import com.intellij.codeInsight.TargetElementUtil -import com.intellij.codeInsight.TargetElementUtilExtender -import com.intellij.psi.PsiElement -import com.intellij.psi.PsiFile -import com.intellij.psi.PsiReference -import com.intellij.util.BitUtil -import org.jetbrains.kotlin.descriptors.CallableDescriptor -import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithSource -import org.jetbrains.kotlin.idea.refactoring.rename.RenameKotlinImplicitLambdaParameter.Companion.isAutoCreatedItUsage -import org.jetbrains.kotlin.idea.references.KtDestructuringDeclarationReference -import org.jetbrains.kotlin.idea.references.KtSimpleNameReference -import org.jetbrains.kotlin.idea.references.mainReference -import org.jetbrains.kotlin.idea.references.resolveMainReferenceToDescriptors -import org.jetbrains.kotlin.lexer.KtTokens -import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.psi.psiUtil.* -import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension -import org.jetbrains.kotlin.resolve.source.getPsi - -class KotlinTargetElementEvaluator : TargetElementEvaluatorEx, TargetElementUtilExtender { - companion object { - const val DO_NOT_UNWRAP_LABELED_EXPRESSION = 0x100 - const val BYPASS_IMPORT_ALIAS = 0x200 - - // Place caret after the open curly brace in lambda for generated 'it' - fun findLambdaOpenLBraceForGeneratedIt(ref: PsiReference): PsiElement? { - val element: PsiElement = ref.element - if (element.text != "it") return null - - if (element !is KtNameReferenceExpression || !isAutoCreatedItUsage(element)) return null - - val itDescriptor = element.resolveMainReferenceToDescriptors().singleOrNull() ?: return null - val descriptorWithSource = itDescriptor.containingDeclaration as? DeclarationDescriptorWithSource ?: return null - val lambdaExpression = descriptorWithSource.source.getPsi()?.parent as? KtLambdaExpression ?: return null - return lambdaExpression.leftCurlyBrace.treeNext?.psi - } - - // Navigate to receiver element for this in extension declaration - fun findReceiverForThisInExtensionFunction(ref: PsiReference): PsiElement? { - val element: PsiElement = ref.element - if (element.text != "this") return null - - if (element !is KtNameReferenceExpression) return null - val callableDescriptor = element.resolveMainReferenceToDescriptors().singleOrNull() as? CallableDescriptor ?: return null - - if (!callableDescriptor.isExtension) return null - val callableDeclaration = callableDescriptor.source.getPsi() as? KtCallableDeclaration ?: return null - - return callableDeclaration.receiverTypeReference - } - } - - override fun getAdditionalDefinitionSearchFlags() = 0 - - override fun getAdditionalReferenceSearchFlags() = DO_NOT_UNWRAP_LABELED_EXPRESSION or BYPASS_IMPORT_ALIAS - - override fun getAllAdditionalFlags() = additionalDefinitionSearchFlags + additionalReferenceSearchFlags - - override fun includeSelfInGotoImplementation(element: PsiElement): Boolean = !(element is KtClass && element.isAbstract()) - - override fun getElementByReference(ref: PsiReference, flags: Int): PsiElement? { - if (ref is KtSimpleNameReference && ref.expression is KtLabelReferenceExpression) { - val refTarget = ref.resolve() as? KtExpression ?: return null - if (!BitUtil.isSet(flags, DO_NOT_UNWRAP_LABELED_EXPRESSION)) { - return refTarget.getLabeledParent(ref.expression.getReferencedName()) ?: refTarget - } - return refTarget - } - - if (!BitUtil.isSet(flags, BYPASS_IMPORT_ALIAS)) { - (ref.element as? KtSimpleNameExpression)?.mainReference?.getImportAlias()?.let { return it } - } - - // prefer destructing declaration entry to its target if element name is accepted - if (ref is KtDestructuringDeclarationReference && BitUtil.isSet(flags, TargetElementUtil.ELEMENT_NAME_ACCEPTED)) { - return ref.element - } - - val refExpression = ref.element as? KtSimpleNameExpression - val calleeExpression = refExpression?.getParentOfTypeAndBranch<KtCallElement> { calleeExpression } - if (calleeExpression != null) { - (ref.resolve() as? KtConstructor<*>)?.let { - return if (flags and JavaTargetElementEvaluator().additionalReferenceSearchFlags != 0) it else it.containingClassOrObject - } - } - - if (BitUtil.isSet(flags, TargetElementUtil.REFERENCED_ELEMENT_ACCEPTED)) { - return findLambdaOpenLBraceForGeneratedIt(ref) - ?: findReceiverForThisInExtensionFunction(ref) - } - - return null - } - - override fun isIdentifierPart(file: PsiFile, text: CharSequence, offset: Int): Boolean { - val elementAtCaret = file.findElementAt(offset) - - if (elementAtCaret?.node?.elementType == KtTokens.IDENTIFIER) return true - // '(' is considered identifier part if it belongs to primary constructor without 'constructor' keyword - return elementAtCaret?.getNonStrictParentOfType<KtPrimaryConstructor>()?.textOffset == offset - } -} diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/search/usagesSearch/utils.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/search/usagesSearch/utils.kt index 13319e85efe1..421ff73a5114 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/search/usagesSearch/utils.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/search/usagesSearch/utils.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.idea.search.usagesSearch import com.intellij.openapi.project.Project import com.intellij.psi.* import com.intellij.psi.util.MethodSignatureUtil -import org.jetbrains.kotlin.asJava.classes.KtLightClass import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.asJava.toLightClass import org.jetbrains.kotlin.asJava.toLightMethods @@ -26,13 +25,11 @@ import org.jetbrains.kotlin.idea.project.findAnalyzerServices import org.jetbrains.kotlin.idea.references.unwrappedTargets import org.jetbrains.kotlin.idea.search.KotlinSearchUsagesSupport import org.jetbrains.kotlin.idea.search.ReceiverTypeSearcherInfo -import org.jetbrains.kotlin.idea.search.ideaExtensions.KotlinReferencesSearchOptions import org.jetbrains.kotlin.idea.util.FuzzyType import org.jetbrains.kotlin.idea.util.application.runReadAction import org.jetbrains.kotlin.idea.util.fuzzyExtensionReceiverType import org.jetbrains.kotlin.idea.util.toFuzzyType import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor -import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType import org.jetbrains.kotlin.renderer.DescriptorRenderer @@ -129,22 +126,13 @@ fun PsiReference.checkUsageVsOriginalDescriptor( } } -fun PsiReference.isConstructorUsage(ktClassOrObject: KtClassOrObject): Boolean = with(element) { - fun checkJavaUsage(): Boolean { - val call = getNonStrictParentOfType<PsiConstructorCall>() - return call == parent && call?.resolveConstructor()?.containingClass?.navigationElement == ktClassOrObject - } - - fun checkKotlinUsage(): Boolean { - if (this !is KtElement) return false +fun PsiReference.isKotlinConstructorUsage(ktClassOrObject: KtClassOrObject): Boolean = with(element) { + if (this !is KtElement) return false - val descriptor = getConstructorCallDescriptor() as? ConstructorDescriptor ?: return false - - val declaration = DescriptorToSourceUtils.descriptorToDeclaration(descriptor.containingDeclaration) - return declaration == ktClassOrObject || (declaration is KtConstructor<*> && declaration.getContainingClassOrObject() == ktClassOrObject) - } + val descriptor = getConstructorCallDescriptor() as? ConstructorDescriptor ?: return false - checkJavaUsage() || checkKotlinUsage() + val declaration = DescriptorToSourceUtils.descriptorToDeclaration(descriptor.containingDeclaration) + return declaration == ktClassOrObject || (declaration is KtConstructor<*> && declaration.getContainingClassOrObject() == ktClassOrObject) } private fun KtElement.getConstructorCallDescriptor(): DeclarationDescriptor? { @@ -228,26 +216,6 @@ fun PsiReference.isCallableOverrideUsage(declaration: KtNamedDeclaration): Boole } } -fun <T : PsiNamedElement> List<T>.filterDataClassComponentsIfDisabled(kotlinOptions: KotlinReferencesSearchOptions): List<T> { - if (kotlinOptions.searchForComponentConventions) return this - - fun PsiNamedElement.isComponentElement(): Boolean { - - if (this !is PsiMethod) return false - - val dataClassParent = ((parent as? KtLightClass)?.kotlinOrigin as? KtClass)?.isData() == true - if (!dataClassParent) return false - - if (!Name.isValidIdentifier(name)) return false - val nameIdentifier = Name.identifier(name) - if (!DataClassDescriptorResolver.isComponentLike(nameIdentifier)) return false - - return true - } - - return filter { !it.isComponentElement() } -} - fun KtFile.forceResolveReferences(elements: List<KtElement>) { getResolutionFacade().analyze(elements, BodyResolveMode.PARTIAL) } @@ -314,4 +282,4 @@ fun KtFile.getDefaultImports(): List<ImportPath> { ) } -fun PsiFile.scriptDefinitionExists(): Boolean = findScriptDefinition() != null
\ No newline at end of file +fun PsiFile.scriptDefinitionExists(): Boolean = findScriptDefinition() != null diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/slicer/InflowSlicer.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/slicer/InflowSlicer.kt index c4e0f9fbba3f..285d3933b32b 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/slicer/InflowSlicer.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/slicer/InflowSlicer.kt @@ -26,7 +26,7 @@ import org.jetbrains.kotlin.idea.refactoring.changeSignature.toValVar import org.jetbrains.kotlin.idea.references.KtPropertyDelegationMethodsReference import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.idea.references.readWriteAccessWithFullExpression -import org.jetbrains.kotlin.idea.search.ideaExtensions.KotlinTargetElementEvaluator +import org.jetbrains.kotlin.idea.search.ideaExtensions.FE10KotlinTargetElementEvaluator import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.collectDescendantsOfType @@ -380,7 +380,7 @@ class InflowSlicer( private fun KtFunctionLiteral.implicitItUsages(): Collection<KtSimpleNameExpression> { return collectDescendantsOfType(fun(expression: KtSimpleNameExpression): Boolean { if (expression.getQualifiedExpressionForSelector() != null || expression.getReferencedName() != "it") return false - val lBrace = KotlinTargetElementEvaluator.findLambdaOpenLBraceForGeneratedIt(expression.mainReference) ?: return false + val lBrace = FE10KotlinTargetElementEvaluator.findLambdaOpenLBraceForGeneratedIt(expression.mainReference) ?: return false return lBrace == this.lBrace.node.treeNext.psi }) } diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/structuralsearch/KotlinStructuralSearchUtil.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/structuralsearch/KotlinStructuralSearchUtil.kt index 8d4c386fdbc2..7c1166377c24 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/structuralsearch/KotlinStructuralSearchUtil.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/structuralsearch/KotlinStructuralSearchUtil.kt @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinTypeFactory +import org.jetbrains.kotlin.types.TypeAttributes import org.jetbrains.kotlin.types.expressions.OperatorConventions fun getCommentText(comment: PsiComment): String { @@ -56,4 +57,4 @@ fun KtDeclaration.resolveKotlinType(): KotlinType? = (resolveToDescriptorIfAny() as? CallableDescriptor)?.returnType fun ClassDescriptor.toSimpleType(nullable: Boolean = false) = - KotlinTypeFactory.simpleType(Annotations.EMPTY, this.typeConstructor, emptyList(), nullable)
\ No newline at end of file + KotlinTypeFactory.simpleType(TypeAttributes.Empty, this.typeConstructor, emptyList(), nullable) diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/structuralsearch/visitor/KotlinMatchingVisitor.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/structuralsearch/visitor/KotlinMatchingVisitor.kt index 583fc5041181..913c1a29542f 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/structuralsearch/visitor/KotlinMatchingVisitor.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/structuralsearch/visitor/KotlinMatchingVisitor.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.descriptors.impl.AnonymousFunctionDescriptor import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.caches.resolve.resolveToCall +import org.jetbrains.kotlin.idea.caches.resolve.safeAnalyzeNonSourceRootCode import org.jetbrains.kotlin.idea.core.resolveType import org.jetbrains.kotlin.idea.intentions.callExpression import org.jetbrains.kotlin.idea.intentions.calleeName @@ -32,7 +33,6 @@ import org.jetbrains.kotlin.idea.search.declarationsSearch.HierarchySearchReques import org.jetbrains.kotlin.idea.search.declarationsSearch.searchInheritors import org.jetbrains.kotlin.idea.search.usagesSearch.descriptor import org.jetbrains.kotlin.idea.structuralsearch.* -import org.jetbrains.kotlin.idea.util.safeAnalyzeNonSourceRootCode import org.jetbrains.kotlin.kdoc.lexer.KDocTokens import org.jetbrains.kotlin.kdoc.psi.api.KDoc import org.jetbrains.kotlin.kdoc.psi.impl.KDocImpl |