Skip to content

Commit e3e149e

Browse files
committed
Add Module#refinements.
1 parent 816500f commit e3e149e

File tree

5 files changed

+32
-5
lines changed

5 files changed

+32
-5
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ Compatibility:
2525
* Add optional `timeout` argument to `Thread::Queue#pop` (#3039, @itarato).
2626
* Add optional `timeout` argument to `Thread::SizedsQueue#pop` (#3039, @itarato).
2727
* Handle `long long` and aliases in `Fiddle` (#3128, @eregon).
28+
* Add `Module#refinements` (#3039, @itarato).
2829

2930
Performance:
3031

spec/tags/truffle/methods_tags.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,3 +114,4 @@ fails:Public methods on UnboundMethod should include private?
114114
fails:Public methods on UnboundMethod should include protected?
115115
fails:Public methods on UnboundMethod should include public?
116116
fails:Public methods on String should not include bytesplice
117+
fails:Public methods on Module should not include refinements

spec/truffleruby.next-specs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,5 @@ spec/ruby/core/queue/shift_spec.rb
2929
spec/ruby/core/sizedqueue/deq_spec.rb
3030
spec/ruby/core/sizedqueue/pop_spec.rb
3131
spec/ruby/core/sizedqueue/shift_spec.rb
32+
33+
spec/ruby/core/module/refinements_spec.rb

src/main/java/org/truffleruby/core/module/ModuleNodes.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
package org.truffleruby.core.module;
1111

1212
import java.util.ArrayList;
13+
import java.util.Collections;
1314
import java.util.HashMap;
1415
import java.util.HashSet;
1516
import java.util.LinkedHashSet;
@@ -37,7 +38,6 @@
3738
import org.truffleruby.builtins.CoreMethodArrayArgumentsNode;
3839
import org.truffleruby.builtins.CoreMethodNode;
3940
import org.truffleruby.annotations.CoreModule;
40-
import org.truffleruby.builtins.NonStandard;
4141
import org.truffleruby.annotations.Primitive;
4242
import org.truffleruby.builtins.PrimitiveArrayArgumentsNode;
4343
import org.truffleruby.builtins.PrimitiveNode;
@@ -2324,7 +2324,6 @@ protected RubyArray usedModules() {
23242324

23252325
}
23262326

2327-
@NonStandard
23282327
@CoreMethod(names = "used_refinements", onSingleton = true)
23292328
public abstract static class UsedRefinementsNode extends CoreMethodArrayArgumentsNode {
23302329

@@ -2335,15 +2334,24 @@ protected RubyArray usedRefinements() {
23352334
final DeclarationContext declarationContext = RubyArguments.getDeclarationContext(frame);
23362335
final Set<RubyModule> refinements = new HashSet<>();
23372336
for (RubyModule[] refinementModules : declarationContext.getRefinements().values()) {
2338-
for (RubyModule refinementModule : refinementModules) {
2339-
refinements.add(refinementModule);
2340-
}
2337+
Collections.addAll(refinements, refinementModules);
23412338
}
23422339
return createArray(refinements.toArray());
23432340
}
23442341

23452342
}
23462343

2344+
@CoreMethod(names = "refinements")
2345+
public abstract static class RefinementsNode extends CoreMethodArrayArgumentsNode {
2346+
2347+
@TruffleBoundary
2348+
@Specialization
2349+
protected RubyArray refinements(RubyModule self) {
2350+
return createArray(self.fields.getRefinements().values().toArray());
2351+
}
2352+
2353+
}
2354+
23472355
@GenerateUncached
23482356
@ImportStatic(ArrayGuards.class)
23492357
public abstract static class SetMethodVisibilityNode extends RubyBaseNode {

test/mri/tests/ruby/test_refinement.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1835,6 +1835,21 @@ def test_used_modules
18351835
assert_equal [ref::RefB, ref::RefA], ref::Combined::USED_MODS
18361836
end
18371837

1838+
def test_refinements
1839+
int_refinement = nil
1840+
str_refinement = nil
1841+
m = Module.new {
1842+
refine Integer do
1843+
int_refinement = self
1844+
end
1845+
1846+
refine String do
1847+
str_refinement = self
1848+
end
1849+
}
1850+
assert_equal([int_refinement, str_refinement], m.refinements)
1851+
end
1852+
18381853
def test_warn_setconst_in_refinmenet
18391854
bug10103 = '[ruby-core:64143] [Bug #10103]'
18401855
warnings = [

0 commit comments

Comments
 (0)