javafx: filter out unacceptable ids during fx:reference source processing

(cherry picked from commit 490500af5adb50c3cd1b35de700a28fd37ca644b)
This commit is contained in:
anna
2013-03-26 21:43:00 +01:00
parent 124689fa7b
commit 4a159a8648
3 changed files with 42 additions and 7 deletions
@@ -148,6 +148,12 @@ public class JavaFxCompletionTest extends LightFixtureCompletionTestCase {
assertEquals(5, myItems.length);
}
public void testAcceptableSourceOnly() throws Exception {
myFixture.configureByFiles(getTestName(true) + ".fxml");
myItems = myFixture.completeBasic();
assertEmpty(myItems);
}
public void testIncludedRootAttributes() throws Exception {
myFixture.addFileToProject("foo.fxml", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<?import javafx.scene.layout.*?>\n" +
@@ -31,10 +31,7 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.javaFX.fxml.FxmlConstants;
import org.jetbrains.plugins.javaFX.fxml.JavaFxPsiUtil;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
* User: anna
@@ -94,24 +91,49 @@ class JavaFxComponentIdReferenceProvider extends PsiReferenceProvider {
}
return new PsiReference[] {idReferenceBase};
}
final JavaFxIdReferenceBase idReferenceBase = new JavaFxIdReferenceBase(xmlAttributeValue, fileIds, referencesId);
if (startsWithDollar) {
final JavaFxIdReferenceBase idReferenceBase = new JavaFxIdReferenceBase(xmlAttributeValue, fileIds, referencesId);
final TextRange rangeInElement = idReferenceBase.getRangeInElement();
idReferenceBase.setRangeInElement(new TextRange(rangeInElement.getStartOffset() + 1, rangeInElement.getEndOffset()));
return new PsiReference[]{idReferenceBase};
} else {
final Set<String> acceptableIds = new HashSet<String>();
if (currentTag != null) {
final XmlTag parentTag = currentTag.getParentTag();
for (final String id : fileIds.keySet()) {
final XmlAttributeValue resolvedAttrValue = fileIds.get(id);
if (JavaFxPsiUtil.isClassAcceptable(parentTag, JavaFxPsiUtil.getTagClass(resolvedAttrValue)) == null) {
acceptableIds.add(id);
}
}
}
JavaFxIdReferenceBase idReferenceBase = new JavaFxIdReferenceBase(xmlAttributeValue, fileIds, acceptableIds, referencesId);
return new PsiReference[]{idReferenceBase};
}
return new PsiReference[]{idReferenceBase};
}
private static class JavaFxIdReferenceBase extends PsiReferenceBase<XmlAttributeValue> {
private final Map<String, XmlAttributeValue> myFileIds;
private final Set<String> myAcceptableIds;
private final String myReferencesId;
private JavaFxIdReferenceBase(XmlAttributeValue element,
Map<String, XmlAttributeValue> fileIds,
Set<String> acceptableIds,
String referencesId) {
super(element);
myFileIds = fileIds;
myAcceptableIds = acceptableIds;
myReferencesId = referencesId;
}
public JavaFxIdReferenceBase(XmlAttributeValue xmlAttributeValue,
Map<String, XmlAttributeValue> fileIds,
String referencesId) {
super(xmlAttributeValue);
myFileIds = fileIds;
myReferencesId = referencesId;
myAcceptableIds = myFileIds.keySet();
}
@Nullable
@@ -123,7 +145,7 @@ class JavaFxComponentIdReferenceProvider extends PsiReferenceProvider {
@NotNull
@Override
public Object[] getVariants() {
return ArrayUtil.toStringArray(myFileIds.keySet());
return ArrayUtil.toStringArray(myAcceptableIds);
}
}
@@ -0,0 +1,7 @@
<?import javafx.scene.layout.GridPane?>
<GridPane xmlns:fx="http://javafx.com/fxml" fx:id="foo">
<rowConstraints>
<fx:reference source="<caret>"/>
</rowConstraints>
</GridPane>