From e08856b50285e047ed86fdaff5a6ed4ff75c1e09 Mon Sep 17 00:00:00 2001 From: "Vladislav.Soroka" Date: Tue, 4 Apr 2017 14:28:02 +0300 Subject: [PATCH] Maven: pom.xml tags beyond are regarded as invalid (IDEA-89560) --- .../MavenDomElementDescriptorProvider.java | 18 +++++++ .../idea/maven/dom/MavenXmlExtension.java | 52 +++++++++++++++++++ .../src/main/resources/META-INF/plugin.xml | 2 +- 3 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenXmlExtension.java diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenDomElementDescriptorProvider.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenDomElementDescriptorProvider.java index d5b47c932b7e..050cad612dec 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenDomElementDescriptorProvider.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenDomElementDescriptorProvider.java @@ -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); } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenXmlExtension.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenXmlExtension.java new file mode 100644 index 000000000000..029e6931bc2d --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenXmlExtension.java @@ -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); + } +} diff --git a/plugins/maven/src/main/resources/META-INF/plugin.xml b/plugins/maven/src/main/resources/META-INF/plugin.xml index bd1911b8887f..1c9bbeb3a12f 100644 --- a/plugins/maven/src/main/resources/META-INF/plugin.xml +++ b/plugins/maven/src/main/resources/META-INF/plugin.xml @@ -116,7 +116,7 @@ - +