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-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-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)
- 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 KotlinMethodDescriptor methodDescriptor;
protected KotlinCallableParameterTableModel(KotlinMethodDescriptor methodDescriptor, PsiElement context, ColumnInfo... columnInfos) {
super(context, context, columnInfos);
protected KotlinCallableParameterTableModel(
KotlinMethodDescriptor methodDescriptor,
PsiElement typeContext,
PsiElement defaultValueContext,
ColumnInfo... columnInfos
) {
super(typeContext, defaultValueContext, columnInfos);
this.methodDescriptor = methodDescriptor;
project = context.getProject();
project = typeContext.getProject();
}
@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.KotlinMethodDescriptor.Kind
import org.jetbrains.kotlin.idea.refactoring.validateElement
import org.jetbrains.kotlin.psi.KtExpressionCodeFragment
import org.jetbrains.kotlin.psi.KtPsiFactory
import org.jetbrains.kotlin.psi.KtTypeCodeFragment
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.parents
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
import java.awt.BorderLayout
@@ -399,15 +398,29 @@ class KotlinChangeSignatureDialog(
companion object {
private fun createParametersInfoModel(descriptor: KotlinMethodDescriptor, defaultValueContext: PsiElement): KotlinCallableParameterTableModel {
val typeContext = getTypeCodeFragmentContext(defaultValueContext)
return when (descriptor.kind) {
KotlinMethodDescriptor.Kind.FUNCTION -> KotlinFunctionParameterTableModel(descriptor, defaultValueContext)
KotlinMethodDescriptor.Kind.PRIMARY_CONSTRUCTOR -> KotlinPrimaryConstructorParameterTableModel(descriptor, defaultValueContext)
KotlinMethodDescriptor.Kind.SECONDARY_CONSTRUCTOR -> KotlinSecondaryConstructorParameterTableModel(descriptor, defaultValueContext)
KotlinMethodDescriptor.Kind.FUNCTION -> KotlinFunctionParameterTableModel(descriptor, typeContext, defaultValueContext)
KotlinMethodDescriptor.Kind.PRIMARY_CONSTRUCTOR -> KotlinPrimaryConstructorParameterTableModel(descriptor, typeContext, 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) =
KtPsiFactory(project).createTypeCodeFragment(method.returnTypeInfo.render(), method.baseDeclaration)
KtPsiFactory(project).createTypeCodeFragment(method.returnTypeInfo.render(), getTypeCodeFragmentContext(method.baseDeclaration))
fun createRefactoringProcessorForSilentChangeSignature(project: Project,
commandName: String,
@@ -31,14 +31,15 @@ import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
public class KotlinFunctionParameterTableModel extends KotlinCallableParameterTableModel {
public KotlinFunctionParameterTableModel(KotlinMethodDescriptor methodDescriptor, PsiElement context) {
public KotlinFunctionParameterTableModel(KotlinMethodDescriptor methodDescriptor, PsiElement typeContext, PsiElement defaultValueContext) {
super(methodDescriptor,
context,
new NameColumn(context.getProject()),
new TypeColumn(context.getProject(), KotlinFileType.INSTANCE),
new DefaultValueColumn<KotlinParameterInfo, ParameterTableModelItemBase<KotlinParameterInfo>>(context.getProject(),
typeContext,
defaultValueContext,
new NameColumn(typeContext.getProject()),
new TypeColumn(typeContext.getProject(), KotlinFileType.INSTANCE),
new DefaultValueColumn<KotlinParameterInfo, ParameterTableModelItemBase<KotlinParameterInfo>>(typeContext.getProject(),
KotlinFileType.INSTANCE),
new ReceiverColumn(context.getProject(), methodDescriptor));
new ReceiverColumn(typeContext.getProject(), methodDescriptor));
}
@Override
@@ -32,13 +32,14 @@ import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
public class KotlinPrimaryConstructorParameterTableModel extends KotlinCallableParameterTableModel {
public KotlinPrimaryConstructorParameterTableModel(KotlinMethodDescriptor methodDescriptor, PsiElement context) {
public KotlinPrimaryConstructorParameterTableModel(KotlinMethodDescriptor methodDescriptor, PsiElement typeContext, PsiElement defaultValueContext) {
super(methodDescriptor,
context,
typeContext,
defaultValueContext,
new ValVarColumn(),
new NameColumn(context.getProject()),
new TypeColumn(context.getProject(), KotlinFileType.INSTANCE),
new DefaultValueColumn<KotlinParameterInfo, ParameterTableModelItemBase<KotlinParameterInfo>>(context.getProject(), KotlinFileType.INSTANCE));
new NameColumn(typeContext.getProject()),
new TypeColumn(typeContext.getProject(), KotlinFileType.INSTANCE),
new DefaultValueColumn<KotlinParameterInfo, ParameterTableModelItemBase<KotlinParameterInfo>>(typeContext.getProject(), KotlinFileType.INSTANCE));
}
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;
public class KotlinSecondaryConstructorParameterTableModel extends KotlinCallableParameterTableModel {
public KotlinSecondaryConstructorParameterTableModel(KotlinMethodDescriptor methodDescriptor, PsiElement context) {
public KotlinSecondaryConstructorParameterTableModel(KotlinMethodDescriptor methodDescriptor, PsiElement typeContext, PsiElement defaultValueContext) {
super(methodDescriptor,
context,
new NameColumn(context.getProject()),
new TypeColumn(context.getProject(), KotlinFileType.INSTANCE),
new DefaultValueColumn<KotlinParameterInfo, ParameterTableModelItemBase<KotlinParameterInfo>>(context.getProject(), KotlinFileType.INSTANCE));
typeContext,
defaultValueContext,
new NameColumn(typeContext.getProject()),
new TypeColumn(typeContext.getProject(), KotlinFileType.INSTANCE),
new DefaultValueColumn<KotlinParameterInfo, ParameterTableModelItemBase<KotlinParameterInfo>>(typeContext.getProject(), KotlinFileType.INSTANCE));
}
}