1
# XSD4R - Generating class definition code
2
# Copyright (C) 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
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.
9
require 'xsd/codegen/gensupport'
10
require 'xsd/codegen/moduledef'
11
require 'xsd/codegen/methoddef'
18
class ClassDef < ModuleDef
21
def initialize(name, baseclass = nil)
23
@baseclass = baseclass
28
def def_classvar(var, value)
29
var = var.sub(/\A@@/, "")
30
unless safevarname?(var)
31
raise ArgumentError.new("#{var} seems to be unsafe")
33
@classvar << [var, value]
36
def def_attr(attrname, writable = true, varname = nil)
37
unless safevarname?(varname || attrname)
38
raise ArgumentError.new("#{varname || attrname} seems to be unsafe")
40
@attrdef << [attrname, writable, varname]
45
unless @requirepath.empty?
46
buf << dump_requirepath
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
54
unless @classvar.empty?
59
buf << dump_emptyline if spacer
64
buf << dump_emptyline if spacer
68
unless @attrdef.empty?
69
buf << dump_emptyline if spacer
71
buf << dump_attributes
73
unless @methoddef.empty?
74
buf << dump_emptyline if spacer
78
buf << dump_class_def_end
79
buf << dump_package_def_end(package) unless package.empty?
86
name = @name.to_s.split(/::/)
88
format("class #{name.last} < #{@baseclass}")
90
format("class #{name.last}")
94
def dump_class_def_end
100
@classvar.collect { |var, value|
101
%Q(@@#{var.sub(/^@@/, "")} = #{dump_value(value)})
108
@attrdef.each do |attrname, writable, varname|
110
if attrname == varname
111
str << format(dump_accessor(attrname, writable), 2)
114
@attrdef.each do |attrname, writable, varname|
116
if attrname != varname
117
str << "\n" unless str.empty?
118
str << format(dump_attribute(attrname, writable, varname), 2)
124
def dump_accessor(attrname, writable)
126
"attr_accessor :#{attrname}"
128
"attr_reader :#{attrname}"
132
def dump_attribute(attrname, writable, varname)
134
mr = MethodDef.new(attrname)
135
mr.definition = "@#{varname}"
138
mw = MethodDef.new(attrname + "=", 'value')
139
mw.definition = "@#{varname} = value"
140
str << "\n" + mw.dump
152
require 'xsd/codegen/classdef'
154
c = ClassDef.new("Foo::Bar::HobbitName", String)
155
c.def_require("foo/bar")
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")
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
177
c.def_method("baz", "qux") do
179
[1, 2, 3].each do |i|
185
m = MethodDef.new("qux", "quxx", "quxxx") do
190
m.comment = "hello world\n123"
200
c.def_privatemethod("foo", "baz", "*arg", "&block")