Skip to content

Commit

Permalink
bug(objectionary#3845): fix packs
Browse files Browse the repository at this point in the history
  • Loading branch information
maxonfjvipon committed Jan 27, 2025
1 parent 2a985cc commit e1ffe6c
Show file tree
Hide file tree
Showing 59 changed files with 241 additions and 165 deletions.
26 changes: 13 additions & 13 deletions eo-parser/src/main/java/org/eolang/parser/EoSyntax.java
Original file line number Diff line number Diff line change
Expand Up @@ -61,19 +61,19 @@ public final class EoSyntax implements Syntax {
private static final Function<XML, XML> CANONICAL = new Xsline(
new TrFull(
new TrClasspath<>(
"/org/eolang/parser/parse/move-voids-up.xsl",
"/org/eolang/parser/parse/validate-before-stars.xsl",
"/org/eolang/parser/parse/resolve-before-stars.xsl",
"/org/eolang/parser/parse/wrap-method-calls.xsl",
"/org/eolang/parser/parse/const-to-dataized.xsl",
"/org/eolang/parser/parse/stars-to-tuples.xsl",
"/org/eolang/parser/parse/vars-float-up.xsl",
"/org/eolang/parser/parse/build-fqns.xsl",
"/org/eolang/parser/parse/expand-qqs.xsl",
"/org/eolang/parser/parse/expand-aliases.xsl",
"/org/eolang/parser/parse/resolve-aliases.xsl",
"/org/eolang/parser/parse/add-default-package.xsl",
"/org/eolang/parser/parse/explicit-data.xsl",
"/org/eolang/parser/parse/move-voids-up.xsl", //
"/org/eolang/parser/parse/validate-before-stars.xsl", //
"/org/eolang/parser/parse/resolve-before-stars.xsl", //
"/org/eolang/parser/parse/wrap-method-calls.xsl", //
"/org/eolang/parser/parse/const-to-dataized.xsl", //
"/org/eolang/parser/parse/stars-to-tuples.xsl", //
"/org/eolang/parser/parse/vars-float-up.xsl", //
"/org/eolang/parser/parse/build-fqns.xsl", //
"/org/eolang/parser/parse/expand-qqs.xsl", //
"/org/eolang/parser/parse/expand-aliases.xsl", //
"/org/eolang/parser/parse/resolve-aliases.xsl", //
"/org/eolang/parser/parse/add-default-package.xsl", //
"/org/eolang/parser/parse/explicit-data.xsl", //
"/org/eolang/parser/parse/roll-bases.xsl"
).back()
)
Expand Down
14 changes: 7 additions & 7 deletions eo-parser/src/main/java/org/eolang/parser/XeEoListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -449,7 +449,7 @@ public void enterApplicable(final EoParser.ApplicableContext ctx) {
this.startObject(ctx);
final String base;
if (ctx.STAR() != null) {
base = "tuple";
base = "Q.org.eolang.tuple";
this.objects.prop("star");
} else if (ctx.NAME() != null) {
base = ctx.NAME().getText();
Expand Down Expand Up @@ -971,7 +971,7 @@ public void enterBeginner(final EoParser.BeginnerContext ctx) {
if (ctx.XI() != null) {
base = "$";
} else if (ctx.STAR() != null) {
base = "tuple";
base = "Q.org.eolang.tuple";
this.objects.prop("star");
} else if (ctx.ROOT() != null) {
base = "Q";
Expand Down Expand Up @@ -1122,33 +1122,33 @@ public void enterData(final EoParser.DataContext ctx) {
final String base;
final String text = ctx.getText();
if (ctx.BYTES() != null) {
base = "bytes";
base = "Q.org.eolang.bytes";
data = () -> text.replaceAll("\\s+", "").trim();
} else if (ctx.FLOAT() != null || ctx.INT() != null) {
base = "number";
base = "Q.org.eolang.number";
data = new BytesToHex(
ByteBuffer
.allocate(Double.BYTES)
.putDouble(Double.parseDouble(text))
.array()
);
} else if (ctx.HEX() != null) {
base = "number";
base = "Q.org.eolang.number";
data = new BytesToHex(
ByteBuffer
.allocate(Double.BYTES)
.putDouble(((Long) Long.parseLong(text.substring(2), 16)).doubleValue())
.array()
);
} else if (ctx.STRING() != null) {
base = "string";
base = "Q.org.eolang.string";
data = new BytesToHex(
StringEscapeUtils.unescapeJava(
text.substring(1, text.length() - 1)
).getBytes(StandardCharsets.UTF_8)
);
} else {
base = "string";
base = "Q.org.eolang.string";
final int indent = ctx.getStart().getCharPositionInLine();
data = new BytesToHex(
StringEscapeUtils.unescapeJava(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ SOFTWARE.
<xsl:attribute name="line" select="@line"/>
<xsl:attribute name="pos" select="@pos + 8"/>
<xsl:element name="o">
<xsl:attribute name="base" select="'org.eolang.dataized'"/>
<xsl:attribute name="base" select="'Q.org.eolang.dataized'"/>
<xsl:element name="o">
<xsl:for-each select="@*[name()!='const' and name()!='name']">
<xsl:attribute name="{name()}">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,16 @@ SOFTWARE.
<xsl:output encoding="UTF-8" method="xml"/>
<xsl:template match="o[@base='QQ']">
<xsl:copy>
<xsl:attribute name="base">
<xsl:text>Q.org.eolang</xsl:text>
</xsl:attribute>
<xsl:apply-templates select="@* except @base"/>
<xsl:apply-templates select="node()"/>
<xsl:attribute name="base">.eolang</xsl:attribute>
<xsl:copy-of select="@*[name()!='base']"/>
<xsl:element name="o">
<xsl:attribute name="base">.org</xsl:attribute>
<xsl:copy-of select="@*[name()!='base']"/>
<xsl:element name="o">
<xsl:attribute name="base">Q</xsl:attribute>
<xsl:copy-of select="@*[name()!='base']"/>
</xsl:element>
</xsl:element>
</xsl:copy>
</xsl:template>
<xsl:template match="meta/*[text()[matches(., '^QQ\..*')]]">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ SOFTWARE.
<xsl:apply-templates select="."/>
</xsl:for-each>
<xsl:element name="o">
<xsl:attribute name="base" select="'tuple'"/>
<xsl:attribute name="base" select="'Q.org.eolang.tuple'"/>
<xsl:attribute name="star"/>
<xsl:for-each select="o[position() &gt; $before]">
<xsl:apply-templates select="."/>
Expand Down
43 changes: 31 additions & 12 deletions eo-parser/src/main/resources/org/eolang/parser/parse/roll-bases.xsl
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,6 @@ SOFTWARE.
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:eo="https://www.eolang.org" id="roll-bases" version="2.0">
<!--
This XSL rolls ONE reversed object dispatch into single base.
To get all the dispatches rolled up you need to apply the transformation
multiple times until it makes no effect.
- <o base=".org">
<o base="Q"/> => <o base="org"/>
Expand All @@ -40,16 +37,23 @@ SOFTWARE.
- <o base=".seq">
<o base="org.eolang"/> => <o base="org.eolang.seq"/>
</o>
- <o base=".seq">
<o base=".eolang">
<o base=".org">
<o base="Q"/> => <o base="Q.org.eolang.seq"/>
</o>
</o>
</o>
-->
<xsl:output encoding="UTF-8" method="xml"/>
<xsl:import href="/org/eolang/parser/_funcs.xsl"/>
<xsl:template match="o[starts-with(@base, '.')]">
<xsl:variable name="first" select="o[1]"/>
<xsl:choose>
<!--
.x
.y
Process .y
x.
y.
Process y.
-->
<xsl:when test="starts-with($first/@base, '.')">
<xsl:variable name="argument" as="element()">
Expand All @@ -58,8 +62,8 @@ SOFTWARE.
<xsl:choose>
<!--
Left as
.x
.y
x.
y.
Copy as is
-->
<xsl:when test="starts-with($argument/@base, '.')">
Expand All @@ -71,7 +75,7 @@ SOFTWARE.
</xsl:when>
<!--
Changed to
.x
x.
z.y
Try to roll again
-->
Expand All @@ -83,7 +87,22 @@ SOFTWARE.
</xsl:choose>
</xsl:when>
<!--
.x
x.
[]
Leave as is
-->
<xsl:when test="not(exists($first/@base))">
<xsl:element name="o">
<xsl:apply-templates select="@*"/>
<xsl:element name="o">
<xsl:apply-templates select="$first/@*"/>
<xsl:apply-templates select="$first/node()"/>
</xsl:element>
<xsl:apply-templates select="node()[position()&gt;1]"/>
</xsl:element>
</xsl:when>
<!--
x.
y
-->
<xsl:otherwise>
Expand All @@ -98,7 +117,7 @@ SOFTWARE.
<xsl:param name="arg"/>
<xsl:choose>
<!--
.x
x.
y
z
No rolling because of argument
Expand All @@ -117,7 +136,7 @@ SOFTWARE.
</xsl:element>
</xsl:when>
<!--
.x
x.
y
Roll into y.x
-->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ SOFTWARE.
<xsl:attribute name="base" select="'.empty'"/>
<xsl:apply-templates select="@* except (@star | @base)"/>
<xsl:element name="o">
<xsl:attribute name="base" select="'tuple'"/>
<xsl:attribute name="base" select="'Q.org.eolang.tuple'"/>
</xsl:element>
</xsl:element>
</xsl:otherwise>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ SOFTWARE.
-->
<xsl:import href="/org/eolang/parser/_funcs.xsl"/>
<xsl:output encoding="UTF-8" method="xml"/>
<xsl:template match="o[@base='.as-bytes' and o[position()=1 and @base='org.eolang.dataized']]">
<xsl:template match="o[@base='.as-bytes' and o[position()=1 and @base='Q.org.eolang.dataized']]">
<xsl:variable name="argument" select="o[position()=1]/o[1]"/>
<xsl:choose>
<xsl:when test="exists($argument) and not(exists($argument/@name))">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,17 +27,24 @@ SOFTWARE.
Performs the reverse operation of "/org/eolang/parser/stars-to-tuples.xsl"
-->
<xsl:output encoding="UTF-8" method="xml"/>
<xsl:template match="o[@base='.empty' and o[1][@base='tuple' or @base='org.eolang.tuple']]">
<xsl:template match="o[@base='Q.org.eolang.tuple.empty' and not(@star)]">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
<xsl:attribute name="star"/>
</xsl:copy>
</xsl:template>
<xsl:template match="o[@base='Q.org.eolang.tuple.empty.with']">
<xsl:element name="o">
<xsl:attribute name="star"/>
<xsl:attribute name="base" select="'tuple'"/>
<xsl:attribute name="base" select="'Q.org.eolang.tuple'"/>
<xsl:apply-templates select="@* except @base"/>
<xsl:apply-templates select="node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="o[@base='.with' and o[1][@star]]">
<xsl:element name="o">
<xsl:attribute name="star"/>
<xsl:attribute name="base" select="'tuple'"/>
<xsl:attribute name="base" select="'Q.org.eolang.tuple'"/>
<xsl:apply-templates select="@* except @base"/>
<xsl:copy-of select="o[@star]/o"/>
<xsl:copy-of select="o[not(@star)]"/>
Expand Down
27 changes: 22 additions & 5 deletions eo-parser/src/test/java/org/eolang/parser/EoSyntaxTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
import com.jcabi.matchers.XhtmlMatchers;
import com.jcabi.xml.XML;
import com.jcabi.xml.XMLDocument;
import com.yegor256.xsline.Shift;
import com.yegor256.xsline.TrDefault;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
Expand All @@ -39,7 +38,7 @@
import org.cactoos.text.TextOf;
import org.eolang.jucs.ClasspathSource;
import org.eolang.xax.XtSticky;
import org.eolang.xax.XtStrict;
import org.eolang.xax.XtStrictAfter;
import org.eolang.xax.XtYaml;
import org.eolang.xax.Xtory;
import org.eolang.xax.XtoryMatcher;
Expand Down Expand Up @@ -310,18 +309,36 @@ void checksTypoPacks(final String yaml) {

@ParameterizedTest
@ClasspathSource(value = "org/eolang/parser/eo-packs/", glob = "**.yaml")
void checksEoPacks(final String yaml) {
void checksEoTransformations(final String yaml) {
MatcherAssert.assertThat(
"passed without exceptions",
new XtSticky(
new XtStrict(
new XtStrictAfter(
new XtYaml(
yaml,
eo -> new EoSyntax(
"scenario",
String.format("%s\n", eo),
new TrDefault<>()
).parsed()
).parsed(),
new TrFull()
)
)
),
new XtoryMatcher()
);
}

@ParameterizedTest
@ClasspathSource(value = "org/eolang/parser/eo-syntax/", glob = "**.yaml")
void validatesEoSyntax(final String yaml) {
MatcherAssert.assertThat(
"passed without exceptions",
new XtSticky(
new XtSticky(
new XtYaml(
yaml,
eo -> new EoSyntax("scenario", String.format("%s\n", eo)).parsed()
)
)
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,18 +21,16 @@
# SOFTWARE.
---
sheets:
- /org/eolang/parser/shake/cti-adds-errors.xsl
- /org/eolang/parser/shake/vars-float-up.xsl
- /org/eolang/parser/shake/build-fqns.xsl
- /org/eolang/parser/shake/expand-qqs.xsl
- /org/eolang/parser/shake/add-probes.xsl
- /org/eolang/parser/shake/expand-aliases.xsl
- /org/eolang/parser/shake/resolve-aliases.xsl
- /org/eolang/parser/shake/add-default-package.xsl
- /org/eolang/parser/parse/wrap-method-calls.xsl
- /org/eolang/parser/parse/vars-float-up.xsl
- /org/eolang/parser/parse/expand-qqs.xsl
- /org/eolang/parser/parse/expand-aliases.xsl
- /org/eolang/parser/parse/resolve-aliases.xsl
- /org/eolang/parser/parse/add-default-package.xsl
asserts:
- /program[not(errors)]
- /program/objects[count(o)=1]
- //o[@base='org.eolang.and' and @line='9']
- //o[@base='Q.org.eolang.and' and @line='9']
- //o[@base='foo']
- //o[@base='$']
- //o[@base='^']
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,10 @@
# SOFTWARE.
---
sheets:
- /org/eolang/parser/shake/vars-float-up.xsl
- /org/eolang/parser/shake/build-fqns.xsl
- /org/eolang/parser/parse/wrap-method-calls.xsl
- /org/eolang/parser/parse/const-to-dataized.xsl
- /org/eolang/parser/parse/vars-float-up.xsl
- /org/eolang/parser/parse/build-fqns.xsl
asserts:
- /program[not(errors)]
- /program/objects[count(o)=3]
Expand All @@ -31,14 +33,14 @@ asserts:
- /program/objects/o[@name='first']/o[@base='stdout' and @name='std']/o[@base='.x']/o[@base='$']
- /program/objects/o[@name='first']/o[@name='second']/o[@base='.std']/o[1][@base='$']
- /program/objects/o[@name='first']/o[@name='second']/o[@base='.std']/o[2][@base='.x']/o[1][@base='^']
- /program/objects/o[@name='first']/o[@name='second']/o[@name='third']/o[@base='number' and @name='x' and text()!='']
- /program/objects/o[@name='first']/o[@name='second']/o[@name='third']/o[@base='Q.org.eolang.number' and @name='x' and text()!='']
- /program/objects/o[@name='first']/o[@name='second']/o[@name='third']/o[@base='.plus']/o[1][@base='.x']/o[1][@base='$']
- /program/objects/o[@name='first']/o[@name='second']/o[@name='third']/o[@base='.plus']/o[2][@base='.y']/o[1][@base='.^']/o[1][@base='^']
- /program/objects/o[@name='first']/o[@name='second']/o[@name='third']/o[@base='.std']/o[1][@base='^']
- /program/objects/o[@name='first']/o[@name='second']/o[@name='third']/o[@base='.std']/o[2][@base='qwe']
- /program/objects/o[@name='first']/o[@name='second']/o[@name='third']/o[@base='.third']/o[1][@base='^']
- /program/objects/o[@name='first']/o[@name='second']/o[@name='third']/o[@base='.third']/o[2][@base='.bar']/o[@base='.examples']/o[@base='.org']/o[@base='Q']
- /program/objects/o[@name='first']/o[@name='second']/o[@name='fourth']/o[@base='string' and @name='inner']
- /program/objects/o[@name='first']/o[@name='second']/o[@name='fourth']/o[@base='Q.org.eolang.string' and @name='inner']
- /program/objects/o[@name='first']/o[@name='second']/o[@name='fourth']/o[@base='.inner' and @name='outer']/o[1][@base='^']
- /program/objects/o[@name='first']/o[@name='second']/o[@name='fourth']/o[@base='.inner' and @name='self']/o[1][@base='$']
input: |-
Expand Down
Loading

0 comments on commit e1ffe6c

Please sign in to comment.