bitescript 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,9 @@
1
+ === 0.0.2 / 2009-05-14
2
+
3
+ * Improve use support for packages, make it more API-friendly
4
+ * Disable instance_eval when a block argument is requested
5
+ * Allow defining non-public classes
6
+
1
7
  === 0.0.1 / 2009-03-28
2
8
 
3
9
  * 1 major enhancement
data/Rakefile CHANGED
@@ -15,8 +15,3 @@ Hoe.new('bitescript', BiteScript::VERSION) do |p|
15
15
  end
16
16
 
17
17
  task :default => :test
18
-
19
- Rake::TestTask.new do |t|
20
- t.libs << "lib"
21
- t.test_files = FileList["test/**/*.rb"]
22
- end
@@ -91,19 +91,41 @@ module BiteScript
91
91
  end
92
92
  fb
93
93
  end
94
-
95
- def public_class(class_name, superclass = java.lang.Object, *interfaces, &block)
96
- class_name = @package.empty? ? class_name : "#{@package.join('/')}/#{class_name}"
97
- class_builder = ClassBuilder.new(self, class_name, @file_name, superclass, *interfaces)
98
- @class_builders[class_name] ||= class_builder
94
+
95
+ def define_class(class_name, opts, &block)
96
+ pkg = opts[:package] || @package.dup || []
97
+
98
+ class_name = pkg.empty? ? class_name : "#{pkg.join('/')}/#{class_name}"
99
+ class_builder = ClassBuilder.new(self, class_name, @file_name, opts)
100
+ @class_builders[class_name] ||= class_builder # TODO Is this really what we want?
99
101
 
100
102
  if block_given?
101
- class_builder.instance_eval(&block)
103
+ if block.arity == 1
104
+ block.call(class_builder)
105
+ else
106
+ class_builder.instance_eval(&block)
107
+ end
102
108
  else
103
109
  return class_builder
104
110
  end
105
111
  end
106
112
 
113
+ def public_class(class_name, superclass = java.lang.Object, *interfaces, &block)
114
+ define_class(class_name, :visibility => :public, :superclass => superclass, :interfaces => interfaces, &block)
115
+ end
116
+
117
+ def protected_class(class_name, superclass = java.lang.Object, *interfaces, &block)
118
+ define_class(class_name, :visibility => :protected, :superclass => superclass, :interfaces => interfaces, &block)
119
+ end
120
+
121
+ def private_class(class_name, superclass = java.lang.Object, *interfaces, &block)
122
+ define_class(class_name, :visibility => :private, :superclass => superclass, :interfaces => interfaces, &block)
123
+ end
124
+
125
+ def default_class(class_name, superclass = java.lang.Object, *interfaces, &block)
126
+ define_class(class_name, :visibility => :default, :superclass => superclass, :interfaces => interfaces, &block)
127
+ end
128
+
107
129
  def generate
108
130
  @class_builders.each do |class_name, class_builder|
109
131
  class_file = "#{class_name.gsub('.', '/')}.class"
@@ -117,15 +139,26 @@ module BiteScript
117
139
  end
118
140
 
119
141
  def package(*names)
120
- elements = 0
142
+ return @package unless names.size > 0
143
+
144
+ packages = unpack_packages(*names)
145
+ @package.concat(packages)
146
+ yield
147
+ @package = @package[0..(packages.size - 1)]
148
+ end
149
+
150
+ def package=(name)
151
+ @package = unpack_packages(name)
152
+ end
153
+
154
+ def unpack_packages(*names)
155
+ package = []
121
156
  names.each do |name_maybe_dotted|
122
157
  name_maybe_dotted.split(/\./).each do |name|
123
- elements += 1
124
- @package.push name
158
+ package.push name
125
159
  end
126
160
  end
127
- yield
128
- elements.times {@package.pop}
161
+ package
129
162
  end
130
163
 
131
164
  def method?
@@ -156,16 +189,32 @@ module BiteScript
156
189
  attr_accessor :imports
