Skip to content

Commit 7f1568c

Browse files
committed
[CLI] Use full qualified imports if icon name conflict with Compose qualifier
1 parent dcb8830 commit 7f1568c

File tree

25 files changed

+904
-162
lines changed

25 files changed

+904
-162
lines changed

components/generator/jvm/imagevector/api/imagevector.api

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,38 @@
1+
public final class io/github/composegears/valkyrie/generator/jvm/imagevector/FullQualifiedImports {
2+
public static final field Companion Lio/github/composegears/valkyrie/generator/jvm/imagevector/FullQualifiedImports$Companion;
3+
public fun <init> ()V
4+
public fun <init> (ZZZ)V
5+
public synthetic fun <init> (ZZZILkotlin/jvm/internal/DefaultConstructorMarker;)V
6+
public final fun component1 ()Z
7+
public final fun component2 ()Z
8+
public final fun component3 ()Z
9+
public final fun copy (ZZZ)Lio/github/composegears/valkyrie/generator/jvm/imagevector/FullQualifiedImports;
10+
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;
11+
public fun equals (Ljava/lang/Object;)Z
12+
public final fun getBrush ()Z
13+
public final fun getColor ()Z
14+
public final fun getOffset ()Z
15+
public fun hashCode ()I
16+
public fun toString ()Ljava/lang/String;
17+
}
18+
19+
public final class io/github/composegears/valkyrie/generator/jvm/imagevector/FullQualifiedImports$Companion {
20+
public final fun getReservedComposeQualifiers ()Ljava/util/List;
21+
}
22+
123
public final class io/github/composegears/valkyrie/generator/jvm/imagevector/ImageVectorGenerator {
224
public static final field INSTANCE Lio/github/composegears/valkyrie/generator/jvm/imagevector/ImageVectorGenerator;
325
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;
426
}
527

628
public final class io/github/composegears/valkyrie/generator/jvm/imagevector/ImageVectorGeneratorConfig {
7-
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
29+
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
30+
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
831
public final fun component1 ()Ljava/lang/String;
932
public final fun component10 ()Z
1033
public final fun component11 ()Z
1134
public final fun component12 ()I
35+
public final fun component13 ()Lio/github/composegears/valkyrie/generator/jvm/imagevector/FullQualifiedImports;
1236
public final fun component2 ()Ljava/lang/String;
1337
public final fun component3 ()Ljava/lang/String;
1438
public final fun component4 ()Ljava/lang/String;
@@ -17,10 +41,11 @@ public final class io/github/composegears/valkyrie/generator/jvm/imagevector/Ima
1741
public final fun component7 ()Z
1842
public final fun component8 ()Lio/github/composegears/valkyrie/generator/jvm/imagevector/PreviewAnnotationType;
1943
public final fun component9 ()Z
20-
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;
21-
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;
44+
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;
45+
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;
2246
public fun equals (Ljava/lang/Object;)Z
2347
public final fun getAddTrailingComma ()Z
48+
public final fun getFullQualifiedImports ()Lio/github/composegears/valkyrie/generator/jvm/imagevector/FullQualifiedImports;
2449
public final fun getGeneratePreview ()Z
2550
public final fun getIconPackPackage ()Ljava/lang/String;
2651
public final fun getIndentSize ()I

components/generator/jvm/imagevector/build.gradle.kts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ sourceSets {
99
}
1010
}
1111

