diff --git a/src/main/java/com/android/tools/metalava/doclava1/ApiFile.java b/src/main/java/com/android/tools/metalava/doclava1/ApiFile.java
index 6f7466f..3b1341f 100644
--- a/src/main/java/com/android/tools/metalava/doclava1/ApiFile.java
+++ b/src/main/java/com/android/tools/metalava/doclava1/ApiFile.java
@@ -896,7 +896,7 @@
         }
 
         SourcePositionInfo pos() {
-            return new SourcePositionInfo(mFilename, mLine, 0);
+            return new SourcePositionInfo(mFilename, mLine);
         }
 
         public int getLine() {
diff --git a/src/main/java/com/android/tools/metalava/doclava1/SourcePositionInfo.java b/src/main/java/com/android/tools/metalava/doclava1/SourcePositionInfo.java
deleted file mode 100644
index fc21b40..0000000
--- a/src/main/java/com/android/tools/metalava/doclava1/SourcePositionInfo.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.metalava.doclava1;
-
-import org.jetbrains.annotations.NotNull;
-
-// Copied from doclava1
-public class SourcePositionInfo implements Comparable<SourcePositionInfo> {
-    public static final SourcePositionInfo UNKNOWN = new SourcePositionInfo("(unknown)", 0, 0);
-
-    public SourcePositionInfo(String file, int line, int column) {
-        this.file = file;
-        this.line = line;
-        this.column = column;
-    }
-
-    /**
-     * Given this position and str which occurs at that position, as well as str an index into str,
-     * find the SourcePositionInfo.
-     *
-     * @throws StringIndexOutOfBoundsException if index &gt; str.length()
-     */
-    public static SourcePositionInfo add(SourcePositionInfo that, String str, int index) {
-        if (that == null) {
-            return null;
-        }
-        int line = that.line;
-        char prev = 0;
-        for (int i = 0; i < index; i++) {
-            char c = str.charAt(i);
-            if (c == '\r' || (c == '\n' && prev != '\r')) {
-                line++;
-            }
-            prev = c;
-        }
-        return new SourcePositionInfo(that.file, line, 0);
-    }
-
-    @Override
-    public String toString() {
-        return file + ':' + line;
-    }
-
-    @Override
-    public int compareTo(@NotNull SourcePositionInfo that) {
-        int r = this.file.compareTo(that.file);
-        if (r != 0) return r;
-        return this.line - that.line;
-    }
-
-    private final String file;
-    private final int line;
-    private final int column;
-}
diff --git a/src/main/java/com/android/tools/metalava/doclava1/SourcePositionInfo.kt b/src/main/java/com/android/tools/metalava/doclava1/SourcePositionInfo.kt
new file mode 100644
index 0000000..29f770b
--- /dev/null
+++ b/src/main/java/com/android/tools/metalava/doclava1/SourcePositionInfo.kt
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.tools.metalava.doclava1
+
+class SourcePositionInfo(
+    private val file: String,
+    private val line: Int
+) : Comparable<SourcePositionInfo> {
+    override fun toString(): String {
+        return "$file:$line"
+    }
+
+    override fun compareTo(other: SourcePositionInfo): Int {
+        val r = file.compareTo(other.file)
+        return if (r != 0) r else line - other.line
+    }
+
+    companion object {
+        val UNKNOWN = SourcePositionInfo("(unknown)", 0)
+
+        /**
+         * Given this position and str which occurs at that position, as well as str an index into str,
+         * find the SourcePositionInfo.
+         *
+         * @throws StringIndexOutOfBoundsException if index &gt; str.length()
+         */
+        fun add(
+            that: SourcePositionInfo?,
+            str: String,
+            index: Int
+        ): SourcePositionInfo? {
+            if (that == null) {
+                return null
+            }
+            var line = that.line
+            var prev = 0.toChar()
+            for (i in 0 until index) {
+                val c = str[i]
+                if (c == '\r' || c == '\n' && prev != '\r') {
+                    line++
+                }
+                prev = c
+            }
+            return SourcePositionInfo(that.file, line)
+        }
+    }
+}
\ No newline at end of file
