@@ -187,13 +187,44 @@ class ClassAggregateLiteral extends AggregateLiteral {
187187 override string getAPrimaryQlClass ( ) { result = "ClassAggregateLiteral" }
188188
189189 /**
190+ * Gets an expression within the aggregate literal that is used to initialize
191+ * field `field`, if present.
192+ *
193+ * This predicate may have multiple results since a field can be initialized
194+ * multiple times in the same initializer.
195+ */
196+ Expr getAFieldExpr ( Field field ) { result = this .getFieldExpr ( field , _) }
197+
198+ /**
199+ * DEPRECATED: Use `getAFieldExpr` instead.
200+ *
190201 * Gets the expression within the aggregate literal that is used to initialize
191202 * field `field`, if present.
203+ *
204+ * This predicate may have multiple results since a field can be initialized
205+ * multiple times in the same initializer.
206+ */
207+ Expr getFieldExpr ( Field field ) { result = this .getFieldExpr ( field , _) }
208+
209+ /**
210+ * Gets the expression within the aggregate literal that is used to initialize
211+ * field `field`, if present. The expression is the `position`'th entry in the
212+ * aggregate literal.
213+ *
214+ * For example, if `aggr` represents the initialization literal `{.x = 123, .y = 456 .x = 789}` in
215+ * ```cpp
216+ * struct Foo { int x; int y; };
217+ * struct Foo foo = {.x = 123, .y = 456 .x = 789};
218+ * ```
219+ * then:
220+ * - `aggr.getFieldExpr(x, 0)` gives `123`.
221+ * - `aggr.getFieldExpr(y, 1)` gives `456`.
222+ * - `aggr.getFieldExpr(x, 2)` gives `789`.
192223 */
193- Expr getFieldExpr ( Field field ) {
224+ Expr getFieldExpr ( Field field , int position ) {
194225 field = classType .getAField ( ) and
195226 aggregate_field_init ( underlyingElement ( this ) , unresolveElement ( result ) , unresolveElement ( field ) ,
196- _ )
227+ position )
197228 }
198229
199230 /**
@@ -261,11 +292,41 @@ class ArrayOrVectorAggregateLiteral extends AggregateLiteral {
261292 Type getElementType ( ) { none ( ) }
262293
263294 /**
295+ * Gets an expression within the aggregate literal that is used to initialize
296+ * element `elementIndex`, if present.
297+ *
298+ * This predicate may have multiple results since an element can be initialized
299+ * multiple times in the same initializer.
300+ */
301+ Expr getAnElementExpr ( int elementIndex ) { result = this .getElementExpr ( elementIndex , _) }
302+
303+ /**
304+ * DEPRECATED: Use `getAnElementExpr` instead.
305+ *
264306 * Gets the expression within the aggregate literal that is used to initialize
265307 * element `elementIndex`, if present.
308+ *
309+ * This predicate may have multiple results since an element can be initialized
310+ * multiple times in the same initializer.
311+ */
312+ Expr getElementExpr ( int elementIndex ) { result = this .getElementExpr ( elementIndex , _) }
313+
314+ /**
315+ * Gets the expression within the aggregate literal that is used to initialize
316+ * element `elementIndex`, if present. The expression is the `position`'th entry
317+ * in the aggregate literal.
318+ *
319+ * For example, if `a` represents the initialization literal `{[0] = 123, [1] = 456, [0] = 789 }` in
320+ * ```cpp
321+ * int x[2] = {[0] = 123, [1] = 456, [0] = 789 };
322+ * ```
323+ * then:
324+ * - `a.getElementExpr(0, 0)` gives `123`.
325+ * - `a.getElementExpr(1, 1)` gives `456`.
326+ * - `a.getElementExpr(0, 2)` gives `789`.
266327 */
267- Expr getElementExpr ( int elementIndex ) {
268- aggregate_array_init ( underlyingElement ( this ) , unresolveElement ( result ) , elementIndex , _ )
328+ Expr getElementExpr ( int elementIndex , int position ) {
329+ aggregate_array_init ( underlyingElement ( this ) , unresolveElement ( result ) , elementIndex , position )
269330 }
270331
271332 /**
0 commit comments