From b39797250f668d447b445d9d4d8adace25b7b099 Mon Sep 17 00:00:00 2001 From: Watson Date: Sat, 10 Nov 2012 20:48:36 +0900 Subject: [PATCH] add the feature to resolve file dependencies --- lib/motion/project/builder.rb | 68 +++++++++++++++++++++++++++++++++++ lib/motion/project/config.rb | 2 +- 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/lib/motion/project/builder.rb b/lib/motion/project/builder.rb index af7ddfe3..d3978dca 100644 --- a/lib/motion/project/builder.rb +++ b/lib/motion/project/builder.rb @@ -137,6 +137,10 @@ module Motion; module Project; builders << [queue, th] end + # Resolve file dependencies + deps = Dependency.new(config.files).run + config.dependencies = deps.merge(config.dependencies) + # Feed builders with work. builder_i = 0 config.ordered_build_files.each do |path| @@ -578,4 +582,68 @@ PLIST =end end end + + class Dependency + require 'ripper' + + @file_paths = [] + + def initialize(paths) + @file_paths = paths.sort + end + + def run + consts_defined = {} + consts_referred = {} + @file_paths.each do |path| + parser = Constant.new(File.read(path)) + parser.parse + parser.defined.each do |const| + consts_defined[const] = path + end + parser.referred.each do |const| + consts_referred[const] ||= [] + consts_referred[const] << path + end + end + + dependency = {} + consts_defined.each do |const, def_path| + if consts_referred[const] + consts_referred[const].each do |ref_path| + if def_path != ref_path + dependency[ref_path] ||= [] + dependency[ref_path] << def_path + dependency[ref_path].uniq! + end + end + end + end + + return dependency + end + + class Constant < Ripper::SexpBuilder + attr_accessor :defined + attr_accessor :referred + + def initialize(source) + @defined = [] + @referred = [] + super + end + + def on_const_ref(args) + type, const_name, position = args + @defined << const_name + end + + def on_var_ref(args) + type, name, position = args + if type == :@const + @referred << name + end + end + end + end end; end diff --git a/lib/motion/project/config.rb b/lib/motion/project/config.rb index a0879547..17b738ba 100644 --- a/lib/motion/project/config.rb +++ b/lib/motion/project/config.rb @@ -55,7 +55,7 @@ module Motion; module Project :entitlements, :fonts, :status_bar_style, :motiondir # Internal only. - attr_accessor :build_mode, :spec_mode, :distribution_mode + attr_accessor :build_mode, :spec_mode, :distribution_mode, :dependencies def initialize(project_dir, build_mode) @project_dir = project_dir