public override CSNode VisitDotExp(CSScriptParser.DotExpContext context) { CSOPDotNode node = new CSOPDotNode(context.Start.Line, context.Start.Column); CSScriptParser.ExpressionContext[] expressions = context.expression(); if (expressions == null || expressions.Length != 2) { CSLog.E(context.Start.Line, context.Start.Column, "invalid # of children..."); return(null); } node._children = new CSNode[2]; node._children[0] = Visit(expressions[0]); node._children[1] = Visit(expressions[1]); return(node); }
CSNode VisitSelectors(CSScriptParser.SelectorContext[] selectors, int line, int col) { int selectorLen = selectors.Length; string firstName = selectors[0].NAME().GetText(); if (_state.HasVariable(firstName)) { CSLocalVariableNode node = new CSLocalVariableNode(line, col); node._declaration = false; node._variableName = firstName; if (selectorLen == 1) { return(node); } else { CSSelectorNode selectorNode = new CSSelectorNode(line, col); selectorNode._selectors = GetSelectorStrings(selectors, 1); CSOPDotNode dotNode = new CSOPDotNode(line, col); dotNode._children = new CSNode[2]; dotNode._children[0] = node; dotNode._children[1] = selectorNode; return(dotNode); } } string currentTypeString = null; System.Type currentType = null; int typeStart = -1; int typeEnd = 0; for (int i = 0; i < selectorLen; ++i) { CSScriptParser.SelectorContext next = selectors[i]; string name = next.NAME().GetText(); currentTypeString = GetTypeString(selectors, i + 1, typeStart); System.Type nextType = ReflectionUtil.GetType(currentTypeString); if (typeStart == -1 && nextType != null) { typeStart = i; } if (currentType != null && nextType == null) { typeEnd = i; break; } currentType = nextType; } if (currentType != null) { if (typeEnd == 0) { CSTypeNode node = new CSTypeNode(line, col); node._typeString = currentTypeString; node._type = currentType; node._assemblyName = currentType.Assembly.GetCleanName(); return(node); } else { CSStaticVariableNode node = new CSStaticVariableNode(line, col); string varName = selectors[typeEnd].NAME().GetText(); node._variableName = varName; node._staticType = currentType; node._type = ReflectionUtil.GetFieldType(currentType, varName); if (node._type == null) { CSLog.E(node, "type: " + currentType.FullName + " doesn't have: " + varName); } if (selectorLen == typeEnd + 1) { return(node); } else { CSSelectorNode selectorNode = new CSSelectorNode(line, col); selectorNode._selectors = GetSelectorStrings(selectors, typeEnd + 1); CSOPDotNode dotNode = new CSOPDotNode(line, col); dotNode._children = new CSNode[2]; dotNode._children[0] = node; dotNode._children[1] = selectorNode; return(dotNode); } } } else { CSSelectorNode node = new CSSelectorNode(line, col); node._selectors = GetSelectorStrings(selectors, 0); return(node); } }