@@ -92,6 +92,7 @@ export interface Snippet {
9292 */
9393 readonly dataType : BaseData | UnknownData ;
9494 readonly origin : Origin ;
95+ readonly possibleSideEffects : boolean ;
9596}
9697
9798export interface ResolvedSnippet extends Snippet {
@@ -105,11 +106,18 @@ class SnippetImpl implements Snippet {
105106 readonly value : unknown ;
106107 readonly dataType : BaseData | UnknownData ;
107108 readonly origin : Origin ;
109+ readonly possibleSideEffects : boolean ;
108110
109- constructor ( value : unknown , dataType : BaseData | UnknownData , origin : Origin ) {
111+ constructor (
112+ value : unknown ,
113+ dataType : BaseData | UnknownData ,
114+ origin : Origin ,
115+ possibleSideEffects : boolean ,
116+ ) {
110117 this . value = value ;
111118 this . dataType = dataType ;
112119 this . origin = origin ;
120+ this . possibleSideEffects = possibleSideEffects ;
113121 }
114122}
115123
@@ -121,12 +129,23 @@ export function isSnippetNumeric(snippet: Snippet) {
121129 return isNumericSchema ( snippet . dataType ) ;
122130}
123131
124- export function snip ( value : string , dataType : BaseData , origin : Origin ) : ResolvedSnippet ;
125- export function snip ( value : unknown , dataType : BaseData | UnknownData , origin : Origin ) : Snippet ;
132+ export function snip (
133+ value : string ,
134+ dataType : BaseData ,
135+ origin : Origin ,
136+ possibleSideEffects ?: boolean ,
137+ ) : ResolvedSnippet ;
138+ export function snip (
139+ value : unknown ,
140+ dataType : BaseData | UnknownData ,
141+ origin : Origin ,
142+ possibleSideEffects ?: boolean ,
143+ ) : Snippet ;
126144export function snip (
127145 value : unknown ,
128146 dataType : BaseData | UnknownData ,
129147 origin : Origin ,
148+ possibleSideEffects : boolean = true ,
130149) : Snippet | ResolvedSnippet {
131150 if ( DEV && isSnippet ( value ) ) {
132151 // An early error, but not worth checking every time in production
@@ -138,5 +157,30 @@ export function snip(
138157 // We don't care about attributes in snippet land, so we discard that information.
139158 undecorate ( dataType as BaseData ) ,
140159 origin ,
160+ possibleSideEffects ,
141161 ) ;
142162}
163+
164+ export function withDataType (
165+ dataType : BaseData | UnknownData ,
166+ snippet : ResolvedSnippet ,
167+ ) : ResolvedSnippet ;
168+ export function withDataType ( dataType : BaseData | UnknownData , snippet : Snippet ) : Snippet ;
169+ export function withDataType ( dataType : BaseData | UnknownData , snippet : Snippet ) : Snippet {
170+ return new SnippetImpl ( snippet . value , dataType , snippet . origin , snippet . possibleSideEffects ) ;
171+ }
172+
173+ export function withSideEffects (
174+ possibleSideEffects : boolean ,
175+ snippet : ResolvedSnippet ,
176+ ) : ResolvedSnippet ;
177+ export function withSideEffects ( possibleSideEffects : boolean , snippet : Snippet ) : Snippet ;
178+ export function withSideEffects ( possibleSideEffects : boolean , snippet : Snippet ) : Snippet {
179+ return new SnippetImpl ( snippet . value , snippet . dataType , snippet . origin , possibleSideEffects ) ;
180+ }
181+
182+ export function noSideEffects ( snippet : ResolvedSnippet ) : ResolvedSnippet ;
183+ export function noSideEffects ( snippet : Snippet ) : Snippet ;
184+ export function noSideEffects ( snippet : Snippet ) : Snippet {
185+ return withSideEffects ( /* possibleSideEffects */ false , snippet ) ;
186+ }
0 commit comments