KT-3000 "Specify Type Explicitly" action works wrong for Enum

#KT-3000 fixed
This commit is contained in:
Evgeny Gerashchenko
2012-10-29 21:17:59 +04:00
parent 4e05bee22a
commit c4bda6a260
4 changed files with 28 additions and 3 deletions
@@ -27,13 +27,12 @@ import com.intellij.psi.util.PsiTreeUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.JetNodeTypes;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor;
import org.jetbrains.jet.lang.descriptors.VariableDescriptor;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.diagnostics.Diagnostic;
import org.jetbrains.jet.lang.diagnostics.Errors;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.types.ErrorUtils;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.plugin.JetBundle;
@@ -177,6 +176,16 @@ public class SpecifyTypeExplicitlyAction extends PsiElementBaseIntentionAction {
return;
}
}
// For enum entry expression, we want type "MyEntry" instead of "MyEntry.<class-object>.ENTRY1"
ClassifierDescriptor typeClassifier = exprType.getConstructor().getDeclarationDescriptor();
assert typeClassifier != null;
if (DescriptorUtils.isEnumEntry(typeClassifier)) {
ClassDescriptor enumClass = (ClassDescriptor) typeClassifier.getContainingDeclaration().getContainingDeclaration();
assert enumClass != null;
exprType = enumClass.getDefaultType();
}
JetTypeReference typeReference = JetPsiFactory.createType(project, DescriptorRenderer.TEXT.renderType(exprType));
ASTNode colon = JetPsiFactory.createColonNode(project);
ASTNode anchorNode = anchor == null ? null : anchor.getNode().getTreeNext();
@@ -0,0 +1,6 @@
// "Specify type explicitly" "true"
enum class MyEnum {
E1 E2
}
val x: MyEnum = MyEnum.E1
@@ -0,0 +1,6 @@
// "Specify type explicitly" "true"
enum class MyEnum {
E1 E2
}
val x<caret> = MyEnum.E1
@@ -57,6 +57,10 @@ public class SpecifyTypeExplicitlyTest extends LightIntentionActionTestCase {
doTest();
}
public void testEnumType() {
doTest();
}
@Override
protected String getTestDataPath() {
return PluginTestCaseBase.getTestDataPathBase() + "/intentions/";