Class: Puppet::Pops::Model::AstTransformer
- Defined in:
- lib/puppet/pops/model/ast_transformer.rb
Overview
The receiver of ‘import(file)` calls; once per imported file, or nil if imports are ignored
Transforms a Pops::Model to classic Puppet AST. TODO: Documentation is currently skipped completely (it is only used for Rdoc)
Constant Summary collapse
Instance Attribute Summary collapse
- #importer ⇒ Object readonly
Instance Method Summary collapse
-
#ast(o, klass, hash = {}) ⇒ Object
Initialize klass from o (location) and hash (options to created instance).
-
#hostname(o) ⇒ Object
Transforms pops expressions into AST 3.1 hostnames.
-
#hostname_Array(o) ⇒ Object
Transforms Array of host matching expressions into a (Ruby) array of AST::HostName.
- #hostname_LiteralDefault(o) ⇒ Object
- #hostname_LiteralNumber(o) ⇒ Object
- #hostname_LiteralRegularExpression(o) ⇒ Object
- #hostname_LiteralValue(o) ⇒ Object
- #hostname_Object(o) ⇒ Object
- #hostname_QualifiedName(o) ⇒ Object
-
#initialize(source_file = "unknown-file", importer = nil) ⇒ AstTransformer
constructor
A new instance of AstTransformer.
-
#is_nop?(o) ⇒ Boolean
Nil, nop Bee bopp a luh-lah, a bop bop boom.
-
#merge_location(hash, o) ⇒ Object
THIS IS AN EXPENSIVE OPERATION The 3x AST requires line, pos etc.
- #nil_or_empty?(x) ⇒ Boolean
-
#query(o) ⇒ Object
Transforms pops expressions into AST 3.1 query expressions.
-
#query_Object(o) ⇒ Object
Ensures transformation fails if a 3.1 non supported object is encountered in a query expression.
-
#transform(o) ⇒ Object
Transforms pops expressions into AST 3.1 statements/expressions.
- #transform_Object(o) ⇒ Object
Constructor Details
#initialize(source_file = "unknown-file", importer = nil) ⇒ AstTransformer
Returns a new instance of AstTransformer.
14 15 16 17 18 19 20 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 14 def initialize(source_file = "unknown-file", importer=nil) @@transform_visitor ||= Puppet::Pops::Visitor.new(nil,"transform",0,0) @@query_transform_visitor ||= Puppet::Pops::Visitor.new(nil,"query",0,0) @@hostname_transform_visitor ||= Puppet::Pops::Visitor.new(nil,"hostname",0,0) @importer = importer @source_file = source_file end |
Instance Attribute Details
#importer ⇒ Object (readonly)
13 14 15 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 13 def importer @importer end |
Instance Method Details
#ast(o, klass, hash = {}) ⇒ Object
Initialize klass from o (location) and hash (options to created instance). The object o is used to compute a source location. It may be nil. Source position is merged into the given options (non surgically). If o is non-nil, the first found source position going up the containment hierarchy is set. I.e. callers should pass nil if a source position is not wanted or known to be unobtainable for the object.
32 33 34 35 36 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 32 def ast(o, klass, hash={}) # create and pass hash with file and line information # PUP-3274 - still needed since hostname transformation requires AST::HostName, and AST::Regexp klass.new(**merge_location(hash, o)) end |
#hostname(o) ⇒ Object
Transforms pops expressions into AST 3.1 hostnames
78 79 80 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 78 def hostname(o) @@hostname_transform_visitor.visit_this_0(self, o) end |
#hostname_Array(o) ⇒ Object
Transforms Array of host matching expressions into a (Ruby) array of AST::HostName
90 91 92 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 90 def hostname_Array(o) o.collect {|x| ast x, AST::HostName, :value => hostname(x) } end |
#hostname_LiteralDefault(o) ⇒ Object
106 107 108 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 106 def hostname_LiteralDefault(o) return 'default' end |
#hostname_LiteralNumber(o) ⇒ Object
102 103 104 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 102 def hostname_LiteralNumber(o) transform(o) # Number to string with correct radix end |
#hostname_LiteralRegularExpression(o) ⇒ Object
110 111 112 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 110 def hostname_LiteralRegularExpression(o) ast o, AST::Regex, :value => o.value end |
#hostname_LiteralValue(o) ⇒ Object
94 95 96 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 94 def hostname_LiteralValue(o) return o.value end |
#hostname_Object(o) ⇒ Object
114 115 116 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 114 def hostname_Object(o) raise _("Illegal expression - unacceptable as a node name") end |
#hostname_QualifiedName(o) ⇒ Object
98 99 100 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 98 def hostname_QualifiedName(o) return o.value end |
#is_nop?(o) ⇒ Boolean
Nil, nop Bee bopp a luh-lah, a bop bop boom.
125 126 127 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 125 def is_nop?(o) o.nil? || o.is_a?(Model::Nop) end |
#merge_location(hash, o) ⇒ Object
THIS IS AN EXPENSIVE OPERATION The 3x AST requires line, pos etc. to be recorded directly in the AST nodes and this information must be computed. (Newer implementation only computes the information that is actually needed; typically when raising an exception).
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 44 def merge_location(hash, o) if o pos = {} locator = o.locator offset = o.is_a?(Model::Program) ? 0 : o.offset pos[:line] = locator.line_for_offset(offset) pos[:pos] = locator.pos_on_line(offset) pos[:file] = locator.file if nil_or_empty?(pos[:file]) && !nil_or_empty?(@source_file) pos[:file] = @source_file end hash = hash.merge(pos) end hash end |
#nil_or_empty?(x) ⇒ Boolean
129 130 131 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 129 def nil_or_empty?(x) x.nil? || x == '' end |
#query(o) ⇒ Object
Transforms pops expressions into AST 3.1 query expressions
73 74 75 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 73 def query(o) @@query_transform_visitor.visit_this_0(self, o) end |
#query_Object(o) ⇒ Object
Ensures transformation fails if a 3.1 non supported object is encountered in a query expression
85 86 87 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 85 def query_Object(o) raise _("Not a valid expression in a collection query: %{class_name}") % { class_name: o.class.name } end |
#transform(o) ⇒ Object
Transforms pops expressions into AST 3.1 statements/expressions
61 62 63 64 65 66 67 68 69 70 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 61 def transform(o) begin @@transform_visitor.visit_this_0(self,o) rescue StandardError => e loc_data = {} merge_location(loc_data, o) raise Puppet::ParseError.new(_("Error while transforming to Puppet 3 AST: %{message}") % { message: e. }, loc_data[:file], loc_data[:line], loc_data[:pos], e) end end |