56 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
 | 
						|
 | 
						|
class PreprocessinatorIncludesHandler
 | 
						|
  
 | 
						|
  constructor :configurator, :tool_executor, :task_invoker, :file_path_utils, :yaml_wrapper, :file_wrapper
 | 
						|
 | 
						|
  # shallow includes: only those headers a source file explicitly includes
 | 
						|
 | 
						|
  def invoke_shallow_includes_list(filepath)
 | 
						|
    @task_invoker.invoke_test_shallow_include_lists( [@file_path_utils.form_preprocessed_includes_list_filepath(filepath)] )
 | 
						|
  end
 | 
						|
 | 
						|
  # ask the preprocessor for a make-style dependency rule of only the headers the source file immediately includes
 | 
						|
  def form_shallow_dependencies_rule(filepath)
 | 
						|
    # change filename (prefix of '_') to prevent preprocessor from finding include files in temp directory containing file it's scanning
 | 
						|
    temp_filepath = @file_path_utils.form_temp_path(filepath, '_')
 | 
						|
    
 | 
						|
    # read the file and replace all include statements with a decorated version
 | 
						|
    # (decorating the names creates file names that don't exist, thus preventing the preprocessor 
 | 
						|
    #  from snaking out and discovering the entire include path that winds through the code)
 | 
						|
    contents = @file_wrapper.read(filepath)
 | 
						|
    contents.gsub!( /#include\s+\"\s*(\S+)\s*\"/, "#include \"\\1\"\n#include \"@@@@\\1\"" )
 | 
						|
    @file_wrapper.write( temp_filepath, contents )
 | 
						|
    
 | 
						|
    # extract the make-style dependency rule telling the preprocessor to 
 | 
						|
    #  ignore the fact that it can't find the included files
 | 
						|
    command = @tool_executor.build_command_line(@configurator.tools_test_includes_preprocessor, temp_filepath)
 | 
						|
    shell_result = @tool_executor.exec(command[:line], command[:options])
 | 
						|
    
 | 
						|
    return shell_result[:output]
 | 
						|
  end
 | 
						|
  
 | 
						|
  # headers only; ignore any crazy .c includes
 | 
						|
  def extract_shallow_includes(make_rule)
 | 
						|
    list = []
 | 
						|
    header_extension = @configurator.extension_header
 | 
						|
 | 
						|
    headers = make_rule.scan(/(\S+#{'\\'+header_extension})/).flatten # escape slashes before dot file extension
 | 
						|
    headers.uniq!
 | 
						|
    headers.map! { |header| header.sub(/(@@@@)|(.+\/)/, '') }
 | 
						|
    headers.sort!
 | 
						|
    
 | 
						|
    headers.each_with_index do |header, index|
 | 
						|
      break if (headers.size == (index-1))
 | 
						|
      list << header if (header == headers[index + 1])
 | 
						|
    end
 | 
						|
 | 
						|
    return list
 | 
						|
  end
 | 
						|
  
 | 
						|
  def write_shallow_includes_list(filepath, list)
 | 
						|
    @yaml_wrapper.dump(filepath, list)
 | 
						|
  end
 | 
						|
 | 
						|
end
 |