diff --git a/plugins/htmltools/src/com/intellij/htmltools/xml/util/HtmlReferenceProvider.java b/plugins/htmltools/src/com/intellij/htmltools/xml/util/HtmlReferenceProvider.java index 535b388ebc8b..45d3cd13a7dd 100644 --- a/plugins/htmltools/src/com/intellij/htmltools/xml/util/HtmlReferenceProvider.java +++ b/plugins/htmltools/src/com/intellij/htmltools/xml/util/HtmlReferenceProvider.java @@ -11,6 +11,7 @@ import com.intellij.openapi.fileTypes.FileTypeManager; import com.intellij.openapi.fileTypes.LanguageFileType; import com.intellij.openapi.paths.GlobalPathReferenceProvider; import com.intellij.openapi.paths.PathReferenceManager; +import com.intellij.openapi.util.NotNullLazyValue; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; @@ -56,7 +57,8 @@ public final class HtmlReferenceProvider extends PsiReferenceProvider { private static final @NonNls String SRC_ATTR_NAME = "src"; private static final @NonNls String JAVASCRIPT_PREFIX = "javascript:"; - public static final FileType[] IMAGE_FILE_TYPES = new FileType[]{ImageFileTypeManager.getInstance().getImageFileType()}; + public static final @NotNull NotNullLazyValue IMAGE_FILE_TYPES = + NotNullLazyValue.lazy(() -> new FileType[]{ImageFileTypeManager.getInstance().getImageFileType()}); public static final String LABELLEDBY = "aria-labelledby"; public static ElementFilter getFilter() { @@ -102,68 +104,68 @@ public final class HtmlReferenceProvider extends PsiReferenceProvider { tag.getAttributeValue("type") != null && "image".equalsIgnoreCase(tag.getAttributeValue("type")) ) - ) || + ) || ( attrName.equalsIgnoreCase(HREF_ATTRIBUTE_NAME) && ( tagName.equalsIgnoreCase("a") || - tagName.equalsIgnoreCase("area") || - tagName.equalsIgnoreCase("link") - ) - ) || + tagName.equalsIgnoreCase("area") || + tagName.equalsIgnoreCase("link") + ) + ) || ( attrName.equalsIgnoreCase(USEMAP_ATTR_NAME) && - (tagName.equalsIgnoreCase(SizeReference.IMAGE_TAG_NAME) || - tagName.equalsIgnoreCase("object")) - ) || + (tagName.equalsIgnoreCase(SizeReference.IMAGE_TAG_NAME) || + tagName.equalsIgnoreCase("object")) + ) || ( attrName.equalsIgnoreCase("action") && - tagName.equalsIgnoreCase("form") - ) || - attrName.equalsIgnoreCase("background") || + tagName.equalsIgnoreCase("form") + ) || + attrName.equalsIgnoreCase("background") || ( ( attrName.equalsIgnoreCase(NAME_ATTR_LOCAL_NAME) || - attrName.equalsIgnoreCase(HtmlUtil.ID_ATTRIBUTE_NAME) || - attrName.equalsIgnoreCase(HtmlUtil.CLASS_ATTRIBUTE_NAME) - ) && - tag.getNamespacePrefix().length() == 0 - ) || + attrName.equalsIgnoreCase(HtmlUtil.ID_ATTRIBUTE_NAME) || + attrName.equalsIgnoreCase(HtmlUtil.CLASS_ATTRIBUTE_NAME) + ) && + tag.getNamespacePrefix().length() == 0 + ) || ( (attrName.equalsIgnoreCase(SizeReference.WIDTH_ATTR_NAME) || - attrName.equalsIgnoreCase(SizeReference.HEIGHT_ATTR_NAME) - ) && - (tagName.equalsIgnoreCase(SizeReference.IMAGE_TAG_NAME)) - ) || - (attrName.equalsIgnoreCase(ContentTypeReference.TYPE_ATTR_NAME) && - (tagName.equalsIgnoreCase(HtmlUtil.STYLE_TAG_NAME) || - tagName.equalsIgnoreCase(HtmlUtil.SCRIPT_TAG_NAME) - ) - ) || - (attrName.equalsIgnoreCase(ColorReference.BG_COLOR_ATTR_NAME) && - ColorReference.ourBgColorTagNames.contains(StringUtil.toLowerCase(tagName)) - ) || + attrName.equalsIgnoreCase(SizeReference.HEIGHT_ATTR_NAME) + ) && + (tagName.equalsIgnoreCase(SizeReference.IMAGE_TAG_NAME)) + ) || + (attrName.equalsIgnoreCase(ContentTypeReference.TYPE_ATTR_NAME) && + (tagName.equalsIgnoreCase(HtmlUtil.STYLE_TAG_NAME) || + tagName.equalsIgnoreCase(HtmlUtil.SCRIPT_TAG_NAME) + ) + ) || + (attrName.equalsIgnoreCase(ColorReference.BG_COLOR_ATTR_NAME) && + ColorReference.ourBgColorTagNames.contains(StringUtil.toLowerCase(tagName)) + ) || ( attrName.equalsIgnoreCase(ColorReference.COLOR_ATTR_NAME) && - (tagName.equalsIgnoreCase("basefont") || - tagName.equalsIgnoreCase("font") - ) - ) || + (tagName.equalsIgnoreCase("basefont") || + tagName.equalsIgnoreCase("font") + ) + ) || ( tagName.equalsIgnoreCase("body") && - (attrName.equalsIgnoreCase(ColorReference.TEXT_ATTR_NAME) || - attrName.equalsIgnoreCase(ColorReference.LINK_ATTR_NAME) || - attrName.equalsIgnoreCase(ColorReference.VLINK_ATTR_NAME) || - attrName.equalsIgnoreCase(ColorReference.ALINK_ATTR_NAME) - ) - ) || - (tagName.equalsIgnoreCase("label") && - attrName.equalsIgnoreCase(FOR_ATTR_NAME) - ) || - (attrName.equalsIgnoreCase(MicrodataUtil.ITEM_REF) && - tag.getAttribute(MicrodataUtil.ITEM_SCOPE) != null - ) || - (attrName.equalsIgnoreCase("data") && - tagName.equalsIgnoreCase("object") + (attrName.equalsIgnoreCase(ColorReference.TEXT_ATTR_NAME) || + attrName.equalsIgnoreCase(ColorReference.LINK_ATTR_NAME) || + attrName.equalsIgnoreCase(ColorReference.VLINK_ATTR_NAME) || + attrName.equalsIgnoreCase(ColorReference.ALINK_ATTR_NAME) + ) + ) || + (tagName.equalsIgnoreCase("label") && + attrName.equalsIgnoreCase(FOR_ATTR_NAME) + ) || + (attrName.equalsIgnoreCase(MicrodataUtil.ITEM_REF) && + tag.getAttribute(MicrodataUtil.ITEM_SCOPE) != null + ) || + (attrName.equalsIgnoreCase("data") && + tagName.equalsIgnoreCase("object") )|| - (attrName.equalsIgnoreCase("poster") && - tagName.equalsIgnoreCase("video") + (attrName.equalsIgnoreCase("poster") && + tagName.equalsIgnoreCase("video") )|| - (attrName.equalsIgnoreCase("srcset") && - (tagName.equalsIgnoreCase(SizeReference.IMAGE_TAG_NAME) || tagName.equals("source")) + (attrName.equalsIgnoreCase("srcset") && + (tagName.equalsIgnoreCase(SizeReference.IMAGE_TAG_NAME) || tagName.equals("source")) )|| - (attrName.equalsIgnoreCase(LABELLEDBY)) + (attrName.equalsIgnoreCase(LABELLEDBY)) ; } return false; @@ -192,18 +194,18 @@ public final class HtmlReferenceProvider extends PsiReferenceProvider { refs = MicrodataUtil.getReferencesForAttributeValue(value, (token, offset1) -> new HtmlIdRefReference(value, offset1)); } else if(ColorReference.BG_COLOR_ATTR_NAME.equalsIgnoreCase(localName) || - ColorReference.COLOR_ATTR_NAME.equalsIgnoreCase(localName) || - ColorReference.TEXT_ATTR_NAME.equalsIgnoreCase(localName) || - ColorReference.LINK_ATTR_NAME.equalsIgnoreCase(localName) || - ColorReference.VLINK_ATTR_NAME.equalsIgnoreCase(localName) || - ColorReference.ALINK_ATTR_NAME.equalsIgnoreCase(localName) - ) { + ColorReference.COLOR_ATTR_NAME.equalsIgnoreCase(localName) || + ColorReference.TEXT_ATTR_NAME.equalsIgnoreCase(localName) || + ColorReference.LINK_ATTR_NAME.equalsIgnoreCase(localName) || + ColorReference.VLINK_ATTR_NAME.equalsIgnoreCase(localName) || + ColorReference.ALINK_ATTR_NAME.equalsIgnoreCase(localName) + ) { refs = new PsiReference[] { new ColorReference(element, offset)}; } else if(ContentTypeReference.TYPE_ATTR_NAME.equalsIgnoreCase(localName)) { refs = new PsiReference[] { new ContentTypeReference(element)}; } else if (SizeReference.WIDTH_ATTR_NAME.equalsIgnoreCase(localName) || - SizeReference.HEIGHT_ATTR_NAME.equalsIgnoreCase(localName)) { + SizeReference.HEIGHT_ATTR_NAME.equalsIgnoreCase(localName)) { refs = new PsiReference[] { new SizeReference(element, offset)}; } else { if (HtmlUtil.ID_ATTRIBUTE_NAME.equalsIgnoreCase(localName)) { @@ -221,10 +223,12 @@ public final class HtmlReferenceProvider extends PsiReferenceProvider { ndx += token.length(); } references.toArray(refs = new PsiReference[references.size()]); - } else if (SRC_ATTR_NAME.equalsIgnoreCase(localName) && SizeReference.IMAGE_TAG_NAME.equalsIgnoreCase(tag.getName())) { - refs = PathReferenceManager.getInstance().createReferences(element, false, false, true, IMAGE_FILE_TYPES); - } else if (("srcset".equalsIgnoreCase(localName) && - (SizeReference.IMAGE_TAG_NAME.equalsIgnoreCase(tag.getName()) || "source".equals(tag.getName())) && + } + else if (SRC_ATTR_NAME.equalsIgnoreCase(localName) && SizeReference.IMAGE_TAG_NAME.equalsIgnoreCase(tag.getName())) { + refs = PathReferenceManager.getInstance().createReferences(element, false, false, true, IMAGE_FILE_TYPES.get()); + } + else if (("srcset".equalsIgnoreCase(localName) && + (SizeReference.IMAGE_TAG_NAME.equalsIgnoreCase(tag.getName()) || "source".equals(tag.getName())) && PsiTreeUtil.getChildOfType(element, OuterLanguageElement.class) == null)) { final List result = new ArrayList<>(); @@ -234,14 +238,15 @@ public final class HtmlReferenceProvider extends PsiReferenceProvider { while (innerIndex < imageAndSize.length() && Character.isWhitespace(imageAndSize.charAt(innerIndex))) innerIndex++; if (innerIndex < imageAndSize.length()) { final String image = imageAndSize.substring(innerIndex).split(" ", 2)[0]; - Collections.addAll(result, new FileReferenceSet(image, element, index + innerIndex, null, true, false, IMAGE_FILE_TYPES).getAllReferences()); + Collections.addAll(result, new FileReferenceSet(image, element, index + innerIndex, null, true, false, + IMAGE_FILE_TYPES.get()).getAllReferences()); } index += imageAndSize.length() + 1; } refs = result.toArray(PsiReference.EMPTY_ARRAY); } else if (("data".equals(localName) && "object".equalsIgnoreCase(tag.getName())) || ("poster".equals(localName) && "video".equalsIgnoreCase(tag.getName()))) { - refs = PathReferenceManager.getInstance().createReferences(element, false, false, true); + refs = PathReferenceManager.getInstance().createReferences(element, false, false, true); } else if (HREF_ATTRIBUTE_NAME.equalsIgnoreCase(localName) && "link".equalsIgnoreCase(tag.getName())) { if (!HtmlUtil.hasHtmlPrefix(text)) { @@ -275,13 +280,13 @@ public final class HtmlReferenceProvider extends PsiReferenceProvider { return findFileType("text/css"); } if (type.contains("icon") || type.contains("image")) { - return IMAGE_FILE_TYPES; + return IMAGE_FILE_TYPES.get(); } } return null; } - private static FileType[] findFileType(@Nullable String mimeType) { + private static FileType[] findFileType(@Nullable String mimeType) { final Collection languages = Language.findInstancesByMimeType(mimeType != null ? mimeType.trim() : null); FileType fileType = ContainerUtil.find(FileTypeManager.getInstance().getRegisteredFileTypes(), type -> type instanceof LanguageFileType && languages.contains(((LanguageFileType)type).getLanguage()));