Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Skip sending response to $/steep/typecheck request from steep langserver #1267

Merged
merged 1 commit into from
Oct 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions lib/steep/drivers/checkfile.rb
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,7 @@ def run
request.signature_paths << project.absolute_path(path)
end

request.needs_response = true
master.start_type_check(request: request, last_request: nil, report_progress_threshold: 0)

Steep.logger.info { "Starting type checking: #{request_guid}" }
Expand Down
2 changes: 1 addition & 1 deletion lib/steep/drivers/stats.rb
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ def run
master.job_queue << -> do
Steep.logger.info { "Type checking for stats..." }
progress = master.work_done_progress(typecheck_guid)
master.start_type_check(last_request: nil, progress: progress, include_unchanged: true, report_progress_threshold: 0)
master.start_type_check(last_request: nil, progress: progress, include_unchanged: true, report_progress_threshold: 0, needs_response: true)
end
wait_for_message(reader: client_reader) do |message|
message[:id] == typecheck_guid
Expand Down
50 changes: 30 additions & 20 deletions lib/steep/server/master.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ class TypeCheckRequest
attr_reader :checked_paths
attr_reader :work_done_progress
attr_reader :started_at
attr_accessor :needs_response

def initialize(guid:, progress:)
@guid = guid
Expand All @@ -22,6 +23,7 @@ def initialize(guid:, progress:)
@checked_paths = Set[]
@work_done_progress = progress
@started_at = Time.now
@needs_response = false
end

def uri(path)
Expand Down Expand Up @@ -732,7 +734,8 @@ def process_message_from_client(message)
start_type_check(
last_request: last_request,
include_unchanged: true,
progress: work_done_progress(guid)
progress: work_done_progress(guid),
needs_response: false
)
end
)
Expand All @@ -755,7 +758,8 @@ def process_message_from_client(message)

start_type_check(
last_request: last_request,
progress: work_done_progress(guid)
progress: work_done_progress(guid),
needs_response: false
)
end
)
Expand Down Expand Up @@ -859,7 +863,8 @@ def process_message_from_client(message)
start_type_check(
last_request: current_type_check_request,
include_unchanged: true,
progress: work_done_progress(guid || SecureRandom.uuid)
progress: work_done_progress(guid || SecureRandom.uuid),
needs_response: true
)

when "$/ping"
Expand Down Expand Up @@ -920,25 +925,27 @@ def finish_type_check(request)
finished_at = Time.now
duration = finished_at - request.started_at

