File: definition.rb

package info (click to toggle)
ohcount 3.0.0-2
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 4,712 kB
  • ctags: 3,205
  • sloc: ansic: 6,524; ruby: 2,560; perl: 2,041; erlang: 350; lisp: 272; sh: 244; pascal: 196; vhdl: 150; haskell: 149; asm: 128; cs: 124; awk: 98; java: 92; php: 73; tcl: 58; xml: 57; fortran: 54; makefile: 32; python: 31; ada: 30; objc: 30; jsp: 28; sql: 18; cobol: 13; ml: 9; cpp: 3
file content (78 lines) | stat: -rw-r--r-- 2,063 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
require 'gestalt/rules/rule'
require 'gestalt/rules/logical_rule'
require 'gestalt/rules/or_rule'
require 'gestalt/rules/and_rule'
require 'gestalt/rules/not_rule'
require 'gestalt/rules/language_rule'
require 'gestalt/rules/file_rule'
require 'gestalt/rules/filename_rule'
require 'gestalt/rules/find_filenames_rule'
require 'gestalt/rules/c_header_rule'
require 'gestalt/rules/keyword_rule'
require 'gestalt/rules/c_keyword_rule'
require 'gestalt/rules/gestalt_rule'
require 'gestalt/rules/java_import_rule'
require 'gestalt/rules/csharp_using_rule'
require 'gestalt/rules/find_java_imports_rule'
require 'gestalt/rules/maven_parser'
require 'gestalt/rules/maven_rule'
require 'gestalt/rules/csproj_parser'
require 'gestalt/rules/csproj_rule'

module Ohcount
  module Gestalt

    class Definition
      attr_reader :type, :fixed_name

      def initialize(type, fixed_name = nil, options = {}, &block)
        @type = type
        @fixed_name = fixed_name
        if options[:rule]
          @top_level_or = options[:rule]
        else
          @top_level_or = OrRule.new(&block)
        end
      end

      def gestalts(gestalt_engine)
        @top_level_or.triggers(gestalt_engine).map do |trigger|
          Gestalt::Base.new(type, trigger.name || self.fixed_name, trigger.count)
        end
      end

      def top_level_or
        @top_level_or ||= OrRule.new
      end

      def self.add_definition(definition)
        @definitions ||= []
        @definitions << definition
      end

      def self.all_definitions
        @definitions || []
      end

      def clone
        rule = top_level_or.clone
        Definition.new(type,fixed_name,:rule => rule)
      end
    end


    # DSL language to allow people to define gestalt definitions like this:\
    #
    # define_xxx 'Foobar' do
    #   filenames 'foobar'
    # end
    #
    def self.method_missing(method, *args, &block)
      if method.to_s =~ /define_(.*)$/
        Definition.add_definition(Definition.new($1.intern,*args,&block))
      else
        super
      end
    end
  end
end