@@ -97,95 +97,129 @@ public String getFunction() {
9797 }
9898 }
9999
100+ private static final TypeParamType PARAM_TYPE_K = TypeParamType .create ("K" );
101+ private static final TypeParamType PARAM_TYPE_V = TypeParamType .create ("V" );
102+ private static final OptionalType OPTIONAL_TYPE_V = OptionalType .create (PARAM_TYPE_V );
103+ private static final ListType LIST_TYPE_V = ListType .create (PARAM_TYPE_V );
104+ private static final MapType MAP_TYPE_KV = MapType .create (PARAM_TYPE_K , PARAM_TYPE_V );
105+
106+ public static final CelFunctionDecl OPTIONAL_SELECT_DECL =
107+ CelFunctionDecl .newFunctionDeclaration (
108+ Operator .OPTIONAL_SELECT .getFunction (),
109+ CelOverloadDecl .newGlobalOverload (
110+ "select_optional_field" , OPTIONAL_TYPE_V , SimpleType .DYN , SimpleType .STRING ));
111+
112+ /** Declarations for the optional extension library. */
113+ public enum OptionalDeclaration implements CelFunctionDecl .Declarer {
114+ OPTIONAL_OF (
115+ CelFunctionDecl .newFunctionDeclaration (
116+ Function .OPTIONAL_OF .getFunction (),
117+ CelOverloadDecl .newGlobalOverload ("optional_of" , OPTIONAL_TYPE_V , PARAM_TYPE_V ))),
118+ OPTIONAL_OF_NON_ZERO_VALUE (
119+ CelFunctionDecl .newFunctionDeclaration (
120+ Function .OPTIONAL_OF_NON_ZERO_VALUE .getFunction (),
121+ CelOverloadDecl .newGlobalOverload (
122+ "optional_ofNonZeroValue" , OPTIONAL_TYPE_V , PARAM_TYPE_V ))),
123+ OPTIONAL_NONE (
124+ CelFunctionDecl .newFunctionDeclaration (
125+ Function .OPTIONAL_NONE .getFunction (),
126+ CelOverloadDecl .newGlobalOverload ("optional_none" , OPTIONAL_TYPE_V ))),
127+ OPTIONAL_VALUE (
128+ CelFunctionDecl .newFunctionDeclaration (
129+ Function .VALUE .getFunction (),
130+ CelOverloadDecl .newMemberOverload ("optional_value" , PARAM_TYPE_V , OPTIONAL_TYPE_V ))),
131+ OPTIONAL_HAS_VALUE (
132+ CelFunctionDecl .newFunctionDeclaration (
133+ Function .HAS_VALUE .getFunction (),
134+ CelOverloadDecl .newMemberOverload (
135+ "optional_hasValue" , SimpleType .BOOL , OPTIONAL_TYPE_V ))),
136+ OPTIONAL_UNWRAP (
137+ CelFunctionDecl .newFunctionDeclaration (
138+ Function .OPTIONAL_UNWRAP .getFunction (),
139+ CelOverloadDecl .newGlobalOverload (
140+ "optional_unwrap_list" , LIST_TYPE_V , ListType .create (OPTIONAL_TYPE_V )))),
141+ OPTIONAL_OR (
142+ CelFunctionDecl .newFunctionDeclaration (
143+ "or" ,
144+ CelOverloadDecl .newMemberOverload (
145+ "optional_or_optional" , OPTIONAL_TYPE_V , OPTIONAL_TYPE_V , OPTIONAL_TYPE_V ))),
146+ OPTIONAL_OR_VALUE (
147+ CelFunctionDecl .newFunctionDeclaration (
148+ "orValue" ,
149+ CelOverloadDecl .newMemberOverload (
150+ "optional_orValue_value" , PARAM_TYPE_V , OPTIONAL_TYPE_V , PARAM_TYPE_V ))),
151+ OPTIONAL_SELECT (OPTIONAL_SELECT_DECL ),
152+ OPTIONAL_INDEX (
153+ CelFunctionDecl .newFunctionDeclaration (
154+ Operator .OPTIONAL_INDEX .getFunction (),
155+ CelOverloadDecl .newGlobalOverload (
156+ "list_optindex_optional_int" , OPTIONAL_TYPE_V , LIST_TYPE_V , SimpleType .INT ),
157+ CelOverloadDecl .newGlobalOverload (
158+ "optional_list_optindex_optional_int" ,
159+ OPTIONAL_TYPE_V ,
160+ OptionalType .create (LIST_TYPE_V ),
161+ SimpleType .INT ),
162+ CelOverloadDecl .newGlobalOverload (
163+ "map_optindex_optional_value" , OPTIONAL_TYPE_V , MAP_TYPE_KV , PARAM_TYPE_K ),
164+ CelOverloadDecl .newGlobalOverload (
165+ "optional_map_optindex_optional_value" ,
166+ OPTIONAL_TYPE_V ,
167+ OptionalType .create (MAP_TYPE_KV ),
168+ PARAM_TYPE_K ))),
169+ OPTIONAL_INDEX_OPERAND (
170+ CelFunctionDecl .newFunctionDeclaration (
171+ Operator .INDEX .getFunction (),
172+ CelOverloadDecl .newGlobalOverload (
173+ "optional_list_index_int" ,
174+ OPTIONAL_TYPE_V ,
175+ OptionalType .create (LIST_TYPE_V ),
176+ SimpleType .INT ),
177+ CelOverloadDecl .newGlobalOverload (
178+ "optional_map_index_value" ,
179+ OPTIONAL_TYPE_V ,
180+ OptionalType .create (MAP_TYPE_KV ),
181+ PARAM_TYPE_K )));
182+
183+ private final CelFunctionDecl celFunctionDecl ;
184+
185+ OptionalDeclaration (CelFunctionDecl celFunctionDecl ) {
186+ this .celFunctionDecl = celFunctionDecl ;
187+ }
188+
189+ @ Override
190+ public CelFunctionDecl functionDecl () {
191+ return celFunctionDecl ;
192+ }
193+ }
194+
100195 private static final CelExtensionLibrary <CelOptionalLibrary > LIBRARY =
101196 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-
108197 private final CelOptionalLibrary version0 =
109198 new CelOptionalLibrary (
110199 0 ,
111200 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 ))),
201+ OptionalDeclaration .OPTIONAL_OF .functionDecl (),
202+ OptionalDeclaration .OPTIONAL_OF_NON_ZERO_VALUE .functionDecl (),
203+ OptionalDeclaration .OPTIONAL_NONE .functionDecl (),
204+ OptionalDeclaration .OPTIONAL_VALUE .functionDecl (),
205+ OptionalDeclaration .OPTIONAL_HAS_VALUE .functionDecl (),
206+ OptionalDeclaration .OPTIONAL_UNWRAP .functionDecl (),
135207 // Note: Implementation of "or" and "orValue" are special-cased inside the
136208 // 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 )),
209+ OptionalDeclaration .OPTIONAL_OR .functionDecl (),
210+ OptionalDeclaration .OPTIONAL_OR_VALUE .functionDecl (),
145211 // Note: Function bindings for optional field selection and indexer is defined
146212 // 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 )),
213+ OptionalDeclaration .OPTIONAL_SELECT .functionDecl (),
214+ OptionalDeclaration .OPTIONAL_INDEX .functionDecl (),
170215 // 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 ))),
216+ OptionalDeclaration .OPTIONAL_INDEX_OPERAND .functionDecl ()),
183217 ImmutableSet .of (
184218 CelMacro .newReceiverMacro ("optMap" , 2 , CelOptionalLibrary ::expandOptMap )),
185219 ImmutableSet .of (
186220 // Type declaration for optional_type -> type(optional_type(V))
187221 CelVarDecl .newVarDeclaration (
188- OptionalType .NAME , TypeType .create (optionalTypeV ))));
222+ OptionalType .NAME , TypeType .create (OPTIONAL_TYPE_V ))));
189223
190224 private final CelOptionalLibrary version1 =
191225 new CelOptionalLibrary (
@@ -211,16 +245,16 @@ public String getFunction() {
211245 "optional_list_first" ,
212246 "Return the first value in a list if present, otherwise"
213247 + " optional.none()" ,
214- optionalTypeV ,
215- listTypeV )),
248+ OPTIONAL_TYPE_V ,
249+ LIST_TYPE_V )),
216250 CelFunctionDecl .newFunctionDeclaration (
217251 LAST .functionName ,
218252 CelOverloadDecl .newMemberOverload (
219253 "optional_list_last" ,
220254 "Return the last value in a list if present, otherwise"
221255 + " optional.none()" ,
222- optionalTypeV ,
223- listTypeV )))
256+ OPTIONAL_TYPE_V ,
257+ LIST_TYPE_V )))
224258 .build (),
225259 version1 .macros ,
226260 version1 .variables );
0 commit comments