@@ -97,95 +97,148 @@ public String getFunction() {
9797 }
9898 }
9999
100+ private static final class Types {
101+ private static final TypeParamType PARAM_TYPE_K = TypeParamType .create ("K" );
102+ private static final TypeParamType PARAM_TYPE_V = TypeParamType .create ("V" );
103+ private static final OptionalType OPTIONAL_TYPE_V = OptionalType .create (PARAM_TYPE_V );
104+ private static final ListType LIST_TYPE_V = ListType .create (PARAM_TYPE_V );
105+ private static final MapType MAP_TYPE_KV = MapType .create (PARAM_TYPE_K , PARAM_TYPE_V );
106+ }
107+
108+ /** Declarations for the optional extension library. */
109+ public enum OptionalDeclaration implements CelFunctionDecl .Declarer {
110+ OPTIONAL_OF (
111+ CelFunctionDecl .newFunctionDeclaration (
112+ Function .OPTIONAL_OF .getFunction (),
113+ CelOverloadDecl .newGlobalOverload (
114+ "optional_of" , Types .OPTIONAL_TYPE_V , Types .PARAM_TYPE_V ))),
115+ OPTIONAL_OF_NON_ZERO_VALUE (
116+ CelFunctionDecl .newFunctionDeclaration (
117+ Function .OPTIONAL_OF_NON_ZERO_VALUE .getFunction (),
118+ CelOverloadDecl .newGlobalOverload (
119+ "optional_ofNonZeroValue" , Types .OPTIONAL_TYPE_V , Types .PARAM_TYPE_V ))),
120+ OPTIONAL_NONE (
121+ CelFunctionDecl .newFunctionDeclaration (
122+ Function .OPTIONAL_NONE .getFunction (),
123+ CelOverloadDecl .newGlobalOverload ("optional_none" , Types .OPTIONAL_TYPE_V ))),
124+ OPTIONAL_VALUE (
125+ CelFunctionDecl .newFunctionDeclaration (
126+ Function .VALUE .getFunction (),
127+ CelOverloadDecl .newMemberOverload (
128+ "optional_value" , Types .PARAM_TYPE_V , Types .OPTIONAL_TYPE_V ))),
129+ OPTIONAL_HAS_VALUE (
130+ CelFunctionDecl .newFunctionDeclaration (
131+ Function .HAS_VALUE .getFunction (),
132+ CelOverloadDecl .newMemberOverload (
133+ "optional_hasValue" , SimpleType .BOOL , Types .OPTIONAL_TYPE_V ))),
134+ OPTIONAL_UNWRAP (
135+ CelFunctionDecl .newFunctionDeclaration (
136+ Function .OPTIONAL_UNWRAP .getFunction (),
137+ CelOverloadDecl .newGlobalOverload (
138+ "optional_unwrap_list" ,
139+ Types .LIST_TYPE_V ,
140+ ListType .create (Types .OPTIONAL_TYPE_V )))),
141+ OPTIONAL_OR (
142+ CelFunctionDecl .newFunctionDeclaration (
143+ "or" ,
144+ CelOverloadDecl .newMemberOverload (
145+ "optional_or_optional" ,
146+ Types .OPTIONAL_TYPE_V ,
147+ Types .OPTIONAL_TYPE_V ,
148+ Types .OPTIONAL_TYPE_V ))),
149+ OPTIONAL_OR_VALUE (
150+ CelFunctionDecl .newFunctionDeclaration (
151+ "orValue" ,
152+ CelOverloadDecl .newMemberOverload (
153+ "optional_orValue_value" ,
154+ Types .PARAM_TYPE_V ,
155+ Types .OPTIONAL_TYPE_V ,
156+ Types .PARAM_TYPE_V ))),
157+ OPTIONAL_SELECT (
158+ CelFunctionDecl .newFunctionDeclaration (
159+ Operator .OPTIONAL_SELECT .getFunction (),
160+ CelOverloadDecl .newGlobalOverload (
161+ "select_optional_field" ,
162+ Types .OPTIONAL_TYPE_V ,
163+ SimpleType .DYN ,
164+ SimpleType .STRING ))),
165+ OPTIONAL_INDEX (
166+ CelFunctionDecl .newFunctionDeclaration (
167+ Operator .OPTIONAL_INDEX .getFunction (),
168+ CelOverloadDecl .newGlobalOverload (
169+ "list_optindex_optional_int" ,
170+ Types .OPTIONAL_TYPE_V ,
171+ Types .LIST_TYPE_V ,
172+ SimpleType .INT ),
173+ CelOverloadDecl .newGlobalOverload (
174+ "optional_list_optindex_optional_int" ,
175+ Types .OPTIONAL_TYPE_V ,
176+ OptionalType .create (Types .LIST_TYPE_V ),
177+ SimpleType .INT ),
178+ CelOverloadDecl .newGlobalOverload (
179+ "map_optindex_optional_value" ,
180+ Types .OPTIONAL_TYPE_V ,
181+ Types .MAP_TYPE_KV ,
182+ Types .PARAM_TYPE_K ),
183+ CelOverloadDecl .newGlobalOverload (
184+ "optional_map_optindex_optional_value" ,
185+ Types .OPTIONAL_TYPE_V ,
186+ OptionalType .create (Types .MAP_TYPE_KV ),
187+ Types .PARAM_TYPE_K ))),
188+ OPTIONAL_INDEX_OPERAND (
189+ CelFunctionDecl .newFunctionDeclaration (
190+ Operator .INDEX .getFunction (),
191+ CelOverloadDecl .newGlobalOverload (
192+ "optional_list_index_int" ,
193+ Types .OPTIONAL_TYPE_V ,
194+ OptionalType .create (Types .LIST_TYPE_V ),
195+ SimpleType .INT ),
196+ CelOverloadDecl .newGlobalOverload (
197+ "optional_map_index_value" ,
198+ Types .OPTIONAL_TYPE_V ,
199+ OptionalType .create (Types .MAP_TYPE_KV ),
200+ Types .PARAM_TYPE_K )));
201+
202+ private final CelFunctionDecl celFunctionDecl ;
203+
204+ OptionalDeclaration (CelFunctionDecl celFunctionDecl ) {
205+ this .celFunctionDecl = celFunctionDecl ;
206+ }
207+
208+ @ Override
209+ public CelFunctionDecl functionDecl () {
210+ return celFunctionDecl ;
211+ }
212+ }
213+
100214 private static final CelExtensionLibrary <CelOptionalLibrary > LIBRARY =
101215 new CelExtensionLibrary <CelOptionalLibrary >() {
102- final TypeParamType paramTypeK = TypeParamType .create ("K" );
103- final TypeParamType paramTypeV = TypeParamType .create ("V" );
104- final OptionalType optionalTypeV = OptionalType .create (paramTypeV );
105- final ListType listTypeV = ListType .create (paramTypeV );
106- final MapType mapTypeKv = MapType .create (paramTypeK , paramTypeV );
107-
108216 private final CelOptionalLibrary version0 =
109217 new CelOptionalLibrary (
110218 0 ,
111219 ImmutableSet .of (
112- CelFunctionDecl .newFunctionDeclaration (
113- OPTIONAL_OF .getFunction (),
114- CelOverloadDecl .newGlobalOverload (
115- "optional_of" , optionalTypeV , paramTypeV )),
116- CelFunctionDecl .newFunctionDeclaration (
117- OPTIONAL_OF_NON_ZERO_VALUE .getFunction (),
118- CelOverloadDecl .newGlobalOverload (
119- "optional_ofNonZeroValue" , optionalTypeV , paramTypeV )),
120- CelFunctionDecl .newFunctionDeclaration (
121- OPTIONAL_NONE .getFunction (),
122- CelOverloadDecl .newGlobalOverload ("optional_none" , optionalTypeV )),
123- CelFunctionDecl .newFunctionDeclaration (
124- VALUE .getFunction (),
125- CelOverloadDecl .newMemberOverload (
126- "optional_value" , paramTypeV , optionalTypeV )),
127- CelFunctionDecl .newFunctionDeclaration (
128- HAS_VALUE .getFunction (),
129- CelOverloadDecl .newMemberOverload (
130- "optional_hasValue" , SimpleType .BOOL , optionalTypeV )),
131- CelFunctionDecl .newFunctionDeclaration (
132- OPTIONAL_UNWRAP .getFunction (),
133- CelOverloadDecl .newGlobalOverload (
134- "optional_unwrap_list" , listTypeV , ListType .create (optionalTypeV ))),
220+ OptionalDeclaration .OPTIONAL_OF .functionDecl (),
221+ OptionalDeclaration .OPTIONAL_OF_NON_ZERO_VALUE .functionDecl (),
222+ OptionalDeclaration .OPTIONAL_NONE .functionDecl (),
223+ OptionalDeclaration .OPTIONAL_VALUE .functionDecl (),
224+ OptionalDeclaration .OPTIONAL_HAS_VALUE .functionDecl (),
225+ OptionalDeclaration .OPTIONAL_UNWRAP .functionDecl (),
135226 // Note: Implementation of "or" and "orValue" are special-cased inside the
136227 // interpreter. Hence, their bindings are not provided here.
137- CelFunctionDecl .newFunctionDeclaration (
138- "or" ,
139- CelOverloadDecl .newMemberOverload (
140- "optional_or_optional" , optionalTypeV , optionalTypeV , optionalTypeV )),
141- CelFunctionDecl .newFunctionDeclaration (
142- "orValue" ,
143- CelOverloadDecl .newMemberOverload (
144- "optional_orValue_value" , paramTypeV , optionalTypeV , paramTypeV )),
228+ OptionalDeclaration .OPTIONAL_OR .functionDecl (),
229+ OptionalDeclaration .OPTIONAL_OR_VALUE .functionDecl (),
145230 // Note: Function bindings for optional field selection and indexer is defined
146231 // in {@code StandardFunctions}.
147- CelFunctionDecl .newFunctionDeclaration (
148- Operator .OPTIONAL_SELECT .getFunction (),
149- CelOverloadDecl .newGlobalOverload (
150- "select_optional_field" ,
151- optionalTypeV ,
152- SimpleType .DYN ,
153- SimpleType .STRING )),
154- CelFunctionDecl .newFunctionDeclaration (
155- Operator .OPTIONAL_INDEX .getFunction (),
156- CelOverloadDecl .newGlobalOverload (
157- "list_optindex_optional_int" , optionalTypeV , listTypeV , SimpleType .INT ),
158- CelOverloadDecl .newGlobalOverload (
159- "optional_list_optindex_optional_int" ,
160- optionalTypeV ,
161- OptionalType .create (listTypeV ),
162- SimpleType .INT ),
163- CelOverloadDecl .newGlobalOverload (
164- "map_optindex_optional_value" , optionalTypeV , mapTypeKv , paramTypeK ),
165- CelOverloadDecl .newGlobalOverload (
166- "optional_map_optindex_optional_value" ,
167- optionalTypeV ,
168- OptionalType .create (mapTypeKv ),
169- paramTypeK )),
232+ OptionalDeclaration .OPTIONAL_SELECT .functionDecl (),
233+ OptionalDeclaration .OPTIONAL_INDEX .functionDecl (),
170234 // Index overloads to accommodate using an optional value as the operand
171- CelFunctionDecl .newFunctionDeclaration (
172- Operator .INDEX .getFunction (),
173- CelOverloadDecl .newGlobalOverload (
174- "optional_list_index_int" ,
175- optionalTypeV ,
176- OptionalType .create (listTypeV ),
177- SimpleType .INT ),
178- CelOverloadDecl .newGlobalOverload (
179- "optional_map_index_value" ,
180- optionalTypeV ,
181- OptionalType .create (mapTypeKv ),
182- paramTypeK ))),
235+ OptionalDeclaration .OPTIONAL_INDEX_OPERAND .functionDecl ()),
183236 ImmutableSet .of (
184237 CelMacro .newReceiverMacro ("optMap" , 2 , CelOptionalLibrary ::expandOptMap )),
185238 ImmutableSet .of (
186239 // Type declaration for optional_type -> type(optional_type(V))
187240 CelVarDecl .newVarDeclaration (
188- OptionalType .NAME , TypeType .create (optionalTypeV ))));
241+ OptionalType .NAME , TypeType .create (Types . OPTIONAL_TYPE_V ))));
189242
190243 private final CelOptionalLibrary version1 =
191244 new CelOptionalLibrary (
@@ -211,16 +264,16 @@ public String getFunction() {
211264 "optional_list_first" ,
212265 "Return the first value in a list if present, otherwise"
213266 + " optional.none()" ,
214- optionalTypeV ,
215- listTypeV )),
267+ Types . OPTIONAL_TYPE_V ,
268+ Types . LIST_TYPE_V )),
216269 CelFunctionDecl .newFunctionDeclaration (
217270 LAST .functionName ,
218271 CelOverloadDecl .newMemberOverload (
219272 "optional_list_last" ,
220273 "Return the last value in a list if present, otherwise"
221274 + " optional.none()" ,
222- optionalTypeV ,
223- listTypeV )))
275+ Types . OPTIONAL_TYPE_V ,
276+ Types . LIST_TYPE_V )))
224277 .build (),
225278 version1 .macros ,
226279 version1 .variables );
0 commit comments