holistic-ruby 0.1.4 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/README.md +5 -5
  4. data/exe/holistic-ruby +0 -1
  5. data/lib/holistic/application.rb +12 -4
  6. data/lib/holistic/database/migrations.rb +23 -0
  7. data/lib/holistic/database/node.rb +37 -0
  8. data/lib/holistic/database/relation.rb +21 -0
  9. data/lib/holistic/database.rb +57 -0
  10. data/lib/holistic/document/file/record.rb +10 -0
  11. data/lib/holistic/document/file/repository.rb +24 -0
  12. data/lib/holistic/document/file/store.rb +13 -0
  13. data/lib/holistic/document/location.rb +4 -6
  14. data/lib/holistic/document/unsaved/record.rb +12 -3
  15. data/lib/holistic/extensions/ruby/stdlib.rb +8 -8
  16. data/lib/holistic/language_server/requests/lifecycle/initialize.rb +5 -10
  17. data/lib/holistic/language_server/requests/text_document/completion.rb +16 -5
  18. data/lib/holistic/language_server/requests/text_document/did_close.rb +5 -9
  19. data/lib/holistic/language_server/requests/text_document/did_open.rb +1 -0
  20. data/lib/holistic/language_server/requests/text_document/did_save.rb +5 -9
  21. data/lib/holistic/language_server/requests/text_document/find_references.rb +7 -4
  22. data/lib/holistic/language_server/requests/text_document/go_to_definition.rb +3 -2
  23. data/lib/holistic/language_server/stdio/parser.rb +2 -2
  24. data/lib/holistic/language_server/stdio/start.rb +1 -1
  25. data/lib/holistic/ruby/autocompletion/suggest.rb +45 -25
  26. data/lib/holistic/ruby/parser/constant_resolution.rb +11 -11
  27. data/lib/holistic/ruby/parser/live_editing/process_file_changed.rb +23 -23
  28. data/lib/holistic/ruby/parser/program_visitor.rb +62 -29
  29. data/lib/holistic/ruby/parser.rb +51 -11
  30. data/lib/holistic/ruby/reference/delete.rb +18 -0
  31. data/lib/holistic/ruby/reference/find_referenced_scope.rb +2 -2
  32. data/lib/holistic/ruby/reference/record.rb +15 -8
  33. data/lib/holistic/ruby/reference/repository.rb +19 -41
  34. data/lib/holistic/ruby/reference/store.rb +29 -0
  35. data/lib/holistic/ruby/scope/delete.rb +29 -0
  36. data/lib/holistic/ruby/scope/lexical.rb +11 -0
  37. data/lib/holistic/ruby/scope/list_class_methods.rb +19 -0
  38. data/lib/holistic/ruby/scope/list_instance_methods.rb +19 -0
  39. data/lib/holistic/ruby/scope/list_references.rb +3 -3
  40. data/lib/holistic/ruby/scope/location.rb +9 -9
  41. data/lib/holistic/ruby/scope/outline.rb +10 -10
  42. data/lib/holistic/ruby/scope/record.rb +20 -50
  43. data/lib/holistic/ruby/scope/repository.rb +29 -26
  44. data/lib/holistic/ruby/scope/store.rb +45 -0
  45. data/lib/holistic/ruby/type_inference/clue/method_call.rb +1 -0
  46. data/lib/holistic/ruby/type_inference/clue/reference_to_superclass.rb +9 -0
  47. data/lib/holistic/ruby/type_inference/clue/scope_reference.rb +1 -0
  48. data/lib/holistic/ruby/type_inference/processing_queue.rb +28 -0
  49. data/lib/holistic/ruby/type_inference/resolver/class_method.rb +9 -0
  50. data/lib/holistic/ruby/type_inference/resolver/instance_method.rb +9 -0
  51. data/lib/holistic/ruby/type_inference/resolver/scope.rb +24 -0
  52. data/lib/holistic/ruby/type_inference/solve.rb +25 -69
  53. data/lib/holistic/ruby/type_inference/solve_pending_references.rb +3 -1
  54. data/lib/holistic/version.rb +1 -1
  55. metadata +21 -10
  56. data/lib/holistic/database/table.rb +0 -78
  57. data/lib/holistic/document/file.rb +0 -36
  58. data/lib/holistic/ruby/parser/table_of_contents.rb +0 -17
  59. data/lib/holistic/ruby/reference/register.rb +0 -15
  60. data/lib/holistic/ruby/reference/unregister.rb +0 -11
  61. data/lib/holistic/ruby/scope/register.rb +0 -31
  62. data/lib/holistic/ruby/scope/unregister.rb +0 -27
  63. data/lib/holistic/ruby/type_inference/conclusion.rb +0 -20
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: abe4144d1f581c6151784152792604f799c0140d62c28f445f377f6039c40457
4
- data.tar.gz: 6593b92046a8087f75c171280ae66401ff0bb1eb0f6dba9fa496df127bb39ee8
3
+ metadata.gz: b5eda7bf8e9da75eb3716452dfc2ebafdbaf35af0a53aef452c64bd95cd00bd8
4
+ data.tar.gz: 5522698edac5824011fd5aeee3ba4c71eb5cfee51b956c3d5942e329c7644072
5
5
  SHA512:
