diff --git a/plugins/devkit/devkit-core/resources/schemas/descriptor-documentation-schema.json b/plugins/devkit/devkit-core/resources/schemas/descriptor-documentation-schema.json index 0bec803e9d91..b389ba913ea6 100644 --- a/plugins/devkit/devkit-core/resources/schemas/descriptor-documentation-schema.json +++ b/plugins/devkit/devkit-core/resources/schemas/descriptor-documentation-schema.json @@ -44,6 +44,10 @@ "type": "string" } }, + "namespace": { + "type": "string", + "description": "Element namespace." + }, "since": { "type": "string", "description": "Version since the element is available." diff --git a/plugins/devkit/devkit-core/src/documentation/AbstractXmlDescriptorDocumentationTargetProvider.kt b/plugins/devkit/devkit-core/src/documentation/AbstractXmlDescriptorDocumentationTargetProvider.kt index 6c3e4274e730..84e939913117 100644 --- a/plugins/devkit/devkit-core/src/documentation/AbstractXmlDescriptorDocumentationTargetProvider.kt +++ b/plugins/devkit/devkit-core/src/documentation/AbstractXmlDescriptorDocumentationTargetProvider.kt @@ -60,8 +60,8 @@ internal abstract class AbstractXmlDescriptorDocumentationTargetProvider : PsiDo private fun getIsAttributeAndPath(element: PsiElement, originalElement: PsiElement): Pair>? { val context = findContextElement(originalElement) ?: return null - val elementName = (element as? PsiNamedElement)?.name ?: return null - if (elementName == (context as? PsiNamedElement)?.name) { // assume no parent and child with the same name + val elementName = getElementName(element) ?: return null + if (elementName == getContextElementName (context)) { // assume no parent and child with the same name return (context is XmlAttribute) to getXmlElementPath(context) } // handle lookup element @@ -72,6 +72,18 @@ internal abstract class AbstractXmlDescriptorDocumentationTargetProvider : PsiDo return isAttribute to (parentPath + elementName) } + private fun getElementName(element: PsiElement): String? { + // because in case of elements defined with XSD: + if (element is XmlTag && element.containingFile.virtualFile.extension == "xsd") { + return element.getAttribute("name")?.value + } + return (element as? PsiNamedElement)?.name + } + + private fun getContextElementName(context: PsiElement): String? { + return (context as? XmlTag)?.localName ?: (context as? PsiNamedElement)?.name + } + private fun findContextElement(context: PsiElement): XmlElement? { if (context is PsiWhiteSpace) { val prevXmlElement = context.siblings(forward = false, withSelf = false) diff --git a/plugins/devkit/devkit-core/src/documentation/DocumentationContent.kt b/plugins/devkit/devkit-core/src/documentation/DocumentationContent.kt index adbc73b69657..529a73a37edf 100644 --- a/plugins/devkit/devkit-core/src/documentation/DocumentationContent.kt +++ b/plugins/devkit/devkit-core/src/documentation/DocumentationContent.kt @@ -68,6 +68,7 @@ internal data class Element( var name: String? = null, var descriptiveName: String? = null, var sdkDocsFixedPath: List = emptyList(), + var namespace: String? = null, var since: String? = null, var until: String? = null, var deprecatedSince: String? = null, diff --git a/plugins/devkit/devkit-core/src/documentation/DocumentationRenderer.kt b/plugins/devkit/devkit-core/src/documentation/DocumentationRenderer.kt index d6b9e188ed9f..67eebae97655 100644 --- a/plugins/devkit/devkit-core/src/documentation/DocumentationRenderer.kt +++ b/plugins/devkit/devkit-core/src/documentation/DocumentationRenderer.kt @@ -171,6 +171,7 @@ internal class DocumentationRenderer(private val project: Project) { appendDeprecation(element.deprecatedSince, element.deprecationNote) appendSinceUntil(element.since, element.until) element.description?.trim()?.let { appendLine("$it\n") } + appendNamespace(element.namespace) appendRequirement(element.requirement) appendDefaultValue(element.defaultValue) appendAttributes(element.attributes) @@ -250,6 +251,12 @@ internal class DocumentationRenderer(private val project: Project) { } } + private fun StringBuilder.appendNamespace(namespace: String?) { + if (namespace == null) return + appendLine("$HEADER_LEVEL Namespace") + appendLine("`$namespace`") + } + private fun StringBuilder.appendRequirement(requirement: Requirement?) { if (requirement == null) return val requiredText = when (requirement.required) { diff --git a/plugins/devkit/devkit-java-tests/testData/documentation/xml-plugin-descriptor-documentation-test.yaml b/plugins/devkit/devkit-java-tests/testData/documentation/xml-plugin-descriptor-documentation-test.yaml index 3e200534be0c..ad7e5e0fc937 100644 --- a/plugins/devkit/devkit-java-tests/testData/documentation/xml-plugin-descriptor-documentation-test.yaml +++ b/plugins/devkit/devkit-java-tests/testData/documentation/xml-plugin-descriptor-documentation-test.yaml @@ -284,6 +284,22 @@ elements: name: internalChildElement #language=Markdown description: Description of `internalChildElement`. + - element: + name: xi:include + namespace: xmlns:xi="http://www.w3.org/2001/XInclude" + #language=Markdown + description: Description of `xi:include`. + attributes: + - attribute: + name: href + #language=Markdown + description: Description of `xi:include@href`. + children: + - element: + name: xi:fallback + namespace: xmlns:xi="http://www.w3.org/2001/XInclude" + #language=Markdown + description: Description of `xi:fallback`. - element: name: "*" attributes: diff --git a/plugins/devkit/devkit-java-tests/testSrc/org/jetbrains/idea/devkit/documentation/XmlDescriptorDocumentationProviderTest.kt b/plugins/devkit/devkit-java-tests/testSrc/org/jetbrains/idea/devkit/documentation/XmlDescriptorDocumentationProviderTest.kt index c56097a97928..fcd70dd516d4 100644 --- a/plugins/devkit/devkit-java-tests/testSrc/org/jetbrains/idea/devkit/documentation/XmlDescriptorDocumentationProviderTest.kt +++ b/plugins/devkit/devkit-java-tests/testSrc/org/jetbrains/idea/devkit/documentation/XmlDescriptorDocumentationProviderTest.kt @@ -46,6 +46,7 @@ class XmlDescriptorDocumentationProviderTest : CodeInsightFixtureTestCase<elementWithChildrenDescription>" + "
  • <internalElement> internal
  • " + "
  • <elementWithInternalLinks> internal
  • " + + "
  • <xi:include>
  • " + "" ) } @@ -434,6 +435,38 @@ class XmlDescriptorDocumentationProviderTest : CodeInsightFixtureTestCase + lude href="any"/> + + """.trimIndent(), + "

    <root> / <xi:include>


    \n" + + "Description of xi:include.
    Namespace

    xmlns:xi="http://www.w3.org/2001/XInclude"" + + "

    Attributes
    " + + "" + + "
    Children
    " + + "" + ) + } + + fun `test attribute of element with namespace`() { + doTestDocContains( + """ + + ef="any"/> + + """.trimIndent(), + "

    <root> / <xi:include> / @href


    \n" + + "Description of xi:include@href." + ) + } + fun `test element not included in the doc_provider context should not be documented`() { doTestDoesNotProvideDoc( """