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
- AST =
Puppet::Parser::AST
- Model =
Puppet::Pops::Model
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.
-
#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.
13 14 15 16 17 18 19 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 13 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)
12 13 14 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 12 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.
31 32 33 34 35 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 31 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
75 76 77 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 75 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
87 88 89 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 87 def hostname_Array(o) o.collect {|x| ast x, AST::HostName, :value => hostname(x) } end |
#hostname_LiteralDefault(o) ⇒ Object
103 104 105 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 103 def hostname_LiteralDefault(o) return 'default' end |
#hostname_LiteralNumber(o) ⇒ Object
99 100 101 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 99 def hostname_LiteralNumber(o) transform(o) # Number to string with correct radix end |
#hostname_LiteralRegularExpression(o) ⇒ Object
107 108 109 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 107 def hostname_LiteralRegularExpression(o) ast o, AST::Regex, :value => o.value end |
#hostname_LiteralValue(o) ⇒ Object
91 92 93 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 91 def hostname_LiteralValue(o) return o.value end |
#hostname_Object(o) ⇒ Object
111 112 113 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 111 def hostname_Object(o) raise "Illegal expression - unacceptable as a node name" end |
#hostname_QualifiedName(o) ⇒ Object
95 96 97 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 95 def hostname_QualifiedName(o) return o.value end |
#is_nop?(o) ⇒ Boolean
Nil, nop Bee bopp a luh-lah, a bop bop boom.
122 123 124 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 122 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).
43 44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 43 def merge_location(hash, o) if o pos = {} source_pos = Puppet::Pops::Utils.find_closest_positioned(o) if source_pos pos[:line] = source_pos.line pos[:pos] = source_pos.pos end pos[:file] = @source_file if @source_file hash = hash.merge(pos) end hash end |
#query(o) ⇒ Object
Transforms pops expressions into AST 3.1 query expressions
70 71 72 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 70 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
82 83 84 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 82 def query_Object(o) raise "Not a valid expression in a collection query: "+o.class.name end |
#transform(o) ⇒ Object
Transforms pops expressions into AST 3.1 statements/expressions
58 59 60 61 62 63 64 65 66 67 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 58 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: #{e.message}", loc_data[:file], loc_data[:line], loc_data[:pos], e) end end |
#transform_Object(o) ⇒ Object
115 116 117 |
# File 'lib/puppet/pops/model/ast_transformer.rb', line 115 def transform_Object(o) raise "Unacceptable transform - found an Object without a rule: #{o.class}" end |