@@ -270,6 +270,20 @@ module Make<
270270 NeutralSummaryCallable ( ) { this .getKind ( ) = "summary" }
271271 }
272272
273+ /**
274+ * A callable that has a neutral source model.
275+ */
276+ class NeutralSourceCallable extends NeutralCallableFinal {
277+ NeutralSourceCallable ( ) { this .getKind ( ) = "source" }
278+ }
279+
280+ /**
281+ * A callable that has a neutral sink model.
282+ */
283+ class NeutralSinkCallable extends NeutralCallableFinal {
284+ NeutralSinkCallable ( ) { this .getKind ( ) = "sink" }
285+ }
286+
273287 /**
274288 * A callable that has a neutral model.
275289 */
@@ -1739,6 +1753,37 @@ module Make<
17391753 )
17401754 }
17411755
1756+ final private class SourceOrSinkElementFinal = SourceOrSinkElement ;
1757+
1758+ bindingset [ this ]
1759+ private class SourceSinkModelCallableBase extends SourceOrSinkElementFinal {
1760+ /**
1761+ * Holds if there exists a manual model that applies to this.
1762+ */
1763+ final predicate hasManualModel ( ) { any ( Provenance p | this .hasProvenance ( p ) ) .isManual ( ) }
1764+
1765+ /**
1766+ * Holds if this has provenance `p`.
1767+ */
1768+ abstract predicate hasProvenance ( Provenance p ) ;
1769+ }
1770+
1771+ /**
1772+ * A callable that has a source model.
1773+ */
1774+ abstract class SourceModelCallable extends SourceSinkModelCallableBase {
1775+ bindingset [ this ]
1776+ SourceModelCallable ( ) { exists ( this ) }
1777+ }
1778+
1779+ /**
1780+ * A callable that has a sink model.
1781+ */
1782+ abstract class SinkModelCallable extends SourceSinkModelCallableBase {
1783+ bindingset [ this ]
1784+ SinkModelCallable ( ) { exists ( this ) }
1785+ }
1786+
17421787 /** A source or sink relevant for testing. */
17431788 signature class RelevantSourceOrSinkElementSig extends SourceOrSinkElement {
17441789 /** Gets the string representation of this callable used by `source/1` or `sink/1`. */
0 commit comments