Skip to content

Commit a36bbb3

Browse files
authored
Merge pull request #20 from undeadcat/expressionAtStartEnd
fix red code when string template arg is exactly at start/end
2 parents ad4bccf + 3121e5c commit a36bbb3

File tree

3 files changed

+21
-7
lines changed

3 files changed

+21
-7
lines changed

src/main/kotlin/com/intellij/StyledComponents/StyledComponentsInjector.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,12 @@ class StyledComponentsInjector : MultiHostInjector {
3838
val acceptedPattern = places.find { (elementPattern) -> elementPattern.accepts(injectionHost) }
3939
if (acceptedPattern != null) {
4040
val stringPlaces = getInjectionPlaces(injectionHost)
41+
if (stringPlaces.isEmpty())
42+
return
4143
registrar.startInjecting(LESSLanguage.INSTANCE)
4244
stringPlaces.forEachIndexed { index, (prefix, range, suffix) ->
43-
val thePrefix = if (index == 0) acceptedPattern.prefix else prefix
44-
val theSuffix = if (index == stringPlaces.size - 1) acceptedPattern.suffix else suffix
45+
val thePrefix = if (index == 0) acceptedPattern.prefix + prefix.orEmpty() else prefix
46+
val theSuffix = if (index == stringPlaces.size - 1) suffix.orEmpty() + acceptedPattern.suffix else suffix
4547
registrar.addPlace(thePrefix, theSuffix, injectionHost, range)
4648
}
4749
registrar.doneInjecting()
@@ -61,6 +63,6 @@ class StyledComponentsInjector : MultiHostInjector {
6163
else result[result.size - 1]
6264
}
6365
data class PlaceInfo(val elementPattern: ElementPattern<JSStringTemplateExpression>,
64-
val prefix: String? = null,
65-
val suffix: String? = null)
66+
val prefix: String = "",
67+
val suffix: String = "")
6668
}

src/test/InjectionTest.kt

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@ import com.intellij.util.containers.ContainerUtil
88
import org.junit.Assert
99

1010
class InjectionTest : LightCodeInsightFixtureTestCase() {
11+
12+
fun testTemplateArgumentIsWholeRange() {
13+
doTest("let css = css`\${someVariable}`")
14+
doTest("let globalCss = injectGlobal`\${someVariable}`")
15+
}
16+
1117
fun testCss() {
1218
doTest("let css = css`\n" +
1319
" color:red;\n" +
@@ -110,12 +116,18 @@ class InjectionTest : LightCodeInsightFixtureTestCase() {
110116
" }\n")
111117
}
112118

113-
private fun doTest(fileContent: String, expected: String) {
119+
fun testTemplateArgsAtStartEndOfString() {
120+
doTest("let atStart = styled.div`\${getPropName()}:red`\n" +
121+
"let atEnd = styled.div`color:\${getColor()}`\n",
122+
"div {EXTERNAL_FRAGMENT:red}",
123+
"div {color:EXTERNAL_FRAGMENT}")
124+
}
125+
126+
private fun doTest(fileContent: String, vararg expected: String) {
114127
myFixture.setCaresAboutInjection(true)
115128
val file = myFixture.configureByText("dummy.es6", fileContent)
116129
val injections = collectInjectedPsiContents(file)
117-
Assert.assertEquals(1, injections.size)
118-
Assert.assertEquals(expected, injections[0])
130+
Assert.assertEquals(expected.toList(), injections)
119131
}
120132

121133
private fun collectInjectedPsiContents(file: PsiFile): List<String> {

webstorm-styled-components.zip

164 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)