class Prism::Source
Dies repräsentiert eine Quelle von Ruby-Code, die analysiert wurde. Sie wird in Verbindung mit Locations verwendet, um ihnen die Auflösung von Zeilennummern und Quellcodebereichen zu ermöglichen.
Attribute
Die Liste der Byte-Offsets von Zeilenumbrüchen im Quellcode.
Der Quellcode, den dieses Quellobjekt repräsentiert.
Die Zeilennummer, bei der diese Quelle beginnt.
Öffentliche Klassenmethoden
Source
# File lib/prism/parse_result.rb, line 13 def self.for(source, start_line = 1, offsets = []) if source.ascii_only? ASCIISource.new(source, start_line, offsets) elsif source.encoding == Encoding::BINARY source.force_encoding(Encoding::UTF_8) if source.valid_encoding? new(source, start_line, offsets) else # This is an extremely niche use case where the file is marked as # binary, contains multi-byte characters, and those characters are not # valid UTF-8. In this case we'll mark it as binary and fall back to # treating everything as a single-byte character. This _may_ cause # problems when asking for code units, but it appears to be the # cleanest solution at the moment. source.force_encoding(Encoding::BINARY) ASCIISource.new(source, start_line, offsets) end else new(source, start_line, offsets) end end
Erstellt ein neues Quellobjekt mit dem gegebenen Quellcode. Diese Methode sollte anstelle von new verwendet werden und gibt entweder ein Source-Objekt oder ein spezialisiertes und leistungsfähigeres ASCIISource-Objekt zurück, wenn keine Multibyte-Zeichen im Quellcode vorhanden sind.
Source
# File lib/prism/parse_result.rb, line 46 def initialize(source, start_line = 1, offsets = []) @source = source @start_line = start_line # set after parsing is done @offsets = offsets # set after parsing is done end
Erstellt ein neues Quellobjekt mit dem gegebenen Quellcode.
Öffentliche Instanzmethoden
Source
# File lib/prism/parse_result.rb, line 108 def character_column(byte_offset) character_offset(byte_offset) - character_offset(line_start(byte_offset)) end
Gibt die Spaltennummer in Zeichen für den gegebenen Byte-Offset zurück.
Source
# File lib/prism/parse_result.rb, line 103 def character_offset(byte_offset) (source.byteslice(0, byte_offset) or raise).length end
Gibt den Zeichen-Offset für den gegebenen Byte-Offset zurück.
Source
# File lib/prism/parse_result.rb, line 136 def code_units_cache(encoding) CodeUnitsCache.new(source, encoding) end
Generiert einen Cache, der auf eine bestimmte Kodierung zur Berechnung von Code-Unit-Offsets abzielt.
Source
# File lib/prism/parse_result.rb, line 142 def code_units_column(byte_offset, encoding) code_units_offset(byte_offset, encoding) - code_units_offset(line_start(byte_offset), encoding) end
Gibt die Spaltennummer in Code-Einheiten für die gegebene Kodierung für den gegebenen Byte-Offset zurück.
Source
# File lib/prism/parse_result.rb, line 124 def code_units_offset(byte_offset, encoding) byteslice = (source.byteslice(0, byte_offset) or raise).encode(encoding, invalid: :replace, undef: :replace) if encoding == Encoding::UTF_16LE || encoding == Encoding::UTF_16BE byteslice.bytesize / 2 else byteslice.length end end
Gibt den Offset vom Beginn der Datei für den gegebenen Byte-Offset zurück, gezählt in Code-Einheiten für die gegebene Kodierung.
Diese Methode wird mit UTF-8, UTF-16 und UTF-32 getestet. Wenn das Konzept von Code-Einheiten von der Anzahl der Zeichen in anderen Kodierungen abweicht, wird dies hier nicht erfasst.
Wir ersetzen absichtlich ungültige und undefinierte Zeichen durch Ersatzzeichen bei dieser Konvertierung. Dies geschieht aus zwei Gründen. Erstens ist es möglich, dass der gegebene Byte-Offset nicht an einer Zeichengrenze auftritt. Zweitens ist es möglich, dass der Quellcode ein Zeichen enthält, das in der gegebenen Kodierung keine Entsprechung hat.
Source
# File lib/prism/parse_result.rb, line 98 def column(byte_offset) byte_offset - line_start(byte_offset) end
Gibt die Spaltennummer für den gegebenen Byte-Offset zurück.
Source
# File lib/prism/parse_result.rb, line 147 def deep_freeze source.freeze offsets.freeze freeze end
Friert dieses Objekt und die darin enthaltenen Objekte ein.
Source
# File lib/prism/parse_result.rb, line 64 def encoding source.encoding end
Gibt die Kodierung des Quellcodes zurück, die durch Parameter an den Parser oder durch den Encoding-Magic-Kommentar festgelegt wird.
Source
# File lib/prism/parse_result.rb, line 81 def line(byte_offset) start_line + find_line(byte_offset) end
Führt eine binäre Suche durch die Offsets, um die Zeilennummer für den gegebenen Byte-Offset zu ermitteln.
Source
# File lib/prism/parse_result.rb, line 93 def line_end(byte_offset) offsets[find_line(byte_offset) + 1] || source.bytesize end
Gibt den Byte-Offset des Endes der Zeile zurück, die dem gegebenen Byte-Offset entspricht.
Source
# File lib/prism/parse_result.rb, line 87 def line_start(byte_offset) offsets[find_line(byte_offset)] end
Gibt den Byte-Offset des Beginns der Zeile zurück, die dem gegebenen Byte-Offset entspricht.
Source
# File lib/prism/parse_result.rb, line 69 def lines source.lines end
Gibt die Zeilen des Quellcodes als Array von Strings zurück.
Source
# File lib/prism/parse_result.rb, line 58 def replace_offsets(offsets) @offsets.replace(offsets) end
Ersetzt den Wert von offsets durch den gegebenen Wert.
Source
# File lib/prism/parse_result.rb, line 53 def replace_start_line(start_line) @start_line = start_line end
Ersetzt den Wert von start_line durch den gegebenen Wert.
Source
# File lib/prism/parse_result.rb, line 75 def slice(byte_offset, length) source.byteslice(byte_offset, length) or raise end
Führt einen Byteslice im Quellcode unter Verwendung des gegebenen Byte-Offsets und der Byte-Länge durch.
Private Instanzmethoden
Source
# File lib/prism/parse_result.rb, line 157 def find_line(byte_offset) index = offsets.bsearch_index { |offset| offset > byte_offset } || offsets.length index - 1 end
Führt eine binäre Suche durch die Offsets, um die Zeilennummer für den gegebenen Byte-Offset zu ermitteln.