class Project

Parses all components of a project

Public Class Methods

new(path) click to toggle source
# File lib/cpp_dependency_graph/project.rb, line 13
def initialize(path)
  @path = path
  @include_resolver = IncludeToComponentResolver.new(source_components)
end

Public Instance Methods

dependencies(component) click to toggle source
# File lib/cpp_dependency_graph/project.rb, line 36
def dependencies(component)
  # TODO: This is repeating the same work twice! component_for_include is called when calling external_includes
  external_includes(component).map { |include| @include_resolver.component_for_include(include) }.reject(&:empty?).uniq
end
external_includes(component) click to toggle source
# File lib/cpp_dependency_graph/project.rb, line 41
def external_includes(component)
  @include_resolver.external_includes(component)
end
project_component() click to toggle source
# File lib/cpp_dependency_graph/project.rb, line 28
def project_component
  @project_component ||= build_project_component
end
source_component(name) click to toggle source
# File lib/cpp_dependency_graph/project.rb, line 22
def source_component(name)
  return SourceComponent.new('NULL') unless source_components.key?(name)

  source_components[name]
end
source_components() click to toggle source
# File lib/cpp_dependency_graph/project.rb, line 18
def source_components
  @source_components ||= build_source_components
end
source_files() click to toggle source
# File lib/cpp_dependency_graph/project.rb, line 32
def source_files
  @source_files ||= build_source_files
end

Private Instance Methods

build_project_component() click to toggle source
# File lib/cpp_dependency_graph/project.rb, line 55
def build_project_component
  c = SourceComponent.new(@path)
  { c.name => c }
end
build_source_components() click to toggle source
# File lib/cpp_dependency_graph/project.rb, line 60
def build_source_components
  # TODO: Dealing with source components with same dir name?
  dirs = fetch_all_dirs(@path)
  components = dirs.map do |dir|
    c = SourceComponent.new(dir)
    [c.name, c]
  end.to_h
  components.delete_if { |_, v| v.source_files.size.zero? }
end
build_source_files() click to toggle source
# File lib/cpp_dependency_graph/project.rb, line 47
def build_source_files
  # TODO: Breaking Demeter's law here
  files = project_component.values.flat_map(&:source_files)
  files.map do |file|
    [file.path, file]
  end.to_h
end