Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import com.amazon.ion.IonReader
- import com.amazon.ion.TextSpan
- import com.amazon.ion.system.IonSystemBuilder
- import com.amazon.ion.util.Spans
- import org.junit.Test
- class ScratchPad {
- @Test
- fun lineNumbers() {
- val someIon = """ // Line 1
- // Line 2
- { // Line 3
- foo: "I'm on line 4", // Line 4
- bat: "I'm on line 5", // Line 5
- boo: "I'm on line 6", // Line 6
- dee: "I'm on line 7", // Line 7
- baa: "I'm on line 8" // Line 8
- } // Line 9
- """
- val ion = IonSystemBuilder.standard().build()
- val reader = ion.newReader(someIon)
- report(reader)
- reader.next()
- report(reader)
- reader.stepIn()
- report(reader)
- while(reader.next() != null) {
- report(reader)
- }
- }
- fun report(reader: IonReader) {
- try {
- println("---")
- println("reader.type: ${reader.type}")
- println("value: " + if(reader.type == null) "<not on a value>" else "\"${reader.stringValue()}\"")
- val span = Spans.currentSpan(TextSpan::class.java, reader)
- println("span.startLine: ${span.startLine}")
- println("span.finishLine: ${span.finishLine}")
- val dirtyHack = dirtyHackToGetTheLineNum(reader)
- println("dirtyHackToGetTheLineNum(): $dirtyHack")
- if(dirtyHack != span.startLine) {
- println("span.startLine and dirtyHackToGetTheLineNum() are different!")
- }
- } catch(ex: Exception) {
- println("Can't get current TextSpan: $ex" )
- }
- }
- fun dirtyHackToGetTheLineNum(reader: IonReader): Long {
- val scannerField = reader.javaClass.superclass.superclass.getDeclaredField("_scanner")
- scannerField.isAccessible = true
- val scanner = scannerField.get(reader)
- val lineCountField = scanner.javaClass.getDeclaredField("_line_count")
- lineCountField.isAccessible = true
- val lineNum = lineCountField.get(scanner) as Long
- return lineNum
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement