From eb186539e82ca636a72620f228dfba8e1aff1433 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 31 Jan 2013 16:20:51 +0400 Subject: [PATCH] javafx: use FileReferenceSet for location, source refs --- .../fxml/refs/FxmlReferencesContributor.java | 6 +++ .../refs/JavaFxLocationReferenceProvider.java | 43 +++---------------- .../refs/JavaFxSourceReferenceProvider.java | 37 ++++++++++++++++ plugins/javaFX/testData/highlighting/btn.fxml | 2 + .../testData/highlighting/imageIcon.fxml | 2 +- .../testData/highlighting/includeBtn.fxml | 11 +++++ .../highlighting/sourceAttrRecognition.fxml | 2 +- .../javaFX/fxml/JavaFXHighlightingTest.java | 12 ++++++ 8 files changed, 75 insertions(+), 40 deletions(-) create mode 100644 plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxSourceReferenceProvider.java create mode 100644 plugins/javaFX/testData/highlighting/btn.fxml create mode 100644 plugins/javaFX/testData/highlighting/includeBtn.fxml diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/FxmlReferencesContributor.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/FxmlReferencesContributor.java index 7e2ef0108bad..8b1d0d9917bd 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/FxmlReferencesContributor.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/FxmlReferencesContributor.java @@ -45,6 +45,12 @@ public class FxmlReferencesContributor extends PsiReferenceContributor { .and(attributeValueInFxml), new JavaFxFieldIdReferenceProvider()); + registrar.registerReferenceProvider(XmlPatterns.xmlAttributeValue().withParent(XmlPatterns.xmlAttribute().withName(FxmlConstants.FX_ELEMENT_SOURCE) + .withParent(XmlPatterns.xmlTag() + .withName(FxmlConstants.FX_INCLUDE))) + .and(attributeValueInFxml), + new JavaFxSourceReferenceProvider()); + registrar.registerReferenceProvider(XmlPatterns.xmlAttributeValue().withValue(string().startsWith("#")) .and(attributeValueInFxml), new JavaFxEventHandlerReferenceProvider()); diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxLocationReferenceProvider.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxLocationReferenceProvider.java index 601973758d25..9e2f2eb771c4 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxLocationReferenceProvider.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxLocationReferenceProvider.java @@ -15,19 +15,13 @@ */ package org.jetbrains.plugins.javaFX.fxml.refs; -import com.intellij.openapi.util.SystemInfo; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.*; -import com.intellij.psi.impl.source.resolve.reference.impl.providers.FileReference; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiReference; +import com.intellij.psi.PsiReferenceProvider; import com.intellij.psi.impl.source.resolve.reference.impl.providers.FileReferenceSet; import com.intellij.psi.xml.XmlAttributeValue; -import com.intellij.util.ArrayUtil; import com.intellij.util.ProcessingContext; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.ArrayList; -import java.util.List; /** * User: anna @@ -39,34 +33,7 @@ class JavaFxLocationReferenceProvider extends PsiReferenceProvider { @NotNull ProcessingContext context) { final String value = ((XmlAttributeValue)element).getValue(); final String relativePathToResource = value.substring(1); - - final VirtualFile virtualFile = element.getContainingFile().getOriginalFile().getVirtualFile(); - if (virtualFile != null) { - final VirtualFile parent = virtualFile.getParent(); - final VirtualFile resourceFile = parent != null ? parent.findFileByRelativePath(relativePathToResource) : null; - final PsiReferenceBase.Immediate ref = - new PsiReferenceBase.Immediate((XmlAttributeValue)element, resourceFile != null ? element.getManager().findFile(resourceFile) : null) { - @NotNull - @Override - public Object[] getVariants() { - if (parent != null) { //todo multilevel completion, filter by resources - final PsiDirectory psiDirectory = element.getManager().findDirectory(parent); - if (psiDirectory != null) { - final PsiElement[] children = psiDirectory.getChildren(); - final List paths = new ArrayList(); - for (PsiElement child : children) { - if (child instanceof PsiFileSystemItem) { - paths.add("@" + ((PsiFileSystemItem)child).getName()); - } - } - return ArrayUtil.toStringArray(paths); - } - } - return super.getVariants(); - } - }; - return new PsiReference[]{ref}; - } - return PsiReference.EMPTY_ARRAY; + final FileReferenceSet set = new FileReferenceSet(relativePathToResource, element, 2, null, true); + return set.getAllReferences(); } } diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxSourceReferenceProvider.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxSourceReferenceProvider.java new file mode 100644 index 000000000000..0dc96cbca484 --- /dev/null +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxSourceReferenceProvider.java @@ -0,0 +1,37 @@ +/* + * Copyright 2000-2013 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.plugins.javaFX.fxml.refs; + +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiReference; +import com.intellij.psi.PsiReferenceProvider; +import com.intellij.psi.impl.source.resolve.reference.impl.providers.FileReferenceSet; +import com.intellij.psi.xml.XmlAttributeValue; +import com.intellij.util.ProcessingContext; +import org.jetbrains.annotations.NotNull; + +/** + * User: anna + */ +class JavaFxSourceReferenceProvider extends PsiReferenceProvider { + @NotNull + @Override + public PsiReference[] getReferencesByElement(@NotNull final PsiElement element, + @NotNull ProcessingContext context) { + final FileReferenceSet set = new FileReferenceSet(((XmlAttributeValue)element).getValue(), element, 1, null, true); + return set.getAllReferences(); + } +} diff --git a/plugins/javaFX/testData/highlighting/btn.fxml b/plugins/javaFX/testData/highlighting/btn.fxml new file mode 100644 index 000000000000..6444aa8b4cda --- /dev/null +++ b/plugins/javaFX/testData/highlighting/btn.fxml @@ -0,0 +1,2 @@ + +