class SyntaxSuggest::CleanDocument

Parst und bereinigt Quellcode zu einem lexikalisch bewussten Dokument

Intern wird das Dokument durch ein Array dargestellt, wobei jeder Index einen CodeLine enthält, der einer Zeile aus dem Quellcode entspricht.

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

Diese Klasse kümmert sich um den ersten Teil.

Der Grund für die Existenz dieser Klasse ist die Formatierung des Eingabequellcodes für eine bessere/einfachere/sauberere Erkundung.

Die Klasse CodeSearch arbeitet auf Zeilenebene, daher müssen wir vorsichtig sein, keine Zeilen einzufügen, die für sich genommen gültig aussehen, aber beim Entfernen Syntaxfehler oder seltsames Verhalten auslösen.

## Anhängige Schrägstriche verbinden

Code mit einem anhängigen Schrägstrich wird logisch als eine einzige Zeile behandelt

1 it "code can be split" \
2    "across multiple lines" do

In diesem Fall würde das Entfernen von Zeile 2 einen Syntaxfehler verursachen. Wir umgehen dies, indem wir die beiden Zeilen intern zu einem einzigen "Zeilen"-Objekt verbinden

## Logisch aufeinanderfolgende Zeilen

Code, der über mehrere Zeilen aufgeteilt werden kann, wie z. B. Methodenaufrufe, befindet sich in verschiedenen Zeilen

1 User.
2   where(name: "schneems").
3   first

Das Entfernen von Zeile 2 kann einen Syntaxfehler verursachen. Um dies zu beheben, werden alle Zeilen zu einer zusammengefügt.

## Heredocs

Ein Heredoc ist eine Möglichkeit, eine mehrzeilige Zeichenkette zu definieren. Sie können viele Probleme verursachen. Wenn sie als einzelne Zeile belassen werden, versucht der Parser, den Inhalt als Ruby-Code und nicht als Zeichenkette zu parsen. Selbst ohne dieses Problem stoßen wir auf ein Problem mit der Einrückung

1 foo = <<~HEREDOC
2  "Be yourself; everyone else is already taken.""
3    ― Oscar Wilde
4      puts "I look like ruby code" # but i'm still a heredoc
5 HEREDOC

Wenn wir diese Zeilen nicht verbinden würden, würde unser Algorithmus denken, dass Zeile 4 von den anderen getrennt ist, eine höhere Einrückung hat, sie zuerst betrachtet und entfernt.

Wenn der Code Zeile 5 isoliert auswertet, wird er Zeile 5 als Konstante betrachten, sie entfernen und einen Syntaxfehler einführen.

All diese Probleme werden durch das Zusammenfügen des gesamten Heredocs zu einer einzigen Zeile behoben.

## Kommentare und Leerzeichen

Kommentare können die Art und Weise, wie der Lexer uns mitteilt, dass die Zeile logisch zur nächsten Zeile gehört, durcheinanderbringen. Dies ist gültiger Ruby-Code, führt aber zu einer anderen Lex-Ausgabe als zuvor

1 User.
2   where(name: "schneems").
3   # Comment here
4   first

Um dies zu handhaben, können wir Kommentarzeilen durch leere Zeilen ersetzen und dann den Quellcode neu lexen. Dieses Entfernen und Neuluxen bewahrt den Zeilenindex und die Dokumentgröße, erzeugt aber ein leichter zu handhabendes Dokument.