~ubuntu-branches/ubuntu/oneiric/puppet/oneiric-security

« back to all changes in this revision

Viewing changes to lib/puppet/parser/ast.rb

  • Committer: Bazaar Package Importer
  • Author(s): Micah Anderson
  • Date: 2008-07-26 15:43:45 UTC
  • mto: (3.1.1 lenny) (1.3.1 upstream)
  • mto: This revision was merged to the branch mainline in revision 16.
  • Revision ID: james.westby@ubuntu.com-20080726154345-1fmgo76b4l72ulvc
ImportĀ upstreamĀ versionĀ 0.24.5

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
# the parent class for all of our syntactical objects
2
2
 
3
3
require 'puppet'
4
 
require 'puppet/autoload'
 
4
require 'puppet/util/autoload'
5
5
 
6
6
# The base class for all of the objects that make up the parse trees.
7
7
# Handles things like file name, line #, and also does the initialization
12
12
 
13
13
    include Puppet::Util::Errors
14
14
    include Puppet::Util::MethodHelper
15
 
 
16
 
    Puppet.setdefaults("ast",
17
 
        :typecheck => [true, "Whether to validate types during parsing."],
18
 
        :paramcheck => [true, "Whether to validate parameters during parsing."]
19
 
    )
20
15
    attr_accessor :line, :file, :parent, :scope
21
16
 
22
 
    # Just used for 'tree', which is only used in debugging.
23
 
    @@pink = ""
24
 
    @@green = ""
25
 
    @@yellow = ""
26
 
    @@slate = ""
27
 
    @@reset = ""
28
 
 
29
 
    # Just used for 'tree', which is only used in debugging.
30
 
    @@indent = " " * 4
31
 
    @@indline = @@pink + ("-" * 4) + @@reset
32
 
    @@midline = @@slate + ("-" * 4) + @@reset
33
 
 
34
 
    @@settypes = {}
35
 
 
36
 
    # Just used for 'tree', which is only used in debugging.
37
 
    def AST.indention
38
 
        return @@indent * @@indention
39
 
    end
40
 
 
41
 
    # Just used for 'tree', which is only used in debugging.
42
 
    def AST.midline
43
 
        return @@midline
44
 
    end
45
 
 
46
17
    # Does this ast object set something?  If so, it gets evaluated first.
47
18
    def self.settor?
48
19
        if defined? @settor
52
23
        end
53
24
    end
54
25
 
55
 
    # Evaluate the current object.  Basically just iterates across all
 
26
    # Evaluate the current object.  Just a stub method, since the subclass
 
27
    # should override this method.
56
28
    # of the contained children and evaluates them in turn, returning a
57
29
    # list of all of the collected values, rejecting nil values
58
 
    def evaluate(args)
59
 
        #Puppet.debug("Evaluating ast %s" % @name)
60
 
        value = self.collect { |obj|
61
 
            obj.safeevaluate(args)
62
 
        }.reject { |obj|
63
 
            obj.nil?
64
 
        }
 
30
    def evaluate(*options)
 
31
        raise Puppet::DevError, "Did not override #evaluate in %s" % self.class
65
32
    end
66
33
 
67
34
    # Throw a parse error.
80
47
    # correctly handles errors.  It is critical to use this method because
81
48
    # it can enable you to catch the error where it happens, rather than
82
49
    # much higher up the stack.
83
 
    def safeevaluate(*args)
 
50
    def safeevaluate(*options)
84
51
        # We duplicate code here, rather than using exceptwrap, because this
85
52
        # is called so many times during parsing.
86
 
        #exceptwrap do
87
 
        #    self.evaluate(*args)
88
 
        #end
89
53
        begin
90
 
            return self.evaluate(*args)
 
54
            return self.evaluate(*options)
91
55
        rescue Puppet::Error => detail
92
56
            raise adderrorcontext(detail)
93
57
        rescue => detail
