From c4bda6a2606ccb51d625ec907fc6491b5eb8d7c7 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Mon, 29 Oct 2012 21:17:59 +0400 Subject: [PATCH] KT-3000 "Specify Type Explicitly" action works wrong for Enum #KT-3000 fixed --- .../intentions/SpecifyTypeExplicitlyAction.java | 15 ++++++++++++--- .../intentions/specifyType/afterEnumType.kt | 6 ++++++ .../intentions/specifyType/beforeEnumType.kt | 6 ++++++ .../intentions/SpecifyTypeExplicitlyTest.java | 4 ++++ 4 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 idea/testData/intentions/specifyType/afterEnumType.kt create mode 100644 idea/testData/intentions/specifyType/beforeEnumType.kt diff --git a/idea/src/org/jetbrains/jet/plugin/intentions/SpecifyTypeExplicitlyAction.java b/idea/src/org/jetbrains/jet/plugin/intentions/SpecifyTypeExplicitlyAction.java index 5df8cbf580a..76cfa1fa137 100644 --- a/idea/src/org/jetbrains/jet/plugin/intentions/SpecifyTypeExplicitlyAction.java +++ b/idea/src/org/jetbrains/jet/plugin/intentions/SpecifyTypeExplicitlyAction.java @@ -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..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(); diff --git a/idea/testData/intentions/specifyType/afterEnumType.kt b/idea/testData/intentions/specifyType/afterEnumType.kt new file mode 100644 index 00000000000..de155fdbe75 --- /dev/null +++ b/idea/testData/intentions/specifyType/afterEnumType.kt @@ -0,0 +1,6 @@ +// "Specify type explicitly" "true" +enum class MyEnum { + E1 E2 +} + +val x: MyEnum = MyEnum.E1 \ No newline at end of file diff --git a/idea/testData/intentions/specifyType/beforeEnumType.kt b/idea/testData/intentions/specifyType/beforeEnumType.kt new file mode 100644 index 00000000000..c5d6cb246b5 --- /dev/null +++ b/idea/testData/intentions/specifyType/beforeEnumType.kt @@ -0,0 +1,6 @@ +// "Specify type explicitly" "true" +enum class MyEnum { + E1 E2 +} + +val x = MyEnum.E1 \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/intentions/SpecifyTypeExplicitlyTest.java b/idea/tests/org/jetbrains/jet/plugin/intentions/SpecifyTypeExplicitlyTest.java index 9117c5393bf..9434c3137b6 100644 --- a/idea/tests/org/jetbrains/jet/plugin/intentions/SpecifyTypeExplicitlyTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/intentions/SpecifyTypeExplicitlyTest.java @@ -57,6 +57,10 @@ public class SpecifyTypeExplicitlyTest extends LightIntentionActionTestCase { doTest(); } + public void testEnumType() { + doTest(); + } + @Override protected String getTestDataPath() { return PluginTestCaseBase.getTestDataPathBase() + "/intentions/";