private CodeObjectSource(object target, int[] arrayRanks, CodeObjectSourceType type)
 {
     _target = target;
     _arrayRanks = arrayRanks;
     _type = type;
 }
        private static CodeObjectSource InternalCreate(object target, int[] arrayRanks, CodeObjectSourceType type)
        {
            if (target == null)
            {
                return null;
            }

            Debug.Assert(Utils.IsSource(target));

            if (arrayRanks == null)
            {
                arrayRanks = new int[0];
            }

            Type typeTarget = target as Type;

            if (typeTarget != null && typeTarget.IsArray)
            {
                List<int> ranks = new List<int>();

                while (typeTarget.IsArray)
                {
                    ranks.Add(typeTarget.GetArrayRank());
                    typeTarget = typeTarget.GetElementType();
                }

                target = typeTarget;
                arrayRanks = ranks.ToArray();
            }

            CodeObjectSource source = new CodeObjectSource(target, arrayRanks, type);
            //CodeObjectSource cachedSource;

            //if (_cache.TryGetValue(source, out cachedSource))
            //{
            //    source = cachedSource;
            //}
            //else
            //{
            //    _cache.Add(source, source);
            //}

            return source;
        }
        public static CodeObjectSource CreateMergeXXX(CodeObjectSource source, int[] ranks, CodeObjectSourceType type)
        {
            if (type == CodeObjectSourceType.Normal && ranks.Length > 0)
            {
                throw new ArgumentException("Invalid type", "type");
            }

            if (ranks.Length == 0)
            {
                return source;
            }
            else
            {
                CodeObjectSource newSource = source;

                if (type == CodeObjectSourceType.Array)
                {
                    for (int i = ranks.Length - 1; i >= 0; i--)
                    {
                        newSource = CreateIndexer(source, ranks[i]);
                    }
                }
                else
                {
                    for (int i = ranks.Length - 1; i >= 0; i--)
                    {
                        newSource = CreateArray(source, ranks[i]);
                    }
                }

                return newSource;
            }
        }