Skip to content

Commit be55b85

Browse files
committed
Enhance ImageVector gutter functionality and parsing logic
1 parent d1f6357 commit be55b85

File tree

10 files changed

+264
-38
lines changed

10 files changed

+264
-38
lines changed

sdk/intellij/psi/imagevector/api/imagevector.api

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@ public final class io/github/composegears/valkyrie/sdk/intellij/psi/imagevector/
22
public static final field $stable I
33
public static final field INSTANCE Lio/github/composegears/valkyrie/sdk/intellij/psi/imagevector/ImageVectorPsiParser;
44
public final fun parseToIrImageVector (Lorg/jetbrains/kotlin/psi/KtFile;)Lio/github/composegears/valkyrie/sdk/ir/core/IrImageVector;
5+
public final fun parseToIrImageVector (Lorg/jetbrains/kotlin/psi/KtProperty;)Lio/github/composegears/valkyrie/sdk/ir/core/IrImageVector;
56
}
67

sdk/intellij/psi/imagevector/src/main/kotlin/io/github/composegears/valkyrie/sdk/intellij/psi/imagevector/ImageVectorPsiParser.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import io.github.composegears.valkyrie.sdk.intellij.psi.imagevector.parser.Regul
55
import io.github.composegears.valkyrie.sdk.ir.core.IrImageVector
66
import org.jetbrains.kotlin.psi.KtFile
77
import org.jetbrains.kotlin.psi.KtImportList
8+
import org.jetbrains.kotlin.psi.KtProperty
89

910
object ImageVectorPsiParser {
1011

@@ -17,6 +18,16 @@ object ImageVectorPsiParser {
1718
}
1819
}
1920

