Class: Puppet::Parser::AST::PopsBridge::Program
- Inherits:
-
TopLevelConstruct
- Object
- Puppet::Parser::AST
- TopLevelConstruct
- Puppet::Parser::AST::PopsBridge::Program
- Defined in:
- lib/puppet/parser/ast/pops_bridge.rb
Overview
Bridges the top level “Program” produced by the pops parser. Its main purpose is to give one point where all definitions are instantiated (actually defined since the Puppet 3x terminology is somewhat misleading - the definitions are instantiated, but instances of the created types are not created, that happens when classes are included / required, nodes are matched and when resources are instantiated by a resource expression (which is also used to instantiate a host class).
Constant Summary
Constants inherited from Puppet::Parser::AST
Instance Attribute Summary collapse
-
#context ⇒ Object
readonly
Returns the value of attribute context.
-
#program_model ⇒ Object
readonly
Returns the value of attribute program_model.
Attributes inherited from Puppet::Parser::AST
#file, #line, #parent, #pos, #scope
Instance Method Summary collapse
-
#each {|_self| ... } ⇒ Object
Adapts to 3x where top level constructs needs to have each to iterate over children.
- #evaluate(scope) ⇒ Object
-
#initialize(program_model, context = {}) ⇒ Program
constructor
A new instance of Program.
-
#instantiate(modname) ⇒ Object
This is the 3x API, the 3x AST searches through all code to find the instructions that can be instantiated.
Methods inherited from Puppet::Parser::AST
Methods included from Util::MethodHelper
#requiredopts, #set_options, #symbolize_options
Methods included from Util::Errors
#adderrorcontext, #devfail, #error_context, #exceptwrap, #fail
Constructor Details
#initialize(program_model, context = {}) ⇒ Program
Returns a new instance of Program.
86 87 88 89 90 91 |
# File 'lib/puppet/parser/ast/pops_bridge.rb', line 86 def initialize(program_model, context = {}) @program_model = program_model @context = context @ast_transformer ||= Puppet::Pops::Model::AstTransformer.new(@context[:file]) @@evaluator ||= Puppet::Pops::Parser::EvaluatingParser.new() end |
Instance Attribute Details
#context ⇒ Object (readonly)
Returns the value of attribute context.
84 85 86 |
# File 'lib/puppet/parser/ast/pops_bridge.rb', line 84 def context @context end |
#program_model ⇒ Object (readonly)
Returns the value of attribute program_model.
84 85 86 |
# File 'lib/puppet/parser/ast/pops_bridge.rb', line 84 def program_model @program_model end |
Instance Method Details
#each {|_self| ... } ⇒ Object
Adapts to 3x where top level constructs needs to have each to iterate over children. Short circuit this by yielding self. This means that the HostClass container will call this bridge instance with ‘instantiate`.
138 139 140 |
# File 'lib/puppet/parser/ast/pops_bridge.rb', line 138 def each yield self end |
#evaluate(scope) ⇒ Object
131 132 133 |
# File 'lib/puppet/parser/ast/pops_bridge.rb', line 131 def evaluate(scope) @@evaluator.evaluate(scope, program_model) end |
#instantiate(modname) ⇒ Object
This is the 3x API, the 3x AST searches through all code to find the instructions that can be instantiated. This Pops-model based instantiation relies on the parser to build this list while parsing (which is more efficient as it avoids one full scan of all logic via recursive enumeration/yield)
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
# File 'lib/puppet/parser/ast/pops_bridge.rb', line 97 def instantiate(modname) @program_model.definitions.collect do |d| case d when Puppet::Pops::Model::HostClassDefinition instantiate_HostClassDefinition(d, modname) when Puppet::Pops::Model::ResourceTypeDefinition instantiate_ResourceTypeDefinition(d, modname) when Puppet::Pops::Model::CapabilityMapping instantiate_CapabilityMapping(d, modname) when Puppet::Pops::Model::NodeDefinition instantiate_NodeDefinition(d, modname) when Puppet::Pops::Model::SiteDefinition instantiate_SiteDefinition(d, modname) when Puppet::Pops::Model::FunctionDefinition # The 3x logic calling this will not know what to do with the result, it is compacted away at the end instantiate_FunctionDefinition(d, modname) next when Puppet::Pops::Model::TypeAlias # The 3x logic calling this will not know what to do with the result, it is compacted away at the end instantiate_TypeAlias(d, modname) next when Puppet::Pops::Model::TypeMapping # The 3x logic calling this will not know what to do with the result, it is compacted away at the end instantiate_TypeMapping(d, modname) next when Puppet::Pops::Model::Application instantiate_ApplicationDefinition(d, modname) else raise Puppet::ParseError, "Internal Error: Unknown type of definition - got '#{d.class}'" end end.flatten().compact() # flatten since node definition may have returned an array # Compact since functions are not understood by compiler end |