Class: Puppet::Pops::Model::AstTransformer

Inherits:
Object
  • Object
show all
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)

API:

  • public

Constant Summary collapse

AST =

API:

  • public

Puppet::Parser::AST
Model =

API:

  • public

Puppet::Pops::Model

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(source_file = "unknown-file", importer = nil) ⇒ AstTransformer

Returns a new instance of AstTransformer.

API:

  • public



16
17
18
19
20
21
22
# File 'lib/puppet/pops/model/ast_transformer.rb', line 16

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

#importerObject (readonly)

API:

  • public



14
15
16
# File 'lib/puppet/pops/model/ast_transformer.rb', line 14

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.

Parameters:

  • object from which source position / location is obtained, may be nil

  • the ast class to create an instance of

  • (defaults to: {})

    hash with options for the class to create

API:

  • public



34
35
36
37
38
# File 'lib/puppet/pops/model/ast_transformer.rb', line 34

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

API:

  • public



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

API:

  • public



89
90
91
# File 'lib/puppet/pops/model/ast_transformer.rb', line 89

def hostname_Array(o)
  o.collect { |x| ast x, AST::HostName, :value => hostname(x) }
end

#hostname_LiteralDefault(o) ⇒ Object

API:

  • public



105
106
107
# File 'lib/puppet/pops/model/ast_transformer.rb', line 105

def hostname_LiteralDefault(o)
  'default'
end

#hostname_LiteralNumber(o) ⇒ Object

API:

  • public



101
102
103
# File 'lib/puppet/pops/model/ast_transformer.rb', line 101

def hostname_LiteralNumber(o)
  transform(o) # Number to string with correct radix
end

#hostname_LiteralRegularExpression(o) ⇒ Object

API:

  • public



109
110
111
# File 'lib/puppet/pops/model/ast_transformer.rb', line 109

def hostname_LiteralRegularExpression(o)
  ast o, AST::Regex, :value => o.value
end

#hostname_LiteralValue(o) ⇒ Object

API:

  • public



93
94
95
# File 'lib/puppet/pops/model/ast_transformer.rb', line 93

def hostname_LiteralValue(o)
  o.value
end

#hostname_Object(o) ⇒ Object

API:

  • public



113
114
115
# File 'lib/puppet/pops/model/ast_transformer.rb', line 113

def hostname_Object(o)
  raise _("Illegal expression - unacceptable as a node name")
end

#hostname_QualifiedName(o) ⇒ Object

API:

  • public



97
98
99
# File 'lib/puppet/pops/model/ast_transformer.rb', line 97

def hostname_QualifiedName(o)
  o.value
end

#is_nop?(o) ⇒ Boolean

Nil, nop Bee bopp a luh-lah, a bop bop boom.

Returns:

API:

  • public



124
125
126
# File 'lib/puppet/pops/model/ast_transformer.rb', line 124

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).

API:

  • public



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/puppet/pops/model/ast_transformer.rb', line 46

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

Returns:

API:

  • public



128
129
130
# File 'lib/puppet/pops/model/ast_transformer.rb', line 128

def nil_or_empty?(x)
  x.nil? || x == ''
end

#query(o) ⇒ Object

Transforms pops expressions into AST 3.1 query expressions

API:

  • public



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

API:

  • public



84
85
86
# File 'lib/puppet/pops/model/ast_transformer.rb', line 84

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

API:

  • public



63
64
65
66
67
68
69
70
# File 'lib/puppet/pops/model/ast_transformer.rb', line 63

def transform(o)
  @@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.message },
                               loc_data[:file], loc_data[:line], loc_data[:pos], e)
end

#transform_Object(o) ⇒ Object

API:

  • public



117
118
119
# File 'lib/puppet/pops/model/ast_transformer.rb', line 117

def transform_Object(o)
  raise _("Unacceptable transform - found an Object without a rule: %{klass}") % { klass: o.class }
end