summaryrefslogtreecommitdiffstats
path: root/lib/puppet/parser/ast/objectref.rb
diff options
context:
space:
mode:
authorluke <luke@980ebf18-57e1-0310-9a29-db15c13687c0>2006-01-13 23:16:26 +0000
committerluke <luke@980ebf18-57e1-0310-9a29-db15c13687c0>2006-01-13 23:16:26 +0000
commit87b3bb111f2ea68cbeb875f07e826e4f75ea9eea (patch)
treec03530a415b2f90be6b4c6d5b594f0b8c78a3c0b /lib/puppet/parser/ast/objectref.rb
parent1d4638a03df6821c16c00db3084f89889f19ac33 (diff)
downloadpuppet-87b3bb111f2ea68cbeb875f07e826e4f75ea9eea.tar.gz
puppet-87b3bb111f2ea68cbeb875f07e826e4f75ea9eea.tar.xz
puppet-87b3bb111f2ea68cbeb875f07e826e4f75ea9eea.zip
Moving ast classes into separate files
git-svn-id: https://reductivelabs.com/svn/puppet/trunk@825 980ebf18-57e1-0310-9a29-db15c13687c0
Diffstat (limited to 'lib/puppet/parser/ast/objectref.rb')
-rw-r--r--lib/puppet/parser/ast/objectref.rb64
1 files changed, 64 insertions, 0 deletions
diff --git a/lib/puppet/parser/ast/objectref.rb b/lib/puppet/parser/ast/objectref.rb
new file mode 100644
index 000000000..e9561d65d
--- /dev/null
+++ b/lib/puppet/parser/ast/objectref.rb
@@ -0,0 +1,64 @@
+class Puppet::Parser::AST
+ # A reference to an object. Only valid as an rvalue.
+ class ObjectRef < AST::Branch
+ attr_accessor :name, :type
+
+ def each
+ [@type,@name].flatten.each { |param|
+ #Puppet.debug("yielding param %s" % param)
+ yield param
+ }
+ end
+
+ # Evaluate our object, but just return a simple array of the type
+ # and name.
+ def evaluate(scope)
+ objtype = @type.safeevaluate(scope)
+ objnames = @name.safeevaluate(scope)
+
+ # it's easier to always use an array, even for only one name
+ unless objnames.is_a?(Array)
+ objnames = [objnames]
+ end
+
+ # Verify we can find the object.
+ begin
+ object = scope.lookuptype(objtype)
+ rescue Puppet::ParseError => except
+ except.line = self.line
+ except.file = self.file
+ raise except
+ rescue => detail
+ error = Puppet::ParseError.new(detail)
+ error.line = self.line
+ error.file = self.file
+ error.stack = caller
+ raise error
+ end
+ Puppet.debug "ObjectRef returned type %s" % object
+
+ # should we implicitly iterate here?
+ # yes, i believe that we essentially have to...
+ objnames.collect { |objname|
+ if object.is_a?(AST::Component)
+ objname = "%s[%s]" % [objtype,objname]
+ objtype = "component"
+ end
+ [objtype,objname]
+ }.reject { |obj| obj.nil? }
+ end
+
+ def tree(indent = 0)
+ return [
+ @type.tree(indent + 1),
+ @name.tree(indent + 1),
+ ((@@indline * indent) + self.typewrap(self.pin))
+ ].join("\n")
+ end
+
+ def to_s
+ return "%s[%s]" % [@name,@type]
+ end
+ end
+
+end