IJPL-159596 refactor XmlSchemaProvider

GitOrigin-RevId: d859bb645f949a0b494371d7b1b58c92087f1455
This commit is contained in:
Vladimir Krivosheev
2024-08-05 09:13:22 +02:00
committed by intellij-monorepo-bot
parent ba2718bc8b
commit 18f024e481

View File

@@ -1,78 +1,66 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. // Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.xml
package com.intellij.xml; import com.intellij.openapi.extensions.ExtensionPointName
import com.intellij.openapi.module.Module
import com.intellij.openapi.module.ModuleUtilCore
import com.intellij.openapi.project.DumbService.Companion.getInstance
import com.intellij.openapi.project.PossiblyDumbAware
import com.intellij.psi.PsiFile
import com.intellij.psi.xml.XmlFile
import org.jetbrains.annotations.NonNls
import com.intellij.openapi.extensions.ExtensionPointName; abstract class XmlSchemaProvider : PossiblyDumbAware {
import com.intellij.openapi.module.Module; companion object {
import com.intellij.openapi.module.ModuleUtilCore; @JvmField
import com.intellij.openapi.project.DumbService; val EP_NAME: ExtensionPointName<XmlSchemaProvider> = ExtensionPointName<XmlSchemaProvider>("com.intellij.xml.schemaProvider")
import com.intellij.openapi.project.PossiblyDumbAware;
import com.intellij.psi.PsiFile;
import com.intellij.psi.xml.XmlFile;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collections; @JvmStatic
import java.util.List; fun getAvailableProviders(file: XmlFile): List<XmlSchemaProvider> {
import java.util.Set; return EP_NAME.extensionList.filter { it.isAvailable(file) }
}
/** @JvmStatic
* @author Dmitry Avdeev fun findSchema(namespace: @NonNls String, module: Module?, file: PsiFile): XmlFile? {
*/ if (file.getProject().isDefault()) {
public abstract class XmlSchemaProvider implements PossiblyDumbAware { return null
public static final ExtensionPointName<XmlSchemaProvider> EP_NAME = new ExtensionPointName<>("com.intellij.xml.schemaProvider"); }
public abstract @Nullable XmlFile getSchema(@NotNull @NonNls String url, @Nullable Module module, final @NotNull PsiFile baseFile); for (provider in EP_NAME.extensionList) {
if (!getInstance(file.getProject()).isUsableInCurrentContext(provider)) {
continue
}
public boolean isAvailable(final @NotNull XmlFile file) { if (file is XmlFile && !provider.isAvailable(file)) {
return false; continue
}
provider.getSchema(namespace, module, file)?.let {
return it
}
}
return null
}
@JvmStatic
fun findSchema(namespace: @NonNls String, baseFile: PsiFile): XmlFile? {
return findSchema(namespace = namespace, module = ModuleUtilCore.findModuleForPsiElement(baseFile), file = baseFile)
}
} }
public static @NotNull List<XmlSchemaProvider> getAvailableProviders(@NotNull XmlFile file) { abstract fun getSchema(url: @NonNls String, module: Module?, baseFile: PsiFile): XmlFile?
return ContainerUtil.findAll(EP_NAME.getExtensionList(), xmlSchemaProvider -> xmlSchemaProvider.isAvailable(file));
} open fun isAvailable(file: XmlFile): Boolean = false
/** /**
* Provides specific namespaces for given XML file. * Provides specific namespaces for given XML file.
* *
* @param file XML or JSP file. * @param file XML or JSP file.
* @param tagName optional * @param tagName optional
* @return available namespace uris, or {@code null} if the provider did not recognize the file. * @return available namespace uris, or `null` if the provider did not recognize the file.
*/ */
public @NotNull Set<String> getAvailableNamespaces(final @NotNull XmlFile file, final @Nullable String tagName) { open fun getAvailableNamespaces(file: XmlFile, tagName: String?): Set<String> = emptySet()
return Collections.emptySet();
}
public @Nullable String getDefaultPrefix(@NotNull @NonNls String namespace, final @NotNull XmlFile context) { open fun getDefaultPrefix(namespace: @NonNls String, context: XmlFile): String? = null
return null;
}
public @Nullable Set<String> getLocations(@NotNull @NonNls String namespace, final @NotNull XmlFile context) { open fun getLocations(namespace: @NonNls String, context: XmlFile): Set<String>? = null
return null;
}
public static @Nullable XmlFile findSchema(@NotNull @NonNls String namespace, @Nullable Module module, @NotNull PsiFile file) {
if (file.getProject().isDefault()) return null;
for (XmlSchemaProvider provider : EP_NAME.getExtensionList()) {
if (!DumbService.getInstance(file.getProject()).isUsableInCurrentContext(provider)) {
continue;
}
if (file instanceof XmlFile && !provider.isAvailable((XmlFile)file)) {
continue;
}
final XmlFile schema = provider.getSchema(namespace, module, file);
if (schema != null) {
return schema;
}
}
return null;
}
public static @Nullable XmlFile findSchema(@NotNull @NonNls String namespace, @NotNull PsiFile baseFile) {
final Module module = ModuleUtilCore.findModuleForPsiElement(baseFile);
return findSchema(namespace, module, baseFile);
}
} }