157
190
  attr_accessor :fields
158
191
 
159
- def initialize(file_builder, class_name, file_name, superclass = Object, *interfaces)
192
+ def initialize(file_builder, class_name, file_name, opts)
160
193
  @parent = file_builder
161
194
  @class_name = class_name
162
- @superclass = superclass
195
+ @superclass = opts[:superclass] || Object
163
196
 
164
197
  @class_writer = ClassWriter.new(ClassWriter::COMPUTE_MAXS)
165
198
 
166
199
  interface_paths = []
167
- interfaces.each {|interface| interface_paths << path(interface)}
168
- @class_writer.visit(BiteScript.bytecode_version, Opcodes::ACC_PUBLIC | Opcodes::ACC_SUPER, class_name, nil, path(superclass), interface_paths.to_java(:string))
200
+ (opts[:interfaces] || []).each {|interface| interface_paths << path(interface)}
201
+
202
+ visibility = case (opts[:visibility] && opts[:visibility].to_sym)
203
+ when nil
204
+ Opcodes::ACC_PUBLIC # NOTE Not specified means public -- must explicitly ask for default
205
+ when :default
206
+ 0
207
+ when :public
208
+ Opcodes::ACC_PUBLIC
209
+ when :private
210
+ Opcodes::ACC_PRIVATE
211
+ when :protected
212
+ Opcodes::ACC_PROTECTED
213
+ else
214
+ raise "Unknown visibility: #{opts[:visibility]}"
215
+ end
216
+
217
+ @class_writer.visit(BiteScript.bytecode_version, visibility | Opcodes::ACC_SUPER, class_name, nil, path(superclass), interface_paths.to_java(:string))
169
218
  @class_writer.visit_source(file_name, nil)
170
219
 
171
220
  @constructor = nil
@@ -254,7 +303,11 @@ module BiteScript
254
303
 
255
304
  if block_given?
256
305
  mb.start
257
- mb.instance_eval(&block)
306
+ if block.arity == 1
307
+ block.call(mb)
308
+ else
309
+ mb.instance_eval(&block)
310
+ end
258
311
  mb.stop
259
312
  end
260
313
 
@@ -360,7 +413,11 @@ module BiteScript
360
413
  def self.build(class_builder, modifiers, name, signature, &block)
361
414
  mb = MethodBuilder.new(class_builder, modifiers, name, signature)
362
415
  mb.start
363
- mb.instance_eval(&block)
416
+ if block.arity == 1
417
+ block.call(mb)
418
+ else
419
+ mb.instance_eval(&block)
420
+ end
364
421
  mb.stop
365
422
  end
366
423
 
data/lib/bitescript.rb CHANGED
@@ -5,7 +5,7 @@ require 'bitescript/bytecode'
5
5
  require 'bitescript/builder'
6
6
 
7
7
  module BiteScript
8
- VERSION = '0.0.1'
8
+ VERSION = '0.0.2'
9
9
 
10
10
  include BiteScript::ASM
11
11
  JAVA1_4 = Opcodes::V1_4
data/test/test_builder.rb CHANGED
@@ -29,7 +29,6 @@ class TestBuilder < Test::Unit::TestCase
29
29
 
30
30
  def load_and_construct(name, class_builder)
31
31
  class_bytes = class_builder.generate
32
- File.open(name + ".class", 'w') {|f| f.write(class_bytes)}
33
32
  cls = JRuby.runtime.jruby_class_loader.define_class(name, class_bytes.to_java_bytes)
34
33
 
35
34
  cls.new_instance
@@ -426,4 +425,35 @@ class TestBuilder < Test::Unit::TestCase
426
425
  anno = method.annotation(JRubyMethod.java_class)
427
426
  assert anno
428
427
  end
