diff --git a/src/utils/__tests__/parse-stack-trace.test.ts b/src/utils/__tests__/parse-stack-trace.test.ts index acf94a7..f21007c 100644 --- a/src/utils/__tests__/parse-stack-trace.test.ts +++ b/src/utils/__tests__/parse-stack-trace.test.ts @@ -37,7 +37,7 @@ AssertionError: 1 != 2`; }); }); - describe('Java stack traces', () => { + describe('Java/Kotlin stack traces', () => { it('parses at package.Class(File.java:N) format', () => { const trace = `java.lang.AssertionError: expected:<3> but was:<4> at com.example.FooTest.testAdd(FooTest.java:42) @@ -45,6 +45,14 @@ AssertionError: 1 != 2`; expect(parseFileLocation(trace)).toEqual({ path: 'FooTest.java', line: 42 }); }); + + it('parses at package.Class(File.kt:N) format', () => { + const trace = `java.lang.AssertionError: expected:<3> but was:<4> + at com.example.FooTest.testAdd(FooTest.kt:42) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)`; + + expect(parseFileLocation(trace)).toEqual({ path: 'FooTest.kt', line: 42 }); + }); }); describe('Go stack traces', () => { diff --git a/src/utils/parse-stack-trace.ts b/src/utils/parse-stack-trace.ts index d7eb9f6..0b6378d 100644 --- a/src/utils/parse-stack-trace.ts +++ b/src/utils/parse-stack-trace.ts @@ -33,9 +33,9 @@ const PATTERNS: PatternExtractor[] = [ return { path: match[1], line: Number.parseInt(match[2], 10) }; }, - // Java: at package.Class(File.java:N) + // Java/Kotlin: at package.Class(File.java:N) or at package.Class(File.kt:N) (line) => { - const match = line.match(/at\s+[\w.$]+\(([A-Za-z][\w]*\.java):(\d+)\)/); + const match = line.match(/at\s+[\w.$]+\(([A-Za-z][\w]*\.(?:java|kt)):(\d+)\)/); if (!match) return null; return { path: match[1], line: Number.parseInt(match[2], 10) }; },