/** * @param callerForceArrayFlag <c>true</c> if one of the current node's parents is a * function Ptg which Has been Changed from default 'V' To 'A' type (due To requirements on * the function return value). */ private void TransformNode(ParseNode node, byte desiredOperandClass, bool callerForceArrayFlag) { Ptg token = node.GetToken(); ParseNode[] children = node.GetChildren(); bool IsSimpleValueFunc = IsSimpleValueFunction(token); if (IsSimpleValueFunc) { bool localForceArray = desiredOperandClass == Ptg.CLASS_ARRAY; for (int i = 0; i < children.Length; i++) { TransformNode(children[i], desiredOperandClass, localForceArray); } SetSimpleValueFuncClass((AbstractFunctionPtg)token, desiredOperandClass, callerForceArrayFlag); return; } if (IsSingleArgSum(token)) { // Need to process the argument of SUM with transformFunctionNode below // so make a dummy FuncVarPtg for that call. token = FuncVarPtg.SUM; // Note - the tAttrSum token (node.getToken()) is a base // token so does not need to have its operand class set } if (token is ValueOperatorPtg || token is ControlPtg || token is MemFuncPtg || token is MemAreaPtg || token is UnionPtg) { // Value Operator Ptgs and Control are base Tokens, so Token will be unchanged // but any child nodes are processed according To desiredOperandClass and callerForceArrayFlag // As per OOO documentation Sec 3.2.4 "Token Class Transformation", "Step 1" // All direct operands of value operators that are initially 'R' type will // be converted To 'V' type. byte localDesiredOperandClass = desiredOperandClass == Ptg.CLASS_REF ? Ptg.CLASS_VALUE : desiredOperandClass; for (int i = 0; i < children.Length; i++) { TransformNode(children[i], localDesiredOperandClass, callerForceArrayFlag); } return; } if (token is AbstractFunctionPtg) { TransformFunctionNode((AbstractFunctionPtg)token, children, desiredOperandClass, callerForceArrayFlag); return; } if (children.Length > 0) { //if (token == RangePtg.instance) if(token is OperationPtg) { // TODO is any Token transformation required under the various ref operators? return; } throw new InvalidOperationException("Node should not have any children"); } if (token.IsBaseToken) { // nothing To do return; } token.PtgClass = (TransformClass(token.PtgClass, desiredOperandClass, callerForceArrayFlag)); }