diff options
Diffstat (limited to 'xml/xml-psi-impl/src/com/intellij')
10 files changed, 61 insertions, 24 deletions
diff --git a/xml/xml-psi-impl/src/com/intellij/psi/impl/source/html/dtd/HtmlAttributeDescriptorImpl.java b/xml/xml-psi-impl/src/com/intellij/psi/impl/source/html/dtd/HtmlAttributeDescriptorImpl.java index 674ad163c0b2..7204bf720403 100644 --- a/xml/xml-psi-impl/src/com/intellij/psi/impl/source/html/dtd/HtmlAttributeDescriptorImpl.java +++ b/xml/xml-psi-impl/src/com/intellij/psi/impl/source/html/dtd/HtmlAttributeDescriptorImpl.java @@ -20,6 +20,7 @@ import com.intellij.psi.xml.XmlElement; import com.intellij.util.ArrayUtil; import com.intellij.xml.XmlAttributeDescriptor; import com.intellij.xml.impl.BasicXmlAttributeDescriptor; +import com.intellij.xml.impl.XmlEnumerationDescriptor; /** * @author Maxim.Mossienko @@ -95,8 +96,8 @@ public class HtmlAttributeDescriptorImpl extends BasicXmlAttributeDescriptor { @Override public PsiElement getValueDeclaration(XmlElement attributeValue, String value) { String s = myCaseSensitive ? value : value.toLowerCase(); - return delegate instanceof BasicXmlAttributeDescriptor ? - ((BasicXmlAttributeDescriptor)delegate).getValueDeclaration(attributeValue, s) : + return delegate instanceof XmlEnumerationDescriptor ? + ((XmlEnumerationDescriptor)delegate).getValueDeclaration(attributeValue, s) : super.getValueDeclaration(attributeValue, value); } } diff --git a/xml/xml-psi-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/SchemaReferencesProvider.java b/xml/xml-psi-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/SchemaReferencesProvider.java index 8862ac892f0e..cd1f672d8819 100644 --- a/xml/xml-psi-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/SchemaReferencesProvider.java +++ b/xml/xml-psi-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/SchemaReferencesProvider.java @@ -410,7 +410,11 @@ public class SchemaReferencesProvider extends PsiReferenceProvider { class CompletionProcessor implements PsiElementProcessor<XmlTag> { List<String> myElements = new ArrayList<String>(1); String namespace; - XmlTag tag; + final XmlTag tag; + + CompletionProcessor(XmlTag tag) { + this.tag = tag; + } public boolean execute(@NotNull final XmlTag element) { String name = element.getAttributeValue(NAME_ATTR_NAME); @@ -448,8 +452,7 @@ public class SchemaReferencesProvider extends PsiReferenceProvider { break; } - CompletionProcessor processor = new CompletionProcessor(); - processor.tag = tag; + CompletionProcessor processor = new CompletionProcessor(tag); final XmlElement context = PsiTreeUtil.getContextOfType(myElement, XmlElement.class, false); if (context == null) { diff --git a/xml/xml-psi-impl/src/com/intellij/psi/impl/source/xml/SchemaPrefixReference.java b/xml/xml-psi-impl/src/com/intellij/psi/impl/source/xml/SchemaPrefixReference.java index 2c963a95bd80..4d4c3aa60187 100644 --- a/xml/xml-psi-impl/src/com/intellij/psi/impl/source/xml/SchemaPrefixReference.java +++ b/xml/xml-psi-impl/src/com/intellij/psi/impl/source/xml/SchemaPrefixReference.java @@ -47,7 +47,7 @@ public class SchemaPrefixReference extends PsiReferenceBase<XmlElement> implemen * @param name * @param reference */ - public SchemaPrefixReference(XmlElement element, TextRange range, String name, TagNameReference reference) { + public SchemaPrefixReference(XmlElement element, TextRange range, String name, @Nullable TagNameReference reference) { super(element, range); myName = name; myTagNameReference = reference; diff --git a/xml/xml-psi-impl/src/com/intellij/xml/impl/BasicXmlAttributeDescriptor.java b/xml/xml-psi-impl/src/com/intellij/xml/impl/BasicXmlAttributeDescriptor.java index fba46a2cec3d..4e2055d40fe7 100644 --- a/xml/xml-psi-impl/src/com/intellij/xml/impl/BasicXmlAttributeDescriptor.java +++ b/xml/xml-psi-impl/src/com/intellij/xml/impl/BasicXmlAttributeDescriptor.java @@ -45,6 +45,11 @@ public abstract class BasicXmlAttributeDescriptor extends XmlEnumerationDescript } @Override + public boolean isEnumerated(XmlElement context) { + return isEnumerated(); + } + + @Override public String toString() { return getName(); } diff --git a/xml/xml-psi-impl/src/com/intellij/xml/impl/XmlEnumerationDescriptor.java b/xml/xml-psi-impl/src/com/intellij/xml/impl/XmlEnumerationDescriptor.java index bf7b988e899d..b77ed3a1b866 100644 --- a/xml/xml-psi-impl/src/com/intellij/xml/impl/XmlEnumerationDescriptor.java +++ b/xml/xml-psi-impl/src/com/intellij/xml/impl/XmlEnumerationDescriptor.java @@ -3,20 +3,23 @@ package com.intellij.xml.impl; import com.intellij.openapi.util.Comparing; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiReference; -import com.intellij.psi.xml.XmlAttributeValue; import com.intellij.psi.xml.XmlElement; import com.intellij.xml.util.XmlEnumeratedValueReference; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * @author Dmitry Avdeev * Date: 22.08.13 */ -public abstract class XmlEnumerationDescriptor { +public abstract class XmlEnumerationDescriptor<T extends XmlElement> { public abstract boolean isFixed(); public abstract String getDefaultValue(); + public abstract boolean isEnumerated(@Nullable XmlElement context); + public abstract String[] getEnumeratedValues(); public PsiElement getValueDeclaration(XmlElement attributeValue, String value) { @@ -31,8 +34,7 @@ public abstract class XmlEnumerationDescriptor { protected abstract PsiElement getDefaultValueDeclaration(); - public PsiReference[] getValueReferences(XmlAttributeValue value) { - return new PsiReference[] { new XmlEnumeratedValueReference(value, this)}; + public PsiReference[] getValueReferences(T element, @NotNull String text) { + return new PsiReference[] { new XmlEnumeratedValueReference(element, this)}; } - } diff --git a/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/XmlElementDescriptorImpl.java b/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/XmlElementDescriptorImpl.java index 61c33c09cafc..3d3cab737a27 100644 --- a/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/XmlElementDescriptorImpl.java +++ b/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/XmlElementDescriptorImpl.java @@ -16,14 +16,17 @@ package com.intellij.xml.impl.schema; import com.intellij.codeInsight.daemon.Validator; +import com.intellij.psi.ElementManipulators; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiReference; import com.intellij.psi.meta.PsiWritableMetaData; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.xml.*; import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.xml.*; +import com.intellij.xml.util.XmlEnumeratedValueReference; import com.intellij.xml.util.XmlUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -36,7 +39,7 @@ import java.util.List; /** * @author Mike */ -public class XmlElementDescriptorImpl extends XsdEnumerationDescriptor +public class XmlElementDescriptorImpl extends XsdEnumerationDescriptor<XmlTag> implements XmlElementDescriptor, PsiWritableMetaData, Validator<XmlTag>, XmlElementDescriptorAwareAboutChildren { protected XmlTag myDescriptorTag; @@ -473,8 +476,9 @@ public class XmlElementDescriptorImpl extends XsdEnumerationDescriptor } public String getQualifiedName() { - if (!"".equals(getNS())) { - return getNS() + ":" + getName(); + String ns = getNS(); + if (ns != null && !ns.isEmpty()) { + return ns + ":" + getName(); } return getName(); @@ -519,6 +523,16 @@ public class XmlElementDescriptorImpl extends XsdEnumerationDescriptor } } + @Override + public PsiReference[] getValueReferences(XmlTag xmlTag, @NotNull String text) { + XmlTagValue value = xmlTag.getValue(); + XmlText[] elements = value.getTextElements(); + if (elements.length == 0 || xmlTag.getSubTags().length > 0) return PsiReference.EMPTY_ARRAY; + return new PsiReference[] { + new XmlEnumeratedValueReference(xmlTag, this, ElementManipulators.getValueTextRange(xmlTag)) + }; + } + public boolean allowElementsFromNamespace(final String namespace, final XmlTag context) { final TypeDescriptor type = getType(context); diff --git a/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/XsdEnumerationDescriptor.java b/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/XsdEnumerationDescriptor.java index 0a1c341f6825..26600b7795bd 100644 --- a/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/XsdEnumerationDescriptor.java +++ b/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/XsdEnumerationDescriptor.java @@ -21,7 +21,7 @@ import java.util.List; * @author Dmitry Avdeev * Date: 22.08.13 */ -public abstract class XsdEnumerationDescriptor extends XmlEnumerationDescriptor { +public abstract class XsdEnumerationDescriptor<T extends XmlElement> extends XmlEnumerationDescriptor<T> { private boolean myExhaustiveEnum; @@ -60,7 +60,7 @@ public abstract class XsdEnumerationDescriptor extends XmlEnumerationDescriptor } private boolean processEnumeration(XmlElement context, PairProcessor<PsiElement, String> processor) { - XmlTag contextTag = context != null ? PsiTreeUtil.getContextOfType(context, XmlTag.class, true) : null; + XmlTag contextTag = context != null ? PsiTreeUtil.getContextOfType(context, XmlTag.class, false) : null; final XmlElementDescriptorImpl elementDescriptor = (XmlElementDescriptorImpl)XmlUtil.findXmlDescriptorByType(getDeclaration(), contextTag); if (elementDescriptor!=null && elementDescriptor.getType() instanceof ComplexTypeDescriptor) { diff --git a/xml/xml-psi-impl/src/com/intellij/xml/util/HtmlUtil.java b/xml/xml-psi-impl/src/com/intellij/xml/util/HtmlUtil.java index a25f60550e1f..ac01d81a2f77 100644 --- a/xml/xml-psi-impl/src/com/intellij/xml/util/HtmlUtil.java +++ b/xml/xml-psi-impl/src/com/intellij/xml/util/HtmlUtil.java @@ -139,7 +139,8 @@ public class HtmlUtil { @NonNls private static final String[] HTML5_TAGS = { "article", "aside", "audio", "canvas", "command", "datalist", "details", "embed", "figcaption", "figure", "footer", "header", "hgroup", - "keygen", "mark", "meter", "nav", "output", "progress", "rp", "rt", "ruby", "section", "source", "summary", "time", "video", "wbr" + "keygen", "mark", "meter", "nav", "output", "progress", "rp", "rt", "ruby", "section", "source", "summary", "time", "video", "wbr", + "main" }; private static final Set<String> HTML5_TAGS_SET = new THashSet<String>(); diff --git a/xml/xml-psi-impl/src/com/intellij/xml/util/XmlEnumeratedValueReference.java b/xml/xml-psi-impl/src/com/intellij/xml/util/XmlEnumeratedValueReference.java index 5cf994a2deac..6b1bdf47bc2f 100644 --- a/xml/xml-psi-impl/src/com/intellij/xml/util/XmlEnumeratedValueReference.java +++ b/xml/xml-psi-impl/src/com/intellij/xml/util/XmlEnumeratedValueReference.java @@ -17,9 +17,12 @@ package com.intellij.xml.util; import com.intellij.codeInsight.daemon.EmptyResolveMessageProvider; import com.intellij.codeInsight.daemon.XmlErrorMessages; +import com.intellij.openapi.util.TextRange; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiReferenceBase; -import com.intellij.psi.xml.XmlAttributeValue; +import com.intellij.psi.xml.XmlElement; +import com.intellij.psi.xml.XmlTag; import com.intellij.util.ArrayUtil; import com.intellij.xml.impl.XmlEnumerationDescriptor; import org.jetbrains.annotations.NotNull; @@ -29,14 +32,19 @@ import org.jetbrains.annotations.Nullable; * @author Dmitry Avdeev * Date: 16.08.13 */ -public class XmlEnumeratedValueReference extends PsiReferenceBase<XmlAttributeValue> implements EmptyResolveMessageProvider { +public class XmlEnumeratedValueReference extends PsiReferenceBase<XmlElement> implements EmptyResolveMessageProvider { private final XmlEnumerationDescriptor myDescriptor; - public XmlEnumeratedValueReference(XmlAttributeValue value, XmlEnumerationDescriptor descriptor) { + public XmlEnumeratedValueReference(XmlElement value, XmlEnumerationDescriptor descriptor) { super(value); myDescriptor = descriptor; } + public XmlEnumeratedValueReference(XmlElement value, XmlEnumerationDescriptor descriptor, TextRange range) { + super(value, range); + myDescriptor = descriptor; + } + @Nullable @Override public PsiElement resolve() { @@ -59,8 +67,9 @@ public class XmlEnumeratedValueReference extends PsiReferenceBase<XmlAttributeVa @NotNull @Override public String getUnresolvedMessagePattern() { + String name = getElement() instanceof XmlTag ? "tag" : "attribute"; return myDescriptor.isFixed() - ? XmlErrorMessages.message("attribute.should.have.fixed.value", myDescriptor.getDefaultValue()) - : XmlErrorMessages.message("wrong.attribute.value"); + ? XmlErrorMessages.message("should.have.fixed.value", StringUtil.capitalize(name), myDescriptor.getDefaultValue()) + : XmlErrorMessages.message("wrong.value", name); } } diff --git a/xml/xml-psi-impl/src/com/intellij/xml/util/XmlUtil.java b/xml/xml-psi-impl/src/com/intellij/xml/util/XmlUtil.java index e8bb8f4c6f41..abbddfcf654c 100644 --- a/xml/xml-psi-impl/src/com/intellij/xml/util/XmlUtil.java +++ b/xml/xml-psi-impl/src/com/intellij/xml/util/XmlUtil.java @@ -933,6 +933,8 @@ public class XmlUtil { }); } + private final static Set<String> doNotVisitTags = new HashSet<String>(Arrays.asList("annotation", "element", "attribute")); + /** * @return true if enumeration is exhaustive */ @@ -954,7 +956,7 @@ public class XmlUtil { exhaustiveEnum = false; processEnumerationValues(tag, tagProcessor); } - else if (!localName.equals("annotation")) { + else if (!doNotVisitTags.contains(localName)) { // don't go into annotation exhaustiveEnum &= processEnumerationValues(tag, tagProcessor); } @@ -1070,7 +1072,7 @@ public class XmlUtil { return new Pair<XmlTagChild, XmlTagChild>(first, last); } - public static boolean isSimpleXmlAttributeValue(@NotNull final String unquotedValue, final XmlAttributeValue context) { + public static boolean isSimpleValue(@NotNull final String unquotedValue, final PsiElement context) { for (int i = 0; i < unquotedValue.length(); ++i) { final char ch = unquotedValue.charAt(i); if (!Character.isJavaIdentifierPart(ch) && ch != ':' && ch != '-') { |