@Override void verifyFilter(SourceSectionFilter filter) { Set<Class<?>> providedTags = getProvidedTags(language); // filters must not reference tags not declared in @RequiredTags Set<Class<?>> referencedTags = filter.getReferencedTags(); if (!providedTags.containsAll(referencedTags)) { Set<Class<?>> missingTags = new HashSet<>(referencedTags); missingTags.removeAll(providedTags); Set<Class<?>> allTags = new LinkedHashSet<>(providedTags); allTags.addAll(missingTags); StringBuilder builder = new StringBuilder("{"); String sep = ""; for (Class<?> tag : allTags) { builder.append(sep); builder.append(tag.getSimpleName()); sep = ", "; } builder.append("}"); throw new IllegalArgumentException(String.format("The attached filter %s references the following tags %s which are not declared as provided by the language. " + "To fix this annotate the language class %s with @%s(%s).", filter, missingTags, language.getClass().getName(), ProvidedTags.class.getSimpleName(), builder)); } }
@Override void verifyFilter(SourceSectionFilter filter) { Set<Class<?>> providedTags = getProvidedTags(languageInfo); // filters must not reference tags not declared in @RequiredTags Set<Class<?>> referencedTags = filter.getReferencedTags(); if (!providedTags.containsAll(referencedTags)) { Set<Class<?>> missingTags = new HashSet<>(referencedTags); missingTags.removeAll(providedTags); Set<Class<?>> allTags = new LinkedHashSet<>(providedTags); allTags.addAll(missingTags); StringBuilder builder = new StringBuilder("{"); String sep = ""; for (Class<?> tag : allTags) { builder.append(sep); builder.append(tag.getSimpleName()); sep = ", "; } builder.append("}"); Nodes langAccess = AccessorInstrumentHandler.nodesAccess(); TruffleLanguage<?> lang = langAccess.getLanguageSpi(languageInfo); throw new IllegalArgumentException(String.format("The attached filter %s references the following tags %s which are not declared as provided by the language. " + "To fix this annotate the language class %s with @%s(%s).", filter, missingTags, lang.getClass().getName(), ProvidedTags.class.getSimpleName(), builder)); } }
Set<Class<?>> getProvidedTags(Node root) { return getProvidedTags(root.getRootNode().getLanguageInfo()); }
private static Set<Class<?>> getProvidedTags(Node node) { Objects.requireNonNull(node); RootNode root = node.getRootNode(); if (root == null) { return Collections.emptySet(); } Object sourceVM = InstrumentationHandler.AccessorInstrumentHandler.nodesAccess().getSourceVM(root); if (sourceVM == null) { return Collections.emptySet(); } InstrumentationHandler handler = (InstrumentationHandler) InstrumentationHandler.AccessorInstrumentHandler.engineAccess().getInstrumentationHandler(sourceVM); return handler.getProvidedTags(node); }
final Set<Class<?>> queryTagsImpl(Node node, LanguageInfo onlyLanguage) { SourceSection sourceSection = node.getSourceSection(); if (!InstrumentationHandler.isInstrumentableNode(node, sourceSection)) { return Collections.emptySet(); } RootNode root = node.getRootNode(); if (root == null) { return Collections.emptySet(); } if (onlyLanguage != null && root.getLanguageInfo() != onlyLanguage) { throw new IllegalArgumentException("The language instrumenter cannot query tags of nodes of other languages."); } Set<Class<?>> providedTags = getProvidedTags(root); if (providedTags.isEmpty()) { return Collections.emptySet(); } Set<Class<?>> tags = new HashSet<>(); for (Class<?> providedTag : providedTags) { if (hasTagImpl(providedTags, node, providedTag)) { tags.add(providedTag); } } return Collections.unmodifiableSet(tags); }
final Set<Class<?>> queryTagsImpl(Node node, LanguageInfo onlyLanguage) { SourceSection sourceSection = node.getSourceSection(); if (!InstrumentationHandler.isInstrumentableNode(node, sourceSection)) { return Collections.emptySet(); } RootNode root = node.getRootNode(); if (root == null) { return Collections.emptySet(); } if (onlyLanguage != null && root.getLanguageInfo() != onlyLanguage) { throw new IllegalArgumentException("The language instrumenter cannot query tags of nodes of other languages."); } Set<Class<?>> providedTags = getProvidedTags(root); if (providedTags.isEmpty()) { return Collections.emptySet(); } Set<Class<?>> tags = new HashSet<>(); for (Class<?> providedTag : providedTags) { if (hasTagImpl(providedTags, node, providedTag)) { tags.add(providedTag); } } return Collections.unmodifiableSet(tags); }
Set<Class<?>> getProvidedTags(Node root) { return getProvidedTags(AccessorInstrumentHandler.nodesAccess().getLanguage(root.getRootNode())); }
final EventContext getInputContext(int index) { EventContext[] contexts = inputContexts; if (contexts == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); ProbeNode probe = findProbe(); EventContext thisContext = probe.context; RootNode rootNode = getRootNode(); Set<Class<?>> providedTags = probe.handler.getProvidedTags(rootNode); inputContexts = contexts = findChildContexts(getBinding(), rootNode, providedTags, thisContext.getInstrumentedNode(), thisContext.getInstrumentedSourceSection(), inputCount); } if (contexts == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); throw new IllegalStateException("Input event context not yet available. They are only available during event notifications."); } return contexts[index]; }
final EventContext getInputContext(int index) { EventContext[] contexts = inputContexts; if (contexts == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); ProbeNode probe = findProbe(); EventContext thisContext = probe.context; RootNode rootNode = getRootNode(); Set<Class<?>> providedTags = probe.handler.getProvidedTags(rootNode); inputContexts = contexts = findChildContexts(getBinding(), rootNode, providedTags, thisContext.getInstrumentedNode(), thisContext.getInstrumentedSourceSection(), inputCount); } if (contexts == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); throw new IllegalStateException("Input event context not yet available. They are only available during event notifications."); } return contexts[index]; }
Set<Class<?>> providedTags = getProvidedTags(rootNode); EventChainNode root = null; EventChainNode parent = null;
Set<Class<?>> providedTags = getProvidedTags(rootNode); EventChainNode root = null; EventChainNode parent = null;
private void visitRoot(RootNode root, final Node node, final AbstractNodeVisitor visitor, boolean forceRootBitComputation) { if (TRACE) { trace("BEGIN: Visit root %s for %s%n", root.toString(), visitor); } visitor.root = root; visitor.providedTags = getProvidedTags(root); visitor.rootSourceSection = root.getSourceSection(); visitor.rootBits = RootNodeBits.get(visitor.root); if (visitor.shouldVisit() || forceRootBitComputation) { if (forceRootBitComputation) { visitor.computingRootNodeBits = RootNodeBits.isUninitialized(visitor.rootBits) ? RootNodeBits.getAll() : visitor.rootBits; } else if (RootNodeBits.isUninitialized(visitor.rootBits)) { visitor.computingRootNodeBits = RootNodeBits.getAll(); } if (TRACE) { trace("BEGIN: Traverse root %s for %s%n", root.toString(), visitor); } visitor.visit(node); if (TRACE) { trace("END: Traverse root %s for %s%n", root.toString(), visitor); } if (!RootNodeBits.isUninitialized(visitor.computingRootNodeBits)) { RootNodeBits.set(visitor.root, visitor.computingRootNodeBits); } } if (TRACE) { trace("END: Visited root %s for %s%n", root.toString(), visitor); } }
private void visitRoot(RootNode root, final Node node, final AbstractNodeVisitor visitor, boolean forceRootBitComputation) { if (TRACE) { trace("BEGIN: Visit root %s for %s%n", root.toString(), visitor); } visitor.root = root; visitor.providedTags = getProvidedTags(root); visitor.rootSourceSection = root.getSourceSection(); visitor.rootBits = RootNodeBits.get(visitor.root); if (visitor.shouldVisit() || forceRootBitComputation) { if (forceRootBitComputation) { visitor.computingRootNodeBits = RootNodeBits.isUninitialized(visitor.rootBits) ? RootNodeBits.getAll() : visitor.rootBits; } else if (RootNodeBits.isUninitialized(visitor.rootBits)) { visitor.computingRootNodeBits = RootNodeBits.getAll(); } if (TRACE) { trace("BEGIN: Traverse root %s for %s%n", root.toString(), visitor); } visitor.visit(node); if (TRACE) { trace("END: Traverse root %s for %s%n", root.toString(), visitor); } if (!RootNodeBits.isUninitialized(visitor.computingRootNodeBits)) { RootNodeBits.set(visitor.root, visitor.computingRootNodeBits); } } if (TRACE) { trace("END: Visited root %s for %s%n", root.toString(), visitor); } }