• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
南南的空间
博客园    首页    新随笔    联系   管理    订阅  订阅
SharpDevelop研究笔记
public virtual int SearchBracketBackward(IDocument document, int offset, char openBracket, char closingBracket)
        {
            int brackets = -1;
            // first try "quick find" - find the matching bracket if there is no string/comment in the way
            for (int i = offset; i > 0; --i) {
                char ch = document.GetCharAt(i);
                if (ch == openBracket) {
                    ++brackets;
                    if (brackets == 0) return i;
                } else if (ch == closingBracket) {
                    --brackets;
                //} else if (ch == '"') {
                //    break;
                //} else if (ch == '\'') {
                //    break;
                //} else if (ch == '/' && i > 0) {
                //    if (document.GetCharAt(i - 1) == '/') break;
                //    if (document.GetCharAt(i - 1) == '*') break;
                }
            }
            return -1;
        }
        
        public virtual int SearchBracketForward(IDocument document, int offset, char openBracket, char closingBracket)
        {
            int brackets = 1;
            // try "quick find" - find the matching bracket if there is no string/comment in the way
            for (int i = offset; i < document.TextLength; ++i) {
                char ch = document.GetCharAt(i);
                if (ch == openBracket) {
                    ++brackets;
                } else if (ch == closingBracket) {
                    --brackets;
                    if (brackets == 0) return i;
                //} else if (ch == '"') {
                //    break;
                //} else if (ch == '\'') {
                //    break;
                //} else if (ch == '/' && i > 0) {
                //    if (document.GetCharAt(i - 1) == '/') break;
                //} else if (ch == '*' && i > 0) {
                //    if (document.GetCharAt(i - 1) == '/') break;
                }
            }
            return -1;
        }

ICSharpCode:Gui/TextEditor中

括号匹配在何处被定义和捕捉更新?奇怪的是如果加了//或者/*就会失效,所以把上面的注示掉
答:TextArea.cs中的List<BracketHighlightingSheme> bracketshemes  = new List<BracketHighlightingSheme>();变量存储在查找的匹配 项,SearchMatchingBracket()方法中搜索并更新匹配项的显示

代码在Document/FormattingStrategy下

后来想想也有道理,因为注示掉的文字,可能也有括号,这样匹配项就不对了,这里还有修改的空间?????

在4.30的源码里找到了如下段,可是已经给注示掉了,不过证明了原来的两段是不合理的!

 

