Improvements in internal action
This commit is contained in:
+40
-16
@@ -47,6 +47,12 @@ import org.jetbrains.jet.lang.psi.JetExpression
|
|||||||
import org.jetbrains.jet.lang.types.JetType
|
import org.jetbrains.jet.lang.types.JetType
|
||||||
import org.jetbrains.jet.plugin.caches.resolve.ResolutionFacade
|
import org.jetbrains.jet.plugin.caches.resolve.ResolutionFacade
|
||||||
import org.jetbrains.jet.plugin.caches.resolve.getResolutionFacade
|
import org.jetbrains.jet.plugin.caches.resolve.getResolutionFacade
|
||||||
|
import org.jetbrains.jet.lang.psi.JetBlockExpression
|
||||||
|
import org.jetbrains.jet.lang.psi.JetDeclarationWithBody
|
||||||
|
import org.jetbrains.jet.lang.psi.JetContainerNode
|
||||||
|
import org.jetbrains.jet.lang.psi.JetDeclaration
|
||||||
|
import org.jetbrains.jet.lang.psi.psiUtil.siblings
|
||||||
|
import org.jetbrains.jet.utils.addToStdlib.firstIsInstanceOrNull
|
||||||
|
|
||||||
public class CheckPartialBodyResolveAction : AnAction() {
|
public class CheckPartialBodyResolveAction : AnAction() {
|
||||||
override fun actionPerformed(e: AnActionEvent) {
|
override fun actionPerformed(e: AnActionEvent) {
|
||||||
@@ -88,7 +94,7 @@ public class CheckPartialBodyResolveAction : AnAction() {
|
|||||||
diffPanel.setDiffRequest(request)
|
diffPanel.setDiffRequest(request)
|
||||||
diffBuilder.addOkAction().setText("Close")
|
diffBuilder.addOkAction().setText("Close")
|
||||||
diffBuilder.setTitle(title)
|
diffBuilder.setTitle(title)
|
||||||
diffBuilder.show()
|
diffBuilder.showNotModal()
|
||||||
//TODO: choose continue or abort
|
//TODO: choose continue or abort
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
@@ -112,27 +118,20 @@ public class CheckPartialBodyResolveAction : AnAction() {
|
|||||||
element.acceptChildren(this)
|
element.acceptChildren(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitReferenceExpression(expression: JetReferenceExpression) {
|
|
||||||
super.visitReferenceExpression(expression)
|
|
||||||
|
|
||||||
val bindingContext = resolver(expression, resolutionFacade)
|
|
||||||
val target = bindingContext[BindingContext.REFERENCE_TARGET, expression]
|
|
||||||
val offset = expression.getTextOffset()
|
|
||||||
val line = document.getLineNumber(offset)
|
|
||||||
val column = offset - document.getLineStartOffset(line)
|
|
||||||
val exprName = if (expression is JetNameReferenceExpression) expression.getReferencedName() else "<unnamed>"
|
|
||||||
builder.append("$exprName at (${line + 1}:${column + 1}) resolves to ${target?.presentation()}\n")
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun visitExpression(expression: JetExpression) {
|
override fun visitExpression(expression: JetExpression) {
|
||||||
super.visitExpression(expression)
|
super.visitExpression(expression)
|
||||||
|
|
||||||
|
// do not try to resolve to declaration as it crashes on some declaration (namely JetClassInitializer)
|
||||||
|
if (expression is JetDeclaration) return
|
||||||
|
|
||||||
|
if (!isValueNeeded(expression)) return
|
||||||
|
|
||||||
val bindingContext = resolver(expression, resolutionFacade)
|
val bindingContext = resolver(expression, resolutionFacade)
|
||||||
|
|
||||||
val offset = expression.getTextOffset()
|
val offset = expression.getTextOffset()
|
||||||
val line = document.getLineNumber(offset)
|
val line = document.getLineNumber(offset)
|
||||||
val column = offset - document.getLineStartOffset(line)
|
val column = offset - document.getLineStartOffset(line)
|
||||||
val exprName = if (expression is JetNameReferenceExpression) expression.getReferencedName() else "<unnamed>"
|
val exprName = if (expression is JetNameReferenceExpression) expression.getReferencedName() else expression.javaClass.getSimpleName()
|
||||||
builder.append("$exprName at (${line + 1}:${column + 1})")
|
builder.append("$exprName at (${line + 1}:${column + 1})")
|
||||||
|
|
||||||
if (expression is JetReferenceExpression) {
|
if (expression is JetReferenceExpression) {
|
||||||
@@ -151,8 +150,8 @@ public class CheckPartialBodyResolveAction : AnAction() {
|
|||||||
return builder.toString()
|
return builder.toString()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun DeclarationDescriptor.presentation() = DescriptorRenderer.DEBUG_TEXT.render(this)
|
private fun DeclarationDescriptor.presentation() = DescriptorRenderer.FQ_NAMES_IN_TYPES.render(this)
|
||||||
private fun JetType.presentation() = DescriptorRenderer.DEBUG_TEXT.renderType(this)
|
private fun JetType.presentation() = DescriptorRenderer.FQ_NAMES_IN_TYPES.renderType(this)
|
||||||
|
|
||||||
override fun update(e: AnActionEvent) {
|
override fun update(e: AnActionEvent) {
|
||||||
if (!KotlinInternalMode.enabled) {
|
if (!KotlinInternalMode.enabled) {
|
||||||
@@ -189,4 +188,29 @@ public class CheckPartialBodyResolveAction : AnAction() {
|
|||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO: currently copied from PartialBodyResolveFilter - not good
|
||||||
|
private fun isValueNeeded(expression: JetExpression): Boolean {
|
||||||
|
val parent = expression.getParent()
|
||||||
|
return when (parent) {
|
||||||
|
is JetBlockExpression -> expression == parent.lastStatement() && isValueNeeded(parent)
|
||||||
|
|
||||||
|
is JetContainerNode -> { //TODO - not quite correct
|
||||||
|
val pparent = parent.getParent() as? JetExpression
|
||||||
|
pparent != null && isValueNeeded(pparent)
|
||||||
|
}
|
||||||
|
|
||||||
|
is JetDeclarationWithBody -> {
|
||||||
|
if (expression == parent.getBodyExpression())
|
||||||
|
!parent.hasBlockBody() && !parent.hasDeclaredReturnType()
|
||||||
|
else
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
|
else -> true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun JetBlockExpression.lastStatement(): JetExpression?
|
||||||
|
= getLastChild()?.siblings(forward = false)?.firstIsInstanceOrNull<JetExpression>()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user