Lade...
 

CX_FILE_SOURCE_RANGE::RewriteInString

CX_FILE_SOURCE_RANGE::RewriteInString

230177
Beschreibung:

Diese Methode arbeitet ähnlich wie Rewrite mit dem Unterschied, dass der Quellcodebereich nicht in einer Datei überschrieben wird, sondern in dem übergebenen STRING und der daraus resultierende STRING wird auf dem Stack zurückgegeben. Der Quellcodebereich wird (wie in Rewrite) im Anschluss an RewriteInString auf den geschriebenen Bereich gesetzt, sodass dieser anschließend wieder per ReadFromString ausgelesen oder erneut überschrieben werden kann.

Da der Quellcodebereich in einem STRING überschrieben wird, wird bei RewriteInString im Gegensatz zu Rewrite der Dateiname dieses Quellcodebereichs hierbei nicht beachtet, sodass er auch leer sein oder auf eine nicht existierende Datei verweisen kann.

Hinweis: Falls der Quellcodebereich aus einem Teilbereich des Quellcodes überschrieben werden soll (Bsp: Der Codebereich eines String-Widgets, aus dem Quellcode der umschließenden Gruppe), dann lässt sich hierfür per RelativeTo ein Quellcodebereich berechnen, dessen Zeilennummerierung relativ zu dem umschließenden Bereich ist.

Achtung: Falls mehrere Quellcodebereiche in dem gleichen STRING überschrieben werden sollen, dann sollte darauf geachtet werden, dass die Bereiche mit der höchsten Zeilennummer zuerst überschrieben werden und dass sich die Quellcodebereiche nicht überschneiden, denn jedes RewriteInString kann potenziell die Zeilennumerierung des nicht veränderten Quellcodebereichs hinter dem überschriebenen Bereich verändern.


Code-Beispiel:

// Remove the widget "mainGrp" from the window "editWin"
// 1. retrieve the window's source range and read the complete source
Var(windowRange, windowSource)
NULL Widget(editWin) Call(GetSourceRange) -> windowRange // (start=123:4, end=256:5)
FALSE windowRange Call(Read) -> windowSource // "Window(editWin, ...) { ... Group(mainGrp... }"

// 2. retrieve the group's source range
Var(group, groupRange)
"mainGrp" Widget(editWin) Call(GetChild) -> group
NULL group Call(GetSourceRange) -> groupRange // (start=148:6, end=168:7)

// 3. convert the group's source range into a relative source range
windowRange groupRange Call(RelativeTo) -> groupRange // (start=25:6, end=45:7)

// 4. use the relative range to overwrite the group's source with an empty string
windowSource "" groupRange Call(RewriteInString) -> windowSource // "Window(editWin, ...) { ... }"

// 5. compile the modified window definition into the current module
windowSource Module Call(CompileOverrideWindow)

Stack
Stack Positionn Objekttyp Kurzbeschreibung
Stack(In) Top CX_FILE_SOURCE_RANGE Der Quellcodebereich, der im String überschrieben werden soll
  Top-1 STRING Der zu schreibende String
  Top-2 STRING Der Quellcodestring in welchem der Quellcodebereich überschrieben werden soll
Stack(Out) Top STRING Der veränderte Quellcodestring
Funktionsaufruf: Call(RewriteInString)