428
+
429
+ def test_package_equals
430
+ @builder.package = "org.jruby"
431
+ cb = @builder.public_class(@class_name, @builder.object);
432
+ dummy_constructor(cb)
433
+ obj = load_and_construct("org.jruby.#{@class_name}", cb);
434
+
435
+ assert_equal "org.jruby.#{@class_name}", obj.class.java_class.to_s
436
+ end
437
+
438
+ def test_package_builder_list
439
+ obj = nil
440
+ @builder.package "org", "jruby" do
441
+ cb = @builder.public_class(@class_name, @builder.object);
442
+ dummy_constructor(cb)
443
+ obj = load_and_construct("org.jruby.#{@class_name}", cb);
444
+ end
445
+
446
+ assert_equal "org.jruby.#{@class_name}", obj.class.java_class.to_s
447
+ end
448
+
449
+ def test_package_builder_string
450
+ obj = nil
451
+ @builder.package "org.jruby" do
452
+ cb = @builder.public_class(@class_name, @builder.object);
453
+ dummy_constructor(cb)
454
+ obj = load_and_construct("org.jruby.#{@class_name}", cb);
455
+ end
456
+
457
+ assert_equal "org.jruby.#{@class_name}", obj.class.java_class.to_s
458
+ end
429
459
  end
@@ -4,55 +4,62 @@ require 'test/unit'
4
4
  require 'bitescript'
5
5
 
6
6
  class TestJavaClass < Test::Unit::TestCase
7
- def test_constructor
8
- cls = java.lang.String.java_class
7
+ ['public', 'protected', 'private', 'default'].each do |visibility|
9
8
 
10
- cons1 = cls.constructor()
11
- cons2 = cls.constructor(java.lang.String.java_class)
9
+ line = __LINE__; eval "
10
+ def test_constructor_on_#{visibility}_class
11
+ cls = java.lang.String.java_class
12
12
 
13
- assert_not_nil cons1
14
- assert_not_nil cons2
15
- assert_equal [], cons1.parameter_types
16
- assert_equal [java.lang.String.java_class], cons2.parameter_types
13
+ cons1 = cls.constructor()
14
+ cons2 = cls.constructor(java.lang.String.java_class)
17
15
 
18
- cls = BiteScript::FileBuilder.new('x').public_class('y')
19
- cls.public_constructor()
20
- cls.public_constructor(java.lang.String.java_class)
16
+ assert_not_nil cons1
17
+ assert_not_nil cons2
18
+ assert_equal [], cons1.parameter_types
19
+ assert_equal [java.lang.String.java_class], cons2.parameter_types
21
20
 
22
- cons1 = cls.constructor()
23
- cons2 = cls.constructor(java.lang.String.java_class)
21
+ cls = BiteScript::FileBuilder.new('x').#{visibility}_class('y')
22
+ cls.public_constructor()
23
+ cls.public_constructor(java.lang.String.java_class)
24
24
 
25
- assert_not_nil cons1
26
- assert_not_nil cons2
27
- assert_equal [], cons1.parameter_types
28
- assert_equal [java.lang.String.java_class], cons2.parameter_types
29
- end
25
+ cons1 = cls.constructor()
26
+ cons2 = cls.constructor(java.lang.String.java_class)
27
+
28
+ assert_not_nil cons1
29
+ assert_not_nil cons2
30
+ assert_equal [], cons1.parameter_types
31
+ assert_equal [java.lang.String.java_class], cons2.parameter_types
32
+ end
33
+ ", binding, __FILE__, line
34
+
35
+ line = __LINE__; eval "
36
+ def test_java_method_on_#{visibility}_class
37
+ cls = java.lang.String.java_class
38
+
39
+ m1 = cls.java_method('toString')
40
+ m2 = cls.java_method('equals', java.lang.Object.java_class)
41
+
42
+ assert_not_nil m1
43
+ assert_not_nil m2
44
+ assert_equal java.lang.String.java_class, m1.return_type
45
+ assert_equal Java::boolean.java_class, m2.return_type
46
+ assert_equal [], m1.parameter_types
47
+ assert_equal [java.lang.Object.java_class], m2.parameter_types
48
+
49
+ cls = BiteScript::FileBuilder.new('x').#{visibility}_class('y')
50
+ cls.public_method('toString', java.lang.String.java_class)
51
+ cls.public_method('equals', Java::boolean.java_class, java.lang.Object.java_class)
30
52
 
