Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 28 additions & 3 deletions components/generator/jvm/imagevector/api/imagevector.api
Original file line number Diff line number Diff line change
@@ -1,14 +1,38 @@
public final class io/github/composegears/valkyrie/generator/jvm/imagevector/FullQualifiedImports {
public static final field Companion Lio/github/composegears/valkyrie/generator/jvm/imagevector/FullQualifiedImports$Companion;
public fun <init> ()V
public fun <init> (ZZZ)V
public synthetic fun <init> (ZZZILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun component1 ()Z
public final fun component2 ()Z
public final fun component3 ()Z
public final fun copy (ZZZ)Lio/github/composegears/valkyrie/generator/jvm/imagevector/FullQualifiedImports;
public static synthetic fun copy$default (Lio/github/composegears/valkyrie/generator/jvm/imagevector/FullQualifiedImports;ZZZILjava/lang/Object;)Lio/github/composegears/valkyrie/generator/jvm/imagevector/FullQualifiedImports;
public fun equals (Ljava/lang/Object;)Z
public final fun getBrush ()Z
public final fun getColor ()Z
public final fun getOffset ()Z
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}

public final class io/github/composegears/valkyrie/generator/jvm/imagevector/FullQualifiedImports$Companion {
public final fun getReservedComposeQualifiers ()Ljava/util/List;
}

public final class io/github/composegears/valkyrie/generator/jvm/imagevector/ImageVectorGenerator {
public static final field INSTANCE Lio/github/composegears/valkyrie/generator/jvm/imagevector/ImageVectorGenerator;
public final fun convert (Lio/github/composegears/valkyrie/ir/IrImageVector;Ljava/lang/String;Lio/github/composegears/valkyrie/generator/jvm/imagevector/ImageVectorGeneratorConfig;)Lio/github/composegears/valkyrie/generator/jvm/imagevector/ImageVectorSpecOutput;
}

public final class io/github/composegears/valkyrie/generator/jvm/imagevector/ImageVectorGeneratorConfig {
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/github/composegears/valkyrie/generator/jvm/imagevector/OutputFormat;ZZLio/github/composegears/valkyrie/generator/jvm/imagevector/PreviewAnnotationType;ZZZI)V
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/github/composegears/valkyrie/generator/jvm/imagevector/OutputFormat;ZZLio/github/composegears/valkyrie/generator/jvm/imagevector/PreviewAnnotationType;ZZZILio/github/composegears/valkyrie/generator/jvm/imagevector/FullQualifiedImports;)V
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/github/composegears/valkyrie/generator/jvm/imagevector/OutputFormat;ZZLio/github/composegears/valkyrie/generator/jvm/imagevector/PreviewAnnotationType;ZZZILio/github/composegears/valkyrie/generator/jvm/imagevector/FullQualifiedImports;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun component1 ()Ljava/lang/String;
public final fun component10 ()Z
public final fun component11 ()Z
public final fun component12 ()I
public final fun component13 ()Lio/github/composegears/valkyrie/generator/jvm/imagevector/FullQualifiedImports;
public final fun component2 ()Ljava/lang/String;
public final fun component3 ()Ljava/lang/String;
public final fun component4 ()Ljava/lang/String;
Expand All @@ -17,10 +41,11 @@ public final class io/github/composegears/valkyrie/generator/jvm/imagevector/Ima
public final fun component7 ()Z
public final fun component8 ()Lio/github/composegears/valkyrie/generator/jvm/imagevector/PreviewAnnotationType;
public final fun component9 ()Z
public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/github/composegears/valkyrie/generator/jvm/imagevector/OutputFormat;ZZLio/github/composegears/valkyrie/generator/jvm/imagevector/PreviewAnnotationType;ZZZI)Lio/github/composegears/valkyrie/generator/jvm/imagevector/ImageVectorGeneratorConfig;
public static synthetic fun copy$default (Lio/github/composegears/valkyrie/generator/jvm/imagevector/ImageVectorGeneratorConfig;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/github/composegears/valkyrie/generator/jvm/imagevector/OutputFormat;ZZLio/github/composegears/valkyrie/generator/jvm/imagevector/PreviewAnnotationType;ZZZIILjava/lang/Object;)Lio/github/composegears/valkyrie/generator/jvm/imagevector/ImageVectorGeneratorConfig;
public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/github/composegears/valkyrie/generator/jvm/imagevector/OutputFormat;ZZLio/github/composegears/valkyrie/generator/jvm/imagevector/PreviewAnnotationType;ZZZILio/github/composegears/valkyrie/generator/jvm/imagevector/FullQualifiedImports;)Lio/github/composegears/valkyrie/generator/jvm/imagevector/ImageVectorGeneratorConfig;
public static synthetic fun copy$default (Lio/github/composegears/valkyrie/generator/jvm/imagevector/ImageVectorGeneratorConfig;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/github/composegears/valkyrie/generator/jvm/imagevector/OutputFormat;ZZLio/github/composegears/valkyrie/generator/jvm/imagevector/PreviewAnnotationType;ZZZILio/github/composegears/valkyrie/generator/jvm/imagevector/FullQualifiedImports;ILjava/lang/Object;)Lio/github/composegears/valkyrie/generator/jvm/imagevector/ImageVectorGeneratorConfig;
public fun equals (Ljava/lang/Object;)Z
public final fun getAddTrailingComma ()Z
public final fun getFullQualifiedImports ()Lio/github/composegears/valkyrie/generator/jvm/imagevector/FullQualifiedImports;
public final fun getGeneratePreview ()Z
public final fun getIconPackPackage ()Ljava/lang/String;
public final fun getIndentSize ()I
Expand Down
6 changes: 6 additions & 0 deletions components/generator/jvm/imagevector/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@ sourceSets {
}
}

