Module | RuCodeGen::Embedded |
In: |
lib/rucodegen/embedded.rb
|
Получить тела всех RuCodeGen фрагментов из указанного файла.
RuCodeGen фрагмент начинается со строки, в которой присутствует подстрока:
RuCodeGen::Embedded::begin
и заканчивается RuCodeGen фрагмент строкой, в которой присутствует:
RuCodeGen::Embedded::end
Пример корректного встроенного RuCodeGen описания:
/* RuCodeGen::Embedded::begin cpp_value_incapsulator cfg_t do |c| ... end RuCodeGen::Embedded::end */
# File lib/rucodegen/embedded.rb, line 24 def Embedded.extract_fragments( file ) open_mark = /RuCodeGen::Embedd{0,1}ed::begin/ close_mark = /RuCodeGen::Embedd{0,1}ed::end/ expected_mark = open_mark open_at = 0 line_no = 1 script_body = File.readlines( file ).inject( '' ) do |body, line| if expected_mark == close_mark if close_mark =~ line expected_mark = open_mark else fail "#{file}:#{line_no}: open RuCodeGen inside opened fragment " + "started at #{open_at}" if open_mark =~ line body << line end elsif open_mark =~ line expected_mark = close_mark open_at = line_no end line_no += 1 body end fail "#{file}: unclosed RuCodeGen fragment open at #{open_at}" \ if expected_mark == close_mark script_body end
Инициирует кодогенерацию путем запуска ruby для извлеченного из исходного файла кодогенерирующего скрипта.
# File lib/rucodegen/embedded.rb, line 62 def Embedded.run_generation( src_file_name, script, mode ) temp_script_name = src_file_name + '-embeded-rucodegen' File.open( temp_script_name, 'w' ) do |f| f << "require 'rubygems'\nrequire_gem 'RuCodeGen'\n\n" f << script end begin `ruby #{temp_script_name} --mode #{mode}` fail "Error running temporary script generated from #{src_file_name}" \ if $? and $?.exitstatus != 0 ensure # В любом случае временный файл должен быть уничтожен. File.delete( temp_script_name ) end end