source: extensions/gsdl-video/trunk/installed/cmdline/lib/ruby/1.8/xsd/codegen/classdef.rb@ 18425

Last change on this file since 18425 was 18425, checked in by davidb, 15 years ago

Video extension to Greenstone

File size: 4.3 KB
Line 
1# XSD4R - Generating class definition code
2# Copyright (C) 2004 NAKAMURA, Hiroshi <[email protected]>.
3
4# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
5# redistribute it and/or modify it under the same terms of Ruby's license;
6# either the dual license version in 2003, or any later version.
7
8
9require 'xsd/codegen/gensupport'
10require 'xsd/codegen/moduledef'
11require 'xsd/codegen/methoddef'
12
13
14module XSD
15module CodeGen
16
17
18class ClassDef < ModuleDef
19 include GenSupport
20
21 def initialize(name, baseclass = nil)
22 super(name)
23 @baseclass = baseclass
24 @classvar = []
25 @attrdef = []
26 end
27
28 def def_classvar(var, value)
29 var = var.sub(/\A@@/, "")
30 unless safevarname?(var)
31 raise ArgumentError.new("#{var} seems to be unsafe")
32 end
33 @classvar << [var, value]
34 end
35
36 def def_attr(attrname, writable = true, varname = nil)
37 unless safevarname?(varname || attrname)
38 raise ArgumentError.new("#{varname || attrname} seems to be unsafe")
39 end
40 @attrdef << [attrname, writable, varname]
41 end
42
43 def dump
44 buf = ""
45 unless @requirepath.empty?
46 buf << dump_requirepath
47 end
48 buf << dump_emptyline unless buf.empty?
49 package = @name.split(/::/)[0..-2]
50 buf << dump_package_def(package) unless package.empty?
51 buf << dump_comment if @comment
52 buf << dump_class_def
53 spacer = false
54 unless @classvar.empty?
55 spacer = true
56 buf << dump_classvar
57 end
58 unless @const.empty?
59 buf << dump_emptyline if spacer
60 spacer = true
61 buf << dump_const
62 end
63 unless @code.empty?
64 buf << dump_emptyline if spacer
65 spacer = true
66 buf << dump_code
67 end
68 unless @attrdef.empty?
69 buf << dump_emptyline if spacer
70 spacer = true
71 buf << dump_attributes
72 end
73 unless @methoddef.empty?
74 buf << dump_emptyline if spacer
75 spacer = true
76 buf << dump_methods
77 end
78 buf << dump_class_def_end
79 buf << dump_package_def_end(package) unless package.empty?
80 buf.gsub(/^\s+$/, '')
81 end
82
83private
84
85 def dump_class_def
86 name = @name.to_s.split(/::/)
87 if @baseclass
88 format("class #{name.last} < #{@baseclass}")
89 else
90 format("class #{name.last}")
91 end
92 end
93
94 def dump_class_def_end
95 str = format("end")
96 end
97
98 def dump_classvar
99 dump_static(
100 @classvar.collect { |var, value|
101 %Q(@@#{var.sub(/^@@/, "")} = #{dump_value(value)})
102 }.join("\n")
103 )
104 end
105
106 def dump_attributes
107 str = ""
108 @attrdef.each do |attrname, writable, varname|
109 varname ||= attrname
110 if attrname == varname
111 str << format(dump_accessor(attrname, writable), 2)
112 end
113 end
114 @attrdef.each do |attrname, writable, varname|
115 varname ||= attrname
116 if attrname != varname
117 str << "\n" unless str.empty?
118 str << format(dump_attribute(attrname, writable, varname), 2)
119 end
120 end
121 str
122 end
123
124 def dump_accessor(attrname, writable)
125 if writable
126 "attr_accessor :#{attrname}"
127 else
128 "attr_reader :#{attrname}"
129 end
130 end
131
132 def dump_attribute(attrname, writable, varname)
133 str = nil
134 mr = MethodDef.new(attrname)
135 mr.definition = "@#{varname}"
136 str = mr.dump
137 if writable
138 mw = MethodDef.new(attrname + "=", 'value')
139 mw.definition = "@#{varname} = value"
140 str << "\n" + mw.dump
141 end
142 str
143 end
144end
145
146
147end
148end
149
150
151if __FILE__ == $0
152 require 'xsd/codegen/classdef'
153 include XSD::CodeGen
154 c = ClassDef.new("Foo::Bar::HobbitName", String)
155 c.def_require("foo/bar")
156 c.comment = <<-EOD
157 foo
158 bar
159 baz
160 EOD
161 c.def_const("FOO", 1)
162 c.def_classvar("@@foo", "var".dump)
163 c.def_classvar("baz", "1".dump)
164 c.def_attr("Foo", true, "foo")
165 c.def_attr("bar")
166 c.def_attr("baz", true)
167 c.def_attr("Foo2", true, "foo2")
168 c.def_attr("foo3", false, "foo3")
169 c.def_method("foo") do
170 <<-EOD
171 foo.bar = 1
172\tbaz.each do |ele|
173\t ele
174 end
175 EOD
176 end
177 c.def_method("baz", "qux") do
178 <<-EOD
179 [1, 2, 3].each do |i|
180 p i
181 end
182 EOD
183 end
184
185 m = MethodDef.new("qux", "quxx", "quxxx") do
186 <<-EOD
187 p quxx + quxxx
188 EOD
189 end
190 m.comment = "hello world\n123"
191 c.add_method(m)
192 c.def_code <<-EOD
193 Foo.new
194 Bar.z
195 EOD
196 c.def_code <<-EOD
197 Foo.new
198 Bar.z
199 EOD
200 c.def_privatemethod("foo", "baz", "*arg", "&block")
201
202 puts c.dump
203end
Note: See TracBrowser for help on using the repository browser.