Class: Rubino::Compression::LineSkeleton
- Inherits:
-
Object
- Object
- Rubino::Compression::LineSkeleton
- Defined in:
- lib/rubino/compression/line_skeleton.rb
Overview
Language-AGNOSTIC base for turning a whole source file into a SKELETON: signatures/comments/structure are kept VERBATIM and only LARGE bodies are elided, each replaced by a single pointer line that is itself a targeted read:
# … 14 lines elided — read app/loop.rb offset=120 limit=14
The pointer's offset is the EXACT 1-based start line of the elided body in
the ORIGINAL file and limit is the exact line count, so the model can issue
read app/loop.rb offset=120 limit=14 and get those original bytes back
byte-for-byte (the drill-in invariant). Indentation of the elided body's
first line is preserved on the pointer so the skeleton still reads as code.
This base owns the GENERIC mechanics (the pointer format, the splice, the
build template). A per-language subclass supplies ONLY collect_elisions,
using its own parser to find the bodies worth eliding.
Direct Known Subclasses
PythonCodeSkeleton, RubyCodeSkeleton, TreeSitterCodeSkeleton
Defined Under Namespace
Classes: Elision
Instance Method Summary collapse
-
#build(source, pointer_path:) ⇒ Object
Returns the skeleton String, or nil when the source can't be skeletonised (the subclass's parser failed) — the caller then falls back to the original.
-
#initialize(keep_method_body_max_lines:) ⇒ LineSkeleton
constructor
A new instance of LineSkeleton.
Constructor Details
#initialize(keep_method_body_max_lines:) ⇒ LineSkeleton
Returns a new instance of LineSkeleton.
28 29 30 |
# File 'lib/rubino/compression/line_skeleton.rb', line 28 def initialize(keep_method_body_max_lines:) @keep_max = keep_method_body_max_lines.to_i end |
Instance Method Details
#build(source, pointer_path:) ⇒ Object
Returns the skeleton String, or nil when the source can't be skeletonised
(the subclass's parser failed) — the caller then falls back to the
original. pointer_path is the display path embedded verbatim in each
pointer line so the model can copy it straight into a read call.
Also yields, per elision, the exact original (first_line, line_count) so the caller can record elided ranges for drill-in detection.
39 40 41 42 43 44 45 46 |
# File 'lib/rubino/compression/line_skeleton.rb', line 39 def build(source, pointer_path:) elisions = collect_elisions(source) return nil if elisions.nil? # parser failed → caller passes through return source if elisions.empty? # parsed fine but nothing big enough to elide elisions.each { |e| yield e.first_line, e.line_count } if block_given? splice(source.lines, elisions, pointer_path) end |