This commit is contained in:
Valentin Kipyatkov
2015-08-19 21:04:39 +03:00
parent ba33c834c1
commit 14763a7ffa
9 changed files with 44 additions and 44 deletions
@@ -30,7 +30,7 @@ import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.idea.completion.* import org.jetbrains.kotlin.idea.completion.*
import org.jetbrains.kotlin.idea.completion.handlers.KotlinFunctionInsertHandler import org.jetbrains.kotlin.idea.completion.handlers.KotlinFunctionInsertHandler
import org.jetbrains.kotlin.idea.core.overrideImplement.ImplementMethodsHandler import org.jetbrains.kotlin.idea.core.overrideImplement.ImplementMembersHandler
import org.jetbrains.kotlin.idea.core.psiClassToDescriptor import org.jetbrains.kotlin.idea.core.psiClassToDescriptor
import org.jetbrains.kotlin.idea.resolve.ResolutionFacade import org.jetbrains.kotlin.idea.resolve.ResolutionFacade
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
@@ -170,7 +170,7 @@ class TypeInstantiationItems(
shortenReferences(context, startOffset, startOffset + text.length()) shortenReferences(context, startOffset, startOffset + text.length())
ImplementMethodsHandler().invoke(context.getProject(), editor, context.getFile(), true) ImplementMembersHandler().invoke(context.getProject(), editor, context.getFile(), true)
} }
lookupElement = lookupElement.suppressAutoInsertion() lookupElement = lookupElement.suppressAutoInsertion()
lookupElement = lookupElement.assignSmartCompletionPriority(SmartCompletionItemPriority.ANONYMOUS_OBJECT) lookupElement = lookupElement.assignSmartCompletionPriority(SmartCompletionItemPriority.ANONYMOUS_OBJECT)
@@ -24,15 +24,15 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.idea.JetBundle import org.jetbrains.kotlin.idea.JetBundle
import org.jetbrains.kotlin.resolve.OverrideResolver import org.jetbrains.kotlin.resolve.OverrideResolver
public class ImplementMethodsHandler : OverrideImplementMethodsHandler(), IntentionAction { public class ImplementMembersHandler : OverrideImplementMembersHandler(), IntentionAction {
override fun collectMethodsToGenerate(descriptor: ClassDescriptor, project: Project): Collection<OverrideMemberChooserObject> { override fun collectMembersToGenerate(descriptor: ClassDescriptor, project: Project): Collection<OverrideMemberChooserObject> {
return OverrideResolver.getMissingImplementations(descriptor) return OverrideResolver.getMissingImplementations(descriptor)
.map { OverrideMemberChooserObject.create(project, it, it) } .map { OverrideMemberChooserObject.create(project, it, it) }
} }
override fun getChooserTitle() = "Implement Members" override fun getChooserTitle() = "Implement Members"
override fun getNoMethodsFoundHint() = "No methods to implement have been found" override fun getNoMembersFoundHint() = "No members to implement have been found"
override fun getText() = JetBundle.message("implement.members") override fun getText() = JetBundle.message("implement.members")
override fun getFamilyName() = JetBundle.message("implement.members") override fun getFamilyName() = JetBundle.message("implement.members")
@@ -37,14 +37,14 @@ import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
import org.jetbrains.kotlin.renderer.* import org.jetbrains.kotlin.renderer.*
import java.util.ArrayList import java.util.ArrayList
public abstract class OverrideImplementMethodsHandler : LanguageCodeInsightActionHandler { public abstract class OverrideImplementMembersHandler : LanguageCodeInsightActionHandler {
public fun collectMethodsToGenerate(classOrObject: JetClassOrObject): Collection<OverrideMemberChooserObject> { public fun collectMembersToGenerate(classOrObject: JetClassOrObject): Collection<OverrideMemberChooserObject> {
val descriptor = classOrObject.resolveToDescriptor() as? ClassDescriptor ?: return emptySet() val descriptor = classOrObject.resolveToDescriptor() as? ClassDescriptor ?: return emptySet()
return collectMethodsToGenerate(descriptor, classOrObject.project) return collectMembersToGenerate(descriptor, classOrObject.project)
} }
protected abstract fun collectMethodsToGenerate(descriptor: ClassDescriptor, project: Project): Collection<OverrideMemberChooserObject> protected abstract fun collectMembersToGenerate(descriptor: ClassDescriptor, project: Project): Collection<OverrideMemberChooserObject>
private fun showOverrideImplementChooser(project: Project, members: Array<OverrideMemberChooserObject>): MemberChooser<OverrideMemberChooserObject>? { private fun showOverrideImplementChooser(project: Project, members: Array<OverrideMemberChooserObject>): MemberChooser<OverrideMemberChooserObject>? {
val chooser = MemberChooser(members, true, true, project) val chooser = MemberChooser(members, true, true, project)
@@ -63,15 +63,15 @@ public abstract class OverrideImplementMethodsHandler : LanguageCodeInsightActio
return classOrObject != null return classOrObject != null
} }
protected abstract fun getNoMethodsFoundHint(): String protected abstract fun getNoMembersFoundHint(): String
public fun invoke(project: Project, editor: Editor, file: PsiFile, implementAll: Boolean) { public fun invoke(project: Project, editor: Editor, file: PsiFile, implementAll: Boolean) {
val elementAtCaret = file.findElementAt(editor.caretModel.offset) val elementAtCaret = file.findElementAt(editor.caretModel.offset)
val classOrObject = elementAtCaret?.getNonStrictParentOfType<JetClassOrObject>()!! val classOrObject = elementAtCaret?.getNonStrictParentOfType<JetClassOrObject>()!!
val members = collectMethodsToGenerate(classOrObject) val members = collectMembersToGenerate(classOrObject)
if (members.isEmpty() && !implementAll) { if (members.isEmpty() && !implementAll) {
HintManager.getInstance().showErrorHint(editor, getNoMethodsFoundHint()) HintManager.getInstance().showErrorHint(editor, getNoMembersFoundHint())
return return
} }
@@ -21,8 +21,8 @@ import org.jetbrains.kotlin.descriptors.*
import java.util.ArrayList import java.util.ArrayList
import java.util.LinkedHashMap import java.util.LinkedHashMap
public class OverrideMethodsHandler : OverrideImplementMethodsHandler() { public class OverrideMembersHandler : OverrideImplementMembersHandler() {
override fun collectMethodsToGenerate(descriptor: ClassDescriptor, project: Project): Collection<OverrideMemberChooserObject> { override fun collectMembersToGenerate(descriptor: ClassDescriptor, project: Project): Collection<OverrideMemberChooserObject> {
val result = ArrayList<OverrideMemberChooserObject>() val result = ArrayList<OverrideMemberChooserObject>()
for (member in descriptor.unsubstitutedMemberScope.getAllDescriptors()) { for (member in descriptor.unsubstitutedMemberScope.getAllDescriptors()) {
if (member is CallableMemberDescriptor if (member is CallableMemberDescriptor
@@ -74,5 +74,5 @@ public class OverrideMethodsHandler : OverrideImplementMethodsHandler() {
override fun getChooserTitle() = "Override Members" override fun getChooserTitle() = "Override Members"
override fun getNoMethodsFoundHint() = "No methods to override have been found" override fun getNoMembersFoundHint() = "No members to override have been found"
} }
+2 -2
View File
@@ -447,8 +447,8 @@
<debugger.syntheticProvider implementation="org.jetbrains.kotlin.idea.debugger.filter.KotlinSyntheticTypeComponentProvider"/> <debugger.syntheticProvider implementation="org.jetbrains.kotlin.idea.debugger.filter.KotlinSyntheticTypeComponentProvider"/>
<debugger.javaBreakpointHandlerFactory implementation="org.jetbrains.kotlin.idea.debugger.breakpoints.KotlinBreakpointHandlerFactory"/> <debugger.javaBreakpointHandlerFactory implementation="org.jetbrains.kotlin.idea.debugger.breakpoints.KotlinBreakpointHandlerFactory"/>
<codeInsight.implementMethod language="jet" implementationClass="org.jetbrains.kotlin.idea.core.overrideImplement.ImplementMethodsHandler"/> <codeInsight.implementMethod language="jet" implementationClass="org.jetbrains.kotlin.idea.core.overrideImplement.ImplementMembersHandler"/>
<codeInsight.overrideMethod language="jet" implementationClass="org.jetbrains.kotlin.idea.core.overrideImplement.OverrideMethodsHandler"/> <codeInsight.overrideMethod language="jet" implementationClass="org.jetbrains.kotlin.idea.core.overrideImplement.OverrideMembersHandler"/>
<framework.type implementation="org.jetbrains.kotlin.idea.framework.JavaFrameworkType"/> <framework.type implementation="org.jetbrains.kotlin.idea.framework.JavaFrameworkType"/>
<framework.type implementation="org.jetbrains.kotlin.idea.framework.JSFrameworkType"/> <framework.type implementation="org.jetbrains.kotlin.idea.framework.JSFrameworkType"/>
@@ -31,7 +31,7 @@ import org.jetbrains.kotlin.descriptors.ClassKind;
import org.jetbrains.kotlin.descriptors.ConstructorDescriptor; import org.jetbrains.kotlin.descriptors.ConstructorDescriptor;
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; import org.jetbrains.kotlin.descriptors.DeclarationDescriptor;
import org.jetbrains.kotlin.idea.caches.resolve.ResolvePackage; import org.jetbrains.kotlin.idea.caches.resolve.ResolvePackage;
import org.jetbrains.kotlin.idea.core.overrideImplement.ImplementMethodsHandler; import org.jetbrains.kotlin.idea.core.overrideImplement.ImplementMembersHandler;
import org.jetbrains.kotlin.psi.JetReferenceExpression; import org.jetbrains.kotlin.psi.JetReferenceExpression;
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;
@@ -89,7 +89,7 @@ class AnonymousTemplateEditingListener extends TemplateEditingAdapter {
} }
} }
new ImplementMethodsHandler().invoke(psiFile.getProject(), editor, psiFile, true); new ImplementMembersHandler().invoke(psiFile.getProject(), editor, psiFile, true);
} }
} }
@@ -19,7 +19,7 @@ package org.jetbrains.kotlin.idea.quickfix
import com.intellij.codeInsight.intention.IntentionAction import com.intellij.codeInsight.intention.IntentionAction
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory import org.jetbrains.kotlin.diagnostics.DiagnosticFactory
import org.jetbrains.kotlin.diagnostics.Errors.* import org.jetbrains.kotlin.diagnostics.Errors.*
import org.jetbrains.kotlin.idea.core.overrideImplement.ImplementMethodsHandler import org.jetbrains.kotlin.idea.core.overrideImplement.ImplementMembersHandler
import org.jetbrains.kotlin.idea.inspections.AddReflectionQuickFix import org.jetbrains.kotlin.idea.inspections.AddReflectionQuickFix
import org.jetbrains.kotlin.idea.quickfix.createFromUsage.createCallable.* import org.jetbrains.kotlin.idea.quickfix.createFromUsage.createCallable.*
import org.jetbrains.kotlin.idea.quickfix.createFromUsage.createClass.CreateClassFromCallWithConstructorCalleeActionFactory import org.jetbrains.kotlin.idea.quickfix.createFromUsage.createClass.CreateClassFromCallWithConstructorCalleeActionFactory
@@ -144,7 +144,7 @@ public class QuickFixRegistrar : QuickFixContributor {
USELESS_NULLABLE_CHECK.registerFactory(RemoveNullableFix.createFactory(RemoveNullableFix.NullableKind.USELESS)) USELESS_NULLABLE_CHECK.registerFactory(RemoveNullableFix.createFactory(RemoveNullableFix.NullableKind.USELESS))
val implementMethodsHandler = ImplementMethodsHandler() val implementMethodsHandler = ImplementMembersHandler()
ABSTRACT_MEMBER_NOT_IMPLEMENTED.registerActions(implementMethodsHandler) ABSTRACT_MEMBER_NOT_IMPLEMENTED.registerActions(implementMethodsHandler)
MANY_IMPL_MEMBER_NOT_IMPLEMENTED.registerActions(implementMethodsHandler) MANY_IMPL_MEMBER_NOT_IMPLEMENTED.registerActions(implementMethodsHandler)
@@ -28,10 +28,10 @@ import com.intellij.psi.util.PsiTreeUtil
import com.intellij.testFramework.LightProjectDescriptor import com.intellij.testFramework.LightProjectDescriptor
import com.intellij.util.SmartList import com.intellij.util.SmartList
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.idea.core.overrideImplement.ImplementMethodsHandler import org.jetbrains.kotlin.idea.core.overrideImplement.ImplementMembersHandler
import org.jetbrains.kotlin.idea.core.overrideImplement.OverrideImplementMethodsHandler import org.jetbrains.kotlin.idea.core.overrideImplement.OverrideImplementMembersHandler
import org.jetbrains.kotlin.idea.core.overrideImplement.OverrideMemberChooserObject import org.jetbrains.kotlin.idea.core.overrideImplement.OverrideMemberChooserObject
import org.jetbrains.kotlin.idea.core.overrideImplement.OverrideMethodsHandler import org.jetbrains.kotlin.idea.core.overrideImplement.OverrideMembersHandler
import org.jetbrains.kotlin.idea.test.JetLightCodeInsightFixtureTestCase import org.jetbrains.kotlin.idea.test.JetLightCodeInsightFixtureTestCase
import org.jetbrains.kotlin.idea.test.JetLightProjectDescriptor import org.jetbrains.kotlin.idea.test.JetLightProjectDescriptor
import org.jetbrains.kotlin.idea.util.application.executeWriteCommand import org.jetbrains.kotlin.idea.util.application.executeWriteCommand
@@ -47,31 +47,31 @@ public abstract class AbstractOverrideImplementTest : JetLightCodeInsightFixture
override fun getProjectDescriptor(): LightProjectDescriptor = JetLightProjectDescriptor.INSTANCE override fun getProjectDescriptor(): LightProjectDescriptor = JetLightProjectDescriptor.INSTANCE
protected fun doImplementFileTest() { protected fun doImplementFileTest() {
doFileTest(ImplementMethodsHandler()) doFileTest(ImplementMembersHandler())
} }
protected fun doOverrideFileTest() { protected fun doOverrideFileTest() {
doFileTest(OverrideMethodsHandler()) doFileTest(OverrideMembersHandler())
} }
protected fun doMultiImplementFileTest() { protected fun doMultiImplementFileTest() {
doMultiFileTest(ImplementMethodsHandler()) doMultiFileTest(ImplementMembersHandler())
} }
protected fun doMultiOverrideFileTest() { protected fun doMultiOverrideFileTest() {
doMultiFileTest(OverrideMethodsHandler()) doMultiFileTest(OverrideMembersHandler())
} }
protected fun doImplementDirectoryTest() { protected fun doImplementDirectoryTest() {
doDirectoryTest(ImplementMethodsHandler()) doDirectoryTest(ImplementMembersHandler())
} }
protected fun doOverrideDirectoryTest(memberToImplement: String?) { protected fun doOverrideDirectoryTest(memberToImplement: String?) {
doDirectoryTest(OverrideMethodsHandler(), memberToImplement) doDirectoryTest(OverrideMembersHandler(), memberToImplement)
} }
protected fun doMultiOverrideDirectoryTest() { protected fun doMultiOverrideDirectoryTest() {
doMultiDirectoryTest(OverrideMethodsHandler()) doMultiDirectoryTest(OverrideMembersHandler())
} }
protected fun doImplementJavaDirectoryTest(className: String, methodName: String) { protected fun doImplementJavaDirectoryTest(className: String, methodName: String) {
@@ -91,42 +91,42 @@ public abstract class AbstractOverrideImplementTest : JetLightCodeInsightFixture
myFixture.checkResultByFile(getTestName(true) + "/foo/JavaClass.java.after") myFixture.checkResultByFile(getTestName(true) + "/foo/JavaClass.java.after")
} }
private fun doFileTest(handler: OverrideImplementMethodsHandler) { private fun doFileTest(handler: OverrideImplementMembersHandler) {
myFixture.configureByFile(getTestName(true) + ".kt") myFixture.configureByFile(getTestName(true) + ".kt")
doOverrideImplement(handler, null) doOverrideImplement(handler, null)
checkResultByFile(getTestName(true) + ".kt.after") checkResultByFile(getTestName(true) + ".kt.after")
} }
private fun doMultiFileTest(handler: OverrideImplementMethodsHandler) { private fun doMultiFileTest(handler: OverrideImplementMembersHandler) {
myFixture.configureByFile(getTestName(true) + ".kt") myFixture.configureByFile(getTestName(true) + ".kt")
doMultiOverrideImplement(handler) doMultiOverrideImplement(handler)
checkResultByFile(getTestName(true) + ".kt.after") checkResultByFile(getTestName(true) + ".kt.after")
} }
protected fun doDirectoryTest(handler: OverrideImplementMethodsHandler) { protected fun doDirectoryTest(handler: OverrideImplementMembersHandler) {
doDirectoryTest(handler, null) doDirectoryTest(handler, null)
} }
private fun doDirectoryTest(handler: OverrideImplementMethodsHandler, memberToOverride: String?) { private fun doDirectoryTest(handler: OverrideImplementMembersHandler, memberToOverride: String?) {
myFixture.copyDirectoryToProject(getTestName(true), "") myFixture.copyDirectoryToProject(getTestName(true), "")
myFixture.configureFromTempProjectFile("foo/Impl.kt") myFixture.configureFromTempProjectFile("foo/Impl.kt")
doOverrideImplement(handler, memberToOverride) doOverrideImplement(handler, memberToOverride)
checkResultByFile(getTestName(true) + "/foo/Impl.kt.after") checkResultByFile(getTestName(true) + "/foo/Impl.kt.after")
} }
private fun doMultiDirectoryTest(handler: OverrideImplementMethodsHandler) { private fun doMultiDirectoryTest(handler: OverrideImplementMembersHandler) {
myFixture.copyDirectoryToProject(getTestName(true), "") myFixture.copyDirectoryToProject(getTestName(true), "")
myFixture.configureFromTempProjectFile("foo/Impl.kt") myFixture.configureFromTempProjectFile("foo/Impl.kt")
doMultiOverrideImplement(handler) doMultiOverrideImplement(handler)
checkResultByFile(getTestName(true) + "/foo/Impl.kt.after") checkResultByFile(getTestName(true) + "/foo/Impl.kt.after")
} }
private fun doOverrideImplement(handler: OverrideImplementMethodsHandler, memberToOverride: String?) { private fun doOverrideImplement(handler: OverrideImplementMembersHandler, memberToOverride: String?) {
val elementAtCaret = myFixture.file.findElementAt(myFixture.editor.caretModel.offset) val elementAtCaret = myFixture.file.findElementAt(myFixture.editor.caretModel.offset)
val classOrObject = PsiTreeUtil.getParentOfType(elementAtCaret, javaClass<JetClassOrObject>()) val classOrObject = PsiTreeUtil.getParentOfType(elementAtCaret, javaClass<JetClassOrObject>())
?: error("Caret should be inside class or object") ?: error("Caret should be inside class or object")
val chooserObjects = handler.collectMethodsToGenerate(classOrObject) val chooserObjects = handler.collectMembersToGenerate(classOrObject)
val singleToOverride = if (memberToOverride == null) { val singleToOverride = if (memberToOverride == null) {
val filtered = chooserObjects.filter { it.descriptor.containingDeclaration != KotlinBuiltIns.getInstance().any } val filtered = chooserObjects.filter { it.descriptor.containingDeclaration != KotlinBuiltIns.getInstance().any }
@@ -152,12 +152,12 @@ public abstract class AbstractOverrideImplementTest : JetLightCodeInsightFixture
performGenerateCommand(classOrObject, listOf(singleToOverride)) performGenerateCommand(classOrObject, listOf(singleToOverride))
} }
private fun doMultiOverrideImplement(handler: OverrideImplementMethodsHandler) { private fun doMultiOverrideImplement(handler: OverrideImplementMembersHandler) {
val elementAtCaret = myFixture.file.findElementAt(myFixture.editor.caretModel.offset) val elementAtCaret = myFixture.file.findElementAt(myFixture.editor.caretModel.offset)
val classOrObject = PsiTreeUtil.getParentOfType(elementAtCaret, javaClass<JetClassOrObject>()) val classOrObject = PsiTreeUtil.getParentOfType(elementAtCaret, javaClass<JetClassOrObject>())
?: error("Caret should be inside class or object") ?: error("Caret should be inside class or object")
val chooserObjects = handler.collectMethodsToGenerate(classOrObject).sortBy { it.descriptor.name.asString() + " in " + it.immediateSuper.containingDeclaration.name.asString() } val chooserObjects = handler.collectMembersToGenerate(classOrObject).sortBy { it.descriptor.name.asString() + " in " + it.immediateSuper.containingDeclaration.name.asString() }
performGenerateCommand(classOrObject, chooserObjects) performGenerateCommand(classOrObject, chooserObjects)
} }
@@ -178,7 +178,7 @@ public abstract class AbstractOverrideImplementTest : JetLightCodeInsightFixture
selectedElements: List<OverrideMemberChooserObject>) { selectedElements: List<OverrideMemberChooserObject>) {
try { try {
myFixture.project.executeWriteCommand("") { myFixture.project.executeWriteCommand("") {
OverrideImplementMethodsHandler.generateMethods(myFixture.editor, classOrObject, selectedElements) OverrideImplementMembersHandler.generateMethods(myFixture.editor, classOrObject, selectedElements)
} }
} }
catch (throwable: Throwable) { catch (throwable: Throwable) {
@@ -16,7 +16,7 @@
package org.jetbrains.kotlin.idea.codeInsight; package org.jetbrains.kotlin.idea.codeInsight;
import org.jetbrains.kotlin.idea.core.overrideImplement.OverrideMethodsHandler; import org.jetbrains.kotlin.idea.core.overrideImplement.OverrideMembersHandler;
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase; import org.jetbrains.kotlin.idea.test.PluginTestCaseBase;
public final class OverrideImplementTest extends AbstractOverrideImplementTest { public final class OverrideImplementTest extends AbstractOverrideImplementTest {
@@ -180,11 +180,11 @@ public final class OverrideImplementTest extends AbstractOverrideImplementTest {
} }
public void testSameTypeName() { public void testSameTypeName() {
doDirectoryTest(new OverrideMethodsHandler()); doDirectoryTest(new OverrideMembersHandler());
} }
public void testPropagationKJK() { public void testPropagationKJK() {
doDirectoryTest(new OverrideMethodsHandler()); doDirectoryTest(new OverrideMembersHandler());
} }
public void testMultipleSupers() { public void testMultipleSupers() {