Class: Solargraph::Workspace

Inherits:
Object
  • Object
show all
Defined in:
lib/solargraph/workspace.rb,
lib/solargraph/workspace/config.rb,
lib/solargraph/workspace/gemspecs.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, Gemspecs, 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)


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

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)


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

def directory
  @directory
end

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

Returns:

  • (Array<String>)


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

def gemnames
  @gemnames
end

Instance Method Details

#command_pathString

@sg-ignore return type could not be inferred

Returns:

  • (String)


163
164
165
# File 'lib/solargraph/workspace.rb', line 163

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

#configSolargraph::Workspace::Config



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

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

#directory_or_nilString?

Returns:

  • (String, nil)


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

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

#filenamesArray<String>

Returns:

  • (Array<String>)


96
97
98
# File 'lib/solargraph/workspace.rb', line 96

def filenames
  source_hash.keys
end

#find_gem(name, version = nil, out: nil) ⇒ Gem::Specification?

Parameters:

  • name (String)
  • version (String, nil) (defaults to: nil)
  • out (IO, nil) (defaults to: nil)

Returns:

  • (Gem::Specification, nil)


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

def find_gem name, version = nil, out: nil
  Gem::Specification.find_by_name(name, version)
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)


177
178
179
# File 'lib/solargraph/workspace.rb', line 177

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

#gemspec?Boolean

True if the workspace contains at least one gemspec file.

Returns:

  • (Boolean)


184
185
186
# File 'lib/solargraph/workspace.rb', line 184

def gemspec?
  !gemspec_files.empty?
end

#gemspec_filesArray<String>

Get an array of all gemspec files in the workspace.

Returns:

  • (Array<String>)


191
192
193
194
195
196
# File 'lib/solargraph/workspace.rb', line 191

def gemspec_files
  return [] if directory.empty? || directory == '*'
  @gemspec_files ||= Dir[File.join(directory, '**/*.gemspec')].select do |gs|
    config.allow? gs
  end
end

#has_file?(filename) ⇒ Boolean

Parameters:

  • filename (String)

Returns:

  • (Boolean)


107
108
109
# File 'lib/solargraph/workspace.rb', line 107

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



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

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|
    next unless directory == '*' || config.calculated.include?(source.filename)

    # @sg-ignore Wrong argument type for Hash#[]=: arg0 expected String, received String, nil
    source_hash[source.filename] = source
    includes_any = true
  end

  includes_any
end

#rbs_collection_config_pathString?

Returns:

  • (String, nil)


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

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

#rbs_collection_pathString?

Returns:

  • (String, nil)


132
133
134
# File 'lib/solargraph/workspace.rb', line 132

def rbs_collection_path
  @rbs_collection_path ||= 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



89
90
91
92
93
# File 'lib/solargraph/workspace.rb', line 89

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>)


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

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:



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

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:



115
116
117
# File 'lib/solargraph/workspace.rb', line 115

def source filename
  source_hash[filename]
end

#sourcesArray<Solargraph::Source>

Returns:



101
102
103
# File 'lib/solargraph/workspace.rb', line 101

def sources
  source_hash.values
end

#synchronize!(updater) ⇒ void

This method returns an undefined value.

Synchronize the workspace from the provided updater.

Parameters:



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

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)


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

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