Class: Solargraph::Workspace

Inherits:
Object
  • Object
show all
Defined in:
lib/solargraph/workspace.rb,
lib/solargraph/workspace/config.rb,
lib/solargraph/workspace/require_paths.rb

Overview

A workspace consists of the files in a project’s directory and the project’s configuration. It provides a Source for each file to be used in an associated Library or ApiMap.

Defined Under Namespace

Classes: Config, RequirePaths

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(directory = '', config = nil, server = {}) ⇒ Workspace

Returns a new instance of Workspace.

Parameters:

  • directory (String) (defaults to: '')

    TODO: Remove ” and ‘*’ special cases

  • config (Config, nil) (defaults to: nil)
  • server (Hash) (defaults to: {})

Raises:

  • (ArgumentError)


25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/solargraph/workspace.rb', line 25

def initialize directory = '', config = nil, server = {}
  raise ArgumentError, 'directory must be a String' unless directory.is_a?(String)

  @directory = if ['*', ''].include?(directory)
                 directory
               else
                 File.absolute_path(directory)
               end
  @config = config
  @server = server
  load_sources
  @gemnames = []
  require_plugins
end

Instance Attribute Details

#directoryString (readonly)

Returns:

  • (String)


16
17
18
# File 'lib/solargraph/workspace.rb', line 16

def directory
  @directory
end

#gemnamesArray<String> (readonly) Also known as: source_gems

Returns:

  • (Array<String>)


19
20
21
# File 'lib/solargraph/workspace.rb', line 19

def gemnames
  @gemnames
end

Instance Method Details

#command_pathString

Returns:

  • (String)


153
154
155
# File 'lib/solargraph/workspace.rb', line 153

def command_path
  server['commandPath'] || 'solargraph'
end

#configSolargraph::Workspace::Config



49
50
51
# File 'lib/solargraph/workspace.rb', line 49

def config
  @config ||= Solargraph::Workspace::Config.new(directory)
end

#directory_or_nilString?

Returns:

  • (String, nil)


158
159
160
161
# File 'lib/solargraph/workspace.rb', line 158

def directory_or_nil
  return nil if directory.empty? || directory == '*'
  directory
end

#filenamesArray<String>

Returns:

  • (Array<String>)


94
95
96
# File 'lib/solargraph/workspace.rb', line 94

def filenames
  source_hash.keys
end

#gemfile?Boolean

TODO:

Handle projects with custom Bundler/Gemfile setups (see DocMap#gemspecs_required_from_bundler)

True if the workspace has a root Gemfile.

Returns:

  • (Boolean)


167
168
169
# File 'lib/solargraph/workspace.rb', line 167

def gemfile?
  directory && File.file?(File.join(directory, 'Gemfile'))
end

#has_file?(filename) ⇒ Boolean

Parameters:

  • filename (String)

Returns:

  • (Boolean)


105
106
107
# File 'lib/solargraph/workspace.rb', line 105

def has_file? filename
  source_hash.key?(filename)
end

#merge(*sources) ⇒ Boolean

Merge the source. A merge will update the existing source for the file or add it to the sources if the workspace is configured to include it. The source is ignored if the configuration excludes it.

Parameters:

Returns:

  • (Boolean)

    True if the source was added to the workspace



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/solargraph/workspace.rb', line 65

def merge *sources
  unless directory == '*' || sources.all? { |source| source_hash.key?(source.filename) }
    # Reload the config to determine if a new source should be included

    @config = Solargraph::Workspace::Config.new(directory)
  end

  includes_any = false
  sources.each do |source|
    if directory == "*" || config.calculated.include?(source.filename)
      source_hash[source.filename] = source
      includes_any = true
    end
  end

  includes_any
end

#rbs_collection_config_pathString?

Returns:

  • (String, nil)


135
136
137
138
139
140
141
142
# File 'lib/solargraph/workspace.rb', line 135

def rbs_collection_config_path
  @rbs_collection_config_path ||= begin
    unless directory.empty? || directory == '*'
      yaml_file = File.join(directory, 'rbs_collection.yaml')
      yaml_file if File.file?(yaml_file)
    end
  end
end

#rbs_collection_pathString?

Returns:

  • (String, nil)


130
131
132
# File 'lib/solargraph/workspace.rb', line 130

def rbs_collection_path
  @gem_rbs_collection ||= read_rbs_collection_path
end

#remove(filename) ⇒ Boolean

Remove a source from the workspace. The source will not be removed if its file exists and the workspace is configured to include it.

Parameters:

  • filename (String)

Returns:

  • (Boolean)

    True if the source was removed from the workspace



87
88
89
90
91
# File 'lib/solargraph/workspace.rb', line 87

def remove filename
  return false unless source_hash.key?(filename)
  source_hash.delete filename
  true
end

#require_pathsArray<String>

The require paths associated with the workspace.

Returns:

  • (Array<String>)


43
44
45
46
# File 'lib/solargraph/workspace.rb', line 43

def require_paths
  # @todo are the semantics of '*' the same as '', meaning 'don't send back any require paths'?

  @require_paths ||= RequirePaths.new(directory_or_nil, config).generate
end

#rules(level) ⇒ TypeChecker::Rules

Parameters:

  • level (Symbol)

Returns:



55
56
57
# File 'lib/solargraph/workspace.rb', line 55

def rules(level)
  @rules ||= TypeChecker::Rules.new(level, config.type_checker_rules)
end

#source(filename) ⇒ Solargraph::Source

Get a source by its filename.

Parameters:

  • filename (String)

Returns:



113
114
115
# File 'lib/solargraph/workspace.rb', line 113

def source filename
  source_hash[filename]
end

#sourcesArray<Solargraph::Source>

Returns:



99
100
101
# File 'lib/solargraph/workspace.rb', line 99

def sources
  source_hash.values
end

#synchronize!(updater) ⇒ void

This method returns an undefined value.

Synchronize the workspace from the provided updater.

Parameters:



148
149
150
# File 'lib/solargraph/workspace.rb', line 148

def synchronize! updater
  source_hash[updater.filename] = source_hash[updater.filename].synchronize(updater)
end

#would_require?(path) ⇒ Boolean

True if the path resolves to a file in the workspace’s require paths.

Parameters:

  • path (String)

Returns:

  • (Boolean)


121
122
123
124
125
126
127
# File 'lib/solargraph/workspace.rb', line 121

def would_require? path
  require_paths.each do |rp|
    full = File.join rp, path
    return true if File.file?(full) || File.file?(full << ".rb")
  end
  false
end