enqueue_write_job(
SendMessageJob.to_client(
message: CustomMethods::TypeCheck.response(
request.guid,
{
guid: request.guid,
completed: request.finished?,
started_at: request.started_at.iso8601,
finished_at: finished_at.iso8601,
duration: duration.to_i
}
if request.needs_response
enqueue_write_job(
SendMessageJob.to_client(
message: CustomMethods::TypeCheck.response(
request.guid,
{
guid: request.guid,
completed: request.finished?,
started_at: request.started_at.iso8601,
finished_at: finished_at.iso8601,
duration: duration.to_i
}
)
)
)
)

nil
else
Steep.logger.debug { "Skip sending response to #{CustomMethods::TypeCheck::METHOD} request" }
end
end

def start_type_check(request: nil, last_request:, progress: nil, include_unchanged: false, report_progress_threshold: 10)
def start_type_check(request: nil, last_request:, progress: nil, include_unchanged: false, report_progress_threshold: 10, needs_response: nil)
Steep.logger.tagged "#start_type_check(#{progress&.guid || request&.guid}, #{last_request&.guid}" do
if last_request
finish_type_check(last_request)
Expand All @@ -947,6 +954,7 @@ def start_type_check(request: nil, last_request:, progress: nil, include_unchang
unless request
progress or raise
request = controller.make_request(guid: progress.guid, include_unchanged: include_unchanged, progress: progress) or return
request.needs_response = needs_response ? true : false
end

if request.total > report_progress_threshold
Expand All @@ -960,7 +968,8 @@ def start_type_check(request: nil, last_request:, progress: nil, include_unchang
end

if request.finished?
@current_type_check_request = finish_type_check(request)
finish_type_check(request)
@current_type_check_request = nil
return
end
else
Expand Down Expand Up @@ -992,7 +1001,8 @@ def on_type_check_update(guid:, path:)
current.work_done_progress.report(percentage, "#{percentage}%")

if current.finished?
@current_type_check_request = finish_type_check(current)
finish_type_check(current)
@current_type_check_request = nil
end
end
end
Expand Down
15 changes: 13 additions & 2 deletions sig/steep/server/master.rbs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,12 @@ module Steep

attr_reader started_at: Time

# `true` to send a response to the client
#
# Defaults to `false`.
#
attr_accessor needs_response: bool

def initialize: (guid: String, progress: WorkDoneProgress) -> void

def uri: (Pathname path) -> URI::File
Expand Down Expand Up @@ -279,6 +285,11 @@ module Steep

attr_reader initialize_params: Hash[Symbol, untyped]?

# `true` to start type checking if it needs
#
# * On the startup, and
# * When files are changed
#
attr_accessor typecheck_automatically: bool

attr_reader start_type_checking_queue: DelayQueue
Expand Down Expand Up @@ -322,10 +333,10 @@ module Steep

def process_message_from_worker: (untyped message, worker: WorkerProcess) -> void

def start_type_check: (last_request: TypeCheckRequest?, progress: WorkDoneProgress, ?include_unchanged: bool, ?report_progress_threshold: Integer) -> void
def start_type_check: (last_request: TypeCheckRequest?, progress: WorkDoneProgress, ?include_unchanged: bool, ?report_progress_threshold: Integer, needs_response: bool) -> void
| (request: TypeCheckRequest, last_request: TypeCheckRequest?, ?report_progress_threshold: Integer) -> void

def finish_type_check: (TypeCheckRequest) -> nil
def finish_type_check: (TypeCheckRequest) -> void

def on_type_check_update: (guid: String, path: Pathname) -> void

Expand Down
10 changes: 5 additions & 5 deletions test/master_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ def test_start_type_check_with_progress
master.controller.push_changes current_dir + "lib/account.rb"

progress = master.work_done_progress("guid")
master.start_type_check(last_request: nil, progress: progress, report_progress_threshold: 0)
master.start_type_check(last_request: nil, progress: progress, report_progress_threshold: 0, needs_response: true)

assert_instance_of Server::Master::TypeCheckRequest, master.current_type_check_request

Expand Down Expand Up @@ -114,7 +114,7 @@ def test_start_type_check_with_progress_no_support
master.controller.push_changes current_dir + "lib/account.rb"

progress = master.work_done_progress("guid")
master.start_type_check(last_request: nil, progress: progress, report_progress_threshold: 0)
master.start_type_check(last_request: nil, progress: progress, report_progress_threshold: 0, needs_response: true)

assert_instance_of Server::Master::TypeCheckRequest, master.current_type_check_request

Expand Down Expand Up @@ -167,7 +167,7 @@ def test_start_type_check_without_progress
master.controller.push_changes current_dir + "lib/account.rb"

progress = master.work_done_progress("guid")
master.start_type_check(last_request: nil, progress: progress, report_progress_threshold: 10)
master.start_type_check(last_request: nil, progress: progress, report_progress_threshold: 10, needs_response: true)

assert_nil master.current_type_check_request

Expand Down Expand Up @@ -213,7 +213,7 @@ def test_on_type_check_update_with_progress
master.controller.push_changes current_dir + "lib/account.rb"

progress = master.work_done_progress("guid")
master.start_type_check(last_request: nil, progress: progress, report_progress_threshold: 0)
master.start_type_check(last_request: nil, progress: progress, report_progress_threshold: 0, needs_response: true)

flush_queue(master.write_queue)

Expand Down Expand Up @@ -299,7 +299,7 @@ def test_on_type_check_update_without_progress
master.controller.push_changes current_dir + "lib/account.rb"

progress = master.work_done_progress("guid")
master.start_type_check(last_request: nil, progress: progress, report_progress_threshold: 0)
master.start_type_check(last_request: nil, progress: progress, report_progress_threshold: 0, needs_response: true)

assert_instance_of Server::Master::TypeCheckRequest, master.current_type_check_request

Expand Down