Maven: pom.xml tags beyond <configuration> are regarded as invalid (IDEA-89560)

This commit is contained in:
Vladislav.Soroka
2017-04-04 14:33:43 +03:00
parent d73b5d2580
commit e08856b502
3 changed files with 71 additions and 1 deletions
@@ -15,12 +15,30 @@
*/
package org.jetbrains.idea.maven.dom;
import com.intellij.psi.PsiElement;
import com.intellij.psi.impl.source.xml.XmlElementDescriptorProvider;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.xml.XmlTag;
import com.intellij.util.xml.DomElement;
import com.intellij.util.xml.impl.DomManagerImpl;
import com.intellij.xml.XmlElementDescriptor;
import com.intellij.xml.impl.schema.AnyXmlElementDescriptor;
import org.jetbrains.idea.maven.dom.model.MavenDomConfiguration;
public class MavenDomElementDescriptorProvider implements XmlElementDescriptorProvider {
public XmlElementDescriptor getDescriptor(XmlTag tag) {
DomElement domElement = DomManagerImpl.getDomManager(tag.getProject()).getDomElement(tag);
if (domElement == null) {
PsiElement configuration =
PsiTreeUtil.findFirstParent(tag, element -> element instanceof XmlTag && "configuration".equals(((XmlTag)element).getName()));
if (configuration instanceof XmlTag) {
DomElement configurationElement = DomManagerImpl.getDomManager(tag.getProject()).getDomElement((XmlTag)configuration);
if (configurationElement instanceof MavenDomConfiguration &&
configurationElement.getGenericInfo().getFixedChildrenDescriptions().isEmpty()) {
return new AnyXmlElementDescriptor(null, null);
}
}
}
return MavenDomElementDescriptorHolder.getInstance(tag.getProject()).getDescriptor(tag);
}
}
@@ -0,0 +1,52 @@
/*
* Copyright 2000-2017 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.idea.maven.dom;
import com.intellij.psi.PsiFile;
import com.intellij.psi.xml.XmlFile;
import com.intellij.psi.xml.XmlTag;
import com.intellij.util.xml.DomElement;
import com.intellij.util.xml.DomUtil;
import com.intellij.util.xml.impl.DomManagerImpl;
import com.intellij.xml.DefaultXmlExtension;
import com.intellij.xml.XmlElementDescriptor;
import com.intellij.xml.impl.schema.AnyXmlElementDescriptor;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.maven.dom.model.MavenDomConfiguration;
/**
* @author Vladislav.Soroka
* @since 4/4/2017
*/
public class MavenXmlExtension extends DefaultXmlExtension {
@Override
public boolean isAvailable(PsiFile file) {
return file instanceof XmlFile && MavenDomUtil.isMavenFile(file);
}
@Nullable
@Override
public XmlElementDescriptor getElementDescriptor(XmlTag tag, XmlTag contextTag, XmlElementDescriptor parentDescriptor) {
DomElement domElement = DomManagerImpl.getDomManager(tag.getProject()).getDomElement(contextTag);
if (domElement != null) {
MavenDomConfiguration configuration = DomUtil.getParentOfType(domElement, MavenDomConfiguration.class, false);
if (configuration != null && configuration.getGenericInfo().getFixedChildrenDescriptions().isEmpty()) {
return new AnyXmlElementDescriptor(null, null);
}
}
return super.getElementDescriptor(tag, contextTag, parentDescriptor);
}
}
@@ -116,7 +116,7 @@
<localInspection language="XML" shortName="MavenPropertyInParent" bundle="MavenDomBundle" key="inspection.property.in.parent.name"
groupKey="inspection.group" enabledByDefault="true" level="WARNING"
implementationClass="org.jetbrains.idea.maven.dom.inspections.MavenPropertyInParentInspection"/>
<xml.xmlExtension implementation="org.jetbrains.idea.maven.dom.MavenXmlExtension"/>
<dom.extender domClass="org.jetbrains.idea.maven.dom.model.MavenDomConfiguration"
extenderClass="org.jetbrains.idea.maven.dom.MavenPluginConfigurationDomExtender"/>
<dom.extender domClass="org.jetbrains.idea.maven.dom.model.MavenDomConfigurationParameter"