21+
fun parseToIrImageVector(ktProperty: KtProperty): IrImageVector? {
22+
val ktFile = ktProperty.containingKtFile
23+
val isMaterial = ktFile.importList?.isMaterial() ?: return null
24+
25+
return when {
26+
isMaterial -> MaterialImageVectorPsiParser.parse(ktProperty)
27+
else -> RegularImageVectorPsiParser.parse(ktProperty)
28+
}
29+
}
30+
2031
private fun KtImportList.isMaterial(): Boolean {
2132
return imports.any {
2233
val fqName = it.importedFqName

sdk/intellij/psi/imagevector/src/main/kotlin/io/github/composegears/valkyrie/sdk/intellij/psi/imagevector/parser/MaterialImageVectorPsiParser.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,15 @@ internal object MaterialImageVectorPsiParser {
3131
.firstOrNull { it.typeReference?.text == "ImageVector" }
3232
?: return null
3333

34-
val blockBody = property.getter?.bodyBlockExpression ?: return null
34+
return property.parseImageVector()
35+
}
36+
37+
fun parse(ktProperty: KtProperty): IrImageVector? {
38+
return ktProperty.parseImageVector()
39+
}
40+
41+
internal fun KtProperty.parseImageVector(): IrImageVector? {
42+
val blockBody = getter?.bodyBlockExpression ?: return null
3543

3644
val materialIconCall = blockBody.materialIconCall()
3745

@@ -50,7 +58,7 @@ internal object MaterialImageVectorPsiParser {
5058
val builder = blockBody.builderExpression() ?: return null
5159

5260
return IrImageVector(
53-
name = builder.name().ifEmpty { property.name.orEmpty() },
61+
name = builder.name().ifEmpty { name.orEmpty() },
5462
defaultWidth = builder.defaultWidth(24f),
5563
defaultHeight = builder.defaultHeight(24f),
5664
viewportWidth = builder.viewportWidth(24f),

sdk/intellij/psi/imagevector/src/main/kotlin/io/github/composegears/valkyrie/sdk/intellij/psi/imagevector/parser/RegularImageVectorPsiParser.kt

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,22 @@ internal object RegularImageVectorPsiParser {
3232
.firstOrNull { it.typeReference?.text == "ImageVector" }
3333
?: return null
3434

35-
val blockBody = property.getter?.bodyBlockExpression
36-
?: property.delegateExpression?.childrenOfType<KtBlockExpression>()?.firstOrNull()
35+
return property.parseImageVector()
36+
}
37+
38+
fun parse(ktProperty: KtProperty): IrImageVector? {
39+
return ktProperty.parseImageVector()
40+
}
41+
42+
internal fun KtProperty.parseImageVector(): IrImageVector? {
43+
val blockBody = getter?.bodyBlockExpression
44+
?: delegateExpression?.childrenOfType<KtBlockExpression>()?.firstOrNull()
3745
?: return null
3846

3947
val builder = blockBody.builderExpression() ?: return null
4048

4149
return IrImageVector(
42-
name = builder.name().ifEmpty { property.name.orEmpty() },
50+
name = builder.name().ifEmpty { name.orEmpty() },
4351
defaultWidth = builder.defaultWidth(0f),
4452
defaultHeight = builder.defaultHeight(0f),
4553
viewportWidth = builder.viewportWidth(0f),

tools/idea-plugin/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
### Added
66

77
- Add export as file action for `Simple mode` and `ImageVector to XML` tool
8+
- [Gutter] Add support for multiple icons in kt file
89

910
### Fixed
1011

tools/idea-plugin/build.gradle.kts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -95,12 +95,6 @@ dependencies {
9595
}
9696
}
9797

98-
configurations {
99-
testImplementation {
100-
exclude(group = "org.jetbrains.kotlinx")
101-
}
102-
}
103-
10498
compose.resources {
10599
generateResClass = never
106100
}

tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/completion/ImageVectorIcon.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,10 @@ class ImageVectorIcon(
8585
override fun getIconWidth(): Int = size
8686
override fun getIconHeight(): Int = size
8787

88+
override fun toString(): String {
89+
return "ImageVectorIcon(size=$size, aspectRatio=$aspectRatio, dominantShade=$dominantShade, vectorXml=${vectorXml.take(100)})"
90+
}
91+
8892
companion object {
8993
private const val ICON_SCALE_FACTOR = 4
9094

tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/icon/ImageVectorIconProvider.kt

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,29 +6,36 @@ import com.intellij.psi.PsiElement
66
import com.intellij.psi.PsiFile
77
import io.github.composegears.valkyrie.service.PersistentSettings.Companion.persistentSettings
88
import io.github.composegears.valkyrie.util.getOrCreateCachedIcon
9+
import io.github.composegears.valkyrie.util.getOrCreateGutterIcon
910
import io.github.composegears.valkyrie.util.hasImageVectorProperties
11+
import io.github.composegears.valkyrie.util.isImageVector
1012
import javax.swing.Icon
1113
import org.jetbrains.kotlin.psi.KtFile
14+
import org.jetbrains.kotlin.psi.KtProperty
1215

1316
class ImageVectorIconProvider :
1417
IconProvider(),
1518
DumbAware {
1619

1720
override fun getIcon(element: PsiElement, flags: Int): Icon? {
21+
val project = element.project
22+
if (project.isDisposed) return null
23+
24+
if (!project.persistentSettings.state.showIconsInProjectView) return null
25+
26+
if (element is KtProperty && element.isImageVector()) {
27+
return element.getOrCreateGutterIcon()
28+
}
29+
1830
val ktFile = when (element) {
1931
is KtFile -> element
2032
is PsiFile -> null
2133
else -> element.containingFile as? KtFile
2234
} ?: return null
2335

24-
val project = element.project
25-
if (project.isDisposed) return null
26-
val showIconsInProjectView = project.persistentSettings.state.showIconsInProjectView
27-
28-
if (!showIconsInProjectView || !ktFile.hasImageVectorProperties()) {
29-
return null
36+
return when {
37+
ktFile.hasImageVectorProperties() -> ktFile.getOrCreateCachedIcon()
38+
else -> null
3039
}
31-
32-
return ktFile.getOrCreateCachedIcon()
3340
}
3441
}

tools/idea-plugin/src/main/kotlin/io/github/composegears/valkyrie/util/ImageVectorPsiUtil.kt

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -79,18 +79,14 @@ private fun IrImageVector.toIcon(): Icon = ImageVectorIcon(
7979
)
8080

8181
private fun parseImageVectorProperty(property: KtProperty): IrImageVector? {
82-
// Try parsing the current file
83-
val containingFile = property.containingKtFile
84-
ImageVectorPsiParser.parseToIrImageVector(containingFile)?.let { return it }
82+
ImageVectorPsiParser.parseToIrImageVector(property)?.let { return it }
8583

8684
// For properties from libraries, navigate to decompiled/attached source
87-
val navigationElement = property.navigationElement
88-
if (navigationElement is KtProperty && navigationElement != property) {
89-
val sourceFile = navigationElement.containingKtFile
90-
85+
val psiElement = property.navigationElement
86+
if (psiElement is KtProperty && psiElement != property) {
9187
// Only parse if we have actual source code (not a stub)
92-
if (COMPILED_CODE_MARKER !in sourceFile.text) {
93-
return ImageVectorPsiParser.parseToIrImageVector(sourceFile)
88+
if (COMPILED_CODE_MARKER !in psiElement.text) {
89+
return ImageVectorPsiParser.parseToIrImageVector(psiElement)
9490
}
9591
}
9692

0 commit comments

Comments
 (0)