+ /* walk up the let expression tree until found */
+ while ((current_let_exp = current_let_exp->outer)) {
+ struct psi_decl_var *svar = current_let_exp->var;
+
+
+ if (!okay) {
+ struct psi_plist *args = psi_decl_type_get_args(svar->arg->type,
+ NULL);
+
+ if (args && psi_decl_arg_get_by_var(dvar, args, NULL)) {
+ okay = true;
+ } else if (zend_string_equals(svar->name, dvar->name)) {
+ dvar->arg = svar->arg;
+ okay = true;
+ }
+ }
+ if (okay) {
+ zend_string *tmp = dvar->fqn;
+ dvar->fqn = psi_decl_var_name_prepend(dvar->fqn, svar->name);
+ zend_string_release(tmp);
+ }
+ }
+ } else if (scope && scope->current_set) {
+ struct psi_set_exp *current_set_exp = scope->current_set;
+
+ /* walk up the set expression tree until found */
+ while ((current_set_exp = current_set_exp->outer)) {
+ struct psi_decl_var *svar = psi_set_exp_get_decl_var(
+ current_set_exp);
+
+ if (!okay) {
+ struct psi_plist *args = psi_decl_type_get_args(svar->arg->type,
+ NULL);
+
+ if (args && psi_decl_arg_get_by_var(dvar, args, NULL)) {
+ okay = true;
+ } else if (zend_string_equals(svar->name, dvar->name)) {
+ dvar->arg = svar->arg;
+ okay = true;
+ }
+ }
+ if (okay) {
+ zend_string *tmp = dvar->fqn;
+ dvar->fqn = psi_decl_var_name_prepend(dvar->fqn, svar->name);
+ zend_string_release(tmp);
+ }
+ }