Class: Rigor::LanguageServer::SignatureHelpProvider
- Inherits:
-
Object
- Object
- Rigor::LanguageServer::SignatureHelpProvider
- Defined in:
- lib/rigor/language_server/signature_help_provider.rb
Overview
Answers ‘textDocument/signatureHelp` requests. When the user types `(` inside a method call (`obj.foo(|`) editors fire `signatureHelp` to show the method’s parameter signature inline. The provider parses the buffer, locates the enclosing ‘CallNode`, infers the receiver’s type, and returns the method’s first overload as a ‘SignatureInformation`.
Slice C1 (this commit) ships:
-
Sentinel patching for ‘obj.foo(|` so Prism’s parse succeeds (mirrors ‘CompletionProvider`’s slice B4 pattern).
-
First-overload signature only.
-
Active parameter = comma count before cursor.
Multi-overload presentation + ‘documentation` field + active-parameter override per overload land in follow-up slices (queued in the design doc § “Out of scope for v2”).
Instance Method Summary collapse
-
#initialize(buffer_table:, project_context:) ⇒ SignatureHelpProvider
constructor
A new instance of SignatureHelpProvider.
-
#provide(uri:, line:, character:, context: nil) ⇒ Hash?
LSP ‘SignatureHelp` payload or nil when the cursor isn’t inside a resolvable method call.
Constructor Details
#initialize(buffer_table:, project_context:) ⇒ SignatureHelpProvider
Returns a new instance of SignatureHelpProvider.
41 42 43 44 |
# File 'lib/rigor/language_server/signature_help_provider.rb', line 41 def initialize(buffer_table:, project_context:) @buffer_table = buffer_table @project_context = project_context end |
Instance Method Details
#provide(uri:, line:, character:, context: nil) ⇒ Hash?
Returns LSP ‘SignatureHelp` payload or nil when the cursor isn’t inside a resolvable method call.
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/rigor/language_server/signature_help_provider.rb', line 48 def provide(uri:, line:, character:, context: nil) _ = context # Trigger info accepted but not routed in v1. path = Uri.to_path(uri) return nil if path.nil? entry = @buffer_table[uri] return nil if entry.nil? bytes, locate_at = parse_attempt_bytes(entry.bytes, line, character) parse_result = Prism.parse(bytes, filepath: path, version: @project_context.configuration.target_ruby) return nil unless parse_result.errors.empty? cursor_offset = byte_offset_for(bytes, locate_at[0], locate_at[1]) return nil if cursor_offset.nil? call_node = enclosing_call_for_offset(parse_result.value, cursor_offset) return nil if call_node.nil? build_signature(call_node, parse_result.value, path, bytes, locate_at[0], locate_at[1]) end |