Пример #1
0
        static JSNode()
        {
            var tNode         = typeof(JSNode);
            var typesToWalk   = (from t in tNode.Assembly.GetTypes() where tNode.IsAssignableFrom(t) select t).ToArray();
            var nodeTypesById = new List <Type>();

            // Assign a unique ID to all node types in the type hierarchy
            foreach (var nodeType in typesToWalk)
            {
                var type = nodeType;

                while (type != null)
                {
                    if (!TypeIds.ContainsKey(type))
                    {
                        TypeIds.Add(type, nodeTypesById.Count);
                        nodeTypesById.Add(type);
                    }

                    if (type == tNode)
                    {
                        break;
                    }

                    type = type.BaseType;
                }
            }

            NodeTypes = nodeTypesById.ToArray();
            NodeSelfAndBaseTypeIds = new int[NodeTypes.Length][];

            var ids = new List <int>();

            for (var i = 0; i < NodeTypes.Length; i++)
            {
                ids.Clear();

                var type = NodeTypes[i];
                while (type != null)
                {
                    ids.Add(GetTypeId(type));
                    if (type == tNode)
                    {
                        break;
                    }

                    type = type.BaseType;
                }

                NodeSelfAndBaseTypeIds[i] = ids.ToArray();
            }

            JSExpression.Initialize();
            JSNodeTraversalData.Initialize();
        }
Пример #2
0
        public static void EnsureTypeIdsAreAssigned()
        {
            if (AreTypeIdsAssigned)
            {
                return;
            }

            AreTypeIdsAssigned = true;

            var tNode       = typeof(JSNode);
            var typesToWalk = (
                from a in NodeAssemblies
                from t in TypesToWalk(a)
                where tNode.IsAssignableFrom(t)
                select t
                ).ToList();
            var nodeTypesById = new List <Type>();

            // Assign a unique ID to all node types in the type hierarchy
            foreach (var nodeType in typesToWalk)
            {
                var type = nodeType;

                while (type != null)
                {
                    if (!TypeIds.ContainsKey(type))
                    {
                        TypeIds.Add(type, nodeTypesById.Count);
                        nodeTypesById.Add(type);
                    }

                    if (type == tNode)
                    {
                        break;
                    }

                    type = type.BaseType;
                }
            }

            _NodeTypes = nodeTypesById.ToArray();
            _NodeSelfAndBaseTypeIds = new int[_NodeTypes.Length][];

            var ids = new List <int>();

            for (var i = 0; i < _NodeTypes.Length; i++)
            {
                ids.Clear();

                var type = _NodeTypes[i];
                while (type != null)
                {
                    ids.Add(GetTypeId(type));
                    if (type == tNode)
                    {
                        break;
                    }

                    type = type.BaseType;
                }

                _NodeSelfAndBaseTypeIds[i] = ids.ToArray();
            }

            JSExpression.Initialize();
            JSNodeTraversalData.Initialize();
        }