~ubuntu-branches/ubuntu/trusty/ruby1.9/trusty

« back to all changes in this revision

Viewing changes to lib/xsd/codegen/classdef.rb

  • Committer: Bazaar Package Importer
  • Author(s): Stephan Hermann
  • Date: 2008-01-24 11:42:29 UTC
  • mfrom: (1.1.9 upstream)
  • Revision ID: james.westby@ubuntu.com-20080124114229-jw2f87rdxlq6gp11
Tags: 1.9.0.0-2ubuntu1
* Merge from debian unstable, remaining changes:
  - Robustify check for target_os, fixing build failure on lpia.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# XSD4R - Generating class definition code
2
 
# Copyright (C) 2004  NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
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
 
 
9
 
require 'xsd/codegen/gensupport'
10
 
require 'xsd/codegen/moduledef'
11
 
require 'xsd/codegen/methoddef'
12
 
 
13
 
 
14
 
module XSD
15
 
module CodeGen
16
 
 
17
 
 
18
 
class 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
 
 
83
 
private
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
144
 
end
145
 
 
146
 
 
147
 
end
148
 
end
149
 
 
150
 
 
151
 
if __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
203
 
end