Changes on code review
This commit is contained in:
@@ -46,7 +46,7 @@ import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
|
|||||||
public abstract class ElementResolver protected constructor(
|
public abstract class ElementResolver protected constructor(
|
||||||
public val resolveSession: ResolveSession
|
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
|
return performElementAdditionalResolve(resolveElement, resolveElement, bodyResolveMode).first
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,6 +59,7 @@ public abstract class ElementResolver protected constructor(
|
|||||||
val elementOfAdditionalResolve = findElementOfAdditionalResolve(contextElement)
|
val elementOfAdditionalResolve = findElementOfAdditionalResolve(contextElement)
|
||||||
|
|
||||||
if (elementOfAdditionalResolve is JetParameter) {
|
if (elementOfAdditionalResolve is JetParameter) {
|
||||||
|
// Parameters for function literal could be met inside other parameters. We can't make resolveToDescriptors for internal elements.
|
||||||
contextElement = elementOfAdditionalResolve
|
contextElement = elementOfAdditionalResolve
|
||||||
}
|
}
|
||||||
else if (elementOfAdditionalResolve != null) {
|
else if (elementOfAdditionalResolve != null) {
|
||||||
|
|||||||
@@ -524,7 +524,7 @@ class PartialBodyResolveFilter(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun JetElement.forTopLevelBlocksInside(action: (JetBlockExpression) -> Unit) {
|
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
|
private fun JetExpression?.isNullLiteral() = this?.getNode()?.getElementType() == JetNodeTypes.NULL
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ val KDocName.mainReference: KDocReference
|
|||||||
val JetElement.mainReference: JetReference?
|
val JetElement.mainReference: JetReference?
|
||||||
get() {
|
get() {
|
||||||
return when {
|
return when {
|
||||||
this is JetSimpleNameExpression -> mainReference
|
this is JetReferenceExpression -> mainReference
|
||||||
this is KDocName -> mainReference
|
this is KDocName -> mainReference
|
||||||
else -> getReferences().firstIsInstanceOrNull<JetReference>()
|
else -> getReferences().firstIsInstanceOrNull<JetReference>()
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+2
-2
@@ -1,8 +1,8 @@
|
|||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
fun File.foo(absolutePath: String) {
|
fun File.foo(absolutePath: String?) {
|
||||||
<caret>
|
<caret>
|
||||||
}
|
}
|
||||||
|
|
||||||
// EXIST_JAVA_ONLY: getAbsolutePath
|
// EXIST_JAVA_ONLY: getAbsolutePath
|
||||||
// ABSENT: { itemText: "absolutePath", tailText: " for File" }
|
// ABSENT: { itemText: "absolutePath", typeText: "String" }
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ public class JetAddImportAction(
|
|||||||
// TODO: Validate resolution variants. See AddImportAction.execute()
|
// TODO: Validate resolution variants. See AddImportAction.execute()
|
||||||
|
|
||||||
if (variants.size() == 1 || ApplicationManager.getApplication().isUnitTestMode()) {
|
if (variants.size() == 1 || ApplicationManager.getApplication().isUnitTestMode()) {
|
||||||
addImport(element, project, variants.first())
|
addImport(variants.first())
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
chooseCandidateAndImport()
|
chooseCandidateAndImport()
|
||||||
@@ -124,7 +124,7 @@ public class JetAddImportAction(
|
|||||||
if (selectedValue == null) return null
|
if (selectedValue == null) return null
|
||||||
|
|
||||||
if (finalChoice) {
|
if (finalChoice) {
|
||||||
addImport(element, project, selectedValue)
|
addImport(selectedValue)
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -156,23 +156,20 @@ public class JetAddImportAction(
|
|||||||
JBPopupFactory.getInstance().createListPopup(getImportSelectionPopup()).showInBestPositionFor(editor)
|
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) {
|
project.executeWriteCommand(QuickFixBundle.message("add.import")) {
|
||||||
PsiDocumentManager.getInstance(project).commitAllDocuments()
|
if (!element.isValid()) return@executeWriteCommand
|
||||||
|
|
||||||
project.executeWriteCommand(QuickFixBundle.message("add.import")) {
|
val file = element.getContainingFile() as JetFile
|
||||||
if (!element.isValid()) return@executeWriteCommand
|
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
|
||||||
val file = element.getContainingFile() as JetFile
|
if (descriptor is ClassDescriptor || descriptor is PackageViewDescriptor) {
|
||||||
val descriptor = selectedVariant.descriptorToImport
|
element.mainReference.bindToFqName(descriptor.importableFqNameSafe, JetSimpleNameReference.ShorteningMode.FORCED_SHORTENING)
|
||||||
// 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)) {
|
else {
|
||||||
element.mainReference.bindToFqName(descriptor.importableFqNameSafe, JetSimpleNameReference.ShorteningMode.FORCED_SHORTENING)
|
ImportInsertHelper.getInstance(project).importDescriptor(file, descriptor)
|
||||||
}
|
|
||||||
else {
|
|
||||||
ImportInsertHelper.getInstance(project).importDescriptor(file, descriptor)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ import org.jetbrains.kotlin.psi.*
|
|||||||
import org.jetbrains.kotlin.psi.psiUtil.elementsInRange
|
import org.jetbrains.kotlin.psi.psiUtil.elementsInRange
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.forEachDescendantOfType
|
import org.jetbrains.kotlin.psi.psiUtil.forEachDescendantOfType
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getReceiverExpression
|
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.DescriptorUtils
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension
|
import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension
|
||||||
import org.jetbrains.kotlin.resolve.scopes.JetScope
|
import org.jetbrains.kotlin.resolve.scopes.JetScope
|
||||||
@@ -217,16 +218,14 @@ public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor<Kotlin
|
|||||||
private fun findReference(data: KotlinReferenceData, file: JetFile, blockStart: Int): JetReference? {
|
private fun findReference(data: KotlinReferenceData, file: JetFile, blockStart: Int): JetReference? {
|
||||||
val startOffset = data.startOffset + blockStart
|
val startOffset = data.startOffset + blockStart
|
||||||
val endOffset = data.endOffset + blockStart
|
val endOffset = data.endOffset + blockStart
|
||||||
val element = file.findElementAt(startOffset)
|
val element = file.findElementAt(startOffset) ?: return null
|
||||||
val desiredRange = TextRange(startOffset, endOffset)
|
val desiredRange = TextRange(startOffset, endOffset)
|
||||||
var current = element
|
for (current in element.parentsWithSelf) {
|
||||||
while (current != null) {
|
|
||||||
val range = current.range
|
val range = current.range
|
||||||
if (current is JetElement && range == desiredRange) {
|
if (current is JetElement && range == desiredRange) {
|
||||||
current.mainReference?.let { return it }
|
current.mainReference?.let { return it }
|
||||||
}
|
}
|
||||||
if (range !in desiredRange) return null
|
if (range !in desiredRange) return null
|
||||||
current = current.getParent()
|
|
||||||
}
|
}
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ class C(param1: String = "", param2: Int = 0) {
|
|||||||
|
|
||||||
statement1.getParent().addAfter(factory.createExpression("x()"), statement1)
|
statement1.getParent().addAfter(factory.createExpression("x()"), statement1)
|
||||||
|
|
||||||
val bindingContext5 = statement1.analyze(BodyResolveMode.PARTIAL)
|
val bindingContext5 = statement1.analyze(BodyResolveMode.FULL)
|
||||||
assert(bindingContext5 !== bindingContext4)
|
assert(bindingContext5 !== bindingContext4)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user