diff --git a/tools/adventure-pack/goodies/java/build.gradle.kts b/tools/adventure-pack/goodies/java/build.gradle.kts index b40b09db..a34cf238 100644 --- a/tools/adventure-pack/goodies/java/build.gradle.kts +++ b/tools/adventure-pack/goodies/java/build.gradle.kts @@ -48,3 +48,9 @@ tasks.register("ktfmtCustom") { source = project.fileTree(rootDir) include("*.gradle.kts") } + +tasks.withType { + options.compilerArgs.add("-Xlint:all") + options.compilerArgs.add("-Werror") + options.isWarnings = true +} diff --git a/tools/adventure-pack/goodies/java/src/simple_iterator/SimpleIterator.java b/tools/adventure-pack/goodies/java/src/simple_iterator/SimpleIterator.java new file mode 100644 index 00000000..67ea9eaa --- /dev/null +++ b/tools/adventure-pack/goodies/java/src/simple_iterator/SimpleIterator.java @@ -0,0 +1,52 @@ +package simple_iterator; + +import java.util.Iterator; +import java.util.NoSuchElementException; + +public interface SimpleIterator { + public T next(); + + static enum HasNextState { + TRUE, + FALSE, + UNKNOWN, + } + + public static Iterator toIterator(final SimpleIterator iterator) { + final HasNextState[] hasNextState = { HasNextState.UNKNOWN }; + final Object[] elementReserve = { null }; + + return new Iterator() { + public boolean hasNext() { + if (hasNextState[0] == HasNextState.UNKNOWN) { + try { + elementReserve[0] = iterator.next(); + hasNextState[0] = HasNextState.TRUE; + } catch (NoSuchElementException e) { + hasNextState[0] = HasNextState.FALSE; + } + } + + return hasNextState[0] == HasNextState.TRUE; + } + + public T next() { + if (hasNextState[0] == HasNextState.TRUE) { + hasNextState[0] = HasNextState.UNKNOWN; + + @SuppressWarnings("unchecked") + T element = (T) elementReserve[0]; + + elementReserve[0] = null; + return element; + } + + if (hasNextState[0] == HasNextState.UNKNOWN) { + return iterator.next(); + } + + throw new NoSuchElementException(); + } + }; + } +} diff --git a/tools/adventure-pack/goodies/java/src/simple_iterator/goody.json b/tools/adventure-pack/goodies/java/src/simple_iterator/goody.json new file mode 100644 index 00000000..a38d0e52 --- /dev/null +++ b/tools/adventure-pack/goodies/java/src/simple_iterator/goody.json @@ -0,0 +1,3 @@ +{ + "name": "SimpleIterator" +} diff --git a/tools/adventure-pack/goodies/java/src/to_iterable/AP.java b/tools/adventure-pack/goodies/java/src/to_iterable/AP.java index f6247dd6..b064f8fc 100644 --- a/tools/adventure-pack/goodies/java/src/to_iterable/AP.java +++ b/tools/adventure-pack/goodies/java/src/to_iterable/AP.java @@ -2,7 +2,7 @@ final class AP { - public static Iterable toIterable(Iterator iterator) { + public static Iterable toIterable(final Iterator iterator) { return () -> iterator; } } diff --git a/tools/adventure-pack/goodies/kotlin/build.gradle.kts b/tools/adventure-pack/goodies/kotlin/build.gradle.kts index 302bd29d..c51c4fea 100644 --- a/tools/adventure-pack/goodies/kotlin/build.gradle.kts +++ b/tools/adventure-pack/goodies/kotlin/build.gradle.kts @@ -44,3 +44,5 @@ tasks.register("ktfmtCustom") { include("*.gradle.kts") include("**/*.kt") } + +// TODO: Kotlin equivalent of -Xlint:all diff --git a/tools/adventure-pack/src/app/__tests__/__snapshots__/equip-test.ts.snap b/tools/adventure-pack/src/app/__tests__/__snapshots__/equip-test.ts.snap index 335b500c..0eaf4c5b 100644 --- a/tools/adventure-pack/src/app/__tests__/__snapshots__/equip-test.ts.snap +++ b/tools/adventure-pack/src/app/__tests__/__snapshots__/equip-test.ts.snap @@ -10,6 +10,65 @@ record Pair(TFirst first, TSecond second) {} /////////////////////////// END ADVENTURE PACK CODE ////////////////////////////" `; +exports[`App can equip single goody: Java SimpleIterator 1`] = ` +"////////////////////////// BEGIN ADVENTURE PACK CODE /////////////////////////// +// Adventure Pack commit fake-commit-hash +// Running at: https://example.com/ + +import java.util.Iterator; +import java.util.NoSuchElementException; + +interface SimpleIterator { + public T next(); + + static enum HasNextState { + TRUE, + FALSE, + UNKNOWN, + } + + public static Iterator toIterator(final SimpleIterator iterator) { + final HasNextState[] hasNextState = { HasNextState.UNKNOWN }; + final Object[] elementReserve = { null }; + + return new Iterator() { + public boolean hasNext() { + if (hasNextState[0] == HasNextState.UNKNOWN) { + try { + elementReserve[0] = iterator.next(); + hasNextState[0] = HasNextState.TRUE; + } catch (NoSuchElementException e) { + hasNextState[0] = HasNextState.FALSE; + } + } + + return hasNextState[0] == HasNextState.TRUE; + } + + public T next() { + if (hasNextState[0] == HasNextState.TRUE) { + hasNextState[0] = HasNextState.UNKNOWN; + + @SuppressWarnings("unchecked") + T element = (T) elementReserve[0]; + + elementReserve[0] = null; + return element; + } + + if (hasNextState[0] == HasNextState.UNKNOWN) { + return iterator.next(); + } + + throw new NoSuchElementException(); + } + }; + } +} + +/////////////////////////// END ADVENTURE PACK CODE ////////////////////////////" +`; + exports[`App can equip single goody: Java UnionFind 1`] = ` "////////////////////////// BEGIN ADVENTURE PACK CODE /////////////////////////// // Adventure Pack commit fake-commit-hash @@ -118,7 +177,7 @@ import java.util.Iterator; final class AP { private AP() {} - public static Iterable toIterable(Iterator iterator) { + public static Iterable toIterable(final Iterator iterator) { return () -> iterator; } } diff --git a/tools/adventure-pack/src/app/__tests__/__snapshots__/render-test.ts.snap b/tools/adventure-pack/src/app/__tests__/__snapshots__/render-test.ts.snap index d1b992f4..23cc7084 100644 --- a/tools/adventure-pack/src/app/__tests__/__snapshots__/render-test.ts.snap +++ b/tools/adventure-pack/src/app/__tests__/__snapshots__/render-test.ts.snap @@ -6,6 +6,61 @@ exports[`App can render goody: Java Pair 1`] = ` record Pair(TFirst first, TSecond second) {}" `; +exports[`App can render goody: Java SimpleIterator 1`] = ` +"package simple_iterator; + +import java.util.Iterator; +import java.util.NoSuchElementException; + +interface SimpleIterator { + public T next(); + + static enum HasNextState { + TRUE, + FALSE, + UNKNOWN, + } + + public static Iterator toIterator(final SimpleIterator iterator) { + final HasNextState[] hasNextState = { HasNextState.UNKNOWN }; + final Object[] elementReserve = { null }; + + return new Iterator() { + public boolean hasNext() { + if (hasNextState[0] == HasNextState.UNKNOWN) { + try { + elementReserve[0] = iterator.next(); + hasNextState[0] = HasNextState.TRUE; + } catch (NoSuchElementException e) { + hasNextState[0] = HasNextState.FALSE; + } + } + + return hasNextState[0] == HasNextState.TRUE; + } + + public T next() { + if (hasNextState[0] == HasNextState.TRUE) { + hasNextState[0] = HasNextState.UNKNOWN; + + @SuppressWarnings("unchecked") + T element = (T) elementReserve[0]; + + elementReserve[0] = null; + return element; + } + + if (hasNextState[0] == HasNextState.UNKNOWN) { + return iterator.next(); + } + + throw new NoSuchElementException(); + } + }; + } +}" +`; + exports[`App can render goody: Java UnionFind 1`] = ` "package union_find; @@ -86,7 +141,7 @@ import java.util.Iterator; final class AP { private AP() {} - public static Iterable toIterable(Iterator iterator) { + public static Iterable toIterable(final Iterator iterator) { return () -> iterator; } }"