summaryrefslogtreecommitdiff
path: root/spec/ruby/language/fixtures
diff options
context:
space:
mode:
Diffstat (limited to 'spec/ruby/language/fixtures')
-rw-r--r--spec/ruby/language/fixtures/argv_encoding.rb1
-rw-r--r--spec/ruby/language/fixtures/array.rb32
-rw-r--r--spec/ruby/language/fixtures/begin_file.rb3
-rw-r--r--spec/ruby/language/fixtures/binary_symbol.rb4
-rw-r--r--spec/ruby/language/fixtures/block.rb61
-rw-r--r--spec/ruby/language/fixtures/break.rb291
-rw-r--r--spec/ruby/language/fixtures/break_lambda_toplevel.rb9
-rw-r--r--spec/ruby/language/fixtures/break_lambda_toplevel_block.rb23
-rw-r--r--spec/ruby/language/fixtures/break_lambda_toplevel_method.rb17
-rw-r--r--spec/ruby/language/fixtures/bytes_magic_comment.rb2
-rw-r--r--spec/ruby/language/fixtures/case_magic_comment.rb2
-rw-r--r--spec/ruby/language/fixtures/class_with_class_variable.rb9
-rw-r--r--spec/ruby/language/fixtures/classes.rb31
-rw-r--r--spec/ruby/language/fixtures/coding_us_ascii.rb11
-rw-r--r--spec/ruby/language/fixtures/coding_utf_8.rb11
-rw-r--r--spec/ruby/language/fixtures/constant_visibility.rb114
-rw-r--r--spec/ruby/language/fixtures/constants_sclass.rb54
-rw-r--r--spec/ruby/language/fixtures/def.rb14
-rw-r--r--spec/ruby/language/fixtures/defined.rb312
-rw-r--r--spec/ruby/language/fixtures/delegation.rb11
-rw-r--r--spec/ruby/language/fixtures/dollar_zero.rb6
-rw-r--r--spec/ruby/language/fixtures/emacs_magic_comment.rb2
-rw-r--r--spec/ruby/language/fixtures/ensure.rb121
-rw-r--r--spec/ruby/language/fixtures/file.rb1
-rw-r--r--spec/ruby/language/fixtures/for_scope.rb15
-rw-r--r--spec/ruby/language/fixtures/freeze_magic_comment_across_files.rb5
-rw-r--r--spec/ruby/language/fixtures/freeze_magic_comment_across_files_diff_enc.rb5
-rw-r--r--spec/ruby/language/fixtures/freeze_magic_comment_across_files_no_comment.rb5
-rw-r--r--spec/ruby/language/fixtures/freeze_magic_comment_one_literal.rb4
-rw-r--r--spec/ruby/language/fixtures/freeze_magic_comment_required.rb3
-rw-r--r--spec/ruby/language/fixtures/freeze_magic_comment_required_diff_enc.rb4
-rw-r--r--spec/ruby/language/fixtures/freeze_magic_comment_required_no_comment.rb1
-rw-r--r--spec/ruby/language/fixtures/freeze_magic_comment_two_literals.rb3
-rw-r--r--spec/ruby/language/fixtures/hash_strings_binary.rb7
-rw-r--r--spec/ruby/language/fixtures/hash_strings_usascii.rb7
-rw-r--r--spec/ruby/language/fixtures/hash_strings_utf8.rb7
-rw-r--r--spec/ruby/language/fixtures/magic_comment.rb2
-rw-r--r--spec/ruby/language/fixtures/match_operators.rb9
-rw-r--r--spec/ruby/language/fixtures/metaclass.rb33
-rw-r--r--spec/ruby/language/fixtures/module.rb15
-rw-r--r--spec/ruby/language/fixtures/next.rb134
-rw-r--r--spec/ruby/language/fixtures/no_magic_comment.rb1
-rw-r--r--spec/ruby/language/fixtures/precedence.rb16
-rw-r--r--spec/ruby/language/fixtures/print_magic_comment_result_at_exit.rb3
-rw-r--r--spec/ruby/language/fixtures/private.rb59
-rw-r--r--spec/ruby/language/fixtures/rescue.rb67
-rw-r--r--spec/ruby/language/fixtures/rescue/top_level.rb7
-rw-r--r--spec/ruby/language/fixtures/rescue_captures.rb107
-rw-r--r--spec/ruby/language/fixtures/return.rb135
-rw-r--r--spec/ruby/language/fixtures/second_line_magic_comment.rb3
-rw-r--r--spec/ruby/language/fixtures/second_token_magic_comment.rb2
-rw-r--r--spec/ruby/language/fixtures/send.rb151
-rwxr-xr-xspec/ruby/language/fixtures/shebang_magic_comment.rb3
-rw-r--r--spec/ruby/language/fixtures/squiggly_heredoc.rb71
-rw-r--r--spec/ruby/language/fixtures/super.rb804
-rw-r--r--spec/ruby/language/fixtures/utf16-be-nobom.rbbin0 -> 68 bytes
-rw-r--r--spec/ruby/language/fixtures/utf16-le-nobom.rbbin0 -> 69 bytes
-rw-r--r--spec/ruby/language/fixtures/utf8-bom.rb2
-rw-r--r--spec/ruby/language/fixtures/utf8-nobom.rb2
-rw-r--r--spec/ruby/language/fixtures/variables.rb157
-rw-r--r--spec/ruby/language/fixtures/vim_magic_comment.rb2
-rw-r--r--spec/ruby/language/fixtures/yield.rb41
62 files changed, 3034 insertions, 0 deletions
diff --git a/spec/ruby/language/fixtures/argv_encoding.rb b/spec/ruby/language/fixtures/argv_encoding.rb
new file mode 100644
index 0000000000..8192b2d9a0
--- /dev/null
+++ b/spec/ruby/language/fixtures/argv_encoding.rb
@@ -0,0 +1 @@
+p ARGV.map { |a| a.encoding.name }
diff --git a/spec/ruby/language/fixtures/array.rb b/spec/ruby/language/fixtures/array.rb
new file mode 100644
index 0000000000..c1036575ff
--- /dev/null
+++ b/spec/ruby/language/fixtures/array.rb
@@ -0,0 +1,32 @@
+module ArraySpec
+ class Splat
+ def unpack_3args(a, b, c)
+ [a, b, c]
+ end
+
+ def unpack_4args(a, b, c, d)
+ [a, b, c, d]
+ end
+ end
+
+ class SideEffect
+ def initialize()
+ @call_count = 0
+ end
+
+ attr_reader :call_count
+
+ def array_result(a_number)
+ [result(a_number), result(a_number)]
+ end
+
+ def result(a_number)
+ @call_count += 1
+ if a_number
+ 1
+ else
+ :thing
+ end
+ end
+ end
+end
diff --git a/spec/ruby/language/fixtures/begin_file.rb b/spec/ruby/language/fixtures/begin_file.rb
new file mode 100644
index 0000000000..73cae61a08
--- /dev/null
+++ b/spec/ruby/language/fixtures/begin_file.rb
@@ -0,0 +1,3 @@
+BEGIN {
+ puts __FILE__
+}
diff --git a/spec/ruby/language/fixtures/binary_symbol.rb b/spec/ruby/language/fixtures/binary_symbol.rb
new file mode 100644
index 0000000000..2ddf565820
--- /dev/null
+++ b/spec/ruby/language/fixtures/binary_symbol.rb
@@ -0,0 +1,4 @@
+# encoding: binary
+
+p :il_était.to_s.bytes
+puts :il_était.encoding.name
diff --git a/spec/ruby/language/fixtures/block.rb b/spec/ruby/language/fixtures/block.rb
new file mode 100644
index 0000000000..33baac6aeb
--- /dev/null
+++ b/spec/ruby/language/fixtures/block.rb
@@ -0,0 +1,61 @@
+module BlockSpecs
+ class Yielder
+ def z
+ yield
+ end
+
+ def m(*a)
+ yield(*a)
+ end
+
+ def s(a)
+ yield(a)
+ end
+
+ def r(a)
+ yield(*a)
+ end
+
+ def k(*a)
+ yield(*a, b: true)
+ end
+ end
+
+ # TODO: rewrite all specs that use Yield to use Yielder
+
+ class Yield
+ def splat(*args)
+ yield(*args)
+ end
+
+ def two_args
+ yield 1, 2
+ end
+
+ def two_arg_array
+ yield [1, 2]
+ end
+
+ def yield_splat_inside_block
+ [1, 2].send(:each_with_index) {|*args| yield(*args)}
+ end
+
+ def yield_this(obj)
+ yield obj
+ end
+ end
+
+ class OverwriteBlockVariable
+ def initialize
+ @y = Yielder.new
+ end
+
+ def method_missing(method, *args, &block)
+ self.class.send :define_method, method do |*a, &b|
+ @y.send method, *a, &b
+ end
+
+ send method, *args, &block
+ end
+ end
+end
diff --git a/spec/ruby/language/fixtures/break.rb b/spec/ruby/language/fixtures/break.rb
new file mode 100644
index 0000000000..217c20a2c0
--- /dev/null
+++ b/spec/ruby/language/fixtures/break.rb
@@ -0,0 +1,291 @@
+module BreakSpecs
+ class Driver
+ def initialize(ensures=false)
+ @ensures = ensures
+ end
+
+ def note(value)
+ ScratchPad << value
+ end
+ end
+
+ class Block < Driver
+ def break_nil
+ note :a
+ note yielding {
+ note :b
+ break
+ note :c
+ }
+ note :d
+ end
+
+ def break_value
+ note :a
+ note yielding {
+ note :b
+ break :break
+ note :c
+ }
+ note :d
+ end
+
+ def yielding
+ note :aa
+ note yield
+ note :bb
+ end
+
+ def create_block
+ note :za
+ b = capture_block do
+ note :zb
+ break :break
+ note :zc
+ end
+ note :zd
+ b
+ end
+
+ def capture_block(&b)
+ note :xa
+ b
+ end
+
+ def break_in_method_captured
+ note :a
+ create_block.call
+ note :b
+ end
+
+ def break_in_yield_captured
+ note :a
+ yielding(&create_block)
+ note :b
+ end
+
+ def break_in_method
+ note :a
+ b = capture_block {
+ note :b
+ break :break
+ note :c
+ }
+ note :d
+ note b.call
+ note :e
+ end
+
+ def call_method(b)
+ note :aa
+ note b.call
+ note :bb
+ end
+
+ def break_in_nested_method
+ note :a
+ b = capture_block {
+ note :b
+ break :break
+ note :c
+ }
+ note :cc
+ note call_method(b)
+ note :d
+ end
+
+ def break_in_yielding_method
+ note :a
+ b = capture_block {
+ note :b
+ break :break
+ note :c
+ }
+ note :cc
+ note yielding(&b)
+ note :d
+ end
+
+ def looped_break_in_captured_block
+ note :begin
+ looped_delegate_block do |i|
+ note :prebreak
+ break if i == 1
+ note :postbreak
+ end
+ note :end
+ end
+
+ def looped_delegate_block(&block)
+ note :preloop
+ 2.times do |i|
+ note :predele
+ yield_value(i, &block)
+ note :postdele
+ end
+ note :postloop
+ end
+ private :looped_delegate_block
+
+ def yield_value(value)
+ note :preyield
+ yield value
+ note :postyield
+ end
+ private :yield_value
+
+ def method(v)
+ yield v
+ end
+
+ def invoke_yield_in_while
+ looping = true
+ while looping
+ note :aa
+ yield
+ note :bb
+ looping = false
+ end
+ note :should_not_reach_here
+ end
+
+ def break_in_block_in_while
+ invoke_yield_in_while do
+ note :break
+ break :value
+ note :c
+ end
+ end
+ end
+
+ class Lambda < Driver
+ # Cases for the invocation of the scope defining the lambda still active
+ # on the call stack when the lambda is invoked.
+ def break_in_defining_scope(value=true)
+ note :a
+ note -> {
+ note :b
+ if value
+ break :break
+ else
+ break
+ end
+ note :c
+ }.call
+ note :d
+ end
+
+ def break_in_nested_scope
+ note :a
+ l = -> do
+ note :b
+ break :break
+ note :c
+ end
+ note :d
+
+ invoke_lambda l
+
+ note :e
+ end
+
+ def invoke_lambda(l)
+ note :aa
+ note l.call
+ note :bb
+ end
+
+ def break_in_nested_scope_yield
+ note :a
+ l = -> do
+ note :b
+ break :break
+ note :c
+ end
+ note :d
+
+ invoke_yield(&l)
+
+ note :e
+ end
+
+ def note_invoke_yield
+ note :aa
+ note yield
+ note :bb
+ end
+
+ def break_in_nested_scope_block
+ note :a
+ l = -> do
+ note :b
+ break :break
+ note :c
+ end
+ note :d
+
+ invoke_lambda_block l
+
+ note :e
+ end
+
+ def invoke_yield
+ note :aaa
+ yield
+ note :bbb
+ end
+
+ def invoke_lambda_block(b)
+ note :aa
+ invoke_yield do
+ note :bb
+
+ note b.call
+
+ note :cc
+ end
+ note :dd
+ end
+
+ # Cases for the invocation of the scope defining the lambda NOT still
+ # active on the call stack when the lambda is invoked.
+ def create_lambda
+ note :la
+ l = -> do
+ note :lb
+ break :break
+ note :lc
+ end
+ note :ld
+ l
+ end
+
+ def break_in_method
+ note :a
+
+ note create_lambda.call
+
+ note :b
+ end
+
+ def break_in_block_in_method
+ note :a
+ invoke_yield do
+ note :b
+
+ note create_lambda.call
+
+ note :c
+ end
+ note :d
+ end
+
+ def break_in_method_yield
+ note :a
+
+ invoke_yield(&create_lambda)
+
+ note :b
+ end
+ end
+end
diff --git a/spec/ruby/language/fixtures/break_lambda_toplevel.rb b/spec/ruby/language/fixtures/break_lambda_toplevel.rb
new file mode 100644
index 0000000000..da5abbaf00
--- /dev/null
+++ b/spec/ruby/language/fixtures/break_lambda_toplevel.rb
@@ -0,0 +1,9 @@
+print "a,"
+
+print -> {
+ print "b,"
+ break "break,"
+ print "c,"
+}.call
+
+puts "d"
diff --git a/spec/ruby/language/fixtures/break_lambda_toplevel_block.rb b/spec/ruby/language/fixtures/break_lambda_toplevel_block.rb
new file mode 100644
index 0000000000..3dcee62424
--- /dev/null
+++ b/spec/ruby/language/fixtures/break_lambda_toplevel_block.rb
@@ -0,0 +1,23 @@
+print "a,"
+
+l = -> {
+ print "b,"
+ break "break,"
+ print "c,"
+}
+
+def a(l)
+ print "d,"
+ b { l.call }
+ print "e,"
+end
+
+def b
+ print "f,"
+ print yield
+ print "g,"
+end
+
+a(l)
+
+puts "h"
diff --git a/spec/ruby/language/fixtures/break_lambda_toplevel_method.rb b/spec/ruby/language/fixtures/break_lambda_toplevel_method.rb
new file mode 100644
index 0000000000..a5936a3d70
--- /dev/null
+++ b/spec/ruby/language/fixtures/break_lambda_toplevel_method.rb
@@ -0,0 +1,17 @@
+print "a,"
+
+l = -> {
+ print "b,"
+ break "break,"
+ print "c,"
+}
+
+def a(l)
+ print "d,"
+ print l.call
+ print "e,"
+end
+
+a(l)
+
+puts "f"
diff --git a/spec/ruby/language/fixtures/bytes_magic_comment.rb b/spec/ruby/language/fixtures/bytes_magic_comment.rb
new file mode 100644
index 0000000000..2bc2bcfb07
--- /dev/null
+++ b/spec/ruby/language/fixtures/bytes_magic_comment.rb
@@ -0,0 +1,2 @@
+# encoding: big5
+$magic_comment_result = '§A¦n'.bytes.inspect
diff --git a/spec/ruby/language/fixtures/case_magic_comment.rb b/spec/ruby/language/fixtures/case_magic_comment.rb
new file mode 100644
index 0000000000..96f35a7c94
--- /dev/null
+++ b/spec/ruby/language/fixtures/case_magic_comment.rb
@@ -0,0 +1,2 @@
+# CoDiNg: bIg5
+$magic_comment_result = __ENCODING__.name
diff --git a/spec/ruby/language/fixtures/class_with_class_variable.rb b/spec/ruby/language/fixtures/class_with_class_variable.rb
new file mode 100644
index 0000000000..0b07f16d30
--- /dev/null
+++ b/spec/ruby/language/fixtures/class_with_class_variable.rb
@@ -0,0 +1,9 @@
+module StringSpecs
+ class ClassWithClassVariable
+ @@a = "xxx"
+
+ def foo
+ "#@@a"
+ end
+ end
+end
diff --git a/spec/ruby/language/fixtures/classes.rb b/spec/ruby/language/fixtures/classes.rb
new file mode 100644
index 0000000000..eb239e1e29
--- /dev/null
+++ b/spec/ruby/language/fixtures/classes.rb
@@ -0,0 +1,31 @@
+module LanguageSpecs
+ # Regexp support
+
+ def self.paired_delimiters
+ [%w[( )], %w[{ }], %w[< >], ["[", "]"]]
+ end
+
+ def self.non_paired_delimiters
+ %w[~ ! # $ % ^ & * _ + ` - = " ' , . ? / | \\]
+ end
+
+ def self.blanks
+ " \t"
+ end
+
+ def self.white_spaces
+ return blanks + "\f\n\r\v"
+ end
+
+ def self.non_alphanum_non_space
+ '~!@#$%^&*()+-\|{}[]:";\'<>?,./'
+ end
+
+ def self.punctuations
+ ",.?" # TODO - Need to fill in the full list
+ end
+
+ def self.get_regexp_with_substitution o
+ /#{o}/o
+ end
+end
diff --git a/spec/ruby/language/fixtures/coding_us_ascii.rb b/spec/ruby/language/fixtures/coding_us_ascii.rb
new file mode 100644
index 0000000000..7df66109d7
--- /dev/null
+++ b/spec/ruby/language/fixtures/coding_us_ascii.rb
@@ -0,0 +1,11 @@
+# encoding: us-ascii
+
+module CodingUS_ASCII
+ def self.encoding
+ __ENCODING__
+ end
+
+ def self.string_literal
+ "string literal"
+ end
+end
diff --git a/spec/ruby/language/fixtures/coding_utf_8.rb b/spec/ruby/language/fixtures/coding_utf_8.rb
new file mode 100644
index 0000000000..3d8e1d9a34
--- /dev/null
+++ b/spec/ruby/language/fixtures/coding_utf_8.rb
@@ -0,0 +1,11 @@
+# encoding: utf-8
+
+module CodingUTF_8
+ def self.encoding
+ __ENCODING__
+ end
+
+ def self.string_literal
+ "string literal"
+ end
+end
diff --git a/spec/ruby/language/fixtures/constant_visibility.rb b/spec/ruby/language/fixtures/constant_visibility.rb
new file mode 100644
index 0000000000..af38b2d8f2
--- /dev/null
+++ b/spec/ruby/language/fixtures/constant_visibility.rb
@@ -0,0 +1,114 @@
+module ConstantVisibility
+ module ModuleContainer
+ module PrivateModule
+ end
+ private_constant :PrivateModule
+
+ class PrivateClass
+ end
+ private_constant :PrivateClass
+ end
+
+ class ClassContainer
+ module PrivateModule
+ end
+ private_constant :PrivateModule
+
+ class PrivateClass
+ end
+ private_constant :PrivateClass
+ end
+
+ module PrivConstModule
+ PRIVATE_CONSTANT_MODULE = true
+ private_constant :PRIVATE_CONSTANT_MODULE
+
+ def self.private_constant_from_self
+ PRIVATE_CONSTANT_MODULE
+ end
+
+ def self.defined_from_self
+ defined? PRIVATE_CONSTANT_MODULE
+ end
+
+ module Nested
+ def self.private_constant_from_scope
+ PRIVATE_CONSTANT_MODULE
+ end
+
+ def self.defined_from_scope
+ defined? PRIVATE_CONSTANT_MODULE
+ end
+ end
+ end
+
+ class PrivConstClass
+ PRIVATE_CONSTANT_CLASS = true
+ private_constant :PRIVATE_CONSTANT_CLASS
+
+ def self.private_constant_from_self
+ PRIVATE_CONSTANT_CLASS
+ end
+
+ def self.defined_from_self
+ defined? PRIVATE_CONSTANT_CLASS
+ end
+
+ module Nested
+ def self.private_constant_from_scope
+ PRIVATE_CONSTANT_CLASS
+ end
+
+ def self.defined_from_scope
+ defined? PRIVATE_CONSTANT_CLASS
+ end
+ end
+ end
+
+ class ClassIncludingPrivConstModule
+ include PrivConstModule
+
+ def private_constant_from_include
+ PRIVATE_CONSTANT_MODULE
+ end
+
+ def defined_from_include
+ defined? PRIVATE_CONSTANT_MODULE
+ end
+ end
+
+ module ModuleIncludingPrivConstModule
+ include PrivConstModule
+
+ def self.private_constant_from_include
+ PRIVATE_CONSTANT_MODULE
+ end
+
+ def self.private_constant_self_from_include
+ self::PRIVATE_CONSTANT_MODULE
+ end
+
+ def self.private_constant_named_from_include
+ PrivConstModule::PRIVATE_CONSTANT_MODULE
+ end
+ end
+
+ class PrivConstClassChild < PrivConstClass
+ def private_constant_from_subclass
+ PRIVATE_CONSTANT_CLASS
+ end
+
+ def defined_from_subclass
+ defined? PRIVATE_CONSTANT_CLASS
+ end
+ end
+
+ def self.reset_private_constants
+ Object.send :private_constant, :PRIVATE_CONSTANT_IN_OBJECT
+ end
+end
+
+class Object
+ PRIVATE_CONSTANT_IN_OBJECT = true
+ private_constant :PRIVATE_CONSTANT_IN_OBJECT
+end
diff --git a/spec/ruby/language/fixtures/constants_sclass.rb b/spec/ruby/language/fixtures/constants_sclass.rb
new file mode 100644
index 0000000000..21dc4081e2
--- /dev/null
+++ b/spec/ruby/language/fixtures/constants_sclass.rb
@@ -0,0 +1,54 @@
+module ConstantSpecs
+
+ CS_SINGLETON1 = Object.new
+ class << CS_SINGLETON1
+ CONST = 1
+ def foo
+ CONST
+ end
+ end
+
+ CS_SINGLETON2 = [Object.new, Object.new]
+ 2.times do |i|
+ obj = CS_SINGLETON2[i]
+ $spec_i = i
+ class << obj
+ CONST = ($spec_i + 1)
+ def foo
+ CONST
+ end
+ end
+ end
+
+ CS_SINGLETON3 = [Object.new, Object.new]
+ 2.times do |i|
+ obj = CS_SINGLETON3[i]
+ class << obj
+ class X
+ # creates <singleton class::X>
+ end
+
+ def x
+ X
+ end
+ end
+ end
+
+ CS_SINGLETON4 = [Object.new, Object.new]
+ CS_SINGLETON4_CLASSES = []
+ 2.times do |i|
+ obj = CS_SINGLETON4[i]
+ $spec_i = i
+ class << obj
+ class X
+ CS_SINGLETON4_CLASSES << self
+ CONST = ($spec_i + 1)
+
+ def foo
+ CONST
+ end
+ end
+ end
+ end
+
+end
diff --git a/spec/ruby/language/fixtures/def.rb b/spec/ruby/language/fixtures/def.rb
new file mode 100644
index 0000000000..e07060ed74
--- /dev/null
+++ b/spec/ruby/language/fixtures/def.rb
@@ -0,0 +1,14 @@
+def toplevel_define_other_method
+ def nested_method_in_toplevel_method
+ 42
+ end
+end
+
+def some_toplevel_method
+end
+
+public
+def public_toplevel_method
+end
+
+private
diff --git a/spec/ruby/language/fixtures/defined.rb b/spec/ruby/language/fixtures/defined.rb
new file mode 100644
index 0000000000..3761cfa5bd
--- /dev/null
+++ b/spec/ruby/language/fixtures/defined.rb
@@ -0,0 +1,312 @@
+module DefinedSpecs
+ self::SelfScoped = 42
+
+ def self.side_effects
+ ScratchPad.record :defined_specs_side_effects
+ end
+
+ def self.fixnum_method
+ ScratchPad.record :defined_specs_fixnum_method
+ 42
+ end
+
+ def self.exception_method
+ ScratchPad.record :defined_specs_exception
+ raise "defined? specs exception method"
+ end
+
+ def self.defined_method
+ DefinedSpecs
+ end
+
+ def self.any_args(*)
+ end
+
+ class Basic
+ A = 42
+
+ def defined_method
+ DefinedSpecs
+ end
+
+ def a_defined_method
+ end
+
+ def protected_method
+ end
+ protected :protected_method
+
+ def private_method
+ end
+ private :private_method
+
+ def private_method_defined
+ defined? private_method
+ end
+
+ def private_predicate?
+ end
+ private :private_predicate?
+
+ def private_predicate_defined
+ defined? private_predicate?
+ end
+
+ def local_variable_defined
+ x = 2
+ defined? x
+ end
+
+ def local_variable_defined_nil
+ x = nil
+ defined? x
+ end
+
+ def instance_variable_undefined
+ defined? @instance_variable_undefined
+ end
+
+ def instance_variable_read
+ value = @instance_variable_read
+ defined? @instance_variable_read
+ end
+
+ def instance_variable_defined
+ @instance_variable_defined = 1
+ defined? @instance_variable_defined
+ end
+
+ def instance_variable_defined_nil
+ @instance_variable_defined_nil = nil
+ defined? @instance_variable_defined_nil
+ end
+
+ def global_variable_undefined
+ defined? $defined_specs_global_variable_undefined
+ end
+
+ def global_variable_read
+ suppress_warning do
+ value = $defined_specs_global_variable_read
+ end
+ defined? $defined_specs_global_variable_read
+ end
+
+ def global_variable_defined
+ $defined_specs_global_variable_defined = 1
+ defined? $defined_specs_global_variable_defined
+ end
+
+ def global_variable_defined_as_nil
+ $defined_specs_global_variable_defined_as_nil = nil
+ defined? $defined_specs_global_variable_defined_as_nil
+ end
+
+ def class_variable_undefined
+ defined? @@class_variable_undefined
+ end
+
+ def class_variable_defined
+ @@class_variable_defined = 1
+ defined? @@class_variable_defined
+ end
+
+ def yield_defined_method
+ defined? yield
+ end
+
+ def yield_defined_parameter_method(&block)
+ defined? yield
+ end
+
+ def no_yield_block
+ yield_defined_method
+ end
+
+ def no_yield_block_parameter
+ yield_defined_parameter_method
+ end
+
+ def yield_block
+ yield_defined_method { 42 }
+ end
+
+ def yield_block_parameter
+ yield_defined_parameter_method { 42 }
+ end
+ end
+
+ module Mixin
+ MixinConstant = 42
+
+ def defined_super
+ defined? super()
+ end
+ end
+
+ class Parent
+ ParentConstant = 42
+
+ def defined_super; end
+ end
+
+ class Child < Parent
+ include Mixin
+
+ A = 42
+
+ def self.parent_constant_defined
+ defined? self::ParentConstant
+ end
+
+ def self.module_defined
+ defined? Mixin
+ end
+
+ def self.module_constant_defined
+ defined? MixinConstant
+ end
+
+ def defined_super
+ super
+ end
+ end
+
+ class Superclass
+ def yield_method
+ yield
+ end
+
+ def method_no_args
+ end
+
+ def method_args
+ end
+
+ def method_block_no_args
+ end
+
+ def method_block_args
+ end
+
+ def define_method_no_args
+ end
+
+ def define_method_args
+ end
+
+ def define_method_block_no_args
+ end
+
+ def define_method_block_args
+ end
+ end
+
+ class Super < Superclass
+ def no_super_method_no_args
+ defined? super
+ end
+
+ def no_super_method_args
+ defined? super()
+ end
+
+ def method_no_args
+ defined? super
+ end
+
+ def method_args
+ defined? super()
+ end
+
+ def no_super_method_block_no_args
+ yield_method { defined? super }
+ end
+
+ def no_super_method_block_args
+ yield_method { defined? super() }
+ end
+
+ def method_block_no_args
+ yield_method { defined? super }
+ end
+
+ def method_block_args
+ yield_method { defined? super() }
+ end
+
+ define_method(:no_super_define_method_no_args) { defined? super }
+ define_method(:no_super_define_method_args) { defined? super() }
+ define_method(:define_method_no_args) { defined? super }
+ define_method(:define_method_args) { defined? super() }
+
+ define_method(:no_super_define_method_block_no_args) do
+ yield_method { defined? super }
+ end
+
+ define_method(:no_super_define_method_block_args) do
+ yield_method { defined? super() }
+ end
+
+ define_method(:define_method_block_no_args) do
+ yield_method { defined? super }
+ end
+
+ define_method(:define_method_block_args) do
+ yield_method { defined? super() }
+ end
+ end
+
+ class ClassWithMethod
+ def test
+ end
+ end
+
+ class ClassUndefiningMethod < ClassWithMethod
+ undef :test
+ end
+
+ class ClassWithoutMethod < ClassUndefiningMethod
+ # If an undefined method overridden in descendants
+ # define?(super) should return nil
+ def test
+ defined?(super)
+ end
+ end
+
+ module IntermediateModule1
+ def method_no_args
+ end
+ end
+
+ module IntermediateModule2
+ def method_no_args
+ defined?(super)
+ end
+ end
+
+ module ModuleWithConstMissing
+ def self.const_missing(const)
+ const
+ end
+ end
+
+ class SuperWithIntermediateModules
+ include IntermediateModule1
+ include IntermediateModule2
+
+ def method_no_args
+ super
+ end
+ end
+end
+
+class Object
+ def defined_specs_method
+ DefinedSpecs
+ end
+
+ def defined_specs_receiver
+ DefinedSpecs::Basic.new
+ end
+end
diff --git a/spec/ruby/language/fixtures/delegation.rb b/spec/ruby/language/fixtures/delegation.rb
new file mode 100644
index 0000000000..da2b024791
--- /dev/null
+++ b/spec/ruby/language/fixtures/delegation.rb
@@ -0,0 +1,11 @@
+module DelegationSpecs
+ class Target
+ def target(*args, **kwargs, &block)
+ [args, kwargs, block]
+ end
+
+ def target_block(*args, **kwargs)
+ yield [kwargs, args]
+ end
+ end
+end
diff --git a/spec/ruby/language/fixtures/dollar_zero.rb b/spec/ruby/language/fixtures/dollar_zero.rb
new file mode 100644
index 0000000000..683bce8d4e
--- /dev/null
+++ b/spec/ruby/language/fixtures/dollar_zero.rb
@@ -0,0 +1,6 @@
+puts $0
+puts __FILE__
+
+if $0 == __FILE__
+ print "OK"
+end
diff --git a/spec/ruby/language/fixtures/emacs_magic_comment.rb b/spec/ruby/language/fixtures/emacs_magic_comment.rb
new file mode 100644
index 0000000000..2b09f3e74c
--- /dev/null
+++ b/spec/ruby/language/fixtures/emacs_magic_comment.rb
@@ -0,0 +1,2 @@
+# -*- encoding: big5 -*-
+$magic_comment_result = __ENCODING__.name
diff --git a/spec/ruby/language/fixtures/ensure.rb b/spec/ruby/language/fixtures/ensure.rb
new file mode 100644
index 0000000000..6047ac5bc0
--- /dev/null
+++ b/spec/ruby/language/fixtures/ensure.rb
@@ -0,0 +1,121 @@
+module EnsureSpec
+ class Container
+ attr_reader :executed
+
+ def initialize
+ @executed = []
+ end
+
+ def raise_in_method_with_ensure
+ @executed << :method
+ raise EnsureSpec::Error
+ ensure
+ @executed << :ensure
+ end
+
+ def raise_and_rescue_in_method_with_ensure
+ @executed << :method
+ raise "An Exception"
+ rescue
+ @executed << :rescue
+ ensure
+ @executed << :ensure
+ end
+
+ def throw_in_method_with_ensure
+ @executed << :method
+ throw(:symbol)
+ ensure
+ @executed << :ensure
+ end
+
+ def implicit_return_in_method_with_ensure
+ :method
+ ensure
+ :ensure
+ end
+
+ def explicit_return_in_method_with_ensure
+ return :method
+ ensure
+ return :ensure
+ end
+
+ def explicit_return_in_rescue_and_explicit_return_in_ensure
+ raise
+ rescue
+ return 2
+ ensure
+ return "returned in ensure"
+ end
+
+ def explicit_return_in_rescue_and_implicit_return_in_ensure
+ raise
+ rescue
+ return "returned in rescue"
+ ensure
+ 3
+ end
+
+ def raise_and_explicit_return_in_ensure
+ raise
+ ensure
+ return "returned in ensure"
+ end
+
+ def raise_in_rescue_and_explicit_return_in_ensure
+ raise
+ rescue
+ raise
+ ensure
+ return "returned in ensure"
+ end
+
+ def raise_in_rescue_and_raise_in_ensure
+ raise
+ rescue
+ raise "raised in rescue"
+ ensure
+ raise "raised in ensure"
+ end
+
+ def raise_in_method_and_raise_in_ensure
+ raise
+ ensure
+ raise "raised in ensure"
+ end
+ end
+end
+
+module EnsureSpec
+
+ class Test
+
+ def initialize
+ @values = []
+ end
+
+ attr_reader :values
+
+ def call_block
+ begin
+ @values << :start
+ yield
+ ensure
+ @values << :end
+ end
+ end
+
+ def do_test
+ call_block do
+ @values << :in_block
+ return :did_test
+ end
+ end
+ end
+end
+
+module EnsureSpec
+ class Error < RuntimeError
+ end
+end
diff --git a/spec/ruby/language/fixtures/file.rb b/spec/ruby/language/fixtures/file.rb
new file mode 100644
index 0000000000..7b862cfe1a
--- /dev/null
+++ b/spec/ruby/language/fixtures/file.rb
@@ -0,0 +1 @@
+ScratchPad.record __FILE__
diff --git a/spec/ruby/language/fixtures/for_scope.rb b/spec/ruby/language/fixtures/for_scope.rb
new file mode 100644
index 0000000000..9c44a23a2c
--- /dev/null
+++ b/spec/ruby/language/fixtures/for_scope.rb
@@ -0,0 +1,15 @@
+module ForSpecs
+ class ForInClassMethod
+ m = :same_variable_set_outside
+
+ def self.foo
+ all = []
+ for m in [:bar, :baz]
+ all << m
+ end
+ all
+ end
+
+ READER = -> { m }
+ end
+end
diff --git a/spec/ruby/language/fixtures/freeze_magic_comment_across_files.rb b/spec/ruby/language/fixtures/freeze_magic_comment_across_files.rb
new file mode 100644
index 0000000000..3aed2f29b6
--- /dev/null
+++ b/spec/ruby/language/fixtures/freeze_magic_comment_across_files.rb
@@ -0,0 +1,5 @@
+# frozen_string_literal: true
+
+require_relative 'freeze_magic_comment_required'
+
+p "abc".object_id == $second_literal_id
diff --git a/spec/ruby/language/fixtures/freeze_magic_comment_across_files_diff_enc.rb b/spec/ruby/language/fixtures/freeze_magic_comment_across_files_diff_enc.rb
new file mode 100644
index 0000000000..53ef959970
--- /dev/null
+++ b/spec/ruby/language/fixtures/freeze_magic_comment_across_files_diff_enc.rb
@@ -0,0 +1,5 @@
+# frozen_string_literal: true
+
+require_relative 'freeze_magic_comment_required_diff_enc'
+
+p "abc".object_id != $second_literal_id
diff --git a/spec/ruby/language/fixtures/freeze_magic_comment_across_files_no_comment.rb b/spec/ruby/language/fixtures/freeze_magic_comment_across_files_no_comment.rb
new file mode 100644
index 0000000000..fc6cd5bf82
--- /dev/null
+++ b/spec/ruby/language/fixtures/freeze_magic_comment_across_files_no_comment.rb
@@ -0,0 +1,5 @@
+# frozen_string_literal: true
+
+require_relative 'freeze_magic_comment_required_no_comment'
+
+p "abc".object_id != $second_literal_id
diff --git a/spec/ruby/language/fixtures/freeze_magic_comment_one_literal.rb b/spec/ruby/language/fixtures/freeze_magic_comment_one_literal.rb
new file mode 100644
index 0000000000..d35905b332
--- /dev/null
+++ b/spec/ruby/language/fixtures/freeze_magic_comment_one_literal.rb
@@ -0,0 +1,4 @@
+# frozen_string_literal: true
+
+ids = Array.new(2) { "abc".object_id }
+p ids.first == ids.last
diff --git a/spec/ruby/language/fixtures/freeze_magic_comment_required.rb b/spec/ruby/language/fixtures/freeze_magic_comment_required.rb
new file mode 100644
index 0000000000..a4ff4459b1
--- /dev/null
+++ b/spec/ruby/language/fixtures/freeze_magic_comment_required.rb
@@ -0,0 +1,3 @@
+# frozen_string_literal: true
+
+$second_literal_id = "abc".object_id
diff --git a/spec/ruby/language/fixtures/freeze_magic_comment_required_diff_enc.rb b/spec/ruby/language/fixtures/freeze_magic_comment_required_diff_enc.rb
new file mode 100644
index 0000000000..f72a32e879
--- /dev/null
+++ b/spec/ruby/language/fixtures/freeze_magic_comment_required_diff_enc.rb
@@ -0,0 +1,4 @@
+# encoding: euc-jp # built-in for old regexp option
+# frozen_string_literal: true
+
+$second_literal_id = "abc".object_id
diff --git a/spec/ruby/language/fixtures/freeze_magic_comment_required_no_comment.rb b/spec/ruby/language/fixtures/freeze_magic_comment_required_no_comment.rb
new file mode 100644
index 0000000000..e09232a5f4
--- /dev/null
+++ b/spec/ruby/language/fixtures/freeze_magic_comment_required_no_comment.rb
@@ -0,0 +1 @@
+$second_literal_id = "abc".object_id
diff --git a/spec/ruby/language/fixtures/freeze_magic_comment_two_literals.rb b/spec/ruby/language/fixtures/freeze_magic_comment_two_literals.rb
new file mode 100644
index 0000000000..cccc5969bd
--- /dev/null
+++ b/spec/ruby/language/fixtures/freeze_magic_comment_two_literals.rb
@@ -0,0 +1,3 @@
+# frozen_string_literal: true
+
+p "abc".equal?("abc")
diff --git a/spec/ruby/language/fixtures/hash_strings_binary.rb b/spec/ruby/language/fixtures/hash_strings_binary.rb
new file mode 100644
index 0000000000..44b99cbf80
--- /dev/null
+++ b/spec/ruby/language/fixtures/hash_strings_binary.rb
@@ -0,0 +1,7 @@
+# encoding: binary
+
+module HashStringsBinary
+ def self.literal_hash
+ {"foo" => "bar"}
+ end
+end
diff --git a/spec/ruby/language/fixtures/hash_strings_usascii.rb b/spec/ruby/language/fixtures/hash_strings_usascii.rb
new file mode 100644
index 0000000000..18cfef7c8c
--- /dev/null
+++ b/spec/ruby/language/fixtures/hash_strings_usascii.rb
@@ -0,0 +1,7 @@
+# encoding: us-ascii
+
+module HashStringsUSASCII
+ def self.literal_hash
+ {"foo" => "bar"}
+ end
+end
diff --git a/spec/ruby/language/fixtures/hash_strings_utf8.rb b/spec/ruby/language/fixtures/hash_strings_utf8.rb
new file mode 100644
index 0000000000..7928090282
--- /dev/null
+++ b/spec/ruby/language/fixtures/hash_strings_utf8.rb
@@ -0,0 +1,7 @@
+# encoding: utf-8
+
+module HashStringsUTF8
+ def self.literal_hash
+ {"foo" => "bar"}
+ end
+end
diff --git a/spec/ruby/language/fixtures/magic_comment.rb b/spec/ruby/language/fixtures/magic_comment.rb
new file mode 100644
index 0000000000..120ef6ff4a
--- /dev/null
+++ b/spec/ruby/language/fixtures/magic_comment.rb
@@ -0,0 +1,2 @@
+# encoding: big5
+$magic_comment_result = __ENCODING__.name
diff --git a/spec/ruby/language/fixtures/match_operators.rb b/spec/ruby/language/fixtures/match_operators.rb
new file mode 100644
index 0000000000..f04c54d723
--- /dev/null
+++ b/spec/ruby/language/fixtures/match_operators.rb
@@ -0,0 +1,9 @@
+class OperatorImplementor
+ def =~(val)
+ return val
+ end
+
+ def !~(val)
+ return val
+ end
+end
diff --git a/spec/ruby/language/fixtures/metaclass.rb b/spec/ruby/language/fixtures/metaclass.rb
new file mode 100644
index 0000000000..a8f837e701
--- /dev/null
+++ b/spec/ruby/language/fixtures/metaclass.rb
@@ -0,0 +1,33 @@
+module MetaClassSpecs
+
+ def self.metaclass_of obj
+ class << obj
+ self
+ end
+ end
+
+ class A
+ def self.cheese
+ 'edam'
+ end
+ end
+
+ class B < A
+ def self.cheese
+ 'stilton'
+ end
+ end
+
+ class C
+ class << self
+ class << self
+ def ham
+ 'iberico'
+ end
+ end
+ end
+ end
+
+ class D < C; end
+
+end
diff --git a/spec/ruby/language/fixtures/module.rb b/spec/ruby/language/fixtures/module.rb
new file mode 100644
index 0000000000..75eee77791
--- /dev/null
+++ b/spec/ruby/language/fixtures/module.rb
@@ -0,0 +1,15 @@
+module ModuleSpecs
+ module Modules
+ class Klass
+ end
+
+ A = "Module"
+ B = 1
+ C = nil
+ D = true
+ E = false
+ end
+
+ module Anonymous
+ end
+end
diff --git a/spec/ruby/language/fixtures/next.rb b/spec/ruby/language/fixtures/next.rb
new file mode 100644
index 0000000000..fbca842334
--- /dev/null
+++ b/spec/ruby/language/fixtures/next.rb
@@ -0,0 +1,134 @@
+class NextSpecs
+ def self.yielding_method(expected)
+ yield.should == expected
+ :method_return_value
+ end
+
+ def self.yielding
+ yield
+ end
+
+ # The methods below are defined to spec the behavior of the next statement
+ # while specifically isolating whether the statement is in an Iter block or
+ # not. In a normal spec example, the code is always nested inside a block.
+ # Rather than rely on that implicit context in this case, the context is
+ # made explicit because of the interaction of next in a loop nested inside
+ # an Iter block.
+ def self.while_next(arg)
+ x = true
+ while x
+ begin
+ ScratchPad << :begin
+ x = false
+ if arg
+ next 42
+ else
+ next
+ end
+ ensure
+ ScratchPad << :ensure
+ end
+ end
+ end
+
+ def self.while_within_iter(arg)
+ yielding do
+ x = true
+ while x
+ begin
+ ScratchPad << :begin
+ x = false
+ if arg
+ next 42
+ else
+ next
+ end
+ ensure
+ ScratchPad << :ensure
+ end
+ end
+ end
+ end
+
+ def self.until_next(arg)
+ x = false
+ until x
+ begin
+ ScratchPad << :begin
+ x = true
+ if arg
+ next 42
+ else
+ next
+ end
+ ensure
+ ScratchPad << :ensure
+ end
+ end
+ end
+
+ def self.until_within_iter(arg)
+ yielding do
+ x = false
+ until x
+ begin
+ ScratchPad << :begin
+ x = true
+ if arg
+ next 42
+ else
+ next
+ end
+ ensure
+ ScratchPad << :ensure
+ end
+ end
+ end
+ end
+
+ def self.loop_next(arg)
+ x = 1
+ loop do
+ break if x == 2
+
+ begin
+ ScratchPad << :begin
+ x += 1
+ if arg
+ next 42
+ else
+ next
+ end
+ ensure
+ ScratchPad << :ensure
+ end
+ end
+ end
+
+ def self.loop_within_iter(arg)
+ yielding do
+ x = 1
+ loop do
+ break if x == 2
+
+ begin
+ ScratchPad << :begin
+ x += 1
+ if arg
+ next 42
+ else
+ next
+ end
+ ensure
+ ScratchPad << :ensure
+ end
+ end
+ end
+ end
+
+ class Block
+ def method(v)
+ yield v
+ end
+ end
+end
diff --git a/spec/ruby/language/fixtures/no_magic_comment.rb b/spec/ruby/language/fixtures/no_magic_comment.rb
new file mode 100644
index 0000000000..743a0f9503
--- /dev/null
+++ b/spec/ruby/language/fixtures/no_magic_comment.rb
@@ -0,0 +1 @@
+$magic_comment_result = __ENCODING__.name
diff --git a/spec/ruby/language/fixtures/precedence.rb b/spec/ruby/language/fixtures/precedence.rb
new file mode 100644
index 0000000000..d2295c755b
--- /dev/null
+++ b/spec/ruby/language/fixtures/precedence.rb
@@ -0,0 +1,16 @@
+module PrecedenceSpecs
+ class NonUnaryOpTest
+ def add_num(arg)
+ [1].collect { |i| arg + i +1 }
+ end
+ def sub_num(arg)
+ [1].collect { |i| arg + i -1 }
+ end
+ def add_str
+ %w[1].collect { |i| i +'1' }
+ end
+ def add_var
+ [1].collect { |i| i +i }
+ end
+ end
+end
diff --git a/spec/ruby/language/fixtures/print_magic_comment_result_at_exit.rb b/spec/ruby/language/fixtures/print_magic_comment_result_at_exit.rb
new file mode 100644
index 0000000000..aa82cf4471
--- /dev/null
+++ b/spec/ruby/language/fixtures/print_magic_comment_result_at_exit.rb
@@ -0,0 +1,3 @@
+at_exit {
+ print $magic_comment_result
+}
diff --git a/spec/ruby/language/fixtures/private.rb b/spec/ruby/language/fixtures/private.rb
new file mode 100644
index 0000000000..da3e0a97f9
--- /dev/null
+++ b/spec/ruby/language/fixtures/private.rb
@@ -0,0 +1,59 @@
+module Private
+ class A
+ def foo
+ "foo"
+ end
+
+ private
+ def bar
+ "bar"
+ end
+ end
+
+ class B
+ def foo
+ "foo"
+ end
+
+ private
+
+ def self.public_defs_method; 0; end
+
+ class C
+ def baz
+ "baz"
+ end
+ end
+
+ class << self
+ def public_class_method1; 1; end
+ private
+ def private_class_method1; 1; end
+ end
+
+ def bar
+ "bar"
+ end
+ end
+
+ module D
+ private
+ def foo
+ "foo"
+ end
+ end
+
+ class E
+ include D
+ end
+
+ class G
+ def foo
+ "foo"
+ end
+ end
+
+ class H < A
+ private :foo
+ end
+end
diff --git a/spec/ruby/language/fixtures/rescue.rb b/spec/ruby/language/fixtures/rescue.rb
new file mode 100644
index 0000000000..b906e17a2f
--- /dev/null
+++ b/spec/ruby/language/fixtures/rescue.rb
@@ -0,0 +1,67 @@
+module RescueSpecs
+ def self.begin_else(raise_exception)
+ begin
+ ScratchPad << :one
+ raise "an error occurred" if raise_exception
+ rescue
+ ScratchPad << :rescue_ran
+ :rescue_val
+ else
+ ScratchPad << :else_ran
+ :val
+ end
+ end
+
+ def self.begin_else_ensure(raise_exception)
+ begin
+ ScratchPad << :one
+ raise "an error occurred" if raise_exception
+ rescue
+ ScratchPad << :rescue_ran
+ :rescue_val
+ else
+ ScratchPad << :else_ran
+ :val
+ ensure
+ ScratchPad << :ensure_ran
+ :ensure_val
+ end
+ end
+
+ def self.begin_else_return(raise_exception)
+ begin
+ ScratchPad << :one
+ raise "an error occurred" if raise_exception
+ rescue
+ ScratchPad << :rescue_ran
+ :rescue_val
+ else
+ ScratchPad << :else_ran
+ :val
+ end
+ ScratchPad << :outside_begin
+ :return_val
+ end
+
+ def self.begin_else_return_ensure(raise_exception)
+ begin
+ ScratchPad << :one
+ raise "an error occurred" if raise_exception
+ rescue
+ ScratchPad << :rescue_ran
+ :rescue_val
+ else
+ ScratchPad << :else_ran
+ :val
+ ensure
+ ScratchPad << :ensure_ran
+ :ensure_val
+ end
+ ScratchPad << :outside_begin
+ :return_val
+ end
+
+ def self.raise_standard_error
+ raise StandardError, "an error occurred"
+ end
+end
diff --git a/spec/ruby/language/fixtures/rescue/top_level.rb b/spec/ruby/language/fixtures/rescue/top_level.rb
new file mode 100644
index 0000000000..59e78ef1d6
--- /dev/null
+++ b/spec/ruby/language/fixtures/rescue/top_level.rb
@@ -0,0 +1,7 @@
+# capturing in local variable at top-level
+
+begin
+ raise "message"
+rescue => e
+ ScratchPad << e.message
+end
diff --git a/spec/ruby/language/fixtures/rescue_captures.rb b/spec/ruby/language/fixtures/rescue_captures.rb
new file mode 100644
index 0000000000..69f9b83904
--- /dev/null
+++ b/spec/ruby/language/fixtures/rescue_captures.rb
@@ -0,0 +1,107 @@
+module RescueSpecs
+ class Captor
+ attr_accessor :captured_error
+
+ def self.should_capture_exception
+ captor = new
+ captor.capture('some text').should == :caught # Ensure rescue body still runs
+ captor.captured_error.message.should == 'some text'
+ end
+ end
+
+ class ClassVariableCaptor < Captor
+ def capture(msg)
+ raise msg
+ rescue => @@captured_error
+ :caught
+ end
+
+ def captured_error
+ self.class.remove_class_variable(:@@captured_error)
+ end
+ end
+
+ class ConstantCaptor < Captor
+ # Using lambda gets around the dynamic constant assignment warning
+ CAPTURE = -> msg {
+ begin
+ raise msg
+ rescue => CapturedError
+ :caught
+ end
+ }
+
+ def capture(msg)
+ CAPTURE.call(msg)
+ end
+
+ def captured_error
+ self.class.send(:remove_const, :CapturedError)
+ end
+ end
+
+ class GlobalVariableCaptor < Captor
+ def capture(msg)
+ raise msg
+ rescue => $captured_error
+ :caught
+ end
+
+ def captured_error
+ $captured_error.tap do
+ $captured_error = nil # Can't remove globals, only nil them out
+ end
+ end
+ end
+
+ class InstanceVariableCaptor < Captor
+ def capture(msg)
+ raise msg
+ rescue => @captured_error
+ :caught
+ end
+ end
+
+ class LocalVariableCaptor < Captor
+ def capture(msg)
+ raise msg
+ rescue => captured_error
+ @captured_error = captured_error
+ :caught
+ end
+ end
+
+ class SafeNavigationSetterCaptor < Captor
+ def capture(msg)
+ raise msg
+ rescue => self&.captured_error
+ :caught
+ end
+ end
+
+ class SetterCaptor < Captor
+ def capture(msg)
+ raise msg
+ rescue => self.captured_error
+ :caught
+ end
+ end
+
+ class SquareBracketsCaptor < Captor
+ def capture(msg)
+ @hash = {}
+
+ raise msg
+ rescue => self[:error]
+ :caught
+ end
+
+ def []=(key, value)
+ @hash[key] = value
+ end
+
+ def captured_error
+ @hash[:error]
+ end
+ end
+end
diff --git a/spec/ruby/language/fixtures/return.rb b/spec/ruby/language/fixtures/return.rb
new file mode 100644
index 0000000000..f6b143f3fa
--- /dev/null
+++ b/spec/ruby/language/fixtures/return.rb
@@ -0,0 +1,135 @@
+module ReturnSpecs
+ class Blocks
+ def yielding_method
+ yield
+ ScratchPad.record :after_yield
+ end
+
+ def enclosing_method
+ yielding_method do
+ ScratchPad.record :before_return
+ return :return_value
+ ScratchPad.record :after_return
+ end
+
+ ScratchPad.record :after_call
+ end
+ end
+
+ class NestedCalls < Blocks
+ def invoking_method(&b)
+ yielding_method(&b)
+ ScratchPad.record :after_invoke
+ end
+
+ def enclosing_method
+ invoking_method do
+ ScratchPad.record :before_return
+ return :return_value
+ ScratchPad.record :after_return
+ end
+ ScratchPad.record :after_invoke
+ end
+ end
+
+ class NestedBlocks < Blocks
+ def enclosing_method
+ yielding_method do
+ yielding_method do
+ ScratchPad.record :before_return
+ return :return_value
+ ScratchPad.record :after_return
+ end
+ ScratchPad.record :after_invoke1
+ end
+ ScratchPad.record :after_invoke2
+ end
+ end
+
+ class SavedInnerBlock
+ def add(&b)
+ @block = b
+ end
+
+ def outer
+ yield
+ @block.call
+ end
+
+ def inner
+ yield
+ end
+
+ def start
+ outer do
+ inner do
+ add do
+ ScratchPad.record :before_return
+ return :return_value
+ end
+ end
+ end
+
+ ScratchPad.record :bottom_of_start
+
+ return false
+ end
+ end
+
+ class ThroughDefineMethod
+ lamb = proc { |x| x.call }
+ define_method :foo, lamb
+
+ def mp(&b); b; end
+
+ def outer
+ pr = mp { return :good }
+
+ foo(pr)
+ return :bad
+ end
+ end
+
+ class DefineMethod
+ lamb = proc { return :good }
+ define_method :foo, lamb
+
+ def outer
+ val = :bad
+
+ # This is tricky, but works. If lamb properly returns, then the
+ # return value will go into val before we run the ensure.
+ #
+ # If lamb's return keeps unwinding incorrectly, val will still
+ # have its old value.
+ #
+ # We can therefore use val to figure out what happened.
+ begin
+ val = foo()
+ ensure
+ return val
+ end
+ end
+ end
+
+ class MethodWithBlock
+ def method1
+ return [2, 3].inject 0 do |a, b|
+ a + b
+ end
+ nil
+ end
+
+ def get_ary(count, &blk)
+ count.times.to_a do |i|
+ blk.call(i) if blk
+ end
+ end
+
+ def method2
+ return get_ary 3 do |i|
+ end
+ nil
+ end
+ end
+end
diff --git a/spec/ruby/language/fixtures/second_line_magic_comment.rb b/spec/ruby/language/fixtures/second_line_magic_comment.rb
new file mode 100644
index 0000000000..a3dd50393b
--- /dev/null
+++ b/spec/ruby/language/fixtures/second_line_magic_comment.rb
@@ -0,0 +1,3 @@
+
+# encoding: big5
+$magic_comment_result = __ENCODING__.name
diff --git a/spec/ruby/language/fixtures/second_token_magic_comment.rb b/spec/ruby/language/fixtures/second_token_magic_comment.rb
new file mode 100644
index 0000000000..8d443e68f3
--- /dev/null
+++ b/spec/ruby/language/fixtures/second_token_magic_comment.rb
@@ -0,0 +1,2 @@
+1 + 1 # encoding: big5
+$magic_comment_result = __ENCODING__.name
diff --git a/spec/ruby/language/fixtures/send.rb b/spec/ruby/language/fixtures/send.rb
new file mode 100644
index 0000000000..4787abee5c
--- /dev/null
+++ b/spec/ruby/language/fixtures/send.rb
@@ -0,0 +1,151 @@
+module LangSendSpecs
+ module_function
+
+ def fooM0; 100 end
+ def fooM1(a); [a]; end
+ def fooM2(a,b); [a,b]; end
+ def fooM3(a,b,c); [a,b,c]; end
+ def fooM4(a,b,c,d); [a,b,c,d]; end
+ def fooM5(a,b,c,d,e); [a,b,c,d,e]; end
+ def fooM0O1(a=1); [a]; end
+ def fooM1O1(a,b=1); [a,b]; end
+ def fooM2O1(a,b,c=1); [a,b,c]; end
+ def fooM3O1(a,b,c,d=1); [a,b,c,d]; end
+ def fooM4O1(a,b,c,d,e=1); [a,b,c,d,e]; end
+ def fooM0O2(a=1,b=2); [a,b]; end
+ def fooM0R(*r); r; end
+ def fooM1R(a, *r); [a, r]; end
+ def fooM0O1R(a=1, *r); [a, r]; end
+ def fooM1O1R(a, b=1, *r); [a, b, r]; end
+
+ def one(a); a; end
+ def oneb(a,&b); [a,yield(b)]; end
+ def twob(a,b,&c); [a,b,yield(c)]; end
+ def makeproc(&b) b end
+
+ def yield_now; yield; end
+
+ def double(x); x * 2 end
+ def weird_parens
+ # means double((5).to_s)
+ # NOT (double(5)).to_s
+ double (5).to_s
+ end
+
+ def rest_len(*a); a.size; end
+
+ def self.twos(a,b,*c)
+ [c.size, c.last]
+ end
+
+ class PrivateSetter
+ attr_reader :foo
+ attr_writer :foo
+ private :foo=
+
+ def call_self_foo_equals(value)
+ self.foo = value
+ end
+
+ def call_self_foo_equals_masgn(value)
+ a, self.foo = 1, value
+ end
+ end
+
+ class PrivateGetter
+ attr_accessor :foo
+ private :foo
+ private :foo=
+
+ def call_self_foo
+ self.foo
+ end
+
+ def call_self_foo_or_equals(value)
+ self.foo ||= 6
+ end
+ end
+
+ class AttrSet
+ attr_reader :result
+ def []=(a, b, c, d); @result = [a,b,c,d]; end
+ end
+
+ class ToProc
+ def initialize(val)
+ @val = val
+ end
+
+ def to_proc
+ Proc.new { @val }
+ end
+ end
+
+ class RawToProc
+ def initialize(to_proc)
+ @to_proc = to_proc
+ end
+
+ def to_proc
+ @to_proc
+ end
+ end
+
+ class ToAry
+ def initialize(obj)
+ @obj = obj
+ end
+
+ def to_ary
+ @obj
+ end
+ end
+
+ class MethodMissing
+ def initialize
+ @message = nil
+ @args = nil
+ end
+
+ attr_reader :message, :args
+
+ def method_missing(m, *a)
+ @message = m
+ @args = a
+ end
+ end
+
+ class Attr19Set
+ attr_reader :result
+ def []=(*args); @result = args; end
+ end
+
+ module_function
+
+ def fooR(*r); r; end
+ def fooM0RQ1(*r, q); [r, q]; end
+ def fooM0RQ2(*r, s, q); [r, s, q]; end
+ def fooM1RQ1(a, *r, q); [a, r, q]; end
+ def fooM1O1RQ1(a, b=9, *r, q); [a, b, r, q]; end
+ def fooM1O1RQ2(a, b=9, *r, q, t); [a, b, r, q, t]; end
+
+ def fooO1Q1(a=1, b); [a,b]; end
+ def fooM1O1Q1(a,b=2,c); [a,b,c]; end
+ def fooM2O1Q1(a,b,c=3,d); [a,b,c,d]; end
+ def fooM2O2Q1(a,b,c=3,d=4,e); [a,b,c,d,e]; end
+ def fooO4Q1(a=1,b=2,c=3,d=4,e); [a,b,c,d,e]; end
+ def fooO4Q2(a=1,b=2,c=3,d=4,e,f); [a,b,c,d,e,f]; end
+
+ def destructure2((a,b)); a+b; end
+ def destructure2b((a,b)); [a,b]; end
+ def destructure4r((a,b,*c,d,e)); [a,b,c,d,e]; end
+ def destructure4o(a=1,(b,c),d,&e); [a,b,c,d]; end
+ def destructure5o(a=1, f=2, (b,c),d,&e); [a,f,b,c,d]; end
+ def destructure7o(a=1, f=2, (b,c),(d,e), &g); [a,f,b,c,d,e]; end
+ def destructure7b(a=1, f=2, (b,c),(d,e), &g); g.call([a,f,b,c,d,e]); end
+ def destructure4os(a=1,(b,*c)); [a,b,c]; end
+end
+
+def lang_send_rest_len(*a)
+ a.size
+end
diff --git a/spec/ruby/language/fixtures/shebang_magic_comment.rb b/spec/ruby/language/fixtures/shebang_magic_comment.rb
new file mode 100755
index 0000000000..f8e5e7d8e4
--- /dev/null
+++ b/spec/ruby/language/fixtures/shebang_magic_comment.rb
@@ -0,0 +1,3 @@
+#!/usr/bin/ruby
+# encoding: big5
+$magic_comment_result = __ENCODING__.name
diff --git a/spec/ruby/language/fixtures/squiggly_heredoc.rb b/spec/ruby/language/fixtures/squiggly_heredoc.rb
new file mode 100644
index 0000000000..984a629e5b
--- /dev/null
+++ b/spec/ruby/language/fixtures/squiggly_heredoc.rb
@@ -0,0 +1,71 @@
+module SquigglyHeredocSpecs
+ def self.message
+ <<~HEREDOC
+ character density, n.:
+ The number of very weird people in the office.
+ HEREDOC
+ end
+
+ def self.blank
+ <<~HERE
+ HERE
+ end
+
+ def self.unquoted
+ <<~HERE
+ unquoted #{"interpolated"}
+ HERE
+ end
+
+ def self.doublequoted
+ <<~"HERE"
+ doublequoted #{"interpolated"}
+ HERE
+ end
+
+ def self.singlequoted
+ <<~'HERE'
+ singlequoted #{"interpolated"}
+ HERE
+ end
+
+ def self.backslash
+ <<~HERE
+ a
+ b\
+ c
+ HERE
+ end
+
+ def self.least_indented_on_the_first_line
+ <<~HERE
+ a
+ b
+ c
+ HERE
+ end
+
+ def self.least_indented_on_the_last_line
+ <<~HERE
+ a
+ b
+ c
+ HERE
+ end
+
+ def self.least_indented_on_the_first_line_single
+ <<~'HERE'
+ a
+ b
+ c
+ HERE
+ end
+
+ def self.least_indented_on_the_last_line_single
+ <<~'HERE'
+ a
+ b
+ c
+ HERE
+ end
+end
diff --git a/spec/ruby/language/fixtures/super.rb b/spec/ruby/language/fixtures/super.rb
new file mode 100644
index 0000000000..c5bdcf0e40
--- /dev/null
+++ b/spec/ruby/language/fixtures/super.rb
@@ -0,0 +1,804 @@
+module SuperSpecs
+ module S1
+ class A
+ def foo(a)
+ a << "A#foo"
+ bar(a)
+ end
+ def bar(a)
+ a << "A#bar"
+ end
+ end
+ class B < A
+ def foo(a)
+ a << "B#foo"
+ super(a)
+ end
+ def bar(a)
+ a << "B#bar"
+ super(a)
+ end
+ end
+ end
+
+ module S2
+ class A
+ def baz(a)
+ a << "A#baz"
+ end
+ end
+ class B < A
+ def foo(a)
+ a << "B#foo"
+ baz(a)
+ end
+ end
+ class C < B
+ def baz(a)
+ a << "C#baz"
+ super(a)
+ end
+ end
+ end
+
+ module S3
+ class A
+ def foo(a)
+ a << "A#foo"
+ end
+ def self.foo(a)
+ a << "A.foo"
+ end
+ def self.bar(a)
+ a << "A.bar"
+ foo(a)
+ end
+ end
+ class B < A
+ def self.foo(a)
+ a << "B.foo"
+ super(a)
+ end
+ def self.bar(a)
+ a << "B.bar"
+ super(a)
+ end
+ end
+ end
+
+ module S4
+ class A
+ def foo(a)
+ a << "A#foo"
+ end
+ end
+ class B < A
+ def foo(a, b)
+ a << "B#foo(a,#{b})"
+ super(a)
+ end
+ end
+ end
+
+ class S5
+ def here
+ :good
+ end
+ end
+
+ class S6 < S5
+ def under
+ yield
+ end
+
+ def here
+ under {
+ super
+ }
+ end
+ end
+
+ class S7 < S5
+ define_method(:here) { super() }
+ end
+
+ module MS1
+ module ModA
+ def foo(a)
+ a << "ModA#foo"
+ bar(a)
+ end
+ def bar(a)
+ a << "ModA#bar"
+ end
+ end
+ class A
+ include ModA
+ end
+ module ModB
+ def bar(a)
+ a << "ModB#bar"
+ super(a)
+ end
+ end
+ class B < A
+ def foo(a)
+ a << "B#foo"
+ super(a)
+ end
+ include ModB
+ end
+ end
+
+ module MS2
+ class A
+ def baz(a)
+ a << "A#baz"
+ end
+ end
+ module ModB
+ def foo(a)
+ a << "ModB#foo"
+ baz(a)
+ end
+ end
+ class B < A
+ include ModB
+ end
+ class C < B
+ def baz(a)
+ a << "C#baz"
+ super(a)
+ end
+ end
+ end
+
+ module MultiSuperTargets
+ module M
+ def foo
+ super
+ end
+ end
+
+ class BaseA
+ def foo
+ :BaseA
+ end
+ end
+
+ class BaseB
+ def foo
+ :BaseB
+ end
+ end
+
+ class A < BaseA
+ include M
+ end
+
+ class B < BaseB
+ include M
+ end
+ end
+
+ module MS3
+ module ModA
+ def foo(a)
+ a << "ModA#foo"
+ end
+ def bar(a)
+ a << "ModA#bar"
+ foo(a)
+ end
+ end
+ class A
+ def foo(a)
+ a << "A#foo"
+ end
+ class << self
+ include ModA
+ end
+ end
+ class B < A
+ def self.foo(a)
+ a << "B.foo"
+ super(a)
+ end
+ def self.bar(a)
+ a << "B.bar"
+ super(a)
+ end
+ end
+ end
+
+ module MS4
+ module Layer1
+ def example
+ 5
+ end
+ end
+
+ module Layer2
+ include Layer1
+ def example
+ super
+ end
+ end
+
+ class A
+ include Layer2
+ public :example
+ end
+ end
+
+ class MM_A
+ undef_method :is_a?
+ end
+
+ class MM_B < MM_A
+ def is_a?(blah)
+ # should fire the method_missing below
+ super
+ end
+
+ def method_missing(*)
+ false
+ end
+ end
+
+ class Alias1
+ def name
+ [:alias1]
+ end
+ end
+
+ class Alias2 < Alias1
+ def initialize
+ @times = 0
+ end
+
+ def name
+ if @times >= 10
+ raise "runaway super"
+ end
+
+ @times += 1
+
+ # Use this so that we can see collect all supers that we see.
+ # One bug that arises is that we call Alias2#name from Alias2#name
+ # as it's superclass. In that case, either we get a runaway recursion
+ # super OR we get the return value being [:alias2, :alias2, :alias1]
+ # rather than [:alias2, :alias1].
+ #
+ # Which one depends on caches and how super is implemented.
+ [:alias2] + super
+ end
+ end
+
+ class Alias3 < Alias2
+ alias_method :name3, :name
+ # In the method table for Alias3 now should be a special alias entry
+ # that references Alias2 and Alias2#name (probably as an object).
+ #
+ # When name3 is called then, Alias2 (NOT Alias3) is presented as the
+ # current module to Alias2#name, so that when super is called,
+ # Alias2's superclass is next.
+ #
+ # Otherwise, Alias2 is next, which is where name was to begin with,
+ # causing the wrong #name method to be called.
+ end
+
+ module AliasWithSuper
+ module AS1
+ def foo
+ :a
+ end
+ end
+
+ module BS1
+ def foo
+ [:b, super]
+ end
+ end
+
+ class Base
+ extend AS1
+ extend BS1
+ end
+
+ class Trigger < Base
+ class << self
+ def foo_quux
+ foo_baz
+ end
+
+ alias_method :foo_baz, :foo
+ alias_method :foo, :foo_quux
+ end
+ end
+ end
+
+ module RestArgsWithSuper
+ class A
+ def a(*args)
+ args
+ end
+ end
+
+ class B < A
+ def a(*args)
+ args << "foo"
+
+ super
+ end
+ end
+ end
+
+ class AnonymousModuleIncludedTwiceBase
+ def self.whatever
+ mod = Module.new do
+ def a(array)
+ array << "anon"
+ super
+ end
+ end
+
+ include mod
+ end
+
+ def a(array)
+ array << "non-anon"
+ end
+ end
+
+ class AnonymousModuleIncludedTwice < AnonymousModuleIncludedTwiceBase
+ whatever
+ whatever
+ end
+
+ module ZSuperWithBlock
+ class A
+ def a
+ yield
+ end
+
+ def b(&block)
+ block.call
+ end
+
+ def c
+ yield
+ end
+ end
+
+ class B < A
+ def a
+ super { 14 }
+ end
+
+ def b
+ block_ref = -> { 15 }
+ [super { 14 }, super(&block_ref)]
+ end
+
+ def c
+ block_ref = -> { 16 }
+ super(&block_ref)
+ end
+ end
+ end
+
+ module ZSuperWithOptional
+ class A
+ def m(x, y, z)
+ z
+ end
+ end
+
+ class B < A
+ def m(x, y, z = 14)
+ super
+ end
+ end
+
+ class C < A
+ def m(x, y, z = 14)
+ z = 100
+ super
+ end
+ end
+ end
+
+ module ZSuperWithRest
+ class A
+ def m(*args)
+ args
+ end
+
+ def m_modified(*args)
+ args
+ end
+ end
+
+ class B < A
+ def m(*args)
+ super
+ end
+
+ def m_modified(*args)
+ args[1] = 14
+ super
+ end
+ end
+ end
+
+ module ZSuperWithRestAndOthers
+ class A
+ def m(a, b, *args)
+ args
+ end
+
+ def m_modified(a, b, *args)
+ args
+ end
+ end
+
+ class B < A
+ def m(a, b, *args)
+ super
+ end
+
+ def m_modified(a, b, *args)
+ args[1] = 14
+ super
+ end
+ end
+ end
+
+ module ZSuperWithRestAndPost
+ class A
+ def m(*args, a, b)
+ args
+ end
+
+ def m_modified(*args, a, b)
+ args
+ end
+ end
+
+ class B < A
+ def m(*args, a, b)
+ super
+ end
+
+ def m_modified(*args, a, b)
+ args[1] = 14
+ super
+ end
+ end
+ end
+
+ module ZSuperWithRestOthersAndPost
+ class A
+ def m(a, *args, b)
+ args
+ end
+
+ def m_modified(a, *args, b)
+ args
+ end
+ end
+
+ class B < A
+ def m(a, *args, b)
+ super
+ end
+
+ def m_modified(a, *args, b)
+ args[1] = 14
+ super
+ end
+ end
+ end
+
+ module ZSuperWithRestReassigned
+ class A
+ def a(*args)
+ args
+ end
+ end
+
+ class B < A
+ def a(*args)
+ args = ["foo"]
+
+ super
+ end
+ end
+ end
+
+ module ZSuperWithRestReassignedWithScalar
+ class A
+ def a(*args)
+ args
+ end
+ end
+
+ class B < A
+ def a(*args)
+ args = "foo"
+
+ super
+ end
+ end
+ end
+
+ module ZSuperWithUnderscores
+ class A
+ def m(*args)
+ args
+ end
+
+ def m3(*args)
+ args
+ end
+
+ def m4(*args)
+ args
+ end
+
+ def m_default(*args)
+ args
+ end
+
+ def m_rest(*args)
+ args
+ end
+
+ def m_pre_default_rest_post(*args)
+ args
+ end
+
+ def m_kwrest(**kw)
+ kw
+ end
+
+ def m_modified(*args)
+ args
+ end
+ end
+
+ class B < A
+ def m(_, _)
+ super
+ end
+
+ def m3(_, _, _)
+ super
+ end
+
+ def m4(_, _, _, _)
+ super
+ end
+
+ def m_default(_ = 0)
+ super
+ end
+
+ def m_rest(*_)
+ super
+ end
+
+ def m_pre_default_rest_post(_, _, _=:a, _=:b, *_, _, _)
+ super
+ end
+
+ def m_kwrest(**_)
+ super
+ end
+
+ def m_modified(_, _)
+ _ = 14
+ super
+ end
+ end
+ end
+
+ module ZSuperInBlock
+ class A
+ def m(arg:)
+ arg
+ end
+ end
+
+ class B < A
+ def m(arg:)
+ proc { super }.call
+ end
+ end
+ end
+
+ module Keywords
+ class Arguments
+ def foo(**args)
+ args
+ end
+ end
+
+ # ----
+
+ class RequiredArguments < Arguments
+ def foo(a:)
+ super
+ end
+ end
+
+ class OptionalArguments < Arguments
+ def foo(b: 'b')
+ super
+ end
+ end
+
+ class PlaceholderArguments < Arguments
+ def foo(**args)
+ super
+ end
+ end
+
+ # ----
+
+ class RequiredAndOptionalArguments < Arguments
+ def foo(a:, b: 'b')
+ super
+ end
+ end
+
+ class RequiredAndPlaceholderArguments < Arguments
+ def foo(a:, **args)
+ super
+ end
+ end
+
+ class OptionalAndPlaceholderArguments < Arguments
+ def foo(b: 'b', **args)
+ super
+ end
+ end
+
+ # ----
+
+ class RequiredAndOptionalAndPlaceholderArguments < Arguments
+ def foo(a:, b: 'b', **args)
+ super
+ end
+ end
+ end
+
+ module RegularAndKeywords
+ class Arguments
+ def foo(a, **options)
+ [a, options]
+ end
+ end
+
+ # -----
+
+ class RequiredArguments < Arguments
+ def foo(a, b:)
+ super
+ end
+ end
+
+ class OptionalArguments < Arguments
+ def foo(a, c: 'c')
+ super
+ end
+ end
+
+ class PlaceholderArguments < Arguments
+ def foo(a, **options)
+ super
+ end
+ end
+
+ # -----
+
+ class RequiredAndOptionalArguments < Arguments
+ def foo(a, b:, c: 'c')
+ super
+ end
+ end
+
+ class RequiredAndPlaceholderArguments < Arguments
+ def foo(a, b:, **options)
+ super
+ end
+ end
+
+ class OptionalAndPlaceholderArguments < Arguments
+ def foo(a, c: 'c', **options)
+ super
+ end
+ end
+
+ # -----
+
+ class RequiredAndOptionalAndPlaceholderArguments < Arguments
+ def foo(a, b:, c: 'c', **options)
+ super
+ end
+ end
+ end
+
+ module SplatAndKeywords
+ class Arguments
+ def foo(*args, **options)
+ [args, options]
+ end
+ end
+
+ class AllArguments < Arguments
+ def foo(*args, **options)
+ super
+ end
+ end
+ end
+
+ module FromBasicObject
+ def __send__(name, *args, &block)
+ super
+ end
+ end
+
+ module IntermediateBasic
+ include FromBasicObject
+ end
+
+ class IncludesFromBasic
+ include FromBasicObject
+
+ def foobar; 43; end
+ end
+
+ class IncludesIntermediate
+ include IntermediateBasic
+
+ def foobar; 42; end
+ end
+
+ module SingletonCase
+ class Base
+ def foobar(array)
+ array << :base
+ end
+ end
+
+ class Foo < Base
+ def foobar(array)
+ array << :foo
+ super
+ end
+ end
+ end
+
+ module SingletonAliasCase
+ class Base
+ def foobar(array)
+ array << :base
+ end
+
+ def alias_on_singleton
+ object = self
+ singleton = (class << object; self; end)
+ singleton.__send__(:alias_method, :new_foobar, :foobar)
+ end
+ end
+
+ class Foo < Base
+ def foobar(array)
+ array << :foo
+ super
+ end
+ end
+ end
+end
diff --git a/spec/ruby/language/fixtures/utf16-be-nobom.rb b/spec/ruby/language/fixtures/utf16-be-nobom.rb
new file mode 100644
index 0000000000..99e2ce8ce8
--- /dev/null
+++ b/spec/ruby/language/fixtures/utf16-be-nobom.rb
Binary files differ
diff --git a/spec/ruby/language/fixtures/utf16-le-nobom.rb b/spec/ruby/language/fixtures/utf16-le-nobom.rb
new file mode 100644
index 0000000000..98de9697ca
--- /dev/null
+++ b/spec/ruby/language/fixtures/utf16-le-nobom.rb
Binary files differ
diff --git a/spec/ruby/language/fixtures/utf8-bom.rb b/spec/ruby/language/fixtures/utf8-bom.rb
new file mode 100644
index 0000000000..50c223a922
--- /dev/null
+++ b/spec/ruby/language/fixtures/utf8-bom.rb
@@ -0,0 +1,2 @@
+# encoding: utf-8
+puts 'hello'
diff --git a/spec/ruby/language/fixtures/utf8-nobom.rb b/spec/ruby/language/fixtures/utf8-nobom.rb
new file mode 100644
index 0000000000..75f5563b95
--- /dev/null
+++ b/spec/ruby/language/fixtures/utf8-nobom.rb
@@ -0,0 +1,2 @@
+# encoding: utf-8
+puts 'hello'
diff --git a/spec/ruby/language/fixtures/variables.rb b/spec/ruby/language/fixtures/variables.rb
new file mode 100644
index 0000000000..527caa7a78
--- /dev/null
+++ b/spec/ruby/language/fixtures/variables.rb
@@ -0,0 +1,157 @@
+module VariablesSpecs
+ class ParAsgn
+ attr_accessor :x
+
+ def initialize
+ @x = 0
+ end
+
+ def inc
+ @x += 1
+ end
+
+ def to_ary
+ [1,2,3,4]
+ end
+ end
+
+ class OpAsgn
+ attr_accessor :a, :b, :side_effect
+
+ def do_side_effect
+ self.side_effect = true
+ return @a
+ end
+
+ def do_more_side_effects
+ @a += 5
+ self
+ end
+
+ def do_bool_side_effects
+ @b += 1
+ self
+ end
+ end
+
+ class Hashalike
+ def [](k) k end
+ def []=(k, v) [k, v] end
+ end
+
+ def self.reverse_foo(a, b)
+ return b, a
+ end
+
+ class ArrayLike
+ def initialize(array)
+ @array = array
+ end
+
+ def to_a
+ @array
+ end
+ end
+
+ class ArraySubclass < Array
+ end
+
+ class PrivateMethods
+ private
+
+ def to_ary
+ [1, 2]
+ end
+
+ def to_a
+ [3, 4]
+ end
+ end
+
+ class ToAryNil
+ def to_ary
+ end
+ end
+
+ class Chain
+ def self.without_parenthesis a
+ a
+ end
+ end
+
+ def self.false
+ false
+ end
+
+ class EvalOrder
+ attr_reader :order
+
+ def initialize
+ @order = []
+ end
+
+ def reset
+ @order = []
+ end
+
+ def foo
+ self << "foo"
+ FooClass.new(self)
+ end
+
+ def bar
+ self << "bar"
+ BarClass.new(self)
+ end
+
+ def a
+ self << "a"
+ end
+
+ def b
+ self << "b"
+ end
+
+ def node
+ self << "node"
+
+ node = Node.new
+ node.left = Node.new
+ node.left.right = Node.new
+
+ node
+ end
+
+ def <<(value)
+ order << value
+ end
+
+ class FooClass
+ attr_reader :evaluator
+
+ def initialize(evaluator)
+ @evaluator = evaluator
+ end
+
+ def []=(_index, _value)
+ evaluator << "foo[]="
+ end
+ end
+
+ class BarClass
+ attr_reader :evaluator
+
+ def initialize(evaluator)
+ @evaluator = evaluator
+ end
+
+ def baz=(_value)
+ evaluator << "bar.baz="
+ end
+ end
+
+ class Node
+ attr_accessor :left, :right
+ end
+ end
+end
diff --git a/spec/ruby/language/fixtures/vim_magic_comment.rb b/spec/ruby/language/fixtures/vim_magic_comment.rb
new file mode 100644
index 0000000000..60cbe7a3bf
--- /dev/null
+++ b/spec/ruby/language/fixtures/vim_magic_comment.rb
@@ -0,0 +1,2 @@
+# vim: filetype=ruby, fileencoding=big5, tabsize=3, shiftwidth=3
+$magic_comment_result = __ENCODING__.name
diff --git a/spec/ruby/language/fixtures/yield.rb b/spec/ruby/language/fixtures/yield.rb
new file mode 100644
index 0000000000..9f7a2ba238
--- /dev/null
+++ b/spec/ruby/language/fixtures/yield.rb
@@ -0,0 +1,41 @@
+module YieldSpecs
+ class Yielder
+ def z
+ yield
+ end
+
+ def ze(&block)
+ block = proc { block }
+ yield
+ end
+
+ def s(a)
+ yield(a)
+ end
+
+ def m(a, b, c)
+ yield(a, b, c)
+ end
+
+ def r(a)
+ yield(*a)
+ end
+
+ def k(a)
+ yield(*a, b: true)
+ end
+
+ def rs(a, b, c)
+ yield(a, b, *c)
+ end
+
+ def self.define_deep(&inned_block)
+ define_method 'deep' do |v|
+ # should yield to inner_block
+ yield v
+ end
+ end
+
+ define_deep { |v| v * 2}
+ end
+end