From da263ce090e43081d1efc3a9973312f4d51d76af Mon Sep 17 00:00:00 2001 From: Natalia Ukhorskaya Date: Tue, 9 Jun 2015 11:23:48 +0300 Subject: [PATCH] Show all kotlin properties in 'Add field watchpoint' dialog --- .../codeInsight/DescriptorClassMember.java | 11 +++++ .../dialog/AddFieldBreakpointDialog.java | 31 ++++++------- .../dialog/fieldBreakpointDialogUtil.kt | 46 +++++++++++++++++++ 3 files changed, 71 insertions(+), 17 deletions(-) create mode 100644 idea/src/org/jetbrains/kotlin/idea/debugger/breakpoints/dialog/fieldBreakpointDialogUtil.kt diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/codeInsight/DescriptorClassMember.java b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/codeInsight/DescriptorClassMember.java index bdffb75f48d..11331a8cdf4 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/codeInsight/DescriptorClassMember.java +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/codeInsight/DescriptorClassMember.java @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.idea.core.codeInsight; import com.intellij.codeInsight.generation.ClassMemberWithElement; import com.intellij.codeInsight.generation.MemberChooserObject; import com.intellij.codeInsight.generation.MemberChooserObjectBase; +import com.intellij.codeInsight.generation.PsiElementMemberChooserObject; import com.intellij.openapi.util.Iconable; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; @@ -32,6 +33,7 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; import org.jetbrains.kotlin.idea.JetDescriptorIconProvider; import org.jetbrains.kotlin.psi.JetClass; import org.jetbrains.kotlin.psi.JetDeclaration; +import org.jetbrains.kotlin.psi.JetFile; import org.jetbrains.kotlin.psi.JetNamedDeclaration; import org.jetbrains.kotlin.renderer.*; import org.jetbrains.kotlin.resolve.DescriptorUtils; @@ -99,6 +101,9 @@ public class DescriptorClassMember extends MemberChooserObjectBase implements Cl if (myPsiElement instanceof JetDeclaration) { // kotlin declaration = PsiTreeUtil.getStubOrPsiParentOfType(myPsiElement, JetNamedDeclaration.class); + if (declaration == null) { + declaration = PsiTreeUtil.getStubOrPsiParentOfType(myPsiElement, JetFile.class); + } } else { // java or bytecode @@ -106,6 +111,12 @@ public class DescriptorClassMember extends MemberChooserObjectBase implements Cl } assert parent != null : NO_PARENT_FOR + myDescriptor; assert declaration != null : NO_PARENT_FOR + myPsiElement; + + if (declaration instanceof JetFile) { + JetFile file = (JetFile) declaration; + return new PsiElementMemberChooserObject(file, file.getName()); + } + return new DescriptorClassMember(declaration, parent); } diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/breakpoints/dialog/AddFieldBreakpointDialog.java b/idea/src/org/jetbrains/kotlin/idea/debugger/breakpoints/dialog/AddFieldBreakpointDialog.java index b610faffc84..974bbececff 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/breakpoints/dialog/AddFieldBreakpointDialog.java +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/breakpoints/dialog/AddFieldBreakpointDialog.java @@ -29,6 +29,9 @@ import com.intellij.psi.search.GlobalSearchScope; import com.intellij.ui.DocumentAdapter; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.idea.core.codeInsight.DescriptorClassMember; +import org.jetbrains.kotlin.psi.JetProperty; import javax.swing.*; import javax.swing.event.DocumentEvent; @@ -79,24 +82,18 @@ public abstract class AddFieldBreakpointDialog extends DialogWrapper { }); myFieldChooser.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { + @Override + public void actionPerformed(@NotNull ActionEvent e) { PsiClass selectedClass = getSelectedClass(); - if (selectedClass != null) { - PsiField[] fields = selectedClass.getFields(); - MemberChooser chooser = new MemberChooser( - ContainerUtil.map2Array(fields, PsiFieldMember.class, new Function() { - public PsiFieldMember fun(final PsiField s) { - return new PsiFieldMember(s); - } - }), false, false, myProject); - chooser.setTitle(DebuggerBundle.message("add.field.breakpoint.dialog.field.chooser.title", fields.length)); - chooser.setCopyJavadocVisible(false); - chooser.show(); - List selectedElements = chooser.getSelectedElements(); - if (selectedElements != null && selectedElements.size() == 1) { - PsiField field = selectedElements.get(0).getElement(); - myFieldChooser.setText(field.getName()); - } + DescriptorClassMember[] properties = DialogPackage.collectProperties(selectedClass); + MemberChooser chooser = new MemberChooser(properties, false, false, myProject); + chooser.setTitle(DebuggerBundle.message("add.field.breakpoint.dialog.field.chooser.title", properties.length)); + chooser.setCopyJavadocVisible(false); + chooser.show(); + List selectedElements = chooser.getSelectedElements(); + if (selectedElements != null && selectedElements.size() == 1) { + JetProperty field = (JetProperty) selectedElements.get(0).getElement(); + myFieldChooser.setText(field.getName()); } } }); diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/breakpoints/dialog/fieldBreakpointDialogUtil.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/breakpoints/dialog/fieldBreakpointDialogUtil.kt new file mode 100644 index 00000000000..d0fa651bd53 --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/breakpoints/dialog/fieldBreakpointDialogUtil.kt @@ -0,0 +1,46 @@ +/* + * Copyright 2010-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.idea.debugger.breakpoints.dialog + +import com.intellij.psi.PsiClass +import org.jetbrains.kotlin.asJava.KotlinLightClass +import org.jetbrains.kotlin.asJava.KotlinLightClassForPackage +import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor +import org.jetbrains.kotlin.idea.core.codeInsight.DescriptorClassMember +import org.jetbrains.kotlin.psi.JetProperty + +fun PsiClass.collectProperties(): Array { + if (this is KotlinLightClassForPackage) { + val result = arrayListOf() + this.files.forEach { + it.getDeclarations().filterIsInstance().forEach { + result.add(DescriptorClassMember(it, it.resolveToDescriptor())) + } + } + return result.toTypedArray() + } + if (this is KotlinLightClass) { + val origin = this.getOrigin() + if (origin != null) { + return origin.getDeclarations().filterIsInstance().map { + DescriptorClassMember(it, it.resolveToDescriptor()) + }.toTypedArray() + } + } + return emptyArray() +} +