Skip to content

Commit

Permalink
Merge pull request #2842 from hlindberg/PUP-2886_reserved-type-names
Browse files Browse the repository at this point in the history
(PUP-2886) Add validation for reserved type names
  • Loading branch information
jpartlow committed Jul 16, 2014
2 parents 0311be1 + 4ccac8d commit c31da16
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 0 deletions.
4 changes: 4 additions & 0 deletions lib/puppet/pops/issues.rb
Expand Up @@ -495,6 +495,10 @@ def self.hard_issue(issue_code, *args, &block)
"Use of reserved word: #{word}, must be quoted if intended to be a String value"
end

RESERVED_TYPE_NAME = hard_issue :RESERVED_TYPE_NAME, :name do
"The name: '#{name}' is already defined by Puppet and can not be used as the name of #{label.a_an(semantic)}."
end

UNMATCHED_SELECTOR = hard_issue :UNMATCHED_SELECTOR, :param_value do
"No matching entry for selector parameter with value '#{param_value}'"
end
Expand Down
27 changes: 27 additions & 0 deletions lib/puppet/pops/validation/checker4_0.rb
Expand Up @@ -245,12 +245,39 @@ def check_NamedAccessExpression(o)
end
end

RESERVED_TYPE_NAMES = {
'type' => true,
'any' => true,
'unit' => true,
'scalar' => true,
'boolean' => true,
'numeric' => true,
'integer' => true,
'float' => true,
'collection' => true,
'array' => true,
'hash' => true,
'tuple' => true,
'struct' => true,
'variant' => true,
'optional' => true,
'enum' => true,
'regexp' => true,
'pattern' => true,
'runtime' => true,
}

# for 'class', 'define', and function
def check_NamedDefinition(o)
top(o.eContainer, o)
if o.name !~ Puppet::Pops::Patterns::CLASSREF
acceptor.accept(Issues::ILLEGAL_DEFINITION_NAME, o, {:name=>o.name})
end

if RESERVED_TYPE_NAMES[o.name()]
acceptor.accept(Issues::RESERVED_TYPE_NAME, o, {:name => o.name})
end

if violator = ends_with_idem(o.body)
acceptor.accept(Issues::IDEM_NOT_ALLOWED_LAST, violator, {:container => o})
end
Expand Down
35 changes: 35 additions & 0 deletions spec/unit/pops/validator/validator_spec.rb
Expand Up @@ -120,6 +120,41 @@ def validate(model)
end
end

context 'for reserved type names' do
[# type/Type, is a reserved name but results in syntax error because it is a keyword in lower case form
'any',
'unit',
'scalar',
'boolean',
'numeric',
'integer',
'float',
'collection',
'array',
'hash',
'tuple',
'struct',
'variant',
'optional',
'enum',
'regexp',
'pattern',
'runtime',
].each do |name|

it "produces an error for 'class #{name}'" do
source = "class #{name} {}"
expect(validate(parse(source))).to have_issue(Puppet::Pops::Issues::RESERVED_TYPE_NAME)
end

it "produces an error for 'define #{name}'" do
source = "define #{name} {}"
expect(validate(parse(source))).to have_issue(Puppet::Pops::Issues::RESERVED_TYPE_NAME)
end
end

end

def parse(source)
Puppet::Pops::Parser::Parser.new().parse_string(source)
end
Expand Down

0 comments on commit c31da16

Please sign in to comment.