Skip to content

Commit

Permalink
Code improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
valentinkip committed Jul 28, 2015
1 parent a2b759e commit 29379c0
Show file tree
Hide file tree
Showing 4 changed files with 92 additions and 158 deletions.
Expand Up @@ -36,58 +36,38 @@ import org.jetbrains.kotlin.renderer.DescriptorRenderer
import org.jetbrains.kotlin.renderer.DescriptorRendererModifier
import org.jetbrains.kotlin.renderer.NameShortness
import org.jetbrains.kotlin.renderer.render
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
import javax.swing.Icon

public class DescriptorClassMember(private val myPsiElement: PsiElement, public val descriptor: DeclarationDescriptor) : MemberChooserObjectBase(DescriptorClassMember.getText(descriptor), DescriptorClassMember.getIcon(myPsiElement, descriptor)), ClassMemberWithElement {
public class DescriptorClassMember(
private val psiElement: PsiElement,
public val descriptor: DeclarationDescriptor
) : MemberChooserObjectBase(DescriptorClassMember.getText(descriptor), DescriptorClassMember.getIcon(psiElement, descriptor)), ClassMemberWithElement {

override fun getParentNodeDelegate(): MemberChooserObject {
val parent = descriptor.containingDeclaration
var declaration: PsiElement?
if (myPsiElement is JetDeclaration) {
// kotlin
declaration = PsiTreeUtil.getStubOrPsiParentOfType(myPsiElement, javaClass<JetNamedDeclaration>())
if (declaration == null) {
declaration = PsiTreeUtil.getStubOrPsiParentOfType(myPsiElement, javaClass<JetFile>())
}
}
else {
// java or bytecode
declaration = (myPsiElement as PsiMember).containingClass
}
assert(parent != null) { "$NO_PARENT_FOR$descriptor" }
assert(declaration != null) { "$NO_PARENT_FOR$myPsiElement" }
val parent = descriptor.containingDeclaration ?: error("No parent for $descriptor")

if (declaration is JetFile) {
return PsiElementMemberChooserObject(declaration, declaration.name)
val declaration = if (psiElement is JetDeclaration) { // kotlin
PsiTreeUtil.getStubOrPsiParentOfType(psiElement, javaClass<JetNamedDeclaration>())
?: PsiTreeUtil.getStubOrPsiParentOfType(psiElement, javaClass<JetFile>())
}
else { // java or compiled
(psiElement as PsiMember).containingClass
} ?: error("No parent for $psiElement")

return DescriptorClassMember(declaration!!, parent!!)
return when (declaration) {
is JetFile -> PsiElementMemberChooserObject(declaration, declaration.name)
else -> DescriptorClassMember(declaration, parent)
}
}

override fun equals(other: Any?): Boolean {
if (this === other) return true
if (other == null || javaClass != other.javaClass) return false

val that = other as DescriptorClassMember
override fun equals(other: Any?) = this === other || other is DescriptorClassMember && descriptor == other.descriptor

if (descriptor != that.descriptor) return false

return true
}

override fun hashCode(): Int {
return descriptor.hashCode()
}
override fun hashCode() = descriptor.hashCode()

override fun getElement(): PsiElement {
return myPsiElement
}
override fun getElement() = psiElement

companion object {

public val NO_PARENT_FOR: String = "No parent for "

private val MEMBER_RENDERER = DescriptorRenderer.withOptions {
withDefinedIn = false
modifiers = emptySet<DescriptorRendererModifier>()
Expand All @@ -96,30 +76,29 @@ public class DescriptorClassMember(private val myPsiElement: PsiElement, public
}

private fun getText(descriptor: DeclarationDescriptor): String {
if (descriptor is ClassDescriptor) {
return DescriptorUtils.getFqNameSafe(descriptor).render()
}
else {
return MEMBER_RENDERER.render(descriptor)
}
return if (descriptor is ClassDescriptor)
descriptor.fqNameSafe.render()
else
MEMBER_RENDERER.render(descriptor)
}

private fun getIcon(element: PsiElement, declarationDescriptor: DeclarationDescriptor): Icon {
private fun getIcon(element: PsiElement, descriptor: DeclarationDescriptor): Icon {
if (element.isValid) {
val isClass = element is PsiClass || element is JetClass
val flags = if (isClass) 0 else Iconable.ICON_FLAG_VISIBILITY
if (element is JetDeclaration) {
// kotlin declaration
// visibility and abstraction better detect by a descriptor
return JetDescriptorIconProvider.getIcon(declarationDescriptor, element, flags)
return JetDescriptorIconProvider.getIcon(descriptor, element, flags)
}
else {
// it is better to show java icons for java code
return element.getIcon(flags)
}
}

return JetDescriptorIconProvider.getIcon(declarationDescriptor, element, 0)
else {
return JetDescriptorIconProvider.getIcon(descriptor, element, 0)
}
}
}
}
Expand Up @@ -20,34 +20,19 @@ import com.intellij.codeInsight.intention.IntentionAction
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.idea.JetBundle
import org.jetbrains.kotlin.idea.core.overrideImplement.OverrideImplementMethodsHandler
import org.jetbrains.kotlin.resolve.OverrideResolver

public class ImplementMethodsHandler : OverrideImplementMethodsHandler(), IntentionAction {
override fun collectMethodsToGenerate(descriptor: ClassDescriptor): Set<CallableMemberDescriptor> {
return OverrideResolver.getMissingImplementations(descriptor)
}
override fun collectMethodsToGenerate(descriptor: ClassDescriptor) = OverrideResolver.getMissingImplementations(descriptor)

override fun getChooserTitle(): String {
return "Implement Members"
}
override fun getChooserTitle() = "Implement Members"

override fun getNoMethodsFoundHint(): String {
return "No methods to implement have been found"
}
override fun getNoMethodsFoundHint() = "No methods to implement have been found"

override fun getText(): String {
return JetBundle.message("implement.members")
}
override fun getText() = JetBundle.message("implement.members")
override fun getFamilyName() = JetBundle.message("implement.members")

override fun getFamilyName(): String {
return JetBundle.message("implement.members")
}

override fun isAvailable(project: Project, editor: Editor, file: PsiFile): Boolean {
return isValidFor(editor, file)
}
override fun isAvailable(project: Project, editor: Editor, file: PsiFile) = isValidFor(editor, file)
}

0 comments on commit 29379c0

Please sign in to comment.