diff --git a/src/main/kotlin/zone/clanker/gradle/srcx/parse/PsiEnvironment.kt b/src/main/kotlin/zone/clanker/gradle/srcx/parse/PsiEnvironment.kt index 8c142d6..1e8169e 100644 --- a/src/main/kotlin/zone/clanker/gradle/srcx/parse/PsiEnvironment.kt +++ b/src/main/kotlin/zone/clanker/gradle/srcx/parse/PsiEnvironment.kt @@ -68,6 +68,7 @@ class PsiEnvironment : AutoCloseable { logger.error( "srcx: PSI environment initialization failed: ${e.message}. " + "Hub classes and entry points will not be available.", + e, ) }.getOrNull() } diff --git a/src/main/kotlin/zone/clanker/gradle/srcx/scan/SymbolExtractor.kt b/src/main/kotlin/zone/clanker/gradle/srcx/scan/SymbolExtractor.kt index 38cdc34..920d8c7 100644 --- a/src/main/kotlin/zone/clanker/gradle/srcx/scan/SymbolExtractor.kt +++ b/src/main/kotlin/zone/clanker/gradle/srcx/scan/SymbolExtractor.kt @@ -52,7 +52,7 @@ object SymbolExtractor { throw e } else -> { - logger.warn("srcx: Analysis failed for '$projectName': ${e.message}") + logger.warn("srcx: Analysis failed for '$projectName': ${e.message}", e) return null } } @@ -74,7 +74,8 @@ object SymbolExtractor { } if (sourceFiles.isEmpty()) return emptyList() - return PsiEnvironment().use { env -> + val env = PsiEnvironment.shared() ?: return emptyList() + return synchronized(env) { val parser = PsiParser(env) sourceFiles.flatMap { file -> val sourceDir = dirs.first { file.startsWith(it) } @@ -82,6 +83,8 @@ object SymbolExtractor { parser.extractDeclarations(file).map { symbol -> symbol.toEntry(sourceDir) } + }.onFailure { e -> + logger.warn("srcx: Symbol extraction failed for '${file.name}': ${e.message}", e) }.getOrDefault(emptyList()) } } @@ -287,9 +290,10 @@ object SymbolExtractor { ?: File(projectDir, "build.gradle").takeIf { it.exists() } ?: return emptyList() - return PsiEnvironment().use { env -> + val env = PsiEnvironment.shared() ?: return emptyList() + return synchronized(env) { val vf = LightVirtualFile(buildFile.name, KotlinFileType.INSTANCE, buildFile.readText()) - val ktFile = env.psiManager.findFile(vf) as? KtFile ?: return@use emptyList() + val ktFile = env.psiManager.findFile(vf) as? KtFile ?: return@synchronized emptyList() ktFile .collectDescendantsOfType()