Skip to content

Commit

Permalink
Skip sending response to $/steep/typecheck request from `steep lang…
Browse files Browse the repository at this point in the history
…server`
  • Loading branch information
soutaro committed Oct 8, 2024
1 parent 03e01a5 commit b0ebb1d
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 28 deletions.
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

0 comments on commit b0ebb1d

Please sign in to comment.