Пример #1
0
        protected void AddRelay(ABnfElement element)
        {
            if (element == null)
            {
                return;
            }

            var full_path = element.GetFullPath();

            if (full_path == m_file_path)
            {
                return;
            }

            if (ALittleScriptUtility.IsRegister(element))
            {
                return;
            }

            if (m_is_define_relay)
            {
                if (!m_define_rely.Contains(full_path))
                {
                    m_define_rely.Add(full_path);
                }
                return;
            }

            if (!m_run_rely.Contains(full_path))
            {
                m_run_rely.Add(full_path);
            }
        }
        public override string FastGoto(ALanguageServer server, Dictionary <string, ProjectInfo> projects, string text)
        {
            // 按::切割
            char[]   sy         = { ':', '.' };
            string[] split      = text.Split(sy);
            var      temp_split = new List <string>();

            foreach (var c in split)
            {
                if (c != "")
                {
                    temp_split.Add(c);
                }
            }
            if (temp_split.Count == 0)
            {
                return(null);
            }

            var    package = "";
            string name    = temp_split[temp_split.Count - 1];

            temp_split.RemoveAt(temp_split.Count - 1);

            package = string.Join(".", temp_split);

            ABnfElement element = null;

            // 获取所有工程
            foreach (var pair in projects)
            {
                if (GeneralOptions.Instance.ProjectTeam == ProjectTeamTypes.LW)
                {
                    if (name.EndsWith("_struct"))
                    {
                        name = name.Substring(0, name.Length - "_struct".Length);
                    }
                    else if (name.EndsWith("_dirty"))
                    {
                        name = name.Substring(0, name.Length - "_dirty".Length);
                    }
                }

                var project = pair.Value as AProtobufProjectInfo;
                if (project == null)
                {
                    continue;
                }

                if (package == "")
                {
                    element = project.FindElementInAllPackage(name);
                    if (element != null)
                    {
                        break;
                    }
                }
                else
                {
                    element = project.FindElement(package, name);
                    if (element != null)
                    {
                        break;
                    }
                }
            }

            // 把package当做 enum枚举名,name当做枚举项名
            if (element == null)
            {
                if (temp_split.Count == 1 || temp_split.Count == 2)
                {
                    foreach (var pair in projects)
                    {
                        var project = pair.Value as AProtobufProjectInfo;
                        if (project == null)
                        {
                            continue;
                        }

                        if (temp_split.Count == 1)
                        {
                            element = project.FindElementInAllPackage(temp_split[0]);
                            if (element != null)
                            {
                                break;
                            }
                        }
                        else if (temp_split.Count == 2)
                        {
                            element = project.FindElement(temp_split[0], temp_split[1]);
                            if (element != null)
                            {
                                break;
                            }
                        }
                    }
                }
                else if (GeneralOptions.Instance.ProjectTeam == ProjectTeamTypes.LW && temp_split.Count == 0)
                {
                    if (name.EndsWith("_struct") || name.EndsWith("_dirty"))
                    {
                        var sub_name = name;
                        if (sub_name.EndsWith("_struct"))
                        {
                            sub_name = sub_name.Substring(0, sub_name.Length - "_struct".Length);
                        }
                        else if (sub_name.EndsWith("_dirty"))
                        {
                            sub_name = sub_name.Substring(0, sub_name.Length - "_dirty".Length);
                        }

                        foreach (var pair in projects)
                        {
                            var project = pair.Value as AProtobufProjectInfo;
                            if (project == null)
                            {
                                continue;
                            }

                            element = project.FindElementInAllPackage(sub_name);
                            if (element != null)
                            {
                                break;
                            }
                        }
                    }

                    if (element == null)
                    {
                        foreach (var pair in projects)
                        {
                            var project = pair.Value as AProtobufProjectInfo;
                            if (project == null)
                            {
                                continue;
                            }

                            element = project.FindElementInAllPackage(name);
                            if (element != null)
                            {
                                break;
                            }
                        }
                    }

                    if (element == null)
                    {
                        foreach (var pair in projects)
                        {
                            var project = pair.Value as AProtobufProjectInfo;
                            if (project == null)
                            {
                                continue;
                            }

                            element = project.FindElement("", "EMsgErrorCode");
                            if (element != null)
                            {
                                break;
                            }
                        }
                    }
                }

                if (element is AProtobufEnumElement)
                {
                    var body_dec = (element as AProtobufEnumElement).GetEnumBody();
                    if (body_dec != null)
                    {
                        foreach (var pair in body_dec.GetEnumVarList())
                        {
                            if (pair.GetEnumVarName().GetElementText() == name)
                            {
                                element = pair.GetEnumVarName();
                                break;
                            }
                        }
                    }
                }
            }

            if (element == null)
            {
                return("找不到在包(" + package + ")的协议或枚举(" + name + ")");
            }

            if (element is AProtobufMessageElement)
            {
                element = (element as AProtobufMessageElement).GetMessageName();
            }
            else if (element is AProtobufEnumElement)
            {
                element = (element as AProtobufEnumElement).GetEnumName();
            }

            string full_path = element.GetFullPath();
            int    start     = element.GetStart();
            int    length    = element.GetLength();

            Application.Current.Dispatcher.Invoke(() =>
            {
                ALanguageUtility.OpenFile(m_open_document, m_adapters_factory
                                          , full_path, start, length);
            });

            return(null);
        }