Skip to content

Commit

Permalink
feat(#264): full XPaths in path
Browse files Browse the repository at this point in the history
  • Loading branch information
h1alexbel committed Feb 7, 2025
1 parent 4805b55 commit 43b8bc2
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 17 deletions.
5 changes: 2 additions & 3 deletions src/main/java/org/eolang/lints/LtUnlint.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.stream.Collectors;

/**
* Lint that ignores linting if {@code +unlint} meta is present.
Expand Down Expand Up @@ -57,12 +56,12 @@ public String name() {

@Override
public Collection<Defect> defects(final XML xmir) throws IOException {
final boolean suppress = !new Xnav(xmir.inner()).path(
final boolean suppress = new Xnav(xmir.inner()).path(
String.format(
"/program/metas/meta[head='unlint' and tail='%s']",
this.origin.name()
)
).collect(Collectors.toList()).isEmpty();
).findAny().isPresent();
final Collection<Defect> defects = new ArrayList<>(0);
if (!suppress) {
defects.addAll(this.origin.defects(xmir));
Expand Down
3 changes: 1 addition & 2 deletions src/main/java/org/eolang/lints/errors/LtAtomIsNotUnique.java
Original file line number Diff line number Diff line change
Expand Up @@ -187,8 +187,7 @@ private static List<String> fqns(final Xnav xml) {
.map(o -> o.attribute("fqn").text().get())
.collect(Collectors.toList());
if (
xml.path("/program/metas/meta[head='package']")
.collect(Collectors.toList()).size() == 1
xml.path("/program/metas/meta[head='package']").count() == 1L
) {
final String pack = xml.path("/program/metas/meta[head='package']/tail")
.map(o -> o.text().get())
Expand Down
21 changes: 9 additions & 12 deletions src/main/java/org/eolang/lints/errors/LtObjectIsNotUnique.java
Original file line number Diff line number Diff line change
Expand Up @@ -60,15 +60,15 @@ public Collection<Defect> defects(final Map<String, XML> pkg) {
for (final XML xmir : pkg.values()) {
final Xnav xml = new Xnav(xmir.inner());
final String src = xml.element("program").attribute("name").text().orElse("unknown");
if (LtObjectIsNotUnique.objectsAreEmpty(xml)) {
if (LtObjectIsNotUnique.hasObjects(xml)) {
continue;
}
for (final XML oth : pkg.values()) {
final Xnav second = new Xnav(oth.inner());
if (Objects.equals(oth, xmir)) {
continue;
}
if (LtObjectIsNotUnique.objectsAreEmpty(second)) {
if (LtObjectIsNotUnique.hasObjects(second)) {
continue;
}
LtObjectIsNotUnique.programObjects(second).entrySet().stream()
Expand Down Expand Up @@ -111,11 +111,10 @@ public String motive() throws IOException {
).asString();
}

private static boolean objectsAreEmpty(final Xnav xml) {
private static boolean hasObjects(final Xnav xml) {
return xml.element("program")
.element("objects")
.elements(Filter.withName("o"))
.collect(Collectors.toList()).isEmpty();
.elements(Filter.withName("o")).findAny().isEmpty();
}

private static boolean containsDuplicate(
Expand All @@ -127,18 +126,17 @@ private static boolean containsDuplicate(
}

private static Map<String, String> programObjects(final Xnav xml) {
final List<String> names = xml.element("program").element("objects")
.elements(Filter.withName("o"))
.map(o -> o.attribute("name").text().get())
final List<String> names = xml.path("/program/objects/o/@name")
.map(oname -> oname.text().get())
.collect(Collectors.toList());
return IntStream.range(0, names.size())
.boxed()
.collect(
Collectors.toMap(
names::get,
pos ->
xml.path(String.format("/program/objects/o[%d]", pos + 1))
.findFirst().get().attribute("line").text().orElse("0"),
xml.path(String.format("/program/objects/o[%d]/@line", pos + 1))
.findFirst().get().text().orElse("0"),
(existing, replacement) -> replacement
)
);
Expand All @@ -147,8 +145,7 @@ private static Map<String, String> programObjects(final Xnav xml) {
private static String packageName(final Xnav xml) {
final String name;
if (
xml.path("/program/metas/meta[head='package']")
.collect(Collectors.toList()).size() == 1
xml.path("/program/metas/meta[head='package']").count() == 1L
) {
name = xml.path("/program/metas/meta[head='package']/tail")
.findFirst().get().text().get();
Expand Down
17 changes: 17 additions & 0 deletions src/test/java/org/eolang/lints/errors/LtObjectIsNotUniqueTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,15 @@
package org.eolang.lints.errors;

import com.jcabi.xml.XML;
import com.jcabi.xml.XMLDocument;
import fixtures.ParsedEo;
import matchers.DefectMatcher;
import org.cactoos.map.MapEntry;
import org.cactoos.map.MapOf;
import org.eolang.lints.Defect;
import org.hamcrest.MatcherAssert;
import org.hamcrest.Matchers;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

/**
Expand Down Expand Up @@ -162,4 +164,19 @@ void allowsNonUniqueMultipleObjectsInDifferentPackages() throws Exception {
Matchers.emptyIterable()
);
}

@Test
void doesNotThrowExceptionOnEmptyXmir() {
Assertions.assertDoesNotThrow(
() -> new LtObjectIsNotUnique().defects(
new MapOf<>(
new MapEntry<>(
"empty",
new XMLDocument("<program/>")
)
)
),
() -> "Exception was thrown, but it should not"
);
}
}

0 comments on commit 43b8bc2

Please sign in to comment.