IDEA-111176 Invalid Inspection - Element PUBLIC/PROTECTED/STATIC is not allowed here

This commit is contained in:
Dmitry Avdeev
2013-07-30 14:53:08 +04:00
parent 23662f9e68
commit e85116482a
7 changed files with 96 additions and 15 deletions
@@ -670,6 +670,15 @@ public class XmlParsingTest extends ParsingTestCase {
doTest("<script type=\"application/custom\">Custom Script</script>", "test.html");
}
public void testKeywordsAsName() throws Exception {
doTestDtd("<!ELEMENT FIELD ANY>\n" +
"<!ELEMENT PUBLIC ANY>\n" +
"<!ELEMENT EMPTY ANY>\n" +
"<!ELEMENT ANY ANY>\n" +
"<!ELEMENT AND (FIELD|PUBLIC|EMPTY|ANY)*>");
}
static class MyLanguage extends Language implements InjectableLanguage {
protected MyLanguage() {
super("MyLanguage", "application/custom");
@@ -4,7 +4,7 @@ XmlFile:test.dtd
<empty list>
PsiElement(XML_ELEMENT_DECL)
XmlToken:XML_ELEMENT_DECL_START('<!ELEMENT')
PsiErrorElement:xml name expected
PsiErrorElement:XML name expected
<empty list>
PsiWhiteSpace(' ')
XmlToken:XML_TAG_END('>')
@@ -17,14 +17,14 @@ XmlFile:test.dtd
PsiElement(XML_ELEMENT_CONTENT_SPEC)
PsiElement(XML_ELEMENT_CONTENT_GROUP)
XmlToken:XML_LEFT_PAREN('(')
PsiErrorElement:Xml name or entity ref expected
PsiErrorElement:XML name or entity ref expected
<empty list>
XmlToken:XML_COMMA(',')
XmlToken:XML_RIGHT_PAREN(')')
PsiWhiteSpace('\n')
PsiElement(XML_ATTLIST_DECL)
XmlToken:XML_ATTLIST_DECL_START('<!ATTLIST')
PsiErrorElement:xml name expected
PsiErrorElement:XML name expected
<empty list>
PsiWhiteSpace(' ')
XmlToken:XML_TAG_END('>')
@@ -57,7 +57,7 @@ XmlFile:test.dtd
XmlToken:XML_LEFT_PAREN('(')
XmlToken:XML_NAME('aaa')
XmlToken:XML_COMMA(',')
PsiErrorElement:Xml name or entity ref expected
PsiErrorElement:XML name or entity ref expected
<empty list>
XmlToken:XML_RIGHT_PAREN(')')
XmlToken:XML_TAG_END('>')
@@ -13,7 +13,7 @@ XmlFile:test.dtd
PsiWhiteSpace(' ')
PsiElement(XML_ENTITY_DECL)
XmlToken:XML_ENTITY_DECL_START('<!ENTITY')
PsiErrorElement:xml name expected
PsiErrorElement:XML name expected
<empty list>
PsiWhiteSpace(' ')
XmlToken:XML_TAG_END('>')
@@ -0,0 +1,58 @@
XmlFile:test.dtd
PsiElement(XML_DOCUMENT)
PsiElement(XML_PROLOG)
<empty list>
PsiElement(XML_ELEMENT_DECL)
XmlToken:XML_ELEMENT_DECL_START('<!ELEMENT')
PsiWhiteSpace(' ')
XmlToken:XML_NAME('FIELD')
PsiWhiteSpace(' ')
PsiElement(XML_ELEMENT_CONTENT_SPEC)
XmlToken:XML_CONTENT_ANY('ANY')
XmlToken:XML_TAG_END('>')
PsiWhiteSpace('\n')
PsiElement(XML_ELEMENT_DECL)
XmlToken:XML_ELEMENT_DECL_START('<!ELEMENT')
PsiWhiteSpace(' ')
XmlToken:XML_NAME('PUBLIC')
PsiWhiteSpace(' ')
PsiElement(XML_ELEMENT_CONTENT_SPEC)
XmlToken:XML_CONTENT_ANY('ANY')
XmlToken:XML_TAG_END('>')
PsiWhiteSpace('\n')
PsiElement(XML_ELEMENT_DECL)
XmlToken:XML_ELEMENT_DECL_START('<!ELEMENT')
PsiWhiteSpace(' ')
XmlToken:XML_NAME('EMPTY')
PsiWhiteSpace(' ')
PsiElement(XML_ELEMENT_CONTENT_SPEC)
XmlToken:XML_CONTENT_ANY('ANY')
XmlToken:XML_TAG_END('>')
PsiWhiteSpace('\n')
PsiElement(XML_ELEMENT_DECL)
XmlToken:XML_ELEMENT_DECL_START('<!ELEMENT')
PsiWhiteSpace(' ')
XmlToken:XML_NAME('ANY')
PsiWhiteSpace(' ')
PsiElement(XML_ELEMENT_CONTENT_SPEC)
XmlToken:XML_CONTENT_ANY('ANY')
XmlToken:XML_TAG_END('>')
PsiWhiteSpace('\n')
PsiElement(XML_ELEMENT_DECL)
XmlToken:XML_ELEMENT_DECL_START('<!ELEMENT')
PsiWhiteSpace(' ')
XmlToken:XML_NAME('AND')
PsiWhiteSpace(' ')
PsiElement(XML_ELEMENT_CONTENT_SPEC)
PsiElement(XML_ELEMENT_CONTENT_GROUP)
XmlToken:XML_LEFT_PAREN('(')
XmlToken:XML_NAME('FIELD')
XmlToken:XML_BAR('|')
XmlToken:XML_NAME('PUBLIC')
XmlToken:XML_BAR('|')
XmlToken:XML_CONTENT_EMPTY('EMPTY')
XmlToken:XML_BAR('|')
XmlToken:XML_CONTENT_ANY('ANY')
XmlToken:XML_RIGHT_PAREN(')')
XmlToken:XML_STAR('*')
XmlToken:XML_TAG_END('>')
@@ -79,15 +79,15 @@ xml.declaration.should.precede.all.document.content=Xml declaration should prece
dtd.parser.message.whitespace.expected=Whitespace expected
dtd.parser.message.left.paren.or.entityref.or.empty.or.any.expected=( or entity ref or EMPTY or ANY expected
dtd.parser.message.name.expected=xml name expected
dtd.parser.message.name.expected=XML name expected
dtd.parser.message.literal.public.system.expected=Literal, PUBLIC or SYSTEM expected
dtd.parser.message.name.or.entity.ref.expected=Xml name or entity ref expected
dtd.parser.message.name.or.entity.ref.expected=XML name or entity ref expected
dtd.parser.message.rbrace.expected=) expected
duplicate.declaration=Nonunique declaration name {0}
duplicate.declaration=Non-unique declaration name {0}
xml.validate.external.resource.is.not.registered=External resource {0} is not registered
xml.schema.validation.attr.not.allowed.with.ref=Attribute {0} is not allowed here when element reference is used
xml.schema.validation.max.occurs.should.be.not.less.than.min.occurs=maxOccurs value should be greater than minOccurs value
xml.schema.validation.name.or.ref.should.present=Either 'name' or 'ref' attribute should present
xml.schema.validation.default.or.fixed.should.be.specified.but.not.both='default' and 'fixed' attributes should not bepresent in the same time
xml.schema.validation.default.or.fixed.should.be.specified.but.not.both='default' and 'fixed' attributes should not be present in the same time
@@ -94,7 +94,7 @@ public class DtdParsing extends XmlParsing implements XmlElementType {
parseGenericXml();
break;
case ELEMENT_CONTENT_SPEC:
parseElementContentSpec();
doParseContentSpec(true);
break;
case ATTLIST_SPEC:
parseAttlistContent();
@@ -492,22 +492,28 @@ public class DtdParsing extends XmlParsing implements XmlElementType {
}
private boolean parseName() {
if (myBuilder.getTokenType() == XML_NAME) {
IElementType type = myBuilder.getTokenType();
if (type == XML_NAME) {
addToken();
return true;
}
if (myBuilder.getTokenType() == XML_ENTITY_REF_TOKEN) {
if (type == XML_ENTITY_REF_TOKEN) {
parseEntityRef();
return true;
}
return false;
return consumeKeywordAsName(type);
}
private void parseElementContentSpec() {
doParseContentSpec(true);
private boolean consumeKeywordAsName(IElementType type) {
if (type == XML_DOCTYPE_PUBLIC || type == XML_DOCTYPE_SYSTEM || type == XML_CONTENT_EMPTY || type == XML_CONTENT_ANY) {
myBuilder.remapCurrentToken(XML_NAME);
addToken();
return true;
}
return false;
}
private void doParseContentSpec(boolean topLevel) {
@@ -569,6 +575,9 @@ public class DtdParsing extends XmlParsing implements XmlElementType {
addToken();
endedWithDelimiter = false;
}
else if (consumeKeywordAsName(tokenType)) {
endedWithDelimiter = false;
}
else {
myBuilder.error(XmlErrorMessages.message("dtd.parser.message.name.or.entity.ref.expected"));
return false;
@@ -142,4 +142,9 @@ public abstract class BaseXmlElementDescriptorImpl implements XmlElementDescript
public final XmlAttributeDescriptor getAttributeDescriptor(XmlAttribute attr){
return getAttributeDescriptor(attr.getName(), attr.getParent());
}
@Override
public String toString() {
return getQualifiedName();
}
}