@@ -404,53 +404,55 @@ class ThemeManager : Disposable {
404404 val themeFile = themeResourceDir?.resolve(themeFileName)?.toFile()
405405 val vscodeThemeFile = themeResourceDir?.resolve(vscodeThemeName)?.toFile()
406406
407- if (themeFile?.exists() == true && vscodeThemeFile?.exists() == true ) {
408- // Read theme file content
409- val themeContent = themeFile.readText()
410-
411- // Parse theme content
412- val parsed = parseThemeString(themeContent)
413-
414- // Handle include field, similar to getTheme.ts logic
415- var finalTheme = parsed
416- if (parsed.has(" include" )) {
417- val includeFileName = parsed.get(" include" ).asString
418- val includePath = themeResourceDir?.resolve(includeFileName)
419-
420- if (includePath != null && includePath.exists()) {
421- try {
422- val includeContent = includePath.toFile().readText()
423- val includeTheme = parseThemeString(includeContent)
424- finalTheme = mergeJsonObjects(finalTheme, includeTheme)
425- } catch (e: Exception ) {
426- logger.error(" Error processing include theme: $includeFileName " , e)
427- }
407+ val cssExists = vscodeThemeFile?.exists() == true
408+ if (! cssExists) {
409+ logger.warn(" VSCode theme style file does not exist: $vscodeThemeName " )
410+ return
411+ }
412+
413+ // Read theme file content if it exists; otherwise proceed with an empty theme
414+ val themeContent = if (themeFile?.exists() == true ) themeFile.readText() else " "
415+
416+ // Parse theme content when non-blank; otherwise start from an empty JsonObject
417+ val parsed = if (themeContent.isNotBlank()) parseThemeString(themeContent) else JsonObject ()
418+
419+ // Handle include field, similar to getTheme.ts logic
420+ var finalTheme = parsed
421+ if (parsed.has(" include" )) {
422+ val includeFileName = parsed.get(" include" ).asString
423+ val includePath = themeResourceDir?.resolve(includeFileName)
424+
425+ if (includePath != null && includePath.exists()) {
426+ try {
427+ val includeContent = includePath.toFile().readText()
428+ val includeTheme = parseThemeString(includeContent)
429+ finalTheme = mergeJsonObjects(finalTheme, includeTheme)
430+ } catch (e: Exception ) {
431+ logger.error(" Error processing include theme: $includeFileName " , e)
428432 }
429433 }
430-
431- // Convert theme
432- val converted = convertTheme(finalTheme)
433-
434- // Read VSCode theme style file
435- themeStyleContent = loadVscodeThemeStyle(vscodeThemeFile)
436-
437- // Add style content to converted theme object
438- if (themeStyleContent != null ) {
439- converted.addProperty(" cssContent" , themeStyleContent)
440- }
441-
442- // Update cache
443- val oldConfig = currentThemeConfig
444- currentThemeConfig = converted
445-
446- logger.info(" Loaded and converted theme configuration: $themeFileName " )
447-
448- // Notify listeners when configuration changes
449- if (oldConfig?.toString() != converted.toString()) {
450- notifyThemeChangeListeners()
451- }
452- } else {
453- logger.warn(" Theme configuration file does not exist: $themeFileName " )
434+ }
435+
436+ // Convert theme (works even if finalTheme is empty)
437+ val converted = convertTheme(finalTheme)
438+
439+ // Read VSCode theme style file
440+ themeStyleContent = vscodeThemeFile?.let { loadVscodeThemeStyle(it) }
441+
442+ // Add style content to converted theme object
443+ if (themeStyleContent != null ) {
444+ converted.addProperty(" cssContent" , themeStyleContent)
445+ }
446+
447+ // Update cache
448+ val oldConfig = currentThemeConfig
449+ currentThemeConfig = converted
450+
451+ logger.info(" Loaded and converted theme configuration: $themeFileName (theme exists: ${themeFile?.exists() == true } , css exists: $cssExists )" )
452+
453+ // Notify listeners when configuration changes
454+ if (oldConfig?.toString() != converted.toString()) {
455+ notifyThemeChangeListeners()
454456 }
455457 } catch (e: IOException ) {
456458 logger.error(" Error reading theme configuration" , e)
@@ -570,14 +572,18 @@ class ThemeManager : Disposable {
570572
571573 if (themeDir.notExists()) {
572574 // Try second path: integrations/theme/default-themes
573- themeDir = Paths .get (resourceRoot, " integrations " , " theme " , " default-themes " )
575+ themeDir = getDefaultThemeResourceDir (resourceRoot);
574576 if (themeDir.notExists()) {
575577 return null
576578 }
577579 }
578580
579581 return themeDir
580582 }
583+
584+ fun getDefaultThemeResourceDir (resourceRoot : String ): Path {
585+ return Paths .get(resourceRoot, " integrations" , " theme" , " default-themes" )
586+ }
581587
582588 /* *
583589 * Get theme manager instance
0 commit comments