31
- def test_java_method
32
- cls = java.lang.String.java_class
33
-
34
- m1 = cls.java_method("toString")
35
- m2 = cls.java_method("equals", java.lang.Object.java_class)
36
-
37
- assert_not_nil m1
38
- assert_not_nil m2
39
- assert_equal java.lang.String.java_class, m1.return_type
40
- assert_equal Java::boolean.java_class, m2.return_type
41
- assert_equal [], m1.parameter_types
42
- assert_equal [java.lang.Object.java_class], m2.parameter_types
43
-
44
- cls = BiteScript::FileBuilder.new('x').public_class('y')
45
- cls.public_method('toString', java.lang.String.java_class)
46
- cls.public_method('equals', Java::boolean.java_class, java.lang.Object.java_class)
47
-
48
- m1 = cls.java_method('toString')
49
- m2 = cls.java_method('equals', java.lang.Object.java_class)
50
-
51
- assert_not_nil m1
52
- assert_not_nil m2
53
- assert_equal java.lang.String.java_class, m1.return_type
54
- assert_equal Java::boolean.java_class, m2.return_type
55
- assert_equal [], m1.parameter_types
56
- assert_equal [java.lang.Object.java_class], m2.parameter_types
53
+ m1 = cls.java_method('toString')
54
+ m2 = cls.java_method('equals', java.lang.Object.java_class)
55
+
56
+ assert_not_nil m1
57
+ assert_not_nil m2
58
+ assert_equal java.lang.String.java_class, m1.return_type
59
+ assert_equal Java::boolean.java_class, m2.return_type
60
+ assert_equal [], m1.parameter_types
61
+ assert_equal [java.lang.Object.java_class], m2.parameter_types
62
+ end
63
+ ", binding, __FILE__, line
57
64
  end
58
65
  end
metadata CHANGED
@@ -22,13 +22,15 @@ name: bitescript
22
22
  rdoc_options:
23
23
  - --main
24
24
  - README.txt
25
- autorequire:
26
25
  rubyforge_project: jruby-extras
26
+ autorequire:
27
+ licenses: []
28
+
27
29
  executables:
28
30
  - bite
29
31
  - bitec
30
32
  description: BiteScript is a Ruby DSL for generating Java bytecode and classes.
31
- specification_version: 2
33
+ specification_version: 3
32
34
  default_executable:
33
35
  files:
34
36
  - History.txt
@@ -59,12 +61,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
59
61
  version:
60
62
  extensions: []
61
63
 
62
- rubygems_version: 1.3.1
64
+ rubygems_version: 1.3.3
63
65
  requirements: []
64
66
 
65
67
  authors:
66
68
  - charles.nutter@sun.comCharles Oliver Nutter
67
- date: 2009-03-28 05:00:00 +00:00
69
+ date: 2009-05-14 05:00:00 +00:00
68
70
  platform: ruby
69
71
  test_files:
70
72
  - test/test_bitescript.rb
@@ -73,7 +75,7 @@ test_files:
73
75
  - test/test_java_class.rb
74
76
  - test/test_signature.rb
75
77
  version: !ruby/object:Gem::Version
76
- version: 0.0.1
78
+ version: 0.0.2
77
79
  require_paths:
78
80
  - lib
79
81
  dependencies:
@@ -82,7 +84,7 @@ dependencies:
82
84
  requirements:
83
85
  - - '>='
84
86
  - !ruby/object:Gem::Version
85
- version: 1.11.0
87
+ version: 1.12.1
86
88
  version:
87
89
  type: :development
88
90
  version_requirement: