blob: e2267f53b7702b3543a48a20cef73908f72c6931 [file] [log] [blame]
/*
* Copyright 2000-2014 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 com.intellij.xml.util;
import com.intellij.codeInsight.daemon.impl.analysis.encoding.XmlEncodingReferenceProvider;
import com.intellij.html.impl.providers.MicrodataReferenceProvider;
import com.intellij.html.impl.util.MicrodataUtil;
import com.intellij.patterns.PlatformPatterns;
import com.intellij.psi.*;
import com.intellij.psi.filters.*;
import com.intellij.psi.filters.position.NamespaceFilter;
import com.intellij.psi.filters.position.ParentElementFilter;
import com.intellij.psi.impl.UrlPsiReference;
import com.intellij.psi.impl.source.resolve.reference.impl.providers.DtdReferencesProvider;
import com.intellij.psi.impl.source.resolve.reference.impl.providers.IdReferenceProvider;
import com.intellij.psi.impl.source.resolve.reference.impl.providers.SchemaReferencesProvider;
import com.intellij.psi.impl.source.resolve.reference.impl.providers.URIReferenceProvider;
import com.intellij.psi.xml.*;
import com.intellij.util.ProcessingContext;
import org.jetbrains.annotations.NotNull;
import static com.intellij.patterns.XmlPatterns.*;
/**
* @author peter
*/
public class XmlReferenceContributor extends PsiReferenceContributor {
@Override
public void registerReferenceProviders(@NotNull final PsiReferenceRegistrar registrar) {
final IdReferenceProvider idReferenceProvider = new IdReferenceProvider();
XmlUtil.registerXmlAttributeValueReferenceProvider(registrar, idReferenceProvider.getIdForAttributeNames(),
idReferenceProvider.getIdForFilter(), true, idReferenceProvider,
PsiReferenceRegistrar.DEFAULT_PRIORITY);
final DtdReferencesProvider dtdReferencesProvider = new DtdReferencesProvider();
//registerReferenceProvider(null, XmlEntityDecl.class,dtdReferencesProvider);
registrar.registerReferenceProvider(PlatformPatterns.psiElement(XmlEntityRef.class), dtdReferencesProvider);
registrar.registerReferenceProvider(PlatformPatterns.psiElement(XmlDoctype.class), dtdReferencesProvider);
registrar.registerReferenceProvider(PlatformPatterns.psiElement(XmlElementDecl.class), dtdReferencesProvider);
registrar.registerReferenceProvider(PlatformPatterns.psiElement(XmlAttlistDecl.class), dtdReferencesProvider);
registrar.registerReferenceProvider(PlatformPatterns.psiElement(XmlElementContentSpec.class), dtdReferencesProvider);
registrar.registerReferenceProvider(PlatformPatterns.psiElement(XmlToken.class), dtdReferencesProvider);
URIReferenceProvider uriProvider = new URIReferenceProvider();
XmlUtil.registerXmlAttributeValueReferenceProvider(registrar, null, dtdReferencesProvider.getSystemReferenceFilter(), uriProvider);
XmlUtil.registerXmlAttributeValueReferenceProvider(registrar, new String[] { "href" }, new ScopeFilter(
new ParentElementFilter(
new AndFilter(
new AndFilter(XmlTagFilter.INSTANCE, new XmlTextFilter("include")),
new NamespaceFilter(XmlUtil.XINCLUDE_URI)
),
2
)
), true, uriProvider);
XmlUtil.registerXmlAttributeValueReferenceProvider(
registrar,
new String[]{MicrodataUtil.ITEM_TYPE},
null,
new MicrodataReferenceProvider()
);
final SchemaReferencesProvider schemaReferencesProvider = new SchemaReferencesProvider();
XmlUtil.registerXmlAttributeValueReferenceProvider(registrar,
schemaReferencesProvider.getCandidateAttributeNamesForSchemaReferences(),
new ScopeFilter(
new ParentElementFilter(
new NamespaceFilter(XmlUtil.SCHEMA_URIS), 2
)
),
schemaReferencesProvider
);
registrar.registerReferenceProvider(xmlAttributeValue(xmlAttribute().withNamespace(XmlUtil.XML_SCHEMA_INSTANCE_URI)).
withLocalName("type"), schemaReferencesProvider);
registrar.registerReferenceProvider(xmlAttributeValue(xmlAttribute().withNamespace(XmlUtil.XML_SCHEMA_INSTANCE_URI)).
withLocalName("noNamespaceSchemaLocation", "schemaLocation"), uriProvider);
registrar.registerReferenceProvider(
xmlAttributeValue().withLocalName("schemaLocation","namespace").
withSuperParent(2,
xmlTag().withNamespace(XmlUtil.SCHEMA_URIS).withLocalName("import", "include","redefine")),
uriProvider);
XmlUtil.registerXmlAttributeValueReferenceProvider(registrar, null, URIReferenceProvider.ELEMENT_FILTER, true, uriProvider);
XmlUtil.registerXmlAttributeValueReferenceProvider(registrar, new String[] {"encoding"}, new ScopeFilter(new ParentElementFilter(new ClassFilter(XmlProcessingInstruction.class))), true,
new XmlEncodingReferenceProvider());
registrar.registerReferenceProvider(xmlAttributeValue(), new XmlPrefixReferenceProvider());
registrar.registerReferenceProvider(xmlAttributeValue(), new XmlEnumeratedValueReferenceProvider(), PsiReferenceRegistrar.LOWER_PRIORITY);
registrar.registerReferenceProvider(xmlTag(), XmlEnumeratedValueReferenceProvider.forTags(), PsiReferenceRegistrar.LOWER_PRIORITY);
registrar.registerReferenceProvider(xmlAttributeValue().withLocalName("source")
.withSuperParent(2, xmlTag().withLocalName("documentation").withNamespace(XmlUtil.SCHEMA_URIS)),
new PsiReferenceProvider() {
@NotNull
@Override
public PsiReference[] getReferencesByElement(@NotNull PsiElement element,
@NotNull ProcessingContext context) {
return new PsiReference[] { new UrlPsiReference(element) };
}
});
}
}