From 53810c67db138f38e626aeea0fd10a1255cdd6c8 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 15 Jul 2015 16:06:46 +0300 Subject: [PATCH] Changes on code review --- .../kotlin/resolve/lazy/ElementResolver.kt | 3 +- .../resolve/lazy/PartialBodyResolveFilter.kt | 2 +- .../kotlin/idea/references/referenceUtil.kt | 2 +- ...oNotHideGetterWhenExtensionCannotBeUsed.kt | 4 +-- .../kotlin/idea/actions/JetAddImportAction.kt | 31 +++++++++---------- .../KotlinCopyPasteReferenceProcessor.kt | 7 ++--- .../kotlin/idea/ResolveElementCacheTest.kt | 2 +- 7 files changed, 24 insertions(+), 27 deletions(-) diff --git a/idea/ide-common/src/org/jetbrains/kotlin/resolve/lazy/ElementResolver.kt b/idea/ide-common/src/org/jetbrains/kotlin/resolve/lazy/ElementResolver.kt index 6fd783360c8..5e973a05733 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/resolve/lazy/ElementResolver.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/resolve/lazy/ElementResolver.kt @@ -46,7 +46,7 @@ import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull public abstract class ElementResolver protected constructor( public val resolveSession: ResolveSession ) { - public open fun getElementAdditionalResolve(resolveElement: JetElement, contextElement: JetElement, bodyResolveMode: BodyResolveMode): BindingContext { + protected open fun getElementAdditionalResolve(resolveElement: JetElement, contextElement: JetElement, bodyResolveMode: BodyResolveMode): BindingContext { return performElementAdditionalResolve(resolveElement, resolveElement, bodyResolveMode).first } @@ -59,6 +59,7 @@ public abstract class ElementResolver protected constructor( val elementOfAdditionalResolve = findElementOfAdditionalResolve(contextElement) if (elementOfAdditionalResolve is JetParameter) { + // Parameters for function literal could be met inside other parameters. We can't make resolveToDescriptors for internal elements. contextElement = elementOfAdditionalResolve } else if (elementOfAdditionalResolve != null) { diff --git a/idea/ide-common/src/org/jetbrains/kotlin/resolve/lazy/PartialBodyResolveFilter.kt b/idea/ide-common/src/org/jetbrains/kotlin/resolve/lazy/PartialBodyResolveFilter.kt index bc63a7b9bcc..c6bce01f18f 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/resolve/lazy/PartialBodyResolveFilter.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/resolve/lazy/PartialBodyResolveFilter.kt @@ -524,7 +524,7 @@ class PartialBodyResolveFilter( } private fun JetElement.forTopLevelBlocksInside(action: (JetBlockExpression) -> Unit) { - forEachDescendantOfType({ it !is JetBlockExpression }, action) + forEachDescendantOfType(canGoInside = { it !is JetBlockExpression }, action = action) } private fun JetExpression?.isNullLiteral() = this?.getNode()?.getElementType() == JetNodeTypes.NULL diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/referenceUtil.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/referenceUtil.kt index ce5caa01a32..6b076a2a7c1 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/referenceUtil.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/referenceUtil.kt @@ -130,7 +130,7 @@ val KDocName.mainReference: KDocReference val JetElement.mainReference: JetReference? get() { return when { - this is JetSimpleNameExpression -> mainReference + this is JetReferenceExpression -> mainReference this is KDocName -> mainReference else -> getReferences().firstIsInstanceOrNull() } diff --git a/idea/idea-completion/testData/basic/common/extensions/DoNotHideGetterWhenExtensionCannotBeUsed.kt b/idea/idea-completion/testData/basic/common/extensions/DoNotHideGetterWhenExtensionCannotBeUsed.kt index bfad110447f..72f81972745 100644 --- a/idea/idea-completion/testData/basic/common/extensions/DoNotHideGetterWhenExtensionCannotBeUsed.kt +++ b/idea/idea-completion/testData/basic/common/extensions/DoNotHideGetterWhenExtensionCannotBeUsed.kt @@ -1,8 +1,8 @@ import java.io.File -fun File.foo(absolutePath: String) { +fun File.foo(absolutePath: String?) { } // EXIST_JAVA_ONLY: getAbsolutePath -// ABSENT: { itemText: "absolutePath", tailText: " for File" } +// ABSENT: { itemText: "absolutePath", typeText: "String" } diff --git a/idea/src/org/jetbrains/kotlin/idea/actions/JetAddImportAction.kt b/idea/src/org/jetbrains/kotlin/idea/actions/JetAddImportAction.kt index e9225f8c1c6..23e5d3af082 100644 --- a/idea/src/org/jetbrains/kotlin/idea/actions/JetAddImportAction.kt +++ b/idea/src/org/jetbrains/kotlin/idea/actions/JetAddImportAction.kt @@ -107,7 +107,7 @@ public class JetAddImportAction( // TODO: Validate resolution variants. See AddImportAction.execute() if (variants.size() == 1 || ApplicationManager.getApplication().isUnitTestMode()) { - addImport(element, project, variants.first()) + addImport(variants.first()) } else { chooseCandidateAndImport() @@ -124,7 +124,7 @@ public class JetAddImportAction( if (selectedValue == null) return null if (finalChoice) { - addImport(element, project, selectedValue) + addImport(selectedValue) return null } @@ -156,23 +156,20 @@ public class JetAddImportAction( JBPopupFactory.getInstance().createListPopup(getImportSelectionPopup()).showInBestPositionFor(editor) } - companion object { + private fun addImport(selectedVariant: Variant) { + PsiDocumentManager.getInstance(project).commitAllDocuments() - protected fun addImport(element: PsiElement, project: Project, selectedVariant: Variant) { - PsiDocumentManager.getInstance(project).commitAllDocuments() + project.executeWriteCommand(QuickFixBundle.message("add.import")) { + if (!element.isValid()) return@executeWriteCommand - project.executeWriteCommand(QuickFixBundle.message("add.import")) { - if (!element.isValid()) return@executeWriteCommand - - val file = element.getContainingFile() as JetFile - val descriptor = selectedVariant.descriptorToImport - // for class or package we use ShortenReferences because we not necessary insert an import but may want to insert partly qualified name - if (element is JetSimpleNameExpression && (descriptor is ClassDescriptor || descriptor is PackageViewDescriptor)) { - element.mainReference.bindToFqName(descriptor.importableFqNameSafe, JetSimpleNameReference.ShorteningMode.FORCED_SHORTENING) - } - else { - ImportInsertHelper.getInstance(project).importDescriptor(file, descriptor) - } + val file = element.getContainingFile() as JetFile + val descriptor = selectedVariant.descriptorToImport + // for class or package we use ShortenReferences because we not necessary insert an import but may want to insert partly qualified name + if (descriptor is ClassDescriptor || descriptor is PackageViewDescriptor) { + element.mainReference.bindToFqName(descriptor.importableFqNameSafe, JetSimpleNameReference.ShorteningMode.FORCED_SHORTENING) + } + else { + ImportInsertHelper.getInstance(project).importDescriptor(file, descriptor) } } } diff --git a/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteReferenceProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteReferenceProcessor.kt index b07a053380a..2cb8b806d32 100644 --- a/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteReferenceProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteReferenceProcessor.kt @@ -50,6 +50,7 @@ import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.elementsInRange import org.jetbrains.kotlin.psi.psiUtil.forEachDescendantOfType import org.jetbrains.kotlin.psi.psiUtil.getReceiverExpression +import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension import org.jetbrains.kotlin.resolve.scopes.JetScope @@ -217,16 +218,14 @@ public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor