コード例 #1
0
        public override List <SymbolInfo> Find(string name)
        {
            List <SymbolInfo> sil = SymbolTable.Find(this, name);

            if (PartialScope != null)
            {
                if (sil == null)
                {
                    sil = SymbolTable.Find(PartialScope, name);
                }
                else
                {
                    sil.AddRange(SymbolTable.Find(PartialScope, name));
                }
            }
            if (sil == null)
            {
                return(sil);
            }
            //если это заглушка, то разворачиваем сущность
            foreach (SymbolInfo tsi in sil)
            {
                if (tsi.sym_info.semantic_node_type == semantic_node_type.wrap_def)
                {
                    wrapped_definition_node wdn = (wrapped_definition_node)tsi.sym_info;
                    tsi.sym_info = wdn.PCUReader.CreateInterfaceInClassMember(wdn.offset, name);
                }
            }
            return(sil);
        }
コード例 #2
0
        public override List <SymbolInfo> FindOnlyInScope(string name)
        {
            List <SymbolInfo> sil = SymbolTable.FindOnlyInScope(this, name, false);

            if (sil == null)
            {
                return(sil);
            }
            foreach (SymbolInfo tsi in sil)
            {
                if (tsi.sym_info.semantic_node_type == semantic_node_type.wrap_def)
                {
                    wrapped_definition_node wdn = (wrapped_definition_node)tsi.sym_info;
                    if (wdn.is_synonim)
                    {
                        tsi.sym_info = wdn.PCUReader.CreateTypeSynonim(wdn.offset, name);
                    }
                    else
                    {
                        tsi.sym_info = wdn.PCUReader.CreateInterfaceMember(wdn.offset, name);
                    }
                }
            }
            return(sil);
        }
コード例 #3
0
        public override SymbolInfo FindOnlyInScope(string name)
        {
            SymbolInfo si = SymbolTable.FindOnlyInScope(this, name, false);

            if (si == null)
            {
                return(si);
            }
            SymbolInfo tsi = si;

            while (tsi != null)
            {
                if (tsi.sym_info.semantic_node_type == semantic_node_type.wrap_def)
                {
                    wrapped_definition_node wdn = (wrapped_definition_node)tsi.sym_info;
                    if (wdn.is_synonim)
                    {
                        tsi.sym_info = wdn.PCUReader.CreateTypeSynonim(wdn.offset, name);
                    }
                    else
                    {
                        tsi.sym_info = wdn.PCUReader.CreateInterfaceMember(wdn.offset, name);
                    }
                }
                tsi = tsi.Next;
            }
            return(si);
        }
コード例 #4
0
ファイル: PCUWrappers.cs プロジェクト: ikvm/pascalabcnet
        public override List <SymbolInfo> find_in_type(string name, Scope CurrentScope, type_node orig_generic_or_null = null, bool no_search_in_extension_methods = false)
        {
            List <SymbolInfo> sil = scope.FindOnlyInType(name, CurrentScope);

            if (sil == null)
            {
                if (base_type != null && base_type.IsDelegate)
                {
                    return(base_type.find_in_type(name, CurrentScope, null, no_search_in_extension_methods));
                }
                else if (name == compiler_string_consts.deconstruct_method_name)
                {
                    return(SystemLibrary.SystemLibrary.object_type.find_in_type(name, CurrentScope, null, no_search_in_extension_methods));
                }
                return(sil);
            }

            foreach (SymbolInfo si in sil)
            {
                if (si.sym_info.semantic_node_type == semantic_node_type.wrap_def)
                {
                    wrapped_definition_node wdn = (wrapped_definition_node)si.sym_info;
                    si.sym_info = wdn.PCUReader.CreateInterfaceInClassMember(wdn.offset, name);
                }
            }
            return(sil);
        }
コード例 #5
0
        public override SymbolInfo find_in_type(string name, Scope CurrentScope, bool no_search_in_extension_methods = false)
        {
            SymbolInfo si = scope.FindOnlyInType(name, CurrentScope);

            if (si == null)
            {
                if (base_type != null && base_type.IsDelegate)
                {
                    return(base_type.find_in_type(name, CurrentScope, no_search_in_extension_methods));
                }
                return(si);
            }

            SymbolInfo tsi = si;

            while (tsi != null)
            {
                if (tsi.sym_info.semantic_node_type == semantic_node_type.wrap_def)
                {
                    wrapped_definition_node wdn = (wrapped_definition_node)tsi.sym_info;
                    tsi.sym_info = wdn.PCUReader.CreateInterfaceInClassMember(wdn.offset, name);
                }
                tsi = tsi.Next;
            }
            return(si);
        }
コード例 #6
0
        public override SymbolInfoList Find(string name)
        {
            SymbolInfoList sil = SymbolTable.Find(this, name);

            if (sil == null)
            {
                return(null);
            }
            foreach (SymbolInfo tsi in sil.list)
            {
                if (tsi.sym_info.semantic_node_type == semantic_node_type.wrap_def)
                {
                    wrapped_definition_node wdn = (wrapped_definition_node)tsi.sym_info;
                    if (wdn.is_synonim)
                    {
                        tsi.sym_info = wdn.PCUReader.CreateTypeSynonim(wdn.offset, name);
                    }
                    else
                    {
                        tsi.sym_info = wdn.PCUReader.CreateImplementationMember(wdn.offset);
                    }
                }
            }
            return(sil);
        }
コード例 #7
0
        public void RestoreMembers(string name)
        {
            List <SymbolInfo> sil = SymbolTable.FindOnlyInThisClass(this, name);

            //если это заглушка, то разворачиваем сущность
            foreach (SymbolInfo tsi in sil)
            {
                if (tsi.sym_info.semantic_node_type == semantic_node_type.wrap_def)
                {
                    PCUSymbolInfo pcu_tsi = tsi as PCUSymbolInfo;
                    if (needRestore(pcu_tsi, name) || pr.comp.CompilerOptions.OutputFileType == CompilerOptions.OutputType.ClassLibrary || name == "op_Equality" || name == "op_Inequality")
                    {
                        wrapped_definition_node wdn = (wrapped_definition_node)tsi.sym_info;
                        tsi.sym_info = wdn.PCUReader.CreateInterfaceInClassMember(wdn.offset, name);
                    }
                    else
                    {
                    }
                }
            }
        }
コード例 #8
0
        public void RestoreMembers(string name)
        {
            SymbolInfoList sil = SymbolTable.FindOnlyInThisClass(this, name);

            //если это заглушка, то разворачиваем сущность
            foreach (SymbolInfo tsi in sil.list)
            {
                if (tsi.sym_info.semantic_node_type == semantic_node_type.wrap_def)
                {
                    PCUSymbolInfo pcu_tsi = tsi as PCUSymbolInfo;
                    if (!(pcu_tsi != null && pcu_tsi.semantic_node_type == semantic_node_type.common_method_node && !pcu_tsi.virtual_slot) || pr.comp.CompilerOptions.OutputFileType == CompilerOptions.OutputType.ClassLibrary)
                    {
                        wrapped_definition_node wdn = (wrapped_definition_node)tsi.sym_info;
                        tsi.sym_info = wdn.PCUReader.CreateInterfaceInClassMember(wdn.offset, name);
                    }
                    else
                    {
                    }
                }
            }
        }
コード例 #9
0
        public override SymbolInfo Find(string name)
        {
            SymbolInfo si = SymbolTable.Find(this, name);

            if (PartialScope != null)
            {
                if (si == null)
                {
                    si = SymbolTable.Find(PartialScope, name);
                }
                else
                {
                    SymbolInfo tmp_si = si;
                    while (tmp_si.Next != null)
                    {
                        tmp_si = tmp_si.Next;
                    }
                    tmp_si.Next = SymbolTable.Find(PartialScope, name);
                }
            }
            if (si == null)
            {
                return(si);
            }
            //если это заглушка, то разворачиваем сущность
            SymbolInfo tsi = si;

            while (tsi != null)
            {
                if (tsi.sym_info.semantic_node_type == semantic_node_type.wrap_def)
                {
                    wrapped_definition_node wdn = (wrapped_definition_node)tsi.sym_info;
                    tsi.sym_info = wdn.PCUReader.CreateInterfaceInClassMember(wdn.offset, name);
                }
                tsi = tsi.Next;
            }
            return(si);
        }