int DoQuickFindBackward(IDocument document, int offset, char openBracket, char closingBracket)
        {
            int brackets = -1;
            // first try "quick find" - find the matching bracket if there is no string/comment in the way
            for (int i = offset; i >= 0; --i) {
                char ch = document.GetCharAt(i);
                if (ch == openBracket) {
                    ++brackets;
                    if (brackets == 0) return i;
                } else if (ch == closingBracket) {
                    --brackets;
                } else if (ch == '"') {
                    break;
                } else if (ch == '#') {
                    break;
                } else if (ch == '\'') {
                    break;
                } else if (ch == '/' && i > 0) {
                    if (document.GetCharAt(i - 1) == '/') break;
                    if (document.GetCharAt(i - 1) == '*') break;
                }
            }
            return -1;
        }
        
        int DoQuickFindForward(IDocument document, int offset, char openBracket, char closingBracket)
        {
            int brackets = 1;
            // try "quick find" - find the matching bracket if there is no string/comment in the way
            for (int i = offset; i < document.TextLength; ++i) {
                char ch = document.GetCharAt(i);
                if (ch == openBracket) {
                    ++brackets;
                } else if (ch == closingBracket) {
                    --brackets;
                    if (brackets == 0) return i;
                } else if (ch == '"') {
                    break;
                } else if (ch == '#') {
                    break;
                } else if (ch == '\'') {
                    break;
                } else if (ch == '/' && i > 0) {
                    if (document.GetCharAt(i - 1) == '/') break;
                } else if (ch == '*' && i > 0) {
                    if (document.GetCharAt(i - 1) == '/') break;
                }
            }
            return -1;
        }
        
        public override int SearchBracketBackward(IDocument document, int offset, char openBracket, char closingBracket)
        {
            // Implemented Boo specific "quick find" of brackets
            // needed because of "#" --> comment character
            int quickFind = DoQuickFindBackward(document, offset, openBracket, closingBracket);
            if (quickFind >= 0)
                return quickFind;
            
            // Same as with C# - can not parse a boo file backwards
            // -> all brackets from the beginning are put on a stack
            
            bool inSingleComment = false;
            int multiCommentLevel = 0; // Boo has nested multiline comments
            bool inMultiString = false;
            bool inSingleString = false;
            bool inSingleString2 = false; // ' ... ' strings
            Stack<int> bracketStack = new Stack<int>();
            
            if (document.TextContent.StartsWith("//")) {
                inSingleComment = true;
            }
            
            for (int position = 0; position <= offset; ++position) {
                try {
                    char ch = document.GetCharAt(position);
                    
                    if (ch == openBracket) {
                        if (!(inSingleString || inSingleString2 || inMultiString || inSingleComment || (multiCommentLevel != 0))) {
                            bracketStack.Push(position);
                        }
                    } else {
                        if (ch == closingBracket) {
                            if (!(inSingleString || inSingleString2 || inMultiString || inSingleComment || (multiCommentLevel != 0))) {
                                if (bracketStack.Count > 0) {
                                    bracketStack.Pop();
                                }
                            }
                        } else {
                            switch (ch) {
                                case '/':
                                    if (!(inMultiString || inSingleString2 || inSingleString || inSingleComment)) {
                                        if (document.GetCharAt(position + 1) == '*') {
                                            multiCommentLevel++;
                                        }
                                        if (document.GetCharAt(position + 1) == '/') {
                                            inSingleComment = true;
                                        }
                                        if (document.GetCharAt(position - 1) == '*') {
                                            multiCommentLevel--;
                                        }
                                    }
                                    break;
                                case '#':
                                    if (!inMultiString && !inSingleString && !inSingleString2)
                                        inSingleComment = true;
                                    break;
                                case '\n':
                                    if (!inMultiString && !inSingleString && !inSingleString2)
                                        inSingleComment = false;
                                    break;
                                case '"':
                                    if (IsMultilineString(document, position)) {
                                        position += 2;
                                        inMultiString = !inMultiString;
                                    } else {
                                        if (!inMultiString && !inSingleString2) {
                                            inSingleString = !inSingleString;
                                        }
                                    }
                                    break;
                                case '\'':
                                    if (!inMultiString && !inSingleString2) {
                                        inSingleString2 = !inSingleString2;
                                    }
                                    break;
                                case '\\':
                                    if (!inMultiString)
                                        position++;
                                    break;
                            }
                        }
                    }
                } catch (ArgumentOutOfRangeException) {
                    break;
                }
            }
            
            if (bracketStack.Count > 0)
                return bracketStack.Pop();
            
            return -1;
        }
        
        bool IsMultilineString(IDocument document, int offset)
        {
            if (offset + 2 >= document.TextLength)
                return false;
            
            if ((document.GetCharAt(offset) == document.GetCharAt(offset + 1))
                && (document.GetCharAt(offset) == document.GetCharAt(offset + 2))) {
                return true;
            }
            
            return false;
        }
        
        public override int SearchBracketForward(IDocument document, int offset, char openBracket, char closingBracket)
        {
            // Implemented Boo specific "quick find" of brackets
            // needed because of "#" --> comment character
            int quickFind = DoQuickFindForward(document, offset, openBracket, closingBracket);
            if (quickFind >= 0)
                return quickFind;
            
            int brackets = 1;
            bool inSingleComment = false;
            int multiCommentLevel = 0;
            bool inMultiString = false;
            bool inSingleString = false;
            
            while (offset < document.TextLength) {
                char ch = document.GetCharAt(offset);
                
                if (ch == openBracket) {
                    if (!(inSingleString || inMultiString || inSingleComment || (multiCommentLevel != 0))) {
                        brackets++;
                    }
                } else {
                    if (ch == closingBracket) {
                        if (!(inSingleString || inMultiString || inSingleComment || (multiCommentLevel != 0))) {
                            brackets--;
                            if (brackets == 0) return offset;
                        }
                    } else {
                        switch (ch) {
                            case '/':
                                if (!inMultiString && !inSingleString) {
                                    if (offset + 1 < document.TextLength) {
                                        if (document.GetCharAt(offset + 1) == '*') {
                                            multiCommentLevel++;
                                        } else if (document.GetCharAt(offset + 1) == '/') {
                                            inSingleComment = true;
                                        }
                                    }
                                }
                                break;
                            case '*':
                                if (!inMultiString && !inSingleString) {
                                    if (offset + 1 < document.TextLength && document.GetCharAt(offset + 1) == '/') {
                                        multiCommentLevel--;
                                    }
                                }
                                break;
                            case '#':
                                if (!inMultiString && !inSingleString)
                                    inSingleComment = true;
                                break;
                            case '\n':
                                if (!inMultiString && !inSingleString)
                                    inSingleComment = false;
                                break;
                            case '"':
                                if (IsMultilineString(document, offset)) {

                                    offset += 2;
                                    inMultiString = !inMultiString;
                                } else {
                                    if (!inMultiString) {
                                        inSingleString = !inSingleString;
                                    }
                                }
                                break;
                            case '\\':
                                if (!inMultiString)
                                    offset++;
                                break;
                        }
                    }
                }
                offset++;
            }
            
            return -1;
        }

 

 

 

posted on 2013-03-29 22:54  南南的博客  阅读(278)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3