PB-Tool: Alle Verweise finden
Verfasst: 17.08.2014 19:51
Hallo,
im Visual Studio kann man mit der rechten Maustaste auf eine Variable oder eine Prozedur klicken und im dann aufklappenden Menü auf "Alle Verweise finden" klicken, um alle Codezeilen aufgelistet zu bekommen, die den angeklickten Suchbegriff enthalten.
Hier ist so was ähnliches für PureBasic, welches als PB-Tool eingerichtet werden kann (leider unterstützt die PB-IDE das nicht über das Popup-Menü der Maus, aber mit einem Keyboard-Shortcut eingerichtet ist funktioniert es auch ganz komfortabel.)

Grüße ... Peter
P.S.: Der Gültigkeitsbereich von Variablen wird noch nicht beachtet. Vielleicht baue ich das später mal ein...
// Edit:
* Zeilenfehler behoben. (c4s)
* Groß- und Kleinschreibung wird jetzt nicht mehr beachtet. (Nino)
im Visual Studio kann man mit der rechten Maustaste auf eine Variable oder eine Prozedur klicken und im dann aufklappenden Menü auf "Alle Verweise finden" klicken, um alle Codezeilen aufgelistet zu bekommen, die den angeklickten Suchbegriff enthalten.
Hier ist so was ähnliches für PureBasic, welches als PB-Tool eingerichtet werden kann (leider unterstützt die PB-IDE das nicht über das Popup-Menü der Maus, aber mit einem Keyboard-Shortcut eingerichtet ist funktioniert es auch ganz komfortabel.)

