class SyntaxSuggest::CodeFrontier

Es gibt drei Hauptphasen im Algorithmus

  1. Bereinigung/Formatierung des Eingabequellcodes

  2. Suche nach ungültigen Blöcken

  3. Formatierung ungültiger Blöcke in etwas Sinnvolles

Der Code-Frontier ist ein kritischer Teil des zweiten Schritts.

## Wissen, wo wir waren

Sobald ein Codeblock generiert wurde, wird er dem Frontier hinzugefügt. Dann wird er nach Einrückung sortiert und der Frontier kann gefiltert werden. Große Blöcke, die einen kleineren Block vollständig umschließen, führen dazu, dass der kleinere Block verdrängt wird.

CodeFrontier#<<(block) # Adds block to frontier
CodeFrontier#pop # Removes block from frontier

## Wissen, wohin wir gehen können

Intern verfolgt der Frontier „unbesuchte“ Zeilen, die über `next_indent_line` verfügbar gemacht werden. Wenn diese Methode aufgerufen wird, gibt sie eine Codezeile mit der höchsten Einrückung zurück.

Die zurückgegebene Codezeile kann verwendet werden, um einen CodeBlock zu erstellen. Dann wird dieser Codeblock wieder zum Frontier hinzugefügt. Anschließend werden die Zeilen aus dem „unbesuchten“ Bereich entfernt, damit wir nicht denselben Block doppelt erstellen.

CodeFrontier#next_indent_line # Shows next line
CodeFrontier#register_indent_block(block) # Removes lines from unvisited

## Wissen, wann man aufhören muss

Der Frontier weiß, wie das gesamte Dokument auf Syntaxfehler überprüft werden kann. Wenn Blöcke dem Frontier hinzugefügt werden, werden sie aus dem Dokument entfernt. Wenn der gesamte Code, der Syntaxfehler enthält, zum Frontier hinzugefügt wurde, ist das Dokument ohne Syntaxfehler analysierbar und die Suche kann beendet werden.

CodeFrontier#holds_all_syntax_errors? # Returns true when frontier holds all syntax errors

## Filtern von falsch positiven Ergebnissen

Sobald die Suche abgeschlossen ist, kann der Frontier mehrere Blöcke enthalten, die den Syntaxfehler nicht enthalten. Um das Ergebnis auf die kleinste Teilmenge von „ungültigen Blöcken“ zu beschränken, rufen Sie auf:

CodeFrontier#detect_invalid_blocks