6
- metadata.gz: eb1f43eaa7f78c334da3f8d8f2fc782bfa662b94f8a5a6b5a8a24ab271cae26d62703bd722860dbecf637d9aae5d4595d1424257406d9d349f0d90a95ab702d4
7
- data.tar.gz: f42ed13efc65779f8ef175c7127d03cf68bebd5df990a1744d714100efe639cad104b55592507d4737ecfa4d48e75d6b69da194a033f056740a16fde8bf3d65d
6
+ metadata.gz: 06caa82194be9d2d2d9832aefd9132ab3d3cc1838be8b2cff9cd64f3fbafa36a9f0f79c40384eb4439adfd224a559605a9e328ae7dfb722235870b535f0d155f
7
+ data.tar.gz: a542c510078f1f528b4621000ba87843d0544e23dea77123bcf627e79d17f8dcdcb987be4122bd0f39c7f96533fc57d1a26e489e0cc25b6f5e0e5dfc68c436d3
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- holistic-ruby (0.1.0)
4
+ holistic-ruby (0.1.7)
5
5
  activesupport (~> 7.0)
6
6
  syntax_tree (~> 6.0)
7
7
  zeitwerk (~> 2.6)
data/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  ## Installation for Sublime Text
6
6
 
7
7
  1. Make sure you have the [LSP package installed](https://github.com/sublimelsp/LSP).
8
- 2. Install the gem `$ gem install holistic-ruby`
8
+ 2. Install the gem with `$ gem install holistic-ruby`
9
9
  3. Go to `Preferences > Package Settings > LSP > Settings` and add:
10
10
 
11
11
  ```json
@@ -25,10 +25,10 @@
25
25
 
26
26
  * Go to definition.
27
27
  * Find references.
28
- * Autocompletion for namespaces, methods and local variables.
29
- * Syntax highlighting boundaries based on packwerk.
30
- * Outline dependencies.
31
- * Glossary.
28
+ * Autocompletion for namespaces and methods.
29
+ * (WIP) Outline dependencies.
30
+ * (WIP) Syntax highlighting boundaries based on packwerk.
31
+ * (WIP) Glossary.
32
32
 
33
33
  ## Why is it a toy language server?
34
34
 
data/exe/holistic-ruby CHANGED
@@ -3,4 +3,3 @@
3
3
  require "holistic"
4
4
 
5
5
  ::Holistic::LanguageServer::Stdio::Start.call
6
-
@@ -2,12 +2,12 @@
2
2
 
3
3
  module Holistic
4
4
  class Application
5
- attr_reader :name, :root_directory, :root_scope
5
+ attr_reader :name, :root_directory, :database
6
6
 
7
7
  def initialize(name:, root_directory:)
8
8
  @name = name
9
9
  @root_directory = root_directory
10
- @root_scope = Ruby::Scope::Record.new(kind: Ruby::Scope::Kind::ROOT, name: "::", parent: nil)
10
+ @database = Database.new.tap(&Database::Migrations::Run)
11
11
  end
12
12
 
13
13
  def extensions
@@ -15,11 +15,19 @@ module Holistic
15
15
  end
16
16
 
17
17
  def scopes
18
- @scopes ||= Ruby::Scope::Repository.new
18
+ @scopes ||= Ruby::Scope::Repository.new(database:)
19
19
  end
20
20
 
21
21
  def references
22
- @references ||= Ruby::Reference::Repository.new
22
+ @references ||= Ruby::Reference::Repository.new(database:)
23
+ end
24
+
25
+ def files
26
+ @files ||= Document::File::Repository.new(database:)
27
+ end
28
+
29
+ def type_inference_processing_queue
30
+ @type_inference_processing_queue ||= Ruby::TypeInference::ProcessingQueue.new
23
31
  end
24
32
 
25
33
  def unsaved_documents
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Holistic::Database::Migrations
4
+ Run = ->(database) do
5
+ # scope lexical parent-children relation
6
+ database.define_relation(name: :lexical_children, inverse_of: :lexical_parent)
7
+
8
+ # scope inheritance and mixins
9
+ database.define_relation(name: :ancestors, inverse_of: :descendants)
10
+
11
+ # type inference conclusion
12
+ database.define_relation(name: :referenced_scope, inverse_of: :referenced_by)
13
+
14
+ # reference definition
15
+ database.define_relation(name: :located_in_scope, inverse_of: :contains_many_references)
16
+
17
+ # scope location in files
18
+ database.define_relation(name: :defines_scopes, inverse_of: :scope_defined_in_file)
19
+
20
+ # reference location in files
21
+ database.define_relation(name: :defines_references, inverse_of: :reference_defined_in_file)
22
+ end
23
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Holistic::Database::Node
4
+ attr_accessor :attributes, :relations, :__database__
5
+
6
+ def initialize(id, attributes)
7
+ @id = id
8
+ @attributes = attributes
9
+ @relations = ::Hash.new(&method(:build_relation_hash))
10
+ end
11
+
12
+ def attr(attribute_name)
13
+ @attributes[attribute_name]
14
+ end
15
+
16
+ def relation(relation_name)
17
+ @relations[relation_name]
18
+ end
19
+
20
+ def has_many(connection_name)
21
+ @relations[connection_name].to_a
22
+ end
23
+
24
+ def has_one(connection_name)
25
+ @relations[connection_name].first
26
+ end
27
+
28
+ private
29
+
30
+ def build_relation_hash(hash, name)
31
+ inverse_of = __database__.relations.dig(name, :inverse_of)
32
+
33
+ raise ::ArgumentError, "unknown relation: #{name}" if inverse_of.nil?
34
+
35
+ hash[name] = ::Holistic::Database::Relation.new(node: self, name:, inverse_of:)
36
+ end
37
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Holistic::Database::Relation < ::Set
4
+ def initialize(node:, name:, inverse_of:)
5
+ @node = node
6
+ @name = name
7
+ @inverse_of = inverse_of
8
+
9
+ super()
10
+ end
11
+
12
+ def add!(related_node)
13
+ @node.relations[@name].add(related_node)
14
+ related_node.relations[@inverse_of].add(@node)
15
+ end
16
+
17
+ def delete!(related_node)
18
+ @node.relations[@name].delete(related_node)
19
+ related_node.relations[@inverse_of].delete(@node)
20
+ end
21
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Holistic::Database
4
+ attr_reader :records, :relations
5
+
6
+ def initialize
7
+ @records = ::Hash.new
8
+ @relations = ::Hash.new
9
+ end
10
+
11
+ def define_relation(name:, inverse_of:)
12
+ raise ::ArgumentError if @relations.key?(name) || @relations.key?(inverse_of)
13
+
14
+ @relations[name] = { inverse_of: }
15
+ @relations[inverse_of] = { inverse_of: name }
16
+ end
17
+
18
+ def store(id, node_or_attrs)
19
+ if @records.key?(id)
20
+ return @records[id]&.tap do |node|
21
+ node.attributes =
22
+ case node_or_attrs
23
+ in ::Hash then node_or_attrs
24
+ in Node then node_or_attrs.attributes
25
+ end
26
+ end
27
+ end
28
+
29
+ node =
30
+ case node_or_attrs
31
+ in ::Hash then Node.new(id, node_or_attrs)
32
+ in Node then node_or_attrs
33
+ end
34
+
35
+ node.__database__ = self
36
+
37
+ @records[id] = node
38
+ end
39
+
40
+ def find(id)
41
+ @records[id]
42
+ end
43
+
44
+ def delete(id)
45
+ records.delete(id)
46
+ end
47
+
48
+ concerning :TestHelpers do
49
+ def all
50
+ records.values
51
+ end
52
+
53
+ def size
54
+ records.size
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Holistic::Document::File
4
+ class Record < ::Holistic::Database::Node
5
+ def path = attr(:path)
6
+
7
+ def defines_scopes = has_many(:defines_scopes)
8
+ def defines_references = has_many(:defines_references)
9
+ end
10
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ::Holistic::Document::File
4
+ class Repository
5
+ attr_reader :database
6
+
7
+ def initialize(database:)
8
+ @database = database
9
+ end
10
+
11
+ # rename to `find_file`
12
+ def find(file_path)
13
+ @database.find(file_path)
14
+ end
15
+
16
+ concerning :TestHelpers do
17
+ def build_fake_location(file_path)
18
+ file = Store.call(database:, file_path:)
19
+
20
+ ::Holistic::Document::Location.new(file, 0, 0, 0, 0)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Holistic::Document::File
4
+ module Store
5
+ extend self
6
+
7
+ def call(database:, file_path:)
8
+ record = Record.new(file_path, { path: file_path })
9
+
10
+ database.store(file_path, record)
11
+ end
12
+ end
13
+ end
@@ -2,20 +2,18 @@
2
2
 
3
3
  module Holistic::Document
4
4
  Location = ::Data.define(
5
- :file_path,
5
+ :file,
6
6
  :start_line,
7
7
  :start_column,
8
8
  :end_line,
9
9
  :end_column
10
10
  ) do
11
- def self.beginning_of_file(file_path)
12
- new(file_path, 0, 0, 0, 0)
11
+ def identifier
12
+ "#{file.path}[#{start_line},#{start_column},#{end_line},#{end_column}]"
13
13
  end
14
14
 
15
- def identifier = "#{file_path}[#{start_line},#{start_column},#{end_line},#{end_column}]"
16
-
17
15
  def contains?(cursor)
18
- same_file = cursor.file_path == file_path
16
+ same_file = cursor.file_path == file.path
19
17
  contains_line = cursor.line >= start_line && cursor.line <= end_line
20
18
 
21
19
  contains_column =
@@ -54,6 +54,14 @@ module Holistic::Document
54
54
  line = 0
55
55
  column = 0
56
56
 
57
+ # first edition to the document is special because we can't iterate over the content to find the insert position.
58
+ # there is nothing to iterate over.
59
+ if @content.empty? && change.insertion?
60
+ @content = change.text
61
+
62
+ return
63
+ end
64
+
57
65
  @content.each_char.with_index do |char, index|
58
66
  if change.insertion? && change.starts_on?(line, column)
59
67
  content.insert(index, change.text)
@@ -74,10 +82,11 @@ module Holistic::Document
74
82
  column += 1
75
83
  end
76
84
  end
77
- end
78
85
 
79
- def to_file
80
- File::Fake.new(path:, content:)
86
+ # off-by-one error to insert at the of the document
87
+ if change.insertion? && change.starts_on?(line, column)
88
+ content.insert(@content.length, change.text)
89
+ end
81
90
  end
82
91
  end
83
92
  end
@@ -10,7 +10,7 @@ module Holistic::Extensions::Ruby
10
10
  if method_call_clue.method_name == "new" && referenced_scope.class?
11
11
  initialize_method = "#{referenced_scope.fully_qualified_name}#initialize"
12
12
 
13
- return application.scopes.find_by_fully_qualified_name(initialize_method)
13
+ return application.scopes.find(initialize_method)
14
14
  end
15
15
 
16
16
  nil
@@ -19,12 +19,12 @@ module Holistic::Extensions::Ruby
19
19
  RegisterClassConstructor = ->(application, params) do
20
20
  class_scope, location = params[:class_scope], params[:location]
21
21
 
22
- has_overridden_new_method = class_scope.children.find { _1.class_method? && _1.name == "new" }
22
+ has_overridden_new_method = class_scope.lexical_children.find { _1.instance_method? && _1.name == "initialize" }
23
23
 
24
24
  unless has_overridden_new_method
25
- ::Holistic::Ruby::Scope::Register.call(
26
- repository: application.scopes,
27
- parent: class_scope,
25
+ ::Holistic::Ruby::Scope::Store.call(
26
+ database: application.database,
27
+ lexical_parent: class_scope,
28
28
  kind: ::Holistic::Ruby::Scope::Kind::CLASS_METHOD,
29
29
  name: "new",
30
30
  location:
@@ -38,9 +38,9 @@ module Holistic::Extensions::Ruby
38
38
  lambda_scope, location = params[:lambda_scope], params[:location]
39
39
 
40
40
  LAMBDA_METHODS.each do |method_name|
41
- ::Holistic::Ruby::Scope::Register.call(
42
- repository: application.scopes,
43
- parent: lambda_scope,
41
+ ::Holistic::Ruby::Scope::Store.call(
42
+ database: application.database,
43
+ lexical_parent: lambda_scope,
44
44
  kind: ::Holistic::Ruby::Scope::Kind::CLASS_METHOD,
45
45
  name: method_name,
46
46
  location:
@@ -14,23 +14,18 @@ module Holistic::LanguageServer
14
14
 
15
15
  parse_application_in_background(application)
16
16
 
17
- respond_with_holistic_capabilities(request)
17
+ respond_with_language_server_capabilities(request)
18
18
  end
19
19
 
20
20
  private
21
21
 
22
22
  def create_application(request)
23
- ::Holistic.logger.info("===========")
24
- ::Holistic.logger.info(request.message.inspect)
25
-
26
23
  root_directory = request.param("rootPath")
27
24
  name = ::File.basename(root_directory)
28
25
 
29
- Current.application = ::Holistic::Application.new(name:, root_directory:)
30
-
31
- ::Holistic::Extensions::Ruby::Stdlib.register(Current.application)
32
-
33
- Current.application
26
+ Current.application = ::Holistic::Application.new(name:, root_directory:).tap do |application|
27
+ ::Holistic::Extensions::Ruby::Stdlib.register(application)
28
+ end
34
29
  end
35
30
 
36
31
  def advance_lifecycle_state
@@ -45,7 +40,7 @@ module Holistic::LanguageServer
45
40
  end
46
41
  end
47
42
 
48
- def respond_with_holistic_capabilities(request)
43
+ def respond_with_language_server_capabilities(request)
49
44
  request.respond_with({
50
45
  capabilities: {
51
46
  # Defines how the host (editor) should sync document changes to the language server.
@@ -9,20 +9,31 @@ module Holistic::LanguageServer
9
9
 
10
10
  document = request.application.unsaved_documents.find(cursor.file_path)
11
11
 
12
- return request.respond_with(nil) if document.nil?
12
+ if document.nil?
13
+ ::Holistic.logger.info("aborting completion because document was not found for #{cursor.file_path}")
14
+
15
+ return request.respond_with(nil)
16
+ end
13
17
 
14
18
  if document.has_unsaved_changes?
15
19
  ::Holistic::Ruby::Parser::LiveEditing::ProcessFileChanged.call(
16
20
  application: request.application,
17
- file: document.to_file
21
+ file_path: document.path,
22
+ content: document.content
18
23
  )
19
24
  end
20
25
 
21
26
  code = document.expand_code(cursor)
22
-
23
- return request.respond_with(nil) if code.blank?
24
27
 
25
- scope = request.application.scopes.find_inner_most_scope_by_cursor(cursor) || request.application.root_scope
28
+ if code.blank?
29
+ ::Holistic.logger.info("aborting completion because code under cursor was blank: #{cursor.inspect}")
30
+
31
+ return request.respond_with(nil)
32
+ end
33
+
34
+ scope = request.application.scopes.find_inner_most_scope_by_cursor(cursor) || request.application.scopes.root
35
+
36
+ ::Holistic.logger.info("scope under cursor is: #{scope.fully_qualified_name}")
26
37
 
27
38
  suggestions = ::Holistic::Ruby::Autocompletion::Suggest.call(code:, scope:)
28
39
 
@@ -13,19 +13,15 @@ module Holistic::LanguageServer
13
13
  if unsaved_document.has_unsaved_changes?
14
14
  unsaved_document.restore_original_content!
15
15
 
16
- process_in_background(application: request.application, file: unsaved_document.to_file)
16
+ ::Holistic::Ruby::Parser::LiveEditing::ProcessFileChanged.call(
17
+ application: request.application,
18
+ file_path: unsaved_document.path,
19
+ content: unsaved_document.content
20
+ )
17
21
  end
18
22
  end
19
23
 
20
24
  request.respond_with(nil)
21
25
  end
22
-
23
- private
24
-
25
- def process_in_background(application:, file:)
26
- ::Holistic::BackgroundProcess.run do
27
- ::Holistic::Ruby::Parser::LiveEditing::ProcessFileChanged.call(application:, file:)
28
- end
29
- end
30
26
  end
31
27
  end
@@ -9,6 +9,7 @@ module Holistic::LanguageServer
9
9
  content = request.message.param("textDocument", "text")
10
10
 
11
11
  request.application.unsaved_documents.add(path:, content:)
12
+ ::Holistic::Document::File::Store.call(database: request.application.database, file_path: path)
12
13
 
13
14
  request.respond_with(nil)
14
15
  end
@@ -17,17 +17,13 @@ module Holistic::LanguageServer
17
17
 
18
18
  unsaved_document.mark_as_saved!
19
19
 
20
- process_in_background(application: request.application, file: unsaved_document.to_file)
20
+ ::Holistic::Ruby::Parser::LiveEditing::ProcessFileChanged.call(
21
+ application: request.application,
22
+ file_path: unsaved_document.path,
23
+ content: unsaved_document.content
24
+ )
21
25
 
22
26
  request.respond_with(nil)
23
27
  end
24
-
25
- private
26
-
27
- def process_in_background(application:, file:)
28
- ::Holistic::BackgroundProcess.run do
29
- ::Holistic::Ruby::Parser::LiveEditing::ProcessFileChanged.call(application:, file:)
30
- end
31
- end
32
28
  end
33
29
  end
@@ -12,7 +12,8 @@ module Holistic::LanguageServer
12
12
  if unsaved_document.has_unsaved_changes?
13
13
  ::Holistic::Ruby::Parser::LiveEditing::ProcessFileChanged.call(
14
14
  application: request.application,
15
- file: unsaved_document.to_file
15
+ file_path: unsaved_document.path,
16
+ content: unsaved_document.content
16
17
  )
17
18
  end
18
19
  end
@@ -37,11 +38,13 @@ module Holistic::LanguageServer
37
38
 
38
39
  def respond_with_locations(request, references)
39
40
  locations = references.map do |reference|
41
+ location = reference.location
42
+
40
43
  {
41
- "uri" => Format::FileUri.from_path(reference.location.file_path),
44
+ "uri" => Format::FileUri.from_path(location.file.path),
42
45
  "range" => {
43
- "start" => { "line" => reference.location.start_line, "character" => reference.location.start_column },
44
- "end" => { "line" => reference.location.end_line, "character" => reference.location.end_column }
46
+ "start" => { "line" => location.start_line, "character" => location.start_column },
47
+ "end" => { "line" => location.end_line, "character" => location.end_column }
45
48
  }
46
49
  }
47
50
  end
@@ -12,7 +12,8 @@ module Holistic::LanguageServer
12
12
  if unsaved_document.has_unsaved_changes?
13
13
  ::Holistic::Ruby::Parser::LiveEditing::ProcessFileChanged.call(
14
14
  application: request.application,
15
- file: unsaved_document.to_file
15
+ file_path: unsaved_document.path,
16
+ content: unsaved_document.content
16
17
  )
17
18
  end
18
19
  end
@@ -46,7 +47,7 @@ module Holistic::LanguageServer
46
47
  "start" => { "line" => origin_location.start_line, "character" => origin_location.start_column },
47
48
  "end" => { "line" => origin_location.end_line, "character" => origin_location.end_column }
48
49
  },
49
- "targetUri" => Format::FileUri.from_path(target_declaration_location.file_path),
50
+ "targetUri" => Format::FileUri.from_path(target_declaration_location.file.path),
50
51
  "targetRange" => {
51
52
  "start" => { "line" => target_declaration_location.start_line, "character" => target_declaration_location.start_column },
52
53
  "end" => { "line" => target_declaration_location.end_line, "character" => target_declaration_location.end_column }
@@ -11,7 +11,7 @@ module Holistic::LanguageServer
11
11
 
12
12
  def ingest(payload)
13
13
  payload.each_char do |char|
14
- if @in_header || !completed?
14
+ if @in_header || !has_complete_message?
15
15
  @buffer.concat(char)
16
16
  else
17
17
  @overflow_from_previous_ingestion.concat(char)
@@ -23,7 +23,7 @@ module Holistic::LanguageServer
23
23
  end
24
24
  end
25
25
 
26
- def completed?
26
+ def has_complete_message?
27
27
  !@in_header && @content_length == @buffer.length
28
28
  end
29
29
 
@@ -15,7 +15,7 @@ module Holistic::LanguageServer
15
15
  server.start_input_loop do |payload|
16
16
  parser.ingest(payload)
17
17
 
18
- while parser.completed?
18
+ while parser.has_complete_message?
19
19
  response = ::Holistic::LanguageServer::Router.dispatch(parser.message)
20
20
 
21
21
  case response