ExpandAndAssignAll(this LanguageValueAccess valueAccess, IGMacBinding pattern) { valueAccess = ReduceMultivectorAccess(valueAccess); var accessStack = new Stack <LanguageValueAccess>(); accessStack.Push(valueAccess); var valuesStack = new Stack <IGMacBinding>(); valuesStack.Push(pattern); while (valuesStack.Count > 0) { var rootValueAccess = accessStack.Pop(); var rootValue = valuesStack.Pop(); var scalarPattern = rootValue as GMacScalarBinding; if (scalarPattern != null) { yield return (new Tuple <LanguageValueAccess, GMacScalarBinding>( rootValueAccess, scalarPattern )); continue; } var mvPattern = rootValue as GMacMultivectorBinding; if (mvPattern != null) { var scalarType = mvPattern.ScalarType; var s = rootValueAccess.LastAccessStep as ValueAccessStepByKeyList <int>; var partialMvFlag = !ReferenceEquals(s, null); var idsList = partialMvFlag ? s.AccessKeyList : null; foreach (var pair in mvPattern) { var id = pair.Key; if (!ReferenceEquals(idsList, null) && !idsList.Contains(id)) { continue; } var childValueAccess = partialMvFlag ? rootValueAccess.DuplicateExceptLast().Append(id, scalarType.AssociatedPrimitiveType) : rootValueAccess.Duplicate().Append(id, scalarType.AssociatedPrimitiveType); yield return (new Tuple <LanguageValueAccess, GMacScalarBinding>( childValueAccess, mvPattern[id] )); } continue; } var structPattern = rootValue as GMacStructureBinding; if (structPattern == null) { continue; } foreach (var pair in structPattern) { var dataMemberName = pair.Key; var dataMember = structPattern.BaseStructure.AssociatedStructure.GetDataMember(dataMemberName); var childValueAccess = rootValueAccess .Duplicate() .Append(dataMember.ObjectName, dataMember.SymbolType); var structMemberScalarPattern = pair.Value as GMacScalarBinding; if (structMemberScalarPattern != null) { yield return (new Tuple <LanguageValueAccess, GMacScalarBinding>( childValueAccess, structMemberScalarPattern )); } else { accessStack.Push(childValueAccess); valuesStack.Push(pair.Value); } } } }
ExpandAndAssignAll(this SymbolLValue symbol, IGMacBinding pattern) { return(ExpandAndAssignAll(LanguageValueAccess.Create(symbol), pattern)); }