12+
kotlin {
13+
compilerOptions {
14+
freeCompilerArgs.add("-Xcontext-parameters")
15+
}
16+
}
17+
1218
dependencies {
1319
implementation(projects.components.extensions)
1420
api(projects.components.generator.jvm.poetExtensions)

components/generator/jvm/imagevector/src/main/kotlin/io/github/composegears/valkyrie/generator/jvm/imagevector/ImageVectorFileSpec.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ internal data class ImageVectorSpecConfig(
2020
val useExplicitMode: Boolean,
2121
val addTrailingComma: Boolean,
2222
val indentSize: Int,
23+
val fullQualifiedImports: FullQualifiedImports,
2324
)
2425

2526
internal class ImageVectorFileSpec(private val config: ImageVectorSpecConfig) {

components/generator/jvm/imagevector/src/main/kotlin/io/github/composegears/valkyrie/generator/jvm/imagevector/ImageVectorGenerator.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,19 @@ data class ImageVectorGeneratorConfig(
1515
val useExplicitMode: Boolean,
1616
val addTrailingComma: Boolean,
1717
val indentSize: Int,
18+
val fullQualifiedImports: FullQualifiedImports = FullQualifiedImports(),
1819
)
1920

21+
data class FullQualifiedImports(
22+
val brush: Boolean = false,
23+
val color: Boolean = false,
24+
val offset: Boolean = false,
25+
) {
26+
companion object {
27+
val reservedComposeQualifiers = listOf("Brush", "Color", "Offset")
28+
}
29+
}
30+
2031
enum class PreviewAnnotationType(val key: String) {
2132
AndroidX("androidx"),
2233
Jetbrains("jetbrains"),
@@ -63,6 +74,7 @@ object ImageVectorGenerator {
6374
useExplicitMode = config.useExplicitMode,
6475
addTrailingComma = config.addTrailingComma,
6576
indentSize = config.indentSize,
77+
fullQualifiedImports = config.fullQualifiedImports,
6678
),
6779
).createFileFor(vector)
6880
}

components/generator/jvm/imagevector/src/main/kotlin/io/github/composegears/valkyrie/generator/jvm/imagevector/spec/BackingPropertySpec.kt

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,18 @@ import io.github.composegears.valkyrie.ir.IrImageVector
1818

1919
internal class BackingPropertySpec(private val config: ImageVectorSpecConfig) {
2020

21-
fun createAsBackingProperty(irVector: IrImageVector): ImageVectorSpecOutput {
21+
fun createAsBackingProperty(irVector: IrImageVector): ImageVectorSpecOutput = with(config) {
2222
val backingProperty = backingPropertySpec(
23-
name = config.iconName.backingPropertyName(),
23+
name = iconName.backingPropertyName(),
2424
type = ClassNames.ImageVector,
2525
)
2626

27-
val iconPackClassName = config.resolveIconPackClassName()
28-
val packageName = config.resolvePackageName()
27+
val iconPackClassName = resolveIconPackClassName()
28+
val packageName = resolvePackageName()
2929

3030
val fileSpec = fileSpecBuilder(
3131
packageName = packageName,
32-
fileName = config.iconName,
32+
fileName = iconName,
3333
) {
3434
addProperty(
3535
propertySpec = iconProperty(
@@ -40,22 +40,22 @@ internal class BackingPropertySpec(private val config: ImageVectorSpecConfig) {
4040
)
4141
addProperty(propertySpec = backingProperty)
4242
addPreview(
43-
config = config,
4443
iconPackClassName = iconPackClassName,
4544
packageName = packageName,
4645
)
47-
setIndent(config.indentSize)
46+
setIndent(indentSize)
4847
}
4948

5049
return ImageVectorSpecOutput(
5150
content = when {
52-
config.useExplicitMode -> fileSpec.toString()
51+
useExplicitMode -> fileSpec.toString()
5352
else -> fileSpec.removeExplicitModeCode()
5453
},
5554
name = fileSpec.name,
5655
)
5756
}
5857

58+
context(config: ImageVectorSpecConfig)
5959
private fun iconProperty(
6060
irVector: IrImageVector,
6161
iconPackClassName: ClassName?,
@@ -65,6 +65,7 @@ internal class BackingPropertySpec(private val config: ImageVectorSpecConfig) {
6565
getter(iconFun(irVector = irVector, backingProperty = backingProperty))
6666
}
6767

68+
context(config: ImageVectorSpecConfig)
6869
private fun iconFun(irVector: IrImageVector, backingProperty: PropertySpec): FunSpec {
6970
return getterFunSpecBuilder {
7071
addCode(
@@ -77,7 +78,7 @@ internal class BackingPropertySpec(private val config: ImageVectorSpecConfig) {
7778
addCode(
7879
buildCodeBlock {
7980
addCode("%N = ", backingProperty)
80-
addImageVectorBlock(config = config, irVector = irVector)
81+
addImageVectorBlock(irVector = irVector)
8182
},
8283
)
8384
addStatement("")

components/generator/jvm/imagevector/src/main/kotlin/io/github/composegears/valkyrie/generator/jvm/imagevector/spec/Common.kt

Lines changed: 9 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,8 @@ internal fun ImageVectorSpecConfig.resolveIconPackClassName() = when {
3434
}
3535
}
3636

37-
internal fun CodeBlock.Builder.addImageVectorBlock(
38-
config: ImageVectorSpecConfig,
39-
irVector: IrImageVector,
40-
) {
37+
context(config: ImageVectorSpecConfig)
38+
internal fun CodeBlock.Builder.addImageVectorBlock(irVector: IrImageVector) {
4139
add(
4240
imageVectorBuilderSpecs(
4341
iconName = when {
@@ -47,64 +45,41 @@ internal fun CodeBlock.Builder.addImageVectorBlock(
4745
irVector = irVector,
4846
path = {
4947
irVector.nodes.forEach { node ->
50-
addVectorNode(
51-
irVectorNode = node,
52-
addTrailingComma = config.addTrailingComma,
53-
useComposeColors = config.useComposeColors,
54-
)
48+
addVectorNode(irVectorNode = node)
5549
}
5650
},
57-
addTrailingComma = config.addTrailingComma,
5851
),
5952
)
6053
}
6154

55+
context(config: ImageVectorSpecConfig)
6256
internal fun FileSpec.Builder.addPreview(
63-
config: ImageVectorSpecConfig,
6457
iconPackClassName: ClassName?,
6558
packageName: String,
6659
) {
6760
if (config.generatePreview) {
6861
addFunction(
6962
funSpec = when {
70-
iconPackClassName != null -> iconPreviewSpecForNestedPack(
71-
iconPackClassName = iconPackClassName,
72-
iconName = config.iconName,
73-
previewAnnotationType = config.previewAnnotationType,
74-
)
75-
else -> iconPreviewSpec(
76-
iconPackage = packageName,
77-
iconName = config.iconName,
78-
previewAnnotationType = config.previewAnnotationType,
79-
)
63+
iconPackClassName != null -> iconPreviewSpecForNestedPack(iconPackClassName = iconPackClassName)
64+
else -> iconPreviewSpec(iconPackage = packageName)
8065
},
8166
)
8267
}
8368
}
8469

85-
private fun CodeBlock.Builder.addVectorNode(
86-
irVectorNode: IrVectorNode,
87-
addTrailingComma: Boolean,
88-
useComposeColors: Boolean,
89-
) {
70+
context(config: ImageVectorSpecConfig)
71+
private fun CodeBlock.Builder.addVectorNode(irVectorNode: IrVectorNode) {
9072
when (irVectorNode) {
9173
is IrVectorNode.IrGroup -> addGroup(
9274
path = irVectorNode,
93-
addTrailingComma = addTrailingComma,
9475
groupBody = {
9576
irVectorNode.nodes.forEach { node ->
96-
addVectorNode(
97-
irVectorNode = node,
98-
addTrailingComma = addTrailingComma,
99-
useComposeColors = useComposeColors,
100-
)
77+
addVectorNode(irVectorNode = node)
10178
}
10279
},
10380
)
10481
is IrVectorNode.IrPath -> addPath(
10582
path = irVectorNode,
106-
addTrailingComma = addTrailingComma,
107-
useComposeColor = useComposeColors,
10883
pathBody = {
10984
irVectorNode.paths.forEach { pathNode ->
11085
// based on https://github.com/square/kotlinpoet/pull/1860#issuecomment-1986825382

components/generator/jvm/imagevector/src/main/kotlin/io/github/composegears/valkyrie/generator/jvm/imagevector/spec/LazyPropertySpec.kt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@ import io.github.composegears.valkyrie.ir.IrImageVector
1515

1616
internal class LazyPropertySpec(private val config: ImageVectorSpecConfig) {
1717

18-
fun createAsLazyProperty(irVector: IrImageVector): ImageVectorSpecOutput {
19-
val iconPackClassName = config.resolveIconPackClassName()
20-
val packageName = config.resolvePackageName()
18+
fun createAsLazyProperty(irVector: IrImageVector): ImageVectorSpecOutput = with(config) {
19+
val iconPackClassName = resolveIconPackClassName()
20+
val packageName = resolvePackageName()
2121

2222
val fileSpec = fileSpecBuilder(
2323
packageName = packageName,
24-
fileName = config.iconName,
24+
fileName = iconName,
2525
) {
2626
addProperty(
2727
propertySpec = iconProperty(
@@ -30,29 +30,29 @@ internal class LazyPropertySpec(private val config: ImageVectorSpecConfig) {
3030
),
3131
)
3232
addPreview(
33-
config = config,
3433
iconPackClassName = iconPackClassName,
3534
packageName = packageName,
3635
)
37-
setIndent(config.indentSize)
36+
setIndent(indentSize)
3837
}
3938

4039
return ImageVectorSpecOutput(
4140
content = when {
42-
config.useExplicitMode -> fileSpec.toString()
41+
useExplicitMode -> fileSpec.toString()
4342
else -> fileSpec.removeExplicitModeCode()
4443
},
4544
name = fileSpec.name,
4645
)
4746
}
4847

48+
context(config: ImageVectorSpecConfig)
4949
private fun iconProperty(
5050
irVector: IrImageVector,
5151
iconPackClassName: ClassName?,
5252
): PropertySpec = propertySpecBuilder(name = config.iconName, type = ClassNames.ImageVector) {
5353
receiver(iconPackClassName)
5454
val codeBlock = buildCodeBlock {
55-
addImageVectorBlock(config = config, irVector = irVector)
55+
addImageVectorBlock(irVector = irVector)
5656
}
5757

5858
delegate(

components/generator/jvm/imagevector/src/main/kotlin/io/github/composegears/valkyrie/generator/jvm/imagevector/util/GroupBuilder.kt

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@ package io.github.composegears.valkyrie.generator.jvm.imagevector.util
22

33
import com.squareup.kotlinpoet.CodeBlock
44
import com.squareup.kotlinpoet.buildCodeBlock
5+
import com.squareup.kotlinpoet.withIndent
56
import io.github.composegears.valkyrie.generator.core.formatFloat
67
import io.github.composegears.valkyrie.generator.jvm.ext.builderBlock
7-
import io.github.composegears.valkyrie.generator.jvm.ext.indention
88
import io.github.composegears.valkyrie.generator.jvm.ext.newLine
99
import io.github.composegears.valkyrie.generator.jvm.ext.trailingComma
10+
import io.github.composegears.valkyrie.generator.jvm.imagevector.ImageVectorSpecConfig
1011
import io.github.composegears.valkyrie.generator.jvm.imagevector.spec.asStatement
1112
import io.github.composegears.valkyrie.generator.jvm.imagevector.util.GroupParams.ClipPathParam
1213
import io.github.composegears.valkyrie.generator.jvm.imagevector.util.GroupParams.NameParam
@@ -20,9 +21,9 @@ import io.github.composegears.valkyrie.generator.jvm.imagevector.util.GroupParam
2021
import io.github.composegears.valkyrie.ir.IrPathNode
2122
import io.github.composegears.valkyrie.ir.IrVectorNode
2223

24+
context(config: ImageVectorSpecConfig)
2325
internal fun CodeBlock.Builder.addGroup(
2426
path: IrVectorNode.IrGroup,
25-
addTrailingComma: Boolean,
2627
groupBody: CodeBlock.Builder.() -> Unit,
2728
) {
2829
val groupParams = path.buildGroupParams()
@@ -48,20 +49,20 @@ internal fun CodeBlock.Builder.addGroup(
4849
add(
4950
codeBlock = buildCodeBlock {
5051
add("%M(\n", MemberNames.Group)
51-
indent()
52-
groupParams.forEachIndexed { index, param ->
53-
fillGroupArgs(param)
54-
if (index == groupParams.lastIndex) {
55-
if (addTrailingComma) {
56-
trailingComma()
52+
withIndent {
53+
groupParams.forEachIndexed { index, param ->
54+
fillGroupArgs(param)
55+
if (index == groupParams.lastIndex) {
56+
if (config.addTrailingComma) {
57+
trailingComma()
58+
} else {
59+
newLine()
60+
}
5761
} else {
58-
newLine()
62+
trailingComma()
5963
}
60-
} else {
61-
trailingComma()
6264
}
6365
}
64-
unindent()
6566
add(")")
6667
beginControlFlow("")
6768
groupBody()
@@ -120,7 +121,7 @@ private fun CodeBlock.Builder.translationYArg(param: TranslationYParam) {
120121

121122
private fun CodeBlock.Builder.clipPathArg(param: ClipPathParam) {
122123
newLine()
123-
indention {
124+
withIndent {
124125
builderBlock("clipPathData = %M {", MemberNames.PathData) {
125126
param.clipPath.forEach { pathNode ->
126127
addStatement("%L", pathNode.asStatement().replace(' ', '·'))

0 commit comments

Comments
 (0)