예제 #1
0
        /// <summary>
        /// Manually walk the node and define all classes and interfaces found
        /// </summary>
        /// <param name="node">The parent node where to start searching for classes and interfaces</param>
        public void WalkClasses(TreeNode node)
        {
            CheckerException exc = new CheckerException();

            node.Entry = new IdEntry();
            List <String> using_ = new List <String>();

            node.Entry.ReflectionObject = using_;

            // manually traverse the AST so we can first define all classes before references to them are made
            foreach (TreeNode n in node.Children)
            {
                if (n.Type == VnvdTreeWalker.USING)
                {
                    using_.Add(AbstractHelper.GetFullQualifier(n.GetChild(0)).ToString());
                }
                else if (n.Type == VnvdTreeWalker.NAMESPACE)
                {
                    Qualifier q  = AbstractHelper.GetFullQualifier(n.GetChild(0));
                    string    ns = q.ToString();

                    foreach (TreeNode n2 in n.Children)
                    {
                        try
                        {
                            if (n2.Type == VnvdTreeWalker.CLASS)
                            {
                                n2.EntryType = EntryType.Class;
                                n2.Entry     = new IdEntry();
                                UserType t = DefineClass(ns, AbstractHelper.GetFullQualifier(n2.GetChild(1)).ToString(), AbstractHelper.GetModifiers(n2.GetChild(0)));
                                n2.Entry.ReflectionObject = t;
                                t.Entry = n2.Entry;
                                if (IsAlreadyDefined(t.Name, t.Namespace))
                                {
                                    throw new CheckerException(n2, "A type with the same name '" + t.FullName + "' already exists");
                                }
                                userTypes.Add(t);
                                types.Add(n2);
                            }
                            else if (n2.Type == VnvdTreeWalker.INTERFACE)
                            {
                                n2.EntryType = EntryType.Interface;
                                n2.Entry     = new IdEntry();
                                UserType t = DefineInterface(ns, AbstractHelper.GetFullQualifier(n2.GetChild(1)).ToString(), AbstractHelper.GetModifiers(n2.GetChild(0)));
                                n2.Entry.ReflectionObject = t;
                                t.Entry = n2.Entry;
                                if (IsAlreadyDefined(t.Name, t.Namespace))
                                {
                                    throw new CheckerException(n2, "A type with the same name '" + t.FullName + "' already exists");
                                }
                                userTypes.Add(t);
                                types.Insert(0, n2);
                            }
                            else if (n2.Type == VnvdTreeWalker.ENUM)
                            {
                                n2.EntryType = EntryType.Enum;
                                n2.Entry     = new IdEntry();
                                UserType t = DefineEnum(ns, AbstractHelper.GetFullQualifier(n2.GetChild(1)).ToString(), AbstractHelper.GetModifiers(n2.GetChild(0)));
                                n2.Entry.ReflectionObject = t;
                                t.Entry = n2.Entry;
                                if (IsAlreadyDefined(t.Name, t.Namespace))
                                {
                                    throw new CheckerException(n2, "A type with the same name '" + t.FullName + "' already exists");
                                }
                                userTypes.Add(t);
                                types.Insert(0, n2);
                            }
                        }
                        catch (CheckerException ex)
                        {
                            exc.AddError(n2, ex.GetLastError().Second);
                        }
                    }
                }
            }

            lib.CustomTypes = userTypes.ToArray();

            if (exc.ErrorCount > 0)
            {
                throw exc;
            }
        }
예제 #2
0
 public override void BeginNamespace(TreeNode node, Qualifier qualifier)
 {
     currentNamespace = qualifier.ToString();
 }