Frage

Gibt es eine Möglichkeit, eine zu erstellen SyntaxToken oder SyntaxNode und ändern Sie die FullSpan Eigentum?

Da alle Klassen versiegelt und unveränderlich sind und keine zugänglichen Konstruktoren haben, besteht die einzige Möglichkeit, eine solche zu erstellen, darin, den zu verwenden SyntaxFactory statische Methoden und diese haben keine Überladung, um einen Speicherort anzugeben.

Ich schreibe eine Skriptsprache, die in Roslyn analysiert wird SyntaxTree.Wenn ich das Besuchermuster verwende, um die Semantik von Ausdrücken zu überprüfen, möchte ich dem Benutzer sagen können, wo der Fehler aufgetreten ist, indem ich die Knoten einem Ort zuordne.

Gibt es irgendeinen Weg?Dank im Voraus.

War es hilfreich?

Lösung

Nein, es gibt keine Möglichkeit, dies zu tun.Wir stellen sicher, dass unsere Syntaxbäume mehreren Grundprinzipien entsprechen:

  1. Der Anfang eines Baumes ist die Position Null.
  2. Die vollen Spannweiten der Kinder sind in Ordnung und grenzen aneinander (d. h.das Ende von einem ist der Anfang von einem anderen)
  3. Die gesamte Spanne eines Knotens entspricht der Spanne aller seiner untergeordneten Knoten zusammen.

Diese Kernaxiome bedeuten, dass jeder Code (einschließlich des Compilers), der einen Baum analysiert, vernünftigerweise mit dem Baum arbeiten kann.Wenn wir Ihnen die Möglichkeit geben würden, FullSpans für einige Knoten anzugeben und für andere nicht, wären wir nicht in der Lage, diese Invarianten beizubehalten, und wer weiß, was kaputt gehen würde.Eventuell verlangen wir von Ihnen eine Angabe alle Spannen, aber an diesem Punkt werden Sie sich selbst wahnsinnig machen, wenn Sie versuchen, diese Axiome aufrechtzuerhalten.

Sie haben mehrere Möglichkeiten:

  1. Sie könnten die #line-Direktive in Ihrer generierten Quelle verwenden, um dem Compiler die „echten“ Codezeilen in Ihrer Skriptdatei mitzuteilen.Normalerweise bedeutet das, dass Sie direkt vor dem Einfügen des Benutzercodes in die Datei eine #-Zeile davor einfügen.Wir haben Funktionen wie SyntaxTree.GetMappedLineSpan Dies nimmt eine regelmäßige Spanne an und konvertiert sie basierend auf unserer Interpretation der #line-Anweisungen in Datei-/Zeilen-/Spalteninformationen.

  2. Wenn Sie eine Reihe kleiner Bäume für verschiedene Ausdrücke generieren, behalten Sie einfach eine Karte von Baum -> Startposition in Ihrer Datei bei, und wenn Sie eine Konvertierung in einen Anzeigeort benötigen, kartieren Sie diese einfach durch.

  3. Wenn Sie einen einzelnen Baum mit einer Reihe von Ausdrücken generieren, fügen Sie ihn an SyntaxAnnotations zu Ihren Ausdrücken, der die Position in Ihrer Skriptdatei enthält, von der der Ausdruck stammt.Dann können Sie ganz einfach den Speicherort einer Skriptdatei für einen Knoten berechnen, indem Sie durch die übergeordneten Knoten gehen, bis Sie einen finden SyntaxAnnotation, und berechnen Sie dann den Standort auf diese Weise.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top