Code: Alles auswählen
; FindAllReferences
EnableExplicit
Enumeration ; Windows
#frmMain
EndEnumeration
Enumeration ; Gadgets
#frmMain_References
EndEnumeration
Enumeration ; Menu-/Toolbaritems
#frmMain_Shortcut_Escape_Event
EndEnumeration
Global PbIdeHandle = Val(GetEnvironmentVariable("PB_TOOL_MainWindow"))
If PbIdeHandle = 0 : End : EndIf
Global ScintillaHandle = Val(GetEnvironmentVariable("PB_TOOL_Scintilla"))
If ScintillaHandle = 0 : End : EndIf
Procedure.s RemoveLeadingWhitespaceFromString(InString.s)
While Left(InString, 1) = Chr(32) Or Left(InString, 1) = Chr(9)
InString = LTrim(InString, Chr(32))
InString = LTrim(InString, Chr(9))
Wend
ProcedureReturn InString
EndProcedure
Procedure.s GetScintillaText()
Protected ReturnValue.s
Protected length
Protected buffer
Protected processId
Protected hProcess
Protected result
length = SendMessage_(ScintillaHandle, #SCI_GETLENGTH, 0, 0)
If length
length + 2
buffer = AllocateMemory(length)
If buffer
SendMessageTimeout_(ScintillaHandle, #SCI_GETCHARACTERPOINTER, 0, 0, #SMTO_ABORTIFHUNG, 2000, @result)
If result
GetWindowThreadProcessId_(ScintillaHandle, @processId)
hProcess = OpenProcess_(#PROCESS_ALL_ACCESS, #False, processId)
If hProcess
ReadProcessMemory_(hProcess, result, buffer, length, 0)
ReturnValue = PeekS(buffer, -1, #PB_UTF8)
EndIf
EndIf
EndIf
FreeMemory(buffer)
EndIf
ProcedureReturn ReturnValue
EndProcedure
Procedure frmMain_SizeWindow_Event()
ResizeGadget(#frmMain_References, #PB_Ignore, #PB_Ignore, WindowWidth(#frmMain) - 20, WindowHeight(#frmMain) - 20)
EndProcedure
Procedure frmMain_References_Event()
Protected SelectedLine
SelectedLine = Val(GetGadgetItemText(#frmMain_References, GetGadgetState(#frmMain_References), 0))
If SelectedLine > 0
SendMessage_(ScintillaHandle, #SCI_GOTOLINE, SelectedLine - 1, 0)
SendMessage_(ScintillaHandle, #SCI_ENSUREVISIBLE, SelectedLine - 1, 0)
SetForegroundWindow_(PbIdeHandle)
SetActiveWindow_(PbIdeHandle)
EndIf
EndProcedure
Define SelectedWord.s = GetEnvironmentVariable("PB_TOOL_Word")
If SelectedWord = "" : End : EndIf
Define ScintillaText.s = GetScintillaText()
If ScintillaText = "" : End : EndIf
Define Line.s
Define CountLines, LineCounter
Define CountTokens, TokenCounter
Define WWE
Define RegexLines, PbRegexTokens
Structure sFoundReference
LineNo.i
Reference.s
EndStructure
NewList FoundReference.sFoundReference()
Dim Tokens.s(0)
;http://www.purebasic.fr/english/viewtopic.php?f=12&t=37823
RegexLines = CreateRegularExpression(#PB_Any , ".*\r\n")
PbRegexTokens = CreateRegularExpression(#PB_Any, #DOUBLEQUOTE$ + "[^" + #DOUBLEQUOTE$ + "]*" + #DOUBLEQUOTE$ + "|[\*]?[a-zA-Z_]+[\w]*[\x24]?|#[a-zA-Z_]+[\w]*[\x24]?|[\[\]\(\)\{\}]|[-+]?[0-9]*\.?[0-9]+|;.*|\.|\+|-|[&@!\\\/\*,\|]|::|:|\|<>|>>|<<|=>{1}|>={1}|<={1}|=<{1}|={1}|<{1}|>{1}|\x24+[0-9a-fA-F]+|\%[0-1]*|%|'")
CountLines = CountString(ScintillaText, #CRLF$)
Dim Lines.s(0)
CountLines = ExtractRegularExpression(RegexLines, ScintillaText, Lines())
SelectedWord = LCase(SelectedWord)
For LineCounter = 0 To CountLines - 1
Line = Lines(LineCounter)
CountTokens = ExtractRegularExpression(PbRegexTokens, Line, Tokens())
For TokenCounter = 0 To CountTokens - 1
If SelectedWord = LCase(Tokens(TokenCounter))
AddElement(FoundReference())
FoundReference()\LineNo = LineCounter + 1
FoundReference()\Reference = Line
EndIf
Next
Next
If ListSize(FoundReference()) = 0 : End : EndIf
OpenWindow(#frmMain,
#PB_Ignore,
#PB_Ignore,
600,
300,
"All references for: '" + SelectedWord + "'",
#PB_Window_SystemMenu |
#PB_Window_SizeGadget |
#PB_Window_ScreenCentered)
StickyWindow(#frmMain, #True)
ListIconGadget(#frmMain_References,
10,
10,
WindowWidth(#frmMain) - 20,
WindowHeight(#frmMain) - 20,
"LineNo.",
50,
#PB_ListIcon_FullRowSelect |
#PB_ListIcon_GridLines |
#PB_ListIcon_AlwaysShowSelection)
AddGadgetColumn(#frmMain_References, 1, "Reference", 400)
ForEach FoundReference()
AddGadgetItem(#frmMain_References, -1, Str(FoundReference()\LineNo) + #LF$ + FoundReference()\Reference)
Next
AddKeyboardShortcut(#frmMain, #PB_Shortcut_Escape, #frmMain_Shortcut_Escape_Event)
BindEvent(#PB_Event_SizeWindow, @frmMain_SizeWindow_Event(), #frmMain)
BindGadgetEvent(#frmMain_References, @frmMain_References_Event())
SetActiveGadget(#frmMain_References)
Repeat
WWE = WaitWindowEvent()
If (WWE = #PB_Event_Menu And EventMenu() = #frmMain_Shortcut_Escape_Event) Or (WWE = #PB_Event_CloseWindow)
Break
EndIf
ForEver
P.S.: Der Gültigkeitsbereich von Variablen wird noch nicht beachtet. Vielleicht baue ich das später mal ein...
// Edit:
* Zeilenfehler behoben. (c4s)
* Groß- und Kleinschreibung wird jetzt nicht mehr beachtet. (Nino)