我正在开发一个支持脚本的C#应用程序。是否有用于AvalonEdit代码折叠的Visual Basic代码示例FoldingStrategy?
发布于 2012-08-31 11:12:09
这是我创建的一个似乎可以工作的.相当不错。这并不完美,因为它没有考虑到许多可能的情况,但这是一个开始。
Imports ICSharpCode.AvalonEdit.Folding
Imports ICSharpCode.AvalonEdit.Document
Public Class VBNETFoldingStrategy
Inherits AbstractFoldingStrategy
Private foldableKeywords() As String = {"namespace", "class", "sub", "function", "structure", "enum"}
Public Overrides Function CreateNewFoldings(document As ICSharpCode.AvalonEdit.Document.TextDocument, ByRef firstErrorOffset As Integer) As System.Collections.Generic.IEnumerable(Of ICSharpCode.AvalonEdit.Folding.NewFolding)
firstErrorOffset = -1
Dim foldings As New List(Of NewFolding)
Dim text As String = document.Text
Dim lowerCaseText As String = text.ToLower()
For Each foldableKeyword In foldableKeywords
foldings.AddRange(GetFoldings(text, lowerCaseText, foldableKeyword))
Next
Return foldings.OrderBy(Function(f) f.StartOffset)
End Function
Public Function GetFoldings(text As String, lowerCaseText As String, keyword As String) As IEnumerable(Of NewFolding)
Dim foldings As New List(Of NewFolding)
Dim closingKeyword As String = "end " + keyword
Dim closingKeywordLength As String = closingKeyword.Length
keyword += " "
Dim keywordLength As String = keyword.Length
Dim startOffsets As New Stack(Of Integer)
For i As Integer = 0 To text.Length - closingKeywordLength
If lowerCaseText.Substring(i, keywordLength) = keyword Then
Dim k As Integer = i
If k <> 0 Then
Dim lastLetterPos As Integer = i
Do Until text(k - 1) = vbLf OrElse text(k - 1) = vbCr
If Char.IsLetter(text(k)) Then lastLetterPos = k
k -= 1
Loop
If lastLetterPos > k Then k = lastLetterPos
End If
startOffsets.Push(k)
ElseIf lowerCaseText.Substring(i, closingKeywordLength) = closingKeyword Then
Dim startOffset As Integer = startOffsets.Pop()
Dim newFolding As NewFolding = New NewFolding(startOffset, i + closingKeywordLength)
Dim p As Integer = text.IndexOf(vbLf, startOffset)
If p = -1 Then p = text.IndexOf(vbCr, startOffset)
If p = -1 Then p = text.Length - 1
newFolding.Name = text.Substring(startOffset, p - startOffset)
foldings.Add(newFolding)
End If
Next
Return foldings
End Function
End Class发布于 2014-06-06 23:21:48
我在这段代码中发现了两个错误。以下位置有两个超出范围的exeptions:
Do Until text(k - 1) = vbLf OrElse text(k - 1) = vbCr如果k运行到0。我只修改了一行:
k -= 1
If k <= 0 Then Exit Do和在:
Dim startOffset As Integer = startOffsets.Pop()如果startOffset为空,则通过以下方式修复此参数:
If startOffsets.Count > 0 Then
Dim startOffset As Integer = startOffsets.Pop()
.....
End If但是折叠生成在InlineSubs上失败了。试一下这个例子:
Public Class Window
Public Sub New()
InitializeComponent()
AddHandler TextBox.TextChanged, Sub(TBsender As Object, TBe As EventArgs)
CheckCode()
End Sub
End Sub
End Class我没能解决最后一个问题。
https://stackoverflow.com/questions/11023569
复制相似问题