コード例 #10
0
        public override SymbolInfoList find_in_type(string name, Scope CurrentScope, bool no_search_in_extension_methods = false)
        {
            SymbolInfoList sil = scope.FindOnlyInType(name, CurrentScope);

            if (sil == null)
            {
                if (base_type != null && base_type.IsDelegate)
                {
                    return(base_type.find_in_type(name, CurrentScope, no_search_in_extension_methods));
                }
                return(sil);
            }

            foreach (SymbolInfo si in sil.list)
            {
                if (si.sym_info.semantic_node_type == semantic_node_type.wrap_def)
                {
                    wrapped_definition_node wdn = (wrapped_definition_node)si.sym_info;
                    si.sym_info = wdn.PCUReader.CreateInterfaceInClassMember(wdn.offset, name);
                }
            }
            return(sil);
        }
コード例 #11
0
        public override List <SymbolInfo> find_in_type(string name, Scope CurrentScope, type_node orig_generic_or_null = null, bool no_search_in_extension_methods = false)
        {
            List <SymbolInfo> sil = scope.FindOnlyInType(name, CurrentScope);

            if (sil == null)
            {
                if (base_type != null && base_type.IsDelegate)
                {
                    return(base_type.find_in_type(name, CurrentScope, null, no_search_in_extension_methods));
                }
                else if (name == compiler_string_consts.deconstruct_method_name)
                {
                    return(SystemLibrary.SystemLibrary.object_type.find_in_type(name, CurrentScope, null, no_search_in_extension_methods));
                }

                // SSM перенес из common_type_node (types.cs 2116) - без этого не работали методы расширения последовательностей для типов в pcu, реализующих IEnumerable<T>
                if (ImplementingInterfaces != null)
                {
                    Dictionary <definition_node, definition_node> cache = new Dictionary <definition_node, definition_node>();
                    List <SymbolInfo> props = new List <SymbolInfo>();
                    foreach (type_node ii_tn in ImplementingInterfaces)
                    {
                        List <SymbolInfo> isi = ii_tn.find_in_type(name, CurrentScope);
                        if (isi != null)
                        {
                            if (sil == null)
                            {
                                sil = new List <SymbolInfo>();
                            }
                            foreach (SymbolInfo si in isi)
                            {
                                if (!cache.ContainsKey(si.sym_info))
                                {
                                    if (si.sym_info is function_node && (si.sym_info as function_node).is_extension_method &&
                                        sil.FindIndex(ssi => ssi.sym_info == si.sym_info) == -1)     // SSM 12.12.18 - за счёт методов интерфейсов тоже могут добавляться одинаковые - исключаем их
                                    {
                                        sil.Add(si);
                                    }
                                    cache.Add(si.sym_info, si.sym_info);
                                }
                            }
                        }
                    }
                    if (sil != null && sil.Count == 0)
                    {
                        sil = null;
                    }
                }

                return(sil);
            }
            if (this.base_generic_instance != null && sil != null)
            {
                var bsil = base_generic_instance.ConvertSymbolInfo(sil);
                if (orig_generic_or_null == null && name != "op_Implicit")
                {
                    return(bsil);
                }
            }
            foreach (SymbolInfo si in sil)
            {
                if (si.sym_info.semantic_node_type == semantic_node_type.wrap_def)
                {
                    wrapped_definition_node wdn = (wrapped_definition_node)si.sym_info;
                    si.sym_info = wdn.PCUReader.CreateInterfaceInClassMember(wdn.offset, name);
                }
            }
            return(sil);
        }