94
 
            message = options[:message] || "%s failed with error %s: %s" %
95
 
                    [self.class, detail.class, detail.to_s]
96
 
 
97
 
            error = options[:type].new(message)
 
58
            error = Puppet::Error.new(detail.to_s)
98
59
            # We can't use self.fail here because it always expects strings,
99
60
            # not exceptions.
100
61
            raise adderrorcontext(error, detail)
101
62
        end
102
63
    end
103
64
 
104
 
    # Again, just used for printing out the parse tree.
105
 
    def typewrap(string)
106
 
        #return self.class.to_s.sub(/.+::/,'') +
107
 
            #"(" + @@green + string.to_s + @@reset + ")"
108
 
        return @@green + string.to_s + @@reset +
109
 
            "(" + self.class.to_s.sub(/.+::/,'') + ")"
110
 
    end
111
 
 
112
65
    # Initialize the object.  Requires a hash as the argument, and
113
66
    # takes each of the parameters of the hash and calls the settor
114
67
    # method for them.  This is probably pretty inefficient and should
118
71
        @line = nil
119
72
        set_options(args)
120
73
    end
121
 
    #---------------------------------------------------------------
122
 
    # Now autoload everything.
123
 
    @autoloader = Puppet::Autoload.new(self,
124
 
        "puppet/parser/ast"
125
 
    )
126
 
    @autoloader.loadall
127
74
end
128
75
 
129
 
#require 'puppet/parser/ast/astarray'
130
 
#require 'puppet/parser/ast/branch'
131
 
#require 'puppet/parser/ast/collection'
132
 
#require 'puppet/parser/ast/caseopt'
133
 
#require 'puppet/parser/ast/casestatement'
134
 
#require 'puppet/parser/ast/component'
135
 
#require 'puppet/parser/ast/else'
136
 
#require 'puppet/parser/ast/hostclass'
137
 
#require 'puppet/parser/ast/ifstatement'
138
 
#require 'puppet/parser/ast/leaf'
139
 
#require 'puppet/parser/ast/node'
140
 
#require 'puppet/parser/ast/resourcedef'
141
 
#require 'puppet/parser/ast/resourceparam'
142
 
#require 'puppet/parser/ast/resourceref'
143
 
#require 'puppet/parser/ast/resourceoverride'
144
 
#require 'puppet/parser/ast/selector'
145
 
#require 'puppet/parser/ast/resourcedefaults'
146
 
#require 'puppet/parser/ast/vardef'
147
 
#require 'puppet/parser/ast/tag'
148
 
#require 'puppet/parser/ast/function'
149
 
 
150
 
# $Id: ast.rb 1739 2006-10-06 03:13:15Z luke $
 
76
# And include all of the AST subclasses.
 
77
require 'puppet/parser/ast/astarray'
 
78
require 'puppet/parser/ast/branch'
 
79
require 'puppet/parser/ast/caseopt'
 
80
require 'puppet/parser/ast/casestatement'
 
81
require 'puppet/parser/ast/collection'
 
82
require 'puppet/parser/ast/collexpr'
 
83
require 'puppet/parser/ast/definition'
 
84
require 'puppet/parser/ast/else'
 
85
require 'puppet/parser/ast/function'
 
86
require 'puppet/parser/ast/hostclass'
 
87
require 'puppet/parser/ast/ifstatement'
 
88
require 'puppet/parser/ast/leaf'
 
89
require 'puppet/parser/ast/node'
 
90
require 'puppet/parser/ast/resource'
 
91
require 'puppet/parser/ast/resource_defaults'
 
92
require 'puppet/parser/ast/resource_override'
 
93
require 'puppet/parser/ast/resource_reference'
 
94
require 'puppet/parser/ast/resourceparam'
 
95
require 'puppet/parser/ast/selector'
 
96
require 'puppet/parser/ast/tag'
 
97
require 'puppet/parser/ast/vardef'