Javafx: Improve completion for property tags: offer names of non-abstract class compatible with the property type. Test added. (IDEA-103596)

This commit is contained in:
Pavel Dolgov
2016-03-25 16:23:08 +03:00
parent 62d3e1df5e
commit 3bc362a03d
3 changed files with 27 additions and 7 deletions
@@ -178,6 +178,13 @@ public class JavaFxCompletionTest extends LightFixtureCompletionTestCase {
assertContainsElements(myFixture.getLookupElementStrings(), "disable");
}
public void testPropertyTagSubclass() throws Exception {
myFixture.configureByFiles(getTestName(true) + ".fxml");
complete();
assertContainsElements(myFixture.getLookupElementStrings(), "Color", "ImagePattern", "LinearGradient", "RadialGradient");
assertDoesntContain(myFixture.getLookupElementStrings(), "Paint");
}
public void testSubclassesAndDefaultProperty() throws Exception {
myFixture.configureByFiles(getTestName(true) + ".fxml");
complete();
@@ -9,7 +9,6 @@ import com.intellij.psi.util.PsiUtil;
import com.intellij.psi.xml.XmlAttribute;
import com.intellij.psi.xml.XmlTag;
import com.intellij.util.ArrayUtil;
import com.intellij.util.Processor;
import com.intellij.xml.XmlAttributeDescriptor;
import com.intellij.xml.XmlElementDescriptor;
import com.intellij.xml.XmlElementsGroup;
@@ -84,13 +83,17 @@ public class JavaFxPropertyElementDescriptor implements XmlElementDescriptor {
private static void collectSubclassesDescriptors(PsiType psiType, @NotNull final List<XmlElementDescriptor> descriptors) {
final PsiClass aClass = PsiUtil.resolveClassInType(psiType);
if (aClass != null) {
ClassInheritorsSearch.search(aClass, aClass.getUseScope(), true, true, false).forEach(new Processor<PsiClass>() {
@Override
public boolean process(PsiClass aClass) {
descriptors.add(new JavaFxClassBackedElementDescriptor(aClass.getName(), aClass));
ClassInheritorsSearch.search(aClass, aClass.getUseScope(), true, true, false)
.forEach(psiClass -> {
addElementDescriptor(descriptors, psiClass);
return true;
}
});
});
addElementDescriptor(descriptors, aClass);
}
}
private static void addElementDescriptor(@NotNull List<XmlElementDescriptor> descriptors, @NotNull PsiClass aClass) {
if (!PsiUtil.isAbstractClass(aClass) && !PsiUtil.isInnerClass(aClass)) {
descriptors.add(new JavaFxClassBackedElementDescriptor(aClass.getName(), aClass));
}
}
@@ -0,0 +1,10 @@
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.paint.ImagePattern?>
<?import javafx.scene.shape.Rectangle?>
<fx:root xmlns:fx="http://javafx.com/fxml" type="VBox">
<Rectangle width="100" height="100">
<fill>
<<caret>
</fill>
</Rectangle>
</fx:root>