From 2041189a90dd2a61393410b3da66cef31da8350b Mon Sep 17 00:00:00 2001 From: Tyler Gregg Date: Wed, 15 Jan 2025 17:12:52 -0800 Subject: [PATCH] Uses an iterator that adapts from SymbolToken to String in MacroEvaluatorAsIonReader.iterateTypeAnnotations instead of eagerly allocating a new collection. --- .../impl/macro/MacroEvaluatorAsIonReader.kt | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/amazon/ion/impl/macro/MacroEvaluatorAsIonReader.kt b/src/main/java/com/amazon/ion/impl/macro/MacroEvaluatorAsIonReader.kt index bd7c82955..4e35ba0cd 100644 --- a/src/main/java/com/amazon/ion/impl/macro/MacroEvaluatorAsIonReader.kt +++ b/src/main/java/com/amazon/ion/impl/macro/MacroEvaluatorAsIonReader.kt @@ -148,10 +148,30 @@ class MacroEvaluatorAsIonReader( override fun getTypeAnnotations(): Array? = currentValueExpression?.annotations?.let { Array(it.size) { i -> it[i].assumeText() } } override fun getTypeAnnotationSymbols(): Array? = currentValueExpression?.annotations?.toTypedArray() - // TODO: Make this into an iterator that unwraps the SymbolTokens as it goes instead of allocating a new list + + private class SymbolTokenAsStringIterator(val tokens: List) : MutableIterator { + + var index = 0 + + override fun hasNext(): Boolean { + return index < tokens.size + } + + override fun next(): String { + return tokens[index++].assumeText() + } + + override fun remove() { + throw UnsupportedOperationException("This iterator does not support removal") + } + } + override fun iterateTypeAnnotations(): MutableIterator { - return currentValueExpression?.annotations?.mapTo(mutableListOf()) { it.assumeText() }?.iterator() - ?: return Collections.emptyIterator() + return if (currentValueExpression?.annotations?.isNotEmpty() == true) { + SymbolTokenAsStringIterator(currentValueExpression!!.annotations) + } else { + Collections.emptyIterator() + } } override fun isInStruct(): Boolean = containerStack.peek()?.container?.type == IonType.STRUCT