Change Signature: Fix context element for type code fragments to avoid bogus "Type can not be resolved" warnings

#KT-11862 Fixed
This commit is contained in:
Alexey Sedunov
2016-04-26 18:04:54 +03:00
parent 3048c293d0
commit 9858b178c0
6 changed files with 48 additions and 26 deletions
+1
View File
@@ -215,6 +215,7 @@ Issues fixed:
- [KT-11720](https://youtrack.jetbrains.com/issue/KT-11720) Fixed renaming of Kotlin beans through SpEL references - [KT-11720](https://youtrack.jetbrains.com/issue/KT-11720) Fixed renaming of Kotlin beans through SpEL references
- [KT-11719](https://youtrack.jetbrains.com/issue/KT-11719) Fixed renaming of Kotlin parameters references in XML files - [KT-11719](https://youtrack.jetbrains.com/issue/KT-11719) Fixed renaming of Kotlin parameters references in XML files
- [KT-11736](https://youtrack.jetbrains.com/issue/KT-11736) Fixed searching of Java usages for @JvmStatic properties and @JvmStatic @JvmOverloads functions - [KT-11736](https://youtrack.jetbrains.com/issue/KT-11736) Fixed searching of Java usages for @JvmStatic properties and @JvmStatic @JvmOverloads functions
- [KT-11862](https://youtrack.jetbrains.com/issue/KT-11862) Fixed bogus warnings about unresolved types in the Change Signature dialog
- Fix several issues leading to exceptions: [KT-11579](https://youtrack.jetbrains.com/issue/KT-11579), [KT-11580](https://youtrack.jetbrains.com/issue/KT-11580), [KT-11777](https://youtrack.jetbrains.com/issue/KT-11777), [KT-11868](https://youtrack.jetbrains.com/issue/KT-11868), [KT-11845](https://youtrack.jetbrains.com/issue/KT-11845) - Fix several issues leading to exceptions: [KT-11579](https://youtrack.jetbrains.com/issue/KT-11579), [KT-11580](https://youtrack.jetbrains.com/issue/KT-11580), [KT-11777](https://youtrack.jetbrains.com/issue/KT-11777), [KT-11868](https://youtrack.jetbrains.com/issue/KT-11868), [KT-11845](https://youtrack.jetbrains.com/issue/KT-11845)
- Fixed NoSuchFieldException in Kotlin module settings on IDEA Ultimate - Fixed NoSuchFieldException in Kotlin module settings on IDEA Ultimate
@@ -32,10 +32,15 @@ public abstract class KotlinCallableParameterTableModel extends ParameterTableMo
private final Project project; private final Project project;
private final KotlinMethodDescriptor methodDescriptor; private final KotlinMethodDescriptor methodDescriptor;
protected KotlinCallableParameterTableModel(KotlinMethodDescriptor methodDescriptor, PsiElement context, ColumnInfo... columnInfos) { protected KotlinCallableParameterTableModel(
super(context, context, columnInfos); KotlinMethodDescriptor methodDescriptor,
PsiElement typeContext,
PsiElement defaultValueContext,
ColumnInfo... columnInfos
) {
super(typeContext, defaultValueContext, columnInfos);
this.methodDescriptor = methodDescriptor; this.methodDescriptor = methodDescriptor;
project = context.getProject(); project = typeContext.getProject();
} }
@Nullable @Nullable
@@ -52,9 +52,8 @@ import org.jetbrains.kotlin.idea.refactoring.KotlinRefactoringBundle
import org.jetbrains.kotlin.idea.refactoring.changeSignature.* import org.jetbrains.kotlin.idea.refactoring.changeSignature.*
import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinMethodDescriptor.Kind import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinMethodDescriptor.Kind
import org.jetbrains.kotlin.idea.refactoring.validateElement import org.jetbrains.kotlin.idea.refactoring.validateElement
import org.jetbrains.kotlin.psi.KtExpressionCodeFragment import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.KtPsiFactory import org.jetbrains.kotlin.psi.psiUtil.parents
import org.jetbrains.kotlin.psi.KtTypeCodeFragment
import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
import java.awt.BorderLayout import java.awt.BorderLayout
@@ -399,15 +398,29 @@ class KotlinChangeSignatureDialog(
companion object { companion object {
private fun createParametersInfoModel(descriptor: KotlinMethodDescriptor, defaultValueContext: PsiElement): KotlinCallableParameterTableModel { private fun createParametersInfoModel(descriptor: KotlinMethodDescriptor, defaultValueContext: PsiElement): KotlinCallableParameterTableModel {
val typeContext = getTypeCodeFragmentContext(defaultValueContext)
return when (descriptor.kind) { return when (descriptor.kind) {
KotlinMethodDescriptor.Kind.FUNCTION -> KotlinFunctionParameterTableModel(descriptor, defaultValueContext) KotlinMethodDescriptor.Kind.FUNCTION -> KotlinFunctionParameterTableModel(descriptor, typeContext, defaultValueContext)
KotlinMethodDescriptor.Kind.PRIMARY_CONSTRUCTOR -> KotlinPrimaryConstructorParameterTableModel(descriptor, defaultValueContext) KotlinMethodDescriptor.Kind.PRIMARY_CONSTRUCTOR -> KotlinPrimaryConstructorParameterTableModel(descriptor, typeContext, defaultValueContext)
KotlinMethodDescriptor.Kind.SECONDARY_CONSTRUCTOR -> KotlinSecondaryConstructorParameterTableModel(descriptor, defaultValueContext) KotlinMethodDescriptor.Kind.SECONDARY_CONSTRUCTOR -> KotlinSecondaryConstructorParameterTableModel(descriptor, typeContext, defaultValueContext)
} }
} }
private fun getTypeCodeFragmentContext(startFrom: PsiElement): KtElement {
return startFrom.parents.mapNotNull {
when (it) {
is KtNamedFunction -> it.bodyExpression
is KtPropertyAccessor -> it.bodyExpression
is KtConstructor<*> -> it
is KtClassOrObject -> it
is KtFile -> it
else -> null
}
}.first()
}
private fun createReturnTypeCodeFragment(project: Project, method: KotlinMethodDescriptor) = private fun createReturnTypeCodeFragment(project: Project, method: KotlinMethodDescriptor) =
KtPsiFactory(project).createTypeCodeFragment(method.returnTypeInfo.render(), method.baseDeclaration) KtPsiFactory(project).createTypeCodeFragment(method.returnTypeInfo.render(), getTypeCodeFragmentContext(method.baseDeclaration))
fun createRefactoringProcessorForSilentChangeSignature(project: Project, fun createRefactoringProcessorForSilentChangeSignature(project: Project,
commandName: String, commandName: String,
@@ -31,14 +31,15 @@ import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer; import javax.swing.table.TableCellRenderer;
public class KotlinFunctionParameterTableModel extends KotlinCallableParameterTableModel { public class KotlinFunctionParameterTableModel extends KotlinCallableParameterTableModel {
public KotlinFunctionParameterTableModel(KotlinMethodDescriptor methodDescriptor, PsiElement context) { public KotlinFunctionParameterTableModel(KotlinMethodDescriptor methodDescriptor, PsiElement typeContext, PsiElement defaultValueContext) {
super(methodDescriptor, super(methodDescriptor,
context, typeContext,
new NameColumn(context.getProject()), defaultValueContext,
new TypeColumn(context.getProject(), KotlinFileType.INSTANCE), new NameColumn(typeContext.getProject()),
new DefaultValueColumn<KotlinParameterInfo, ParameterTableModelItemBase<KotlinParameterInfo>>(context.getProject(), new TypeColumn(typeContext.getProject(), KotlinFileType.INSTANCE),
new DefaultValueColumn<KotlinParameterInfo, ParameterTableModelItemBase<KotlinParameterInfo>>(typeContext.getProject(),
KotlinFileType.INSTANCE), KotlinFileType.INSTANCE),
new ReceiverColumn(context.getProject(), methodDescriptor)); new ReceiverColumn(typeContext.getProject(), methodDescriptor));
} }
@Override @Override
@@ -32,13 +32,14 @@ import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer; import javax.swing.table.TableCellRenderer;
public class KotlinPrimaryConstructorParameterTableModel extends KotlinCallableParameterTableModel { public class KotlinPrimaryConstructorParameterTableModel extends KotlinCallableParameterTableModel {
public KotlinPrimaryConstructorParameterTableModel(KotlinMethodDescriptor methodDescriptor, PsiElement context) { public KotlinPrimaryConstructorParameterTableModel(KotlinMethodDescriptor methodDescriptor, PsiElement typeContext, PsiElement defaultValueContext) {
super(methodDescriptor, super(methodDescriptor,
context, typeContext,
defaultValueContext,
new ValVarColumn(), new ValVarColumn(),
new NameColumn(context.getProject()), new NameColumn(typeContext.getProject()),
new TypeColumn(context.getProject(), KotlinFileType.INSTANCE), new TypeColumn(typeContext.getProject(), KotlinFileType.INSTANCE),
new DefaultValueColumn<KotlinParameterInfo, ParameterTableModelItemBase<KotlinParameterInfo>>(context.getProject(), KotlinFileType.INSTANCE)); new DefaultValueColumn<KotlinParameterInfo, ParameterTableModelItemBase<KotlinParameterInfo>>(typeContext.getProject(), KotlinFileType.INSTANCE));
} }
public static boolean isValVarColumn(ColumnInfo column) { public static boolean isValVarColumn(ColumnInfo column) {
@@ -23,11 +23,12 @@ import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinMethodDescrip
import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinParameterInfo; import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinParameterInfo;
public class KotlinSecondaryConstructorParameterTableModel extends KotlinCallableParameterTableModel { public class KotlinSecondaryConstructorParameterTableModel extends KotlinCallableParameterTableModel {
public KotlinSecondaryConstructorParameterTableModel(KotlinMethodDescriptor methodDescriptor, PsiElement context) { public KotlinSecondaryConstructorParameterTableModel(KotlinMethodDescriptor methodDescriptor, PsiElement typeContext, PsiElement defaultValueContext) {
super(methodDescriptor, super(methodDescriptor,
context, typeContext,
new NameColumn(context.getProject()), defaultValueContext,
new TypeColumn(context.getProject(), KotlinFileType.INSTANCE), new NameColumn(typeContext.getProject()),
new DefaultValueColumn<KotlinParameterInfo, ParameterTableModelItemBase<KotlinParameterInfo>>(context.getProject(), KotlinFileType.INSTANCE)); new TypeColumn(typeContext.getProject(), KotlinFileType.INSTANCE),
new DefaultValueColumn<KotlinParameterInfo, ParameterTableModelItemBase<KotlinParameterInfo>>(typeContext.getProject(), KotlinFileType.INSTANCE));
} }
} }