+/* With regular precedence rules, ent.foo[n] is the same as (ent.foo)[n],
+ * so we need to rotate it to become ent.(foo[n]).
+ */
+static bool rotate_entfield_array_index_nodes(ast_expression **out)
+{
+ ast_array_index *index;
+ ast_entfield *entfield;
+
+ ast_value *field;
+ ast_expression *sub;
+ ast_expression *entity;
+
+ lex_ctx ctx = ast_ctx(*out);
+
+ if (!ast_istype(*out, ast_array_index))
+ return false;
+ index = (ast_array_index*)*out;
+
+ if (!ast_istype(index->array, ast_entfield))
+ return false;
+ entfield = (ast_entfield*)index->array;
+
+ if (!ast_istype(entfield->field, ast_value))
+ return false;
+ field = (ast_value*)entfield->field;
+
+ sub = index->index;
+ entity = entfield->entity;
+
+ ast_delete(index);
+
+ index = ast_array_index_new(ctx, (ast_expression*)field, sub);
+ entfield = ast_entfield_new(ctx, entity, (ast_expression*)index);
+ *out = (ast_expression*)entfield;
+
+ return true;
+}
+