From 81556b1339f585a7b4cc2fda8565e05dba65c1e2 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 9 Sep 2016 19:16:52 +0300 Subject: [PATCH] Fix AssertionError in notFoundClasses.kt on bad FQ names (EA-85046) FQ names like "Foo." or "Foo..Bar" were causing this exception. No tests added: no idea how to reproduce this exception --- .../kotlin/load/java/lazy/types/notFoundClasses.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/notFoundClasses.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/notFoundClasses.kt index ccff60ac253..df4deca55d0 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/notFoundClasses.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/notFoundClasses.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.load.java.lazy.types import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.SpecialNames /** * Parse the given FQ name with possible generic arguments to a **top-level** ClassId instance. @@ -31,19 +32,22 @@ internal fun parseCanonicalFqNameIgnoringTypeArguments(fqName: String): ClassId // "test.A.D, I.J>" -> ["test", "A", "D, I.J>"] private fun String.splitCanonicalFqName(): List { + fun String.toNonEmpty(): String = + if (this.isNotEmpty()) this else SpecialNames.SAFE_IDENTIFIER_FOR_NO_NAME.asString() + val result = arrayListOf() var balance = 0 var currentNameStart = 0 for ((index, character) in this.withIndex()) { when (character) { '.' -> if (balance == 0) { - result.add(this.substring(currentNameStart, index)) + result.add(this.substring(currentNameStart, index).toNonEmpty()) currentNameStart = index + 1 } '<' -> balance++ '>' -> balance-- } } - result.add(this.substring(currentNameStart)) + result.add(this.substring(currentNameStart).toNonEmpty()) return result }