示例#1
0
        public override void visit(ident value)
        {
            if (value == null)
            {
                return;
            }

            int pos = value.name.LastIndexOf('`');

            if (pos != -1)
            {
                value.name = value.name.Remove(pos);
            }

            SymbolInfo si = context.find_first(value.name);

            if (si == null)
            {
                return;                                               //ничего не нашли => переменная совсем локальная, никуда добавлять не нужно
            }
            if ((si.sym_info is SemanticTree.ICommonParameterNode) || //параметр или
                (si.sym_info is SemanticTree.ILocalVariableNode) ||   //локальная переменная
                (si.sym_info is SemanticTree.ICommonClassFieldNode) ||  //поле класса
                (si.sym_info is SemanticTree.ILocalBlockVariableNode) ||//локальная блочная переменная
                isLoopVariable)                                         //счетчик цикла
            {
                if (!Variables.Contains(si.sym_info as SemanticTree.IVAriableDefinitionNode))
                {
                    Variables.Add(si.sym_info as SemanticTree.IVAriableDefinitionNode);
                }
            }
            else if ((si.sym_info is SemanticTree.ICommonFunctionConstantDefinitionNode) ||//константа из функции
                     (si.sym_info is SemanticTree.IClassConstantDefinitionNode))   //константа из класса
            {
                if (!Constants.Contains(si.sym_info as SemanticTree.IConstantDefinitionNode))
                {
                    Constants.Add(si.sym_info as SemanticTree.IConstantDefinitionNode);
                }
            }
        }