博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SharpDevelop研究笔记
阅读量:4512 次
发布时间:2019-06-08

本文共 12953 字,大约阅读时间需要 43 分钟。

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
bracketStack = new Stack
(); 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; }

 

 

 

转载于:https://www.cnblogs.com/cyangluiqin/archive/2013/03/29/2989795.html

你可能感兴趣的文章
java调用matlab函数
查看>>
IOS自定义仪表盘
查看>>
第5次作业_078_刘玲志
查看>>
ZOJ 1184
查看>>
spring - aop 使用方式总结
查看>>
最后,我想对你说一句:我爱你
查看>>
使用jndi连接数据库
查看>>
Python---- 函数
查看>>
javascript中的函数作用域和声明提前
查看>>
Xcode10升级项目报错library not found for -lstdc++.6.0.9
查看>>
谷歌Chrome浏览器如何设置网页的默认编码方法
查看>>
ZOJ-1129-Erdos Numbers
查看>>
java学习第四天 类和变量
查看>>
IDEA中如何添加RunDashboard
查看>>
单例静态继承
查看>>
Android开发:《Gradle Recipes for Android》阅读笔记(翻译)3.2——设置Flavors和Variants...
查看>>
Android零基础入门第36节:Android系统事件的响应
查看>>
POJ 2262 Goldbach's Conjecture
查看>>
自己手动写代码实现数据库连接池
查看>>
领域对象驱动开发:来吧,让我们从对象开始吧
查看>>