kotlin {
compilerOptions {
freeCompilerArgs.add("-Xcontext-parameters")
}
}

dependencies {
implementation(projects.components.extensions)
api(projects.components.generator.jvm.poetExtensions)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ internal data class ImageVectorSpecConfig(
val useExplicitMode: Boolean,
val addTrailingComma: Boolean,
val indentSize: Int,
val fullQualifiedImports: FullQualifiedImports,
)

internal class ImageVectorFileSpec(private val config: ImageVectorSpecConfig) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,19 @@ data class ImageVectorGeneratorConfig(
val useExplicitMode: Boolean,
val addTrailingComma: Boolean,
val indentSize: Int,
val fullQualifiedImports: FullQualifiedImports = FullQualifiedImports(),
)

data class FullQualifiedImports(
val brush: Boolean = false,
val color: Boolean = false,
val offset: Boolean = false,
) {
companion object {
val reservedComposeQualifiers = listOf("Brush", "Color", "Offset")
}
}

enum class PreviewAnnotationType(val key: String) {
AndroidX("androidx"),
Jetbrains("jetbrains"),
Expand Down Expand Up @@ -63,6 +74,7 @@ object ImageVectorGenerator {
useExplicitMode = config.useExplicitMode,
addTrailingComma = config.addTrailingComma,
indentSize = config.indentSize,
fullQualifiedImports = config.fullQualifiedImports,
),
).createFileFor(vector)
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,18 @@ import io.github.composegears.valkyrie.ir.IrImageVector

internal class BackingPropertySpec(private val config: ImageVectorSpecConfig) {

fun createAsBackingProperty(irVector: IrImageVector): ImageVectorSpecOutput {
fun createAsBackingProperty(irVector: IrImageVector): ImageVectorSpecOutput = with(config) {
val backingProperty = backingPropertySpec(
name = config.iconName.backingPropertyName(),
name = iconName.backingPropertyName(),
type = ClassNames.ImageVector,
)

val iconPackClassName = config.resolveIconPackClassName()
val packageName = config.resolvePackageName()
val iconPackClassName = resolveIconPackClassName()
val packageName = resolvePackageName()

val fileSpec = fileSpecBuilder(
packageName = packageName,
fileName = config.iconName,
fileName = iconName,
) {
addProperty(
propertySpec = iconProperty(
Expand All @@ -40,22 +40,22 @@ internal class BackingPropertySpec(private val config: ImageVectorSpecConfig) {
)
addProperty(propertySpec = backingProperty)
addPreview(
config = config,
iconPackClassName = iconPackClassName,
packageName = packageName,
)
setIndent(config.indentSize)
setIndent(indentSize)
}

return ImageVectorSpecOutput(
content = when {
config.useExplicitMode -> fileSpec.toString()
useExplicitMode -> fileSpec.toString()
else -> fileSpec.removeExplicitModeCode()
},
name = fileSpec.name,
)
}

context(config: ImageVectorSpecConfig)
private fun iconProperty(
irVector: IrImageVector,
iconPackClassName: ClassName?,
Expand All @@ -65,6 +65,7 @@ internal class BackingPropertySpec(private val config: ImageVectorSpecConfig) {
getter(iconFun(irVector = irVector, backingProperty = backingProperty))
}

context(config: ImageVectorSpecConfig)
private fun iconFun(irVector: IrImageVector, backingProperty: PropertySpec): FunSpec {
return getterFunSpecBuilder {
addCode(
Expand All @@ -77,7 +78,7 @@ internal class BackingPropertySpec(private val config: ImageVectorSpecConfig) {
addCode(
buildCodeBlock {
addCode("%N = ", backingProperty)
addImageVectorBlock(config = config, irVector = irVector)
addImageVectorBlock(irVector = irVector)
},
)
addStatement("")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,8 @@ internal fun ImageVectorSpecConfig.resolveIconPackClassName() = when {
}
}

internal fun CodeBlock.Builder.addImageVectorBlock(
config: ImageVectorSpecConfig,
irVector: IrImageVector,
) {
context(config: ImageVectorSpecConfig)
internal fun CodeBlock.Builder.addImageVectorBlock(irVector: IrImageVector) {
add(
imageVectorBuilderSpecs(
iconName = when {
Expand All @@ -47,64 +45,41 @@ internal fun CodeBlock.Builder.addImageVectorBlock(
irVector = irVector,
path = {
irVector.nodes.forEach { node ->
addVectorNode(
irVectorNode = node,
addTrailingComma = config.addTrailingComma,
useComposeColors = config.useComposeColors,
)
addVectorNode(irVectorNode = node)
}
},
addTrailingComma = config.addTrailingComma,
),
)
}

context(config: ImageVectorSpecConfig)
internal fun FileSpec.Builder.addPreview(
config: ImageVectorSpecConfig,
iconPackClassName: ClassName?,
packageName: String,
) {
if (config.generatePreview) {
addFunction(
funSpec = when {
iconPackClassName != null -> iconPreviewSpecForNestedPack(
iconPackClassName = iconPackClassName,
iconName = config.iconName,
previewAnnotationType = config.previewAnnotationType,
)
else -> iconPreviewSpec(
iconPackage = packageName,
iconName = config.iconName,
previewAnnotationType = config.previewAnnotationType,
)
iconPackClassName != null -> iconPreviewSpecForNestedPack(iconPackClassName = iconPackClassName)
else -> iconPreviewSpec(iconPackage = packageName)
},
)
}
}

private fun CodeBlock.Builder.addVectorNode(
irVectorNode: IrVectorNode,
addTrailingComma: Boolean,
useComposeColors: Boolean,
) {
context(config: ImageVectorSpecConfig)
private fun CodeBlock.Builder.addVectorNode(irVectorNode: IrVectorNode) {
when (irVectorNode) {
is IrVectorNode.IrGroup -> addGroup(
path = irVectorNode,
addTrailingComma = addTrailingComma,
groupBody = {
irVectorNode.nodes.forEach { node ->
addVectorNode(
irVectorNode = node,
addTrailingComma = addTrailingComma,
useComposeColors = useComposeColors,
)
addVectorNode(irVectorNode = node)
}
},
)
is IrVectorNode.IrPath -> addPath(
path = irVectorNode,
addTrailingComma = addTrailingComma,
useComposeColor = useComposeColors,
pathBody = {
irVectorNode.paths.forEach { pathNode ->
// based on https://github.com/square/kotlinpoet/pull/1860#issuecomment-1986825382
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,13 @@ import io.github.composegears.valkyrie.ir.IrImageVector

internal class LazyPropertySpec(private val config: ImageVectorSpecConfig) {

fun createAsLazyProperty(irVector: IrImageVector): ImageVectorSpecOutput {
val iconPackClassName = config.resolveIconPackClassName()
val packageName = config.resolvePackageName()
fun createAsLazyProperty(irVector: IrImageVector): ImageVectorSpecOutput = with(config) {
val iconPackClassName = resolveIconPackClassName()
val packageName = resolvePackageName()

val fileSpec = fileSpecBuilder(
packageName = packageName,
fileName = config.iconName,
fileName = iconName,
) {
addProperty(
propertySpec = iconProperty(
Expand All @@ -30,29 +30,29 @@ internal class LazyPropertySpec(private val config: ImageVectorSpecConfig) {
),
)
addPreview(
config = config,
iconPackClassName = iconPackClassName,
packageName = packageName,
)
setIndent(config.indentSize)
setIndent(indentSize)
}

return ImageVectorSpecOutput(
content = when {
config.useExplicitMode -> fileSpec.toString()
useExplicitMode -> fileSpec.toString()
else -> fileSpec.removeExplicitModeCode()
},
name = fileSpec.name,
)
}

context(config: ImageVectorSpecConfig)
private fun iconProperty(
irVector: IrImageVector,
iconPackClassName: ClassName?,
): PropertySpec = propertySpecBuilder(name = config.iconName, type = ClassNames.ImageVector) {
receiver(iconPackClassName)
val codeBlock = buildCodeBlock {
addImageVectorBlock(config = config, irVector = irVector)
addImageVectorBlock(irVector = irVector)
}

delegate(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@ package io.github.composegears.valkyrie.generator.jvm.imagevector.util

import com.squareup.kotlinpoet.CodeBlock
import com.squareup.kotlinpoet.buildCodeBlock
import com.squareup.kotlinpoet.withIndent
import io.github.composegears.valkyrie.generator.core.formatFloat
import io.github.composegears.valkyrie.generator.jvm.ext.builderBlock
import io.github.composegears.valkyrie.generator.jvm.ext.indention
import io.github.composegears.valkyrie.generator.jvm.ext.newLine
import io.github.composegears.valkyrie.generator.jvm.ext.trailingComma
import io.github.composegears.valkyrie.generator.jvm.imagevector.ImageVectorSpecConfig
import io.github.composegears.valkyrie.generator.jvm.imagevector.spec.asStatement
import io.github.composegears.valkyrie.generator.jvm.imagevector.util.GroupParams.ClipPathParam
import io.github.composegears.valkyrie.generator.jvm.imagevector.util.GroupParams.NameParam
Expand All @@ -20,9 +21,9 @@ import io.github.composegears.valkyrie.generator.jvm.imagevector.util.GroupParam
import io.github.composegears.valkyrie.ir.IrPathNode
import io.github.composegears.valkyrie.ir.IrVectorNode

context(config: ImageVectorSpecConfig)
internal fun CodeBlock.Builder.addGroup(
path: IrVectorNode.IrGroup,
addTrailingComma: Boolean,
groupBody: CodeBlock.Builder.() -> Unit,
) {
val groupParams = path.buildGroupParams()
Expand All @@ -48,20 +49,20 @@ internal fun CodeBlock.Builder.addGroup(
add(
codeBlock = buildCodeBlock {
add("%M(\n", MemberNames.Group)
indent()
groupParams.forEachIndexed { index, param ->
fillGroupArgs(param)
if (index == groupParams.lastIndex) {
if (addTrailingComma) {
trailingComma()
withIndent {
groupParams.forEachIndexed { index, param ->
fillGroupArgs(param)
if (index == groupParams.lastIndex) {
if (config.addTrailingComma) {
trailingComma()
} else {
newLine()
}
} else {
newLine()
trailingComma()
}
} else {
trailingComma()
}
}
unindent()
add(")")
beginControlFlow("")
groupBody()
Expand Down Expand Up @@ -120,7 +121,7 @@ private fun CodeBlock.Builder.translationYArg(param: TranslationYParam) {

private fun CodeBlock.Builder.clipPathArg(param: ClipPathParam) {
newLine()
indention {
withIndent {
builderBlock("clipPathData = %M {", MemberNames.PathData) {
param.clipPath.forEach { pathNode ->
addStatement("%L", pathNode.asStatement().replace(' ', '·'))
Expand Down
Loading