Set<Class<?>> getProvidedTags(TruffleLanguage<?> lang) { if (lang == null) { return Collections.emptySet(); } Class<?> languageClass = lang.getClass(); Set<Class<?>> tags = cachedProvidedTags.get(languageClass); if (tags == null) { ProvidedTags languageTags = languageClass.getAnnotation(ProvidedTags.class); List<Class<?>> languageTagsList = languageTags != null ? Arrays.asList(languageTags.value()) : Collections.<Class<?>> emptyList(); tags = Collections.unmodifiableSet(new HashSet<>(languageTagsList)); cachedProvidedTags.put(languageClass, tags); } return tags; }
@ProvidedTags(StandardTags.RootTag.class) public final class RegexLanguage extends TruffleLanguage<Void> {
Set<Class<?>> getProvidedTags(LanguageInfo language) { Nodes nodesAccess = AccessorInstrumentHandler.nodesAccess(); TruffleLanguage<?> lang = nodesAccess.getLanguageSpi(language); if (lang == null) { return Collections.emptySet(); } Class<?> languageClass = lang.getClass(); Set<Class<?>> tags = cachedProvidedTags.get(languageClass); if (tags == null) { ProvidedTags languageTags = languageClass.getAnnotation(ProvidedTags.class); List<Class<?>> languageTagsList = languageTags != null ? Arrays.asList(languageTags.value()) : Collections.<Class<?>> emptyList(); tags = Collections.unmodifiableSet(new HashSet<>(languageTagsList)); cachedProvidedTags.put(languageClass, tags); } return tags; }
/** * Finds a provided tag by the language using its {@link Tag.Identifier identifier}. If the * language implementation class is not yet loaded then this method will force the loading. * Therefore it is not recommended to iterate over the entire list of languages and request all * provided tags. It is guaranteed that there is only one provided tag class per tag identifier * and language. For different languages the same tag id might refer to different tag classes. * * @since 0.33 */ @SuppressWarnings("unchecked") public static Class<? extends Tag> findProvidedTag(LanguageInfo language, String tagId) { Objects.requireNonNull(language); Objects.requireNonNull(tagId); EngineSupport engine = AccessorInstrumentHandler.engineAccess(); if (engine == null) { return null; } Class<? extends TruffleLanguage<?>> lang = engine.getLanguageClass(language); ProvidedTags tags = lang.getAnnotation(ProvidedTags.class); if (tags != null) { for (Class<? extends Tag> tag : (Class<? extends Tag>[]) tags.value()) { String alias = getIdentifier(tag); if (alias != null && alias.equals(tagId)) { return tag; } } } return null; }
/** * Finds a provided tag by the language using its {@link Tag.Identifier identifier}. If the * language implementation class is not yet loaded then this method will force the loading. * Therefore it is not recommended to iterate over the entire list of languages and request all * provided tags. It is guaranteed that there is only one provided tag class per tag identifier * and language. For different languages the same tag id might refer to different tag classes. * * @since 0.33 */ @SuppressWarnings("unchecked") public static Class<? extends Tag> findProvidedTag(LanguageInfo language, String tagId) { Objects.requireNonNull(language); Objects.requireNonNull(tagId); EngineSupport engine = AccessorInstrumentHandler.engineAccess(); if (engine == null) { return null; } Class<? extends TruffleLanguage<?>> lang = engine.getLanguageClass(language); ProvidedTags tags = lang.getAnnotation(ProvidedTags.class); if (tags != null) { for (Class<? extends Tag> tag : (Class<? extends Tag>[]) tags.value()) { String alias = getIdentifier(tag); if (alias != null && alias.equals(tagId)) { return tag; } } } return null; }