From af4ee415591156207891bbffa98baefa58f6703f Mon Sep 17 00:00:00 2001 From: h1alexbel Date: Thu, 25 Sep 2025 21:22:17 +0200 Subject: [PATCH 1/2] bug(#4529): add XSL transformation to convert local objects to aliases for better package management --- .../main/java/org/eolang/maven/MjParse.java | 37 +++++++++++++++++++ .../eolang/maven/parse/locals-to-aliases.xsl | 29 +++++++++++++++ .../java/org/eolang/maven/MjParseTest.java | 27 ++++++++++++++ 3 files changed, 93 insertions(+) create mode 100644 eo-maven-plugin/src/main/resources/org/eolang/maven/parse/locals-to-aliases.xsl diff --git a/eo-maven-plugin/src/main/java/org/eolang/maven/MjParse.java b/eo-maven-plugin/src/main/java/org/eolang/maven/MjParse.java index a7cf271d536..b2376c4ed5d 100644 --- a/eo-maven-plugin/src/main/java/org/eolang/maven/MjParse.java +++ b/eo-maven-plugin/src/main/java/org/eolang/maven/MjParse.java @@ -9,6 +9,8 @@ import com.jcabi.log.Logger; import com.jcabi.xml.XML; import com.jcabi.xml.XMLDocument; +import com.jcabi.xml.XSL; +import com.jcabi.xml.XSLDocument; import java.io.FileNotFoundException; import java.io.IOException; import java.nio.file.Path; @@ -20,6 +22,7 @@ import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.ResolutionScope; import org.cactoos.io.InputOf; +import org.cactoos.io.ResourceOf; import org.cactoos.iterable.Filtered; import org.cactoos.text.TextOf; import org.eolang.parser.EoSyntax; @@ -113,6 +116,7 @@ private int parsed(final TjForeign tojo) throws Exception { this.cacheEnabled ).apply(source, target) ).withVersion(MjParse.version(target, refs)); + this.optimized(target); final List errors = new Xnav(target) .element("object") .element("errors") @@ -134,6 +138,39 @@ private int parsed(final TjForeign tojo) throws Exception { return 1; } + private Path optimized(final Path source) throws Exception { + final XML transformed = new XSLDocument( + new ResourceOf( + "org/eolang/maven/parse/locals-to-aliases.xsl" + ).stream() + ).transform(new XMLDocument(source)); + System.out.println(transformed); + // 3. get reserved.csv from lints' classpath + // 4. we should supply all home objects to variable + + + + +// final Xnav xmir = new Xnav(source); +// final String pkg = xmir.strict("/object/metas/meta[head='package']/tail", 1) +// .findFirst() +// .get() +// .text() +// .get(); +// xmir.path("//o[@base and starts-with(@base, 'Φ.')]").forEach( +// new Consumer() { +// @Override +// public void accept(final Xnav o) { +// final String base = o.attribute("base").text().get(); +// // if not QQ, then check the presence in the local package +// System.out.println(pkg); +// System.out.println(base.substring(base.lastIndexOf('.') + 1)); +// } +// } +// ); + return null; + } + /** * Source parsed to {@link Node}. * @param source Relative source path diff --git a/eo-maven-plugin/src/main/resources/org/eolang/maven/parse/locals-to-aliases.xsl b/eo-maven-plugin/src/main/resources/org/eolang/maven/parse/locals-to-aliases.xsl new file mode 100644 index 00000000000..dcc7a7bd2c4 --- /dev/null +++ b/eo-maven-plugin/src/main/resources/org/eolang/maven/parse/locals-to-aliases.xsl @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + alias + + + + + + + + diff --git a/eo-maven-plugin/src/test/java/org/eolang/maven/MjParseTest.java b/eo-maven-plugin/src/test/java/org/eolang/maven/MjParseTest.java index d34d44e20b5..1ce3d5b9522 100644 --- a/eo-maven-plugin/src/test/java/org/eolang/maven/MjParseTest.java +++ b/eo-maven-plugin/src/test/java/org/eolang/maven/MjParseTest.java @@ -5,6 +5,7 @@ package org.eolang.maven; import com.jcabi.matchers.XhtmlMatchers; +import com.jcabi.xml.XML; import com.jcabi.xml.XMLDocument; import com.yegor256.Mktmp; import com.yegor256.MktmpResolver; @@ -283,6 +284,32 @@ void parsesWithTargetCache(@Mktmp final Path temp) throws IOException { ); } + @Test + void convertsLocalObjectsToAliases(@Mktmp final Path temp) throws IOException { + MatcherAssert.assertThat( + "Local object is not converted to alias, but it should", + new XMLDocument( + new FakeMaven(temp) + .withProgram( + String.join( + "\n", + "+package foo", + "", + "[] > x", + " bar 42 > @" + ), + "foo.x" + ) + .execute(new FakeMaven.Parse()) + .result() + .get("target/1-parse/foo/x.xmir") + ), + XhtmlMatchers.hasXPath( + "/object/metas/meta[head='alias' and part='foo.bar' and tail='foo.bar']" + ) + ); + } + /** * The mojo that does nothing, but executes infinitely. * @since 0.29 From 0c6fea89ece04cc7acb8998f58d1853edbd1c08e Mon Sep 17 00:00:00 2001 From: h1alexbel Date: Fri, 26 Sep 2025 09:53:32 +0200 Subject: [PATCH 2/2] bug(#4529): replace XSL transformation with Xsline for locals-to-aliases optimization --- .../main/java/org/eolang/maven/MjParse.java | 69 +++++++++---------- .../eolang/maven/parse/locals-to-aliases.xsl | 24 +++++-- .../org/eolang/maven/shake/clean-up.xsl | 20 ------ .../org/eolang/maven/shake/remove-noise.xsl | 27 -------- .../java/org/eolang/maven/MjParseTest.java | 5 +- 5 files changed, 51 insertions(+), 94 deletions(-) delete mode 100644 eo-maven-plugin/src/main/resources/org/eolang/maven/shake/clean-up.xsl delete mode 100644 eo-maven-plugin/src/main/resources/org/eolang/maven/shake/remove-noise.xsl diff --git a/eo-maven-plugin/src/main/java/org/eolang/maven/MjParse.java b/eo-maven-plugin/src/main/java/org/eolang/maven/MjParse.java index b2376c4ed5d..e2fd645c79c 100644 --- a/eo-maven-plugin/src/main/java/org/eolang/maven/MjParse.java +++ b/eo-maven-plugin/src/main/java/org/eolang/maven/MjParse.java @@ -9,8 +9,9 @@ import com.jcabi.log.Logger; import com.jcabi.xml.XML; import com.jcabi.xml.XMLDocument; -import com.jcabi.xml.XSL; -import com.jcabi.xml.XSLDocument; +import com.yegor256.xsline.StClasspath; +import com.yegor256.xsline.TrDefault; +import com.yegor256.xsline.Xsline; import java.io.FileNotFoundException; import java.io.IOException; import java.nio.file.Path; @@ -22,8 +23,8 @@ import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.ResolutionScope; import org.cactoos.io.InputOf; -import org.cactoos.io.ResourceOf; import org.cactoos.iterable.Filtered; +import org.cactoos.list.ListOf; import org.cactoos.text.TextOf; import org.eolang.parser.EoSyntax; import org.eolang.parser.OnDefault; @@ -44,6 +45,32 @@ requiresDependencyResolution = ResolutionScope.COMPILE ) public final class MjParse extends MjSafe { + /** + * Reserved object bases from QQ. + */ + private static final String QQS = String.join( + ",", + new ListOf<>( + "Φ.org.eolang.number", + "Φ.org.eolang.bytes" + ) + ); + + /** + * Optimization line. + */ + private static final Xsline OPTIMIZATION_LINE = new Xsline( + new TrDefault<>( + new StClasspath( + "/org/eolang/maven/parse/locals-to-aliases.xsl", + "name reserved", + String.format( + "reserved %s", + MjParse.QQS + ) + ) + ) + ); /** * Zero version. @@ -107,7 +134,7 @@ private int parsed(final TjForeign tojo) throws Exception { src -> { final Node node = this.parsed(src, name); refs.add(node); - return new XMLDocument(node).toString(); + return MjParse.OPTIMIZATION_LINE.pass(new XMLDocument(node)).toString(); }, this.cache.toPath().resolve(MjParse.CACHE), this.plugin.getVersion(), @@ -116,7 +143,6 @@ private int parsed(final TjForeign tojo) throws Exception { this.cacheEnabled ).apply(source, target) ).withVersion(MjParse.version(target, refs)); - this.optimized(target); final List errors = new Xnav(target) .element("object") .element("errors") @@ -138,39 +164,6 @@ private int parsed(final TjForeign tojo) throws Exception { return 1; } - private Path optimized(final Path source) throws Exception { - final XML transformed = new XSLDocument( - new ResourceOf( - "org/eolang/maven/parse/locals-to-aliases.xsl" - ).stream() - ).transform(new XMLDocument(source)); - System.out.println(transformed); - // 3. get reserved.csv from lints' classpath - // 4. we should supply all home objects to variable - - - - -// final Xnav xmir = new Xnav(source); -// final String pkg = xmir.strict("/object/metas/meta[head='package']/tail", 1) -// .findFirst() -// .get() -// .text() -// .get(); -// xmir.path("//o[@base and starts-with(@base, 'Φ.')]").forEach( -// new Consumer() { -// @Override -// public void accept(final Xnav o) { -// final String base = o.attribute("base").text().get(); -// // if not QQ, then check the presence in the local package -// System.out.println(pkg); -// System.out.println(base.substring(base.lastIndexOf('.') + 1)); -// } -// } -// ); - return null; - } - /** * Source parsed to {@link Node}. * @param source Relative source path diff --git a/eo-maven-plugin/src/main/resources/org/eolang/maven/parse/locals-to-aliases.xsl b/eo-maven-plugin/src/main/resources/org/eolang/maven/parse/locals-to-aliases.xsl index dcc7a7bd2c4..17aec16b650 100644 --- a/eo-maven-plugin/src/main/resources/org/eolang/maven/parse/locals-to-aliases.xsl +++ b/eo-maven-plugin/src/main/resources/org/eolang/maven/parse/locals-to-aliases.xsl @@ -1,26 +1,36 @@ - - + + + + + + + - + - - - + + + + alias - + + diff --git a/eo-maven-plugin/src/main/resources/org/eolang/maven/shake/clean-up.xsl b/eo-maven-plugin/src/main/resources/org/eolang/maven/shake/clean-up.xsl deleted file mode 100644 index dd8ac4d36a0..00000000000 --- a/eo-maven-plugin/src/main/resources/org/eolang/maven/shake/clean-up.xsl +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - diff --git a/eo-maven-plugin/src/main/resources/org/eolang/maven/shake/remove-noise.xsl b/eo-maven-plugin/src/main/resources/org/eolang/maven/shake/remove-noise.xsl deleted file mode 100644 index 210c37bda04..00000000000 --- a/eo-maven-plugin/src/main/resources/org/eolang/maven/shake/remove-noise.xsl +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/eo-maven-plugin/src/test/java/org/eolang/maven/MjParseTest.java b/eo-maven-plugin/src/test/java/org/eolang/maven/MjParseTest.java index 1ce3d5b9522..9597cb7561f 100644 --- a/eo-maven-plugin/src/test/java/org/eolang/maven/MjParseTest.java +++ b/eo-maven-plugin/src/test/java/org/eolang/maven/MjParseTest.java @@ -304,8 +304,9 @@ void convertsLocalObjectsToAliases(@Mktmp final Path temp) throws IOException { .result() .get("target/1-parse/foo/x.xmir") ), - XhtmlMatchers.hasXPath( - "/object/metas/meta[head='alias' and part='foo.bar' and tail='foo.bar']" + XhtmlMatchers.hasXPaths( + "/object/metas/meta[head='alias' and part='bar' and part='foo.bar' and tail='bar foo.bar']", + "//o[@base='foo.bar']/o[1][@base='Φ.org.eolang.number']/o[1][@base='Φ.org.eolang.bytes']" ) ); }