Improve "Incompatible class" message

Includes file location in the message.

Bug: 295737759
Test: ./gradlew
Change-Id: I365ca6c721377a0a946ea7f3612ad34bd56a6b12
diff --git a/metalava-model-text/src/main/java/com/android/tools/metalava/model/text/ApiFile.kt b/metalava-model-text/src/main/java/com/android/tools/metalava/model/text/ApiFile.kt
index f811446..d4ff58f 100644
--- a/metalava-model-text/src/main/java/com/android/tools/metalava/model/text/ApiFile.kt
+++ b/metalava-model-text/src/main/java/com/android/tools/metalava/model/text/ApiFile.kt
@@ -42,7 +42,8 @@
 import java.io.StringReader
 import kotlin.text.Charsets.UTF_8
 
-class ApiFile(
+class ApiFile
+private constructor(
     /** Implements [ResolverContext] interface */
     override val classResolver: ClassResolver?
 ) : ResolverContext {
@@ -366,7 +367,10 @@
                 null -> maybeExistingClass
                 else -> {
                     if (!foundClass.isCompatible(maybeExistingClass)) {
-                        throw ApiParseException("Incompatible $foundClass definitions")
+                        throw ApiParseException(
+                            "Incompatible $foundClass definitions",
+                            maybeExistingClass.position
+                        )
                     } else {
                         foundClass
                     }
diff --git a/metalava-model-text/src/main/java/com/android/tools/metalava/model/text/ApiParseException.kt b/metalava-model-text/src/main/java/com/android/tools/metalava/model/text/ApiParseException.kt
index e70a545..c02ca6d 100644
--- a/metalava-model-text/src/main/java/com/android/tools/metalava/model/text/ApiParseException.kt
+++ b/metalava-model-text/src/main/java/com/android/tools/metalava/model/text/ApiParseException.kt
@@ -30,6 +30,11 @@
         line = tokenizer.line
     }
 
+    internal constructor(message: String, position: SourcePositionInfo) : super(message) {
+        file = position.file
+        line = position.line
+    }
+
     override val message: String
         get() {
             val sb = StringBuilder()
diff --git a/src/test/java/com/android/tools/metalava/ApiFileTest.kt b/src/test/java/com/android/tools/metalava/ApiFileTest.kt
index 62e963e..cda9dbc 100644
--- a/src/test/java/com/android/tools/metalava/ApiFileTest.kt
+++ b/src/test/java/com/android/tools/metalava/ApiFileTest.kt
@@ -4181,7 +4181,7 @@
         check(
             signatureSources = arrayOf(source1, source2),
             expectedFail =
-                "Aborting: Unable to parse signature file: Incompatible class Test.pkg.Class1 definitions"
+                "Aborting: Unable to parse signature file: TESTROOT/project/load-api2.txt:2: Incompatible class Test.pkg.Class1 definitions"
         )
     }