diff --git a/eo-runtime/src/main/java/org/eolang/AtComposite.java b/eo-runtime/src/main/java/org/eolang/AtComposite.java index 12f1d4237e..f71b273363 100644 --- a/eo-runtime/src/main/java/org/eolang/AtComposite.java +++ b/eo-runtime/src/main/java/org/eolang/AtComposite.java @@ -65,7 +65,7 @@ public Phi get() { } @Override - public void put(final Phi phi) { + public void put(final int pos, final Phi phi) { throw new ExReadOnly( "Can't overwrite lambda expression" ); diff --git a/eo-runtime/src/main/java/org/eolang/AtLogged.java b/eo-runtime/src/main/java/org/eolang/AtLogged.java index 5e878b3a91..4dda88cfa9 100644 --- a/eo-runtime/src/main/java/org/eolang/AtLogged.java +++ b/eo-runtime/src/main/java/org/eolang/AtLogged.java @@ -87,9 +87,9 @@ public Phi get() { } @Override - public void put(final Phi src) { + public void put(final int pos, final Phi src) { this.log.info(String.format(" %s.put()...\n", this.owner)); - this.origin.put(src); + this.origin.put(pos, src); this.log.info(String.format(" %s.put()!\n", this.owner)); } } diff --git a/eo-runtime/src/main/java/org/eolang/AtOnce.java b/eo-runtime/src/main/java/org/eolang/AtOnce.java index bc19bdc183..d130229aaf 100644 --- a/eo-runtime/src/main/java/org/eolang/AtOnce.java +++ b/eo-runtime/src/main/java/org/eolang/AtOnce.java @@ -70,7 +70,7 @@ public Phi get() { } @Override - public void put(final Phi phi) { + public void put(final int pos, final Phi phi) { throw new ExReadOnly( String.format( "Can't overwrite the \"%s\" attribute", diff --git a/eo-runtime/src/main/java/org/eolang/AtRho.java b/eo-runtime/src/main/java/org/eolang/AtRho.java index 89a99de2ae..dbcf229c54 100644 --- a/eo-runtime/src/main/java/org/eolang/AtRho.java +++ b/eo-runtime/src/main/java/org/eolang/AtRho.java @@ -70,7 +70,7 @@ public Phi get() { } @Override - public void put(final Phi phi) { + public void put(final int pos, final Phi phi) { if (this.rho.get() == null) { this.rho.set(phi); } diff --git a/eo-runtime/src/main/java/org/eolang/AtVoid.java b/eo-runtime/src/main/java/org/eolang/AtVoid.java index 2a1ec38c25..4cf0ddc9ca 100644 --- a/eo-runtime/src/main/java/org/eolang/AtVoid.java +++ b/eo-runtime/src/main/java/org/eolang/AtVoid.java @@ -89,7 +89,7 @@ public Phi get() { } @Override - public void put(final Phi phi) { + public void put(final int pos, final Phi phi) { if (this.object.get() == null) { this.object.set(phi); } else { diff --git a/eo-runtime/src/main/java/org/eolang/AtWithRho.java b/eo-runtime/src/main/java/org/eolang/AtWithRho.java index bb25fffa51..1d9d50dae1 100644 --- a/eo-runtime/src/main/java/org/eolang/AtWithRho.java +++ b/eo-runtime/src/main/java/org/eolang/AtWithRho.java @@ -68,7 +68,7 @@ public Phi get() { } @Override - public void put(final Phi phi) { - this.origin.put(phi); + public void put(final int pos, final Phi phi) { + this.origin.put(pos, phi); } } diff --git a/eo-runtime/src/main/java/org/eolang/Attr.java b/eo-runtime/src/main/java/org/eolang/Attr.java index c1958c4074..a95969025d 100644 --- a/eo-runtime/src/main/java/org/eolang/Attr.java +++ b/eo-runtime/src/main/java/org/eolang/Attr.java @@ -65,7 +65,8 @@ public interface Attr { /** * Put a new object in. * + * @param pos The position * @param phi The object to put */ - void put(Phi phi); + void put(int pos, Phi phi); } diff --git a/eo-runtime/src/main/java/org/eolang/PhDefault.java b/eo-runtime/src/main/java/org/eolang/PhDefault.java index 4de4f93877..f176a036da 100644 --- a/eo-runtime/src/main/java/org/eolang/PhDefault.java +++ b/eo-runtime/src/main/java/org/eolang/PhDefault.java @@ -140,11 +140,15 @@ public boolean hasRho() { @Override public void put(final int pos, final Phi object) { - this.put(this.attr(pos), object); + this.attrObject(this.attr(pos), object).put(pos, object); } @Override public void put(final String name, final Phi object) { + this.attrObject(name, object).put(0, object); + } + + private Attr attrObject(final String name, final Phi object) { if (!this.attrs.containsKey(name)) { throw new ExUnset( String.format( @@ -153,7 +157,7 @@ public void put(final String name, final Phi object) { ) ); } - this.attrs.get(name).put(object); + return this.attrs.get(name); } @Override diff --git a/eo-runtime/src/test/java/org/eolang/AtEnvelope.java b/eo-runtime/src/test/java/org/eolang/AtEnvelope.java index 6b28f01286..7d15ae8948 100644 --- a/eo-runtime/src/test/java/org/eolang/AtEnvelope.java +++ b/eo-runtime/src/test/java/org/eolang/AtEnvelope.java @@ -56,7 +56,7 @@ public Phi get() { } @Override - public void put(final Phi phi) { - this.origin.put(phi); + public void put(final int pos, final Phi phi) { + this.origin.put(pos, phi); } } diff --git a/eo-runtime/src/test/java/org/eolang/PhDefaultTest.java b/eo-runtime/src/test/java/org/eolang/PhDefaultTest.java index 1addd5b097..ba6686591e 100644 --- a/eo-runtime/src/test/java/org/eolang/PhDefaultTest.java +++ b/eo-runtime/src/test/java/org/eolang/PhDefaultTest.java @@ -23,6 +23,7 @@ */ package org.eolang; +import EOorg.EOeolang.EOnumber; import com.yegor256.Together; import java.security.SecureRandom; import org.cactoos.set.SetOf; @@ -488,6 +489,19 @@ void doesNotCalculateRandomTwice() { ); } + @Test + void failsCorrectlyWhenTooManyAttributesPut() { + MatcherAssert.assertThat( + "the message explains what's going on", + Assertions.assertThrows( + ExAbstract.class, + () -> new EOnumber().put(1, new Data.ToPhi(1)), + "fails when trying to set attribute with too big position" + ).getMessage(), + Matchers.equalTo("There are no void attributes left, can't set the 1st one") + ); + } + /** * Rnd. * @since 0.1.0