Added UNKNOWN manga source constant

master
Koitharu 2 years ago
parent 204223e2a8
commit 39e9f5a2ff
Signed by: Koitharu
GPG Key ID: 676DEE768C17A9D7

@ -15,38 +15,40 @@ class ParserProcessor(
private val logger: KSPLogger, private val logger: KSPLogger,
private val options: Map<String, String>, private val options: Map<String, String>,
) : SymbolProcessor { ) : SymbolProcessor {
private val availableLocales = Locale.getAvailableLocales().toSet() private val availableLocales = Locale.getAvailableLocales().toSet()
private val sourceNamePattern = Regex("[A-Z_][A-Z0-9_]{3,}") private val sourceNamePattern = Regex("[A-Z_][A-Z0-9_]{3,}")
override fun process(resolver: Resolver): List<KSAnnotated> { override fun process(resolver: Resolver): List<KSAnnotated> {
val symbols = resolver val symbols =
.getSymbolsWithAnnotation("org.koitharu.kotatsu.parsers.MangaSourceParser") resolver
.getSymbolsWithAnnotation("org.koitharu.kotatsu.parsers.MangaSourceParser")
val ret = symbols.filterNot { it.validate() }.toList() val ret = symbols.filterNot { it.validate() }.toList()
if (!symbols.iterator().hasNext()) { if (!symbols.iterator().hasNext()) {
return ret return ret
} }
val dependencies = Dependencies.ALL_FILES val dependencies = Dependencies.ALL_FILES
val factoryFile = try { val factoryFile =
codeGenerator.createNewFile( try {
dependencies = dependencies, codeGenerator.createNewFile(
packageName = "org.koitharu.kotatsu.parsers", dependencies = dependencies,
fileName = "MangaParserFactory", packageName = "org.koitharu.kotatsu.parsers",
) fileName = "MangaParserFactory",
} catch (e: FileAlreadyExistsException) { )
logger.warn(e.toString(), null) } catch (e: FileAlreadyExistsException) {
null logger.warn(e.toString(), null)
} null
val sourcesFile = try { }
codeGenerator.createNewFile( val sourcesFile =
dependencies = dependencies, try {
packageName = "org.koitharu.kotatsu.parsers.model", codeGenerator.createNewFile(
fileName = "MangaSource", dependencies = dependencies,
) packageName = "org.koitharu.kotatsu.parsers.model",
} catch (e: FileAlreadyExistsException) { fileName = "MangaSource",
logger.warn(e.toString(), null) )
null } catch (e: FileAlreadyExistsException) {
} logger.warn(e.toString(), null)
null
}
sourcesFile?.writer().use { sourcesWriter -> sourcesFile?.writer().use { sourcesWriter ->
factoryFile?.writer().use { factoryWriter -> factoryFile?.writer().use { factoryWriter ->
writeContent(sourcesWriter, factoryWriter, symbols) writeContent(sourcesWriter, factoryWriter, symbols)
@ -65,30 +67,31 @@ class ParserProcessor(
} }
factoryWriter?.write( factoryWriter?.write(
""" """
package org.koitharu.kotatsu.parsers package org.koitharu.kotatsu.parsers
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
@InternalParsersApi @InternalParsersApi
@Deprecated("", replaceWith = ReplaceWith("context.newParserInstance(this)")) @Deprecated("", replaceWith = ReplaceWith("context.newParserInstance(this)"))
fun MangaSource.newParser(context: MangaLoaderContext): MangaParser = when (this) { fun MangaSource.newParser(context: MangaLoaderContext): MangaParser = when (this) {
""".trimIndent(), """.trimIndent(),
) )
//language=kotlin //language=kotlin
sourcesWriter?.write( sourcesWriter?.write(
""" """
package org.koitharu.kotatsu.parsers.model package org.koitharu.kotatsu.parsers.model
enum class MangaSource( enum class MangaSource(
val title: String, val title: String,
val locale: String, val locale: String,
val contentType: ContentType, val contentType: ContentType,
val isBroken: Boolean, val isBroken: Boolean,
) { ) {
LOCAL("Local", "", ContentType.OTHER, false), LOCAL("Local", "", ContentType.OTHER, false),
UNKNOWN("Unknown", "", ContentType.OTHER, true),
""".trimIndent(), """.trimIndent(),
) )
@ -99,8 +102,9 @@ class ParserProcessor(
factoryWriter?.write( factoryWriter?.write(
""" """
MangaSource.LOCAL -> throw NotImplementedError("Local manga parser is not supported") MangaSource.LOCAL,
MangaSource.DUMMY -> throw NotImplementedError("Dummy manga parser cannot be instantiated") MangaSource.UNKNOWN,
MangaSource.DUMMY -> throw NotImplementedError("Manga parser ${'$'}name cannot be instantiated")
}.also { }.also {
require(it.source == this) { require(it.source == this) {
"Cannot instantiate manga parser: ${'$'}name mapped to ${'$'}{it.source}" "Cannot instantiate manga parser: ${'$'}name mapped to ${'$'}{it.source}"
@ -121,10 +125,12 @@ class ParserProcessor(
private val sourcesWriter: Writer?, private val sourcesWriter: Writer?,
private val factoryWriter: Writer?, private val factoryWriter: Writer?,
) : KSVisitorVoid() { ) : KSVisitorVoid() {
private val titles = HashMap<String, String>() private val titles = HashMap<String, String>()
override fun visitClassDeclaration(classDeclaration: KSClassDeclaration, data: Unit) { override fun visitClassDeclaration(
classDeclaration: KSClassDeclaration,
data: Unit,
) {
if (classDeclaration.classKind != ClassKind.CLASS || classDeclaration.isAbstract()) { if (classDeclaration.classKind != ClassKind.CLASS || classDeclaration.isAbstract()) {
logger.error("Only non-abstract can be annotated with @MangaSourceParser", classDeclaration) logger.error("Only non-abstract can be annotated with @MangaSourceParser", classDeclaration)
} }
@ -161,13 +167,21 @@ class ParserProcessor(
} }
factoryWriter?.write("\tMangaSource.$name -> $className(context)\n") factoryWriter?.write("\tMangaSource.$name -> $className(context)\n")
val deprecationString = if (deprecation != null) { val deprecationString =
val reason = deprecation.arguments if (deprecation != null) {
.find { it.name?.asString() == "message" }?.value?.toString() ?: "Unknown reason" val reason =
"@Deprecated(\"$reason\") " deprecation.arguments
} else "" .find { it.name?.asString() == "message" }
?.value
?.toString() ?: "Unknown reason"
"@Deprecated(\"$reason\") "
} else {
""
}
val localeComment = localeTitle?.toTitleCase(localeObj)?.let { " /* $it */" }.orEmpty() val localeComment = localeTitle?.toTitleCase(localeObj)?.let { " /* $it */" }.orEmpty()
sourcesWriter?.write("\t$deprecationString$name(\"$title\", $localeString$localeComment, ContentType.$type, $isBroken),\n") sourcesWriter?.write(
"\t$deprecationString$name(\"$title\", $localeString$localeComment, ContentType.$type, $isBroken),\n",
)
} }
} }
} }

Loading…
Cancel
Save