首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VB中的AvalonEdit折叠策略

VB中的AvalonEdit折叠策略
EN

Stack Overflow用户
提问于 2012-06-14 05:27:45
回答 2查看 1.4K关注 0票数 0

我正在开发一个支持脚本的C#应用程序。是否有用于AvalonEdit代码折叠的Visual Basic代码示例FoldingStrategy

EN

回答 2

Stack Overflow用户

发布于 2012-08-31 11:12:09

这是我创建的一个似乎可以工作的.相当不错。这并不完美,因为它没有考虑到许多可能的情况,但这是一个开始。

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2014-06-06 23:21:48

我在这段代码中发现了两个错误。以下位置有两个超出范围的exeptions:

代码语言:javascript
复制
Do Until text(k - 1) = vbLf OrElse text(k - 1) = vbCr

如果k运行到0。我只修改了一行:

代码语言:javascript
复制
k -= 1
If k <= 0 Then Exit Do

和在:

代码语言:javascript
复制
Dim startOffset As Integer = startOffsets.Pop()

如果startOffset为空,则通过以下方式修复此参数:

代码语言:javascript
复制
If startOffsets.Count > 0 Then
    Dim startOffset As Integer = startOffsets.Pop()
    .....
End If

但是折叠生成在InlineSubs上失败了。试一下这个例子:

代码语言:javascript
复制
Public Class Window
    Public Sub New()
        InitializeComponent()

        AddHandler TextBox.TextChanged, Sub(TBsender As Object, TBe As EventArgs)
                                             CheckCode()
                                        End Sub
    End Sub
End Class

我没能解决最后一个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11023569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档