/* * Copyright 2013 Vladimir Rudev * * 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 ru.crazyproger.plugins.webtoper.component; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.patterns.PsiElementPattern; import com.intellij.patterns.XmlTagPattern; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; import com.intellij.psi.PsiReference; import com.intellij.psi.PsiReferenceBase; import com.intellij.psi.PsiReferenceContributor; import com.intellij.psi.PsiReferenceProvider; import com.intellij.psi.PsiReferenceRegistrar; import com.intellij.psi.jsp.JspFile; import com.intellij.psi.xml.XmlTokenType; import com.intellij.util.ProcessingContext; import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; import ru.crazyproger.plugins.webtoper.Utils; import static com.intellij.patterns.PlatformPatterns.psiElement; import static com.intellij.patterns.XmlPatterns.xmlTag; public class JspReferenceContributor extends PsiReferenceContributor { public static final XmlTagPattern.Capture COMPONENT_CAPTURE = xmlTag().withName("component").withParent( xmlTag().withName("scope")); public static final PsiElementPattern.Capture<PsiElement> JSP_CAPTURE = psiElement(XmlTokenType.XML_DATA_CHARACTERS) .inside(COMPONENT_CAPTURE); @Override public void registerReferenceProviders(PsiReferenceRegistrar registrar) { registrar.registerReferenceProvider(JSP_CAPTURE, new PsiReferenceProvider() { @NotNull @Override public PsiReference[] getReferencesByElement(@NotNull PsiElement element, @NotNull ProcessingContext context) { final String text = StringUtils.trimToEmpty(element.getText()); if (!text.endsWith(".jsp")) return PsiReference.EMPTY_ARRAY; final Project project = element.getProject(); final VirtualFile virtualFile = Utils.findFileInArtifact(text, project); if (virtualFile == null) return PsiReference.EMPTY_ARRAY; final PsiFile file; file = PsiManager.getInstance(project).findFile(virtualFile); if (!(file instanceof JspFile)) return PsiReference.EMPTY_ARRAY; return new PsiReference[]{new PsiReferenceBase.Immediate<PsiElement>(element, file)}; } }); } }