summaryrefslogtreecommitdiffstats
path: root/lib/puppet/parser
diff options
context:
space:
mode:
authorluke <luke@980ebf18-57e1-0310-9a29-db15c13687c0>2006-02-07 05:58:00 +0000
committerluke <luke@980ebf18-57e1-0310-9a29-db15c13687c0>2006-02-07 05:58:00 +0000
commit6affe220db1248cee8489347dc7d7ac071a534e4 (patch)
treee885f7ac374336c818374556065da70036b71211 /lib/puppet/parser
parent59c7b02f8fb0c5f2820577f11c9c34935ac16a0a (diff)
downloadpuppet-6affe220db1248cee8489347dc7d7ac071a534e4.tar.gz
puppet-6affe220db1248cee8489347dc7d7ac071a534e4.tar.xz
puppet-6affe220db1248cee8489347dc7d7ac071a534e4.zip
Committing both the finalization of the config code, plus all of the code necessary to get basic isomorphism from code to transportables and back. Mostly keyword and autoname stuff.
git-svn-id: https://reductivelabs.com/svn/puppet/trunk@871 980ebf18-57e1-0310-9a29-db15c13687c0
Diffstat (limited to 'lib/puppet/parser')
-rw-r--r--lib/puppet/parser/ast/classdef.rb7
-rw-r--r--lib/puppet/parser/ast/compdef.rb17
-rw-r--r--lib/puppet/parser/ast/component.rb9
-rw-r--r--lib/puppet/parser/ast/node.rb1
-rw-r--r--lib/puppet/parser/ast/nodedef.rb9
-rw-r--r--lib/puppet/parser/ast/objectdef.rb15
-rw-r--r--lib/puppet/parser/grammar.ra6
-rw-r--r--lib/puppet/parser/parser.rb44
-rw-r--r--lib/puppet/parser/scope.rb12
9 files changed, 82 insertions, 38 deletions
diff --git a/lib/puppet/parser/ast/classdef.rb b/lib/puppet/parser/ast/classdef.rb
index 7386b25eb..147ab88e5 100644
--- a/lib/puppet/parser/ast/classdef.rb
+++ b/lib/puppet/parser/ast/classdef.rb
@@ -36,9 +36,9 @@ class Puppet::Parser::AST
# [name,args])
begin
- scope.settype(name,
- HostClass.new(arghash)
- )
+ hclass = HostClass.new(arghash)
+ hclass.keyword = self.keyword
+ scope.settype(name, hclass)
rescue Puppet::ParseError => except
except.line = self.line
except.file = self.file
@@ -54,6 +54,7 @@ class Puppet::Parser::AST
def initialize(hash)
@parentclass = nil
+ @keyword = "class"
super
end
diff --git a/lib/puppet/parser/ast/compdef.rb b/lib/puppet/parser/ast/compdef.rb
index 4118c7184..ef099eff8 100644
--- a/lib/puppet/parser/ast/compdef.rb
+++ b/lib/puppet/parser/ast/compdef.rb
@@ -9,7 +9,7 @@ class Puppet::Parser::AST
# encounter an error if the component is instantiated more than
# once.
class CompDef < AST::Branch
- attr_accessor :name, :args, :code
+ attr_accessor :name, :args, :code, :keyword
def each
[@name,@args,@code].each { |child| yield child }
@@ -21,13 +21,13 @@ class Puppet::Parser::AST
args = @args.safeevaluate(scope)
begin
- scope.settype(name,
- AST::Component.new(
- :name => name,
- :args => args,
- :code => @code
- )
+ comp = AST::Component.new(
+ :name => name,
+ :args => args,
+ :code => @code
)
+ comp.keyword = self.keyword
+ scope.settype(name, comp)
rescue Puppet::ParseError => except
except.line = self.line
except.file = self.file
@@ -43,6 +43,9 @@ class Puppet::Parser::AST
def initialize(hash)
@parentclass = nil
+
+ # Set a default keyword
+ @keyword = "define"
super
#Puppet.debug "Defining type %s" % @name.value
diff --git a/lib/puppet/parser/ast/component.rb b/lib/puppet/parser/ast/component.rb
index 841977b2f..f5105c44b 100644
--- a/lib/puppet/parser/ast/component.rb
+++ b/lib/puppet/parser/ast/component.rb
@@ -10,7 +10,7 @@ class Puppet::Parser::AST
# The class name
@name = :component
- attr_accessor :name, :args, :code, :scope
+ attr_accessor :name, :args, :code, :scope, :autoname, :keyword
def evaluate(scope,hash,objtype,objname)
@@ -23,6 +23,13 @@ class Puppet::Parser::AST
# been dynamically generated. This is almost never used
scope.name = objname
+ scope.keyword = self.keyword
+
+ # Retain the fact that we were autonamed, if so
+ if self.autoname
+ scope.autoname = true
+ end
+
#if self.is_a?(Node)
# scope.isnodescope
#end
diff --git a/lib/puppet/parser/ast/node.rb b/lib/puppet/parser/ast/node.rb
index 18d7f8aa7..2e33eb672 100644
--- a/lib/puppet/parser/ast/node.rb
+++ b/lib/puppet/parser/ast/node.rb
@@ -16,6 +16,7 @@ class Puppet::Parser::AST
# string.
scope.type = @name
scope.name = @name
+ scope.keyword = @keyword
# Mark this scope as a nodescope, so that classes will be
# singletons within it
diff --git a/lib/puppet/parser/ast/nodedef.rb b/lib/puppet/parser/ast/nodedef.rb
index c0e1ee63e..da93069b2 100644
--- a/lib/puppet/parser/ast/nodedef.rb
+++ b/lib/puppet/parser/ast/nodedef.rb
@@ -3,7 +3,7 @@ class Puppet::Parser::AST
# specified node, and this parse tree is only ever looked up when
# a client connects.
class NodeDef < AST::Branch
- attr_accessor :names, :code, :parentclass
+ attr_accessor :names, :code, :parentclass, :keyword
def each
[@names,@code].each { |child| yield child }
@@ -30,9 +30,9 @@ class Puppet::Parser::AST
end
begin
- scope.setnode(name,
- Node.new(arghash)
- )
+ node = Node.new(arghash)
+ node.keyword = true
+ scope.setnode(name, node)
rescue Puppet::ParseError => except
except.line = self.line
except.file = self.file
@@ -48,6 +48,7 @@ class Puppet::Parser::AST
def initialize(hash)
@parentclass = nil
+ @keyword = "node"
super
end
diff --git a/lib/puppet/parser/ast/objectdef.rb b/lib/puppet/parser/ast/objectdef.rb
index 844b7a71d..dc355be77 100644
--- a/lib/puppet/parser/ast/objectdef.rb
+++ b/lib/puppet/parser/ast/objectdef.rb
@@ -52,7 +52,7 @@ class Puppet::Parser::AST
self.typecheck(objtype)
end
- # See if our object was defined
+ # See if our object type was defined
begin
object = scope.lookuptype(objtype)
rescue Puppet::ParseError => except
@@ -81,11 +81,13 @@ class Puppet::Parser::AST
end
+ autonamed = false
# Autogenerate the name if one was not passed.
if defined? @name
objnames = @name.safeevaluate(scope)
else
objnames = self.autoname(objtype, object)
+ autonamed = true
end
# it's easier to always use an array, even for only one name
@@ -106,7 +108,8 @@ class Puppet::Parser::AST
# if someone passed an array as the name, then we act
# just like the called us many times
objnames.collect { |objname|
- # If the object is a class, that means it's a builtin type
+ # If the object is a class, that means it's a builtin type, so
+ # we just store it in the scope
if object.is_a?(Class)
begin
#Puppet.debug(
@@ -138,7 +141,13 @@ class Puppet::Parser::AST
# one of those, evaluate that with our arguments
#Puppet.debug("Calling object '%s' with arguments %s" %
# [object.name, hash.inspect])
- object.safeevaluate(scope,hash,objtype,objname)
+ obj = object.safeevaluate(scope,hash,objtype,objname)
+
+ # Retain any name generation stuff
+ obj.autoname = autonamed
+
+ # and pass the result on
+ obj
end
}.reject { |obj| obj.nil? }
end
diff --git a/lib/puppet/parser/grammar.ra b/lib/puppet/parser/grammar.ra
index 3630d27ef..bd32f2c5b 100644
--- a/lib/puppet/parser/grammar.ra
+++ b/lib/puppet/parser/grammar.ra
@@ -483,6 +483,7 @@ definition: DEFINE NAME argumentlist LBRACE statements RBRACE {
:args => val[2],
:file => @lexer.file,
:line => @lexer.line,
+ :keyword => val[0],
:code => val[4]
)
} | DEFINE NAME argumentlist LBRACE RBRACE {
@@ -491,6 +492,7 @@ definition: DEFINE NAME argumentlist LBRACE statements RBRACE {
:args => val[2],
:file => @lexer.file,
:line => @lexer.line,
+ :keyword => val[0],
:code => AST::ASTArray.new(
:line => @lexer.line,
:file => @lexer.file,
@@ -506,6 +508,7 @@ hostclass: CLASS NAME parent LBRACE statements RBRACE {
:name => AST::Name.new(:value => val[1], :line => @lexer.line),
:file => @lexer.file,
:line => @lexer.line,
+ :keyword => val[0],
:code => val[4]
}
# It'll be an ASTArray if we didn't get a parent
@@ -518,6 +521,7 @@ hostclass: CLASS NAME parent LBRACE statements RBRACE {
:name => AST::Name.new(:value => val[1], :line => @lexer.line),
:file => @lexer.file,
:line => @lexer.line,
+ :keyword => val[0],
:code => AST::ASTArray.new(
:line => @lexer.line,
:file => @lexer.file,
@@ -543,6 +547,7 @@ nodedef: NODE names parent LBRACE statements RBRACE {
:file => @lexer.file,
:line => @lexer.line,
:names => val[1],
+ :keyword => val[0],
:code => val[4]
}
if val[2].is_a?(AST::Name)
@@ -560,6 +565,7 @@ nodedef: NODE names parent LBRACE statements RBRACE {
args = {
:file => @lexer.file,
:line => @lexer.line,
+ :keyword => val[0],
:names => val[1],
:code => AST::ASTArray.new(
:line => @lexer.line,
diff --git a/lib/puppet/parser/parser.rb b/lib/puppet/parser/parser.rb
index 582283704..43fa51119 100644
--- a/lib/puppet/parser/parser.rb
+++ b/lib/puppet/parser/parser.rb
@@ -29,7 +29,7 @@ module Puppet
class Parser < Racc::Parser
-module_eval <<'..end grammar.ra modeval..idc16574e75e', 'grammar.ra', 697
+module_eval <<'..end grammar.ra modeval..id3b98377f5e', 'grammar.ra', 703
attr_reader :file
attr_accessor :files
@@ -144,7 +144,7 @@ def string=(string)
end
# $Id$
-..end grammar.ra modeval..idc16574e75e
+..end grammar.ra modeval..id3b98377f5e
##### racc 1.4.4 generates ###
@@ -1162,26 +1162,28 @@ module_eval <<'.,.,', 'grammar.ra', 478
end
.,.,
-module_eval <<'.,.,', 'grammar.ra', 488
+module_eval <<'.,.,', 'grammar.ra', 489
def _reduce_71( val, _values, result )
result = AST::CompDef.new(
:name => AST::Name.new(:value => val[1], :line => @lexer.line),
:args => val[2],
:file => @lexer.file,
:line => @lexer.line,
+ :keyword => val[0],
:code => val[4]
)
result
end
.,.,
-module_eval <<'.,.,', 'grammar.ra', 500
+module_eval <<'.,.,', 'grammar.ra', 502
def _reduce_72( val, _values, result )
result = AST::CompDef.new(
:name => AST::Name.new(:value => val[1], :line => @lexer.line),
:args => val[2],
:file => @lexer.file,
:line => @lexer.line,
+ :keyword => val[0],
:code => AST::ASTArray.new(
:line => @lexer.line,
:file => @lexer.file,
@@ -1192,13 +1194,14 @@ module_eval <<'.,.,', 'grammar.ra', 500
end
.,.,
-module_eval <<'.,.,', 'grammar.ra', 516
+module_eval <<'.,.,', 'grammar.ra', 519
def _reduce_73( val, _values, result )
#:args => val[2],
args = {
:name => AST::Name.new(:value => val[1], :line => @lexer.line),
:file => @lexer.file,
:line => @lexer.line,
+ :keyword => val[0],
:code => val[4]
}
# It'll be an ASTArray if we didn't get a parent
@@ -1210,12 +1213,13 @@ module_eval <<'.,.,', 'grammar.ra', 516
end
.,.,
-module_eval <<'.,.,', 'grammar.ra', 532
+module_eval <<'.,.,', 'grammar.ra', 536
def _reduce_74( val, _values, result )
args = {
:name => AST::Name.new(:value => val[1], :line => @lexer.line),
:file => @lexer.file,
:line => @lexer.line,
+ :keyword => val[0],
:code => AST::ASTArray.new(
:line => @lexer.line,
:file => @lexer.file,
@@ -1231,7 +1235,7 @@ module_eval <<'.,.,', 'grammar.ra', 532
end
.,.,
-module_eval <<'.,.,', 'grammar.ra', 552
+module_eval <<'.,.,', 'grammar.ra', 557
def _reduce_75( val, _values, result )
unless val[1].is_a?(AST::ASTArray)
val[1] = AST::ASTArray.new(
@@ -1244,6 +1248,7 @@ module_eval <<'.,.,', 'grammar.ra', 552
:file => @lexer.file,
:line => @lexer.line,
:names => val[1],
+ :keyword => val[0],
:code => val[4]
}
if val[2].is_a?(AST::Name)
@@ -1254,7 +1259,7 @@ module_eval <<'.,.,', 'grammar.ra', 552
end
.,.,
-module_eval <<'.,.,', 'grammar.ra', 574
+module_eval <<'.,.,', 'grammar.ra', 580
def _reduce_76( val, _values, result )
unless val[1].is_a?(AST::ASTArray)
val[1] = AST::ASTArray.new(
@@ -1266,6 +1271,7 @@ module_eval <<'.,.,', 'grammar.ra', 574
args = {
:file => @lexer.file,
:line => @lexer.line,
+ :keyword => val[0],
:names => val[1],
:code => AST::ASTArray.new(
:line => @lexer.line,
@@ -1283,7 +1289,7 @@ module_eval <<'.,.,', 'grammar.ra', 574
# reduce 77 omitted
-module_eval <<'.,.,', 'grammar.ra', 588
+module_eval <<'.,.,', 'grammar.ra', 594
def _reduce_78( val, _values, result )
if val[0].is_a?(AST::ASTArray)
result = val[0]
@@ -1299,7 +1305,7 @@ module_eval <<'.,.,', 'grammar.ra', 588
end
.,.,
-module_eval <<'.,.,', 'grammar.ra', 596
+module_eval <<'.,.,', 'grammar.ra', 602
def _reduce_79( val, _values, result )
result = AST::ASTArray.new(
:line => @lexer.line,
@@ -1312,14 +1318,14 @@ module_eval <<'.,.,', 'grammar.ra', 596
# reduce 80 omitted
-module_eval <<'.,.,', 'grammar.ra', 601
+module_eval <<'.,.,', 'grammar.ra', 607
def _reduce_81( val, _values, result )
result = val[1]
result
end
.,.,
-module_eval <<'.,.,', 'grammar.ra', 612
+module_eval <<'.,.,', 'grammar.ra', 618
def _reduce_82( val, _values, result )
if val[1].is_a?(AST::ASTArray)
result = val[1]
@@ -1336,7 +1342,7 @@ module_eval <<'.,.,', 'grammar.ra', 612
# reduce 83 omitted
-module_eval <<'.,.,', 'grammar.ra', 626
+module_eval <<'.,.,', 'grammar.ra', 632
def _reduce_84( val, _values, result )
if val[0].instance_of?(AST::ASTArray)
val[0].push(val[2])
@@ -1352,7 +1358,7 @@ module_eval <<'.,.,', 'grammar.ra', 626
end
.,.,
-module_eval <<'.,.,', 'grammar.ra', 634
+module_eval <<'.,.,', 'grammar.ra', 640
def _reduce_85( val, _values, result )
result = AST::CompArgument.new(
:line => @lexer.line,
@@ -1363,7 +1369,7 @@ module_eval <<'.,.,', 'grammar.ra', 634
end
.,.,
-module_eval <<'.,.,', 'grammar.ra', 641
+module_eval <<'.,.,', 'grammar.ra', 647
def _reduce_86( val, _values, result )
result = AST::CompArgument.new(
:line => @lexer.line,
@@ -1376,7 +1382,7 @@ module_eval <<'.,.,', 'grammar.ra', 641
# reduce 87 omitted
-module_eval <<'.,.,', 'grammar.ra', 650
+module_eval <<'.,.,', 'grammar.ra', 656
def _reduce_88( val, _values, result )
result = AST::Name.new(
:value => val[1],
@@ -1387,7 +1393,7 @@ module_eval <<'.,.,', 'grammar.ra', 650
end
.,.,
-module_eval <<'.,.,', 'grammar.ra', 659
+module_eval <<'.,.,', 'grammar.ra', 665
def _reduce_89( val, _values, result )
name = val[0].sub(/^\$/,'')
result = AST::Variable.new(
@@ -1399,7 +1405,7 @@ module_eval <<'.,.,', 'grammar.ra', 659
end
.,.,
-module_eval <<'.,.,', 'grammar.ra', 671
+module_eval <<'.,.,', 'grammar.ra', 677
def _reduce_90( val, _values, result )
if val[1].is_a?(AST::ASTArray)
result = val[1]
@@ -1420,7 +1426,7 @@ module_eval <<'.,.,', 'grammar.ra', 671
# reduce 93 omitted
-module_eval <<'.,.,', 'grammar.ra', 676
+module_eval <<'.,.,', 'grammar.ra', 682
def _reduce_94( val, _values, result )
result = nil
result
diff --git a/lib/puppet/parser/scope.rb b/lib/puppet/parser/scope.rb
index 9392d6cf9..3e88490e3 100644
--- a/lib/puppet/parser/scope.rb
+++ b/lib/puppet/parser/scope.rb
@@ -8,7 +8,9 @@ module Puppet
class Scope
include Enumerable
attr_accessor :parent, :level, :interp
- attr_accessor :name, :type, :topscope, :base
+ attr_accessor :name, :type, :topscope, :base, :keyword, :autoname
+
+ attr_accessor :top
# This is probably not all that good of an idea, but...
# This way a parent can share its tables with all of its children.
@@ -210,6 +212,9 @@ module Puppet
objects.classes = nodescope.classlist
end
+ if objects.is_a?(Puppet::TransBucket)
+ objects.top = true
+ end
# I should do something to add the node as an object with tags
# but that will possibly end up with far too many tags.
#self.logtags
@@ -262,6 +267,7 @@ module Puppet
}
objects = self.to_trans
+ objects.top = true
# Add our class list
unless self.classlist.empty?
@@ -733,6 +739,10 @@ module Puppet
raise Puppet::ParseError,
"No type for scope %s" % @name
end
+
+ if defined? @keyword
+ bucket.keyword = @keyword
+ end
#Puppet.debug(
# "TransBucket with name %s and type %s in scope %s" %
# [@name,@type,self.object_id]