From 27bb538b9abb3e4762105f4cf19e102db4f72a05 Mon Sep 17 00:00:00 2001 From: Maxim Kropotov Date: Thu, 31 Aug 2017 14:27:37 +0300 Subject: [PATCH 1/2] initial commit from intellij sources * use dummy identifier (EXTERNAL_FRAGMENT) in place of string interpolation arguments to preserve injected syntax structure as much as possible * add tests --- .gitignore | 3 + META-INF/plugin.xml | 52 ------ build.gradle | 21 +++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54788 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 172 ++++++++++++++++++ gradlew.bat | 84 +++++++++ settings.gradle | 1 + src/SCInjector.java | 71 -------- .../StyledComponents/InjectionUtils.kt | 39 ++++ .../com/intellij/StyledComponents/Patterns.kt | 58 ++++++ .../StyledComponentsInjector.kt | 50 +++++ src/main/resources/META-INF/plugin.xml | 28 +++ src/test/CompletionTest.kt | 18 ++ src/test/InjectionTest.kt | 121 ++++++++++++ webstorm-styled-components.jar | Bin 3478 -> 0 bytes webstorm-styled-components.zip | Bin 0 -> 14899 bytes 17 files changed, 601 insertions(+), 123 deletions(-) delete mode 100644 META-INF/plugin.xml create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle delete mode 100644 src/SCInjector.java create mode 100644 src/main/kotlin/com/intellij/StyledComponents/InjectionUtils.kt create mode 100644 src/main/kotlin/com/intellij/StyledComponents/Patterns.kt create mode 100644 src/main/kotlin/com/intellij/StyledComponents/StyledComponentsInjector.kt create mode 100644 src/main/resources/META-INF/plugin.xml create mode 100644 src/test/CompletionTest.kt create mode 100644 src/test/InjectionTest.kt delete mode 100644 webstorm-styled-components.jar create mode 100644 webstorm-styled-components.zip diff --git a/.gitignore b/.gitignore index 9fb18b4..3ad81cf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ .idea out +.gradle +build +gradle.properties \ No newline at end of file diff --git a/META-INF/plugin.xml b/META-INF/plugin.xml deleted file mode 100644 index 4e271e2..0000000 --- a/META-INF/plugin.xml +++ /dev/null @@ -1,52 +0,0 @@ - - com.deadlock.scsyntax - Styled Components - 1.0 - Kodehouse - - - com.intellij.modules.lang - com.intellij.css - - JavaScript - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..a171634 --- /dev/null +++ b/build.gradle @@ -0,0 +1,21 @@ +plugins { + id 'org.jetbrains.intellij' version '0.2.16' + id 'org.jetbrains.kotlin.jvm' version '1.1.3' +} + +repositories { + mavenCentral() +} + +intellij { + version 'IU-2017.2' + plugins = ['JavaScriptLanguage', 'CSS', 'less'] + pluginName 'webstorm-styled-components' + downloadSources false +} + +sourceSets { + test { + java.srcDir 'src/test' + } +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..b73f0548ccaf75b4fe2312231c1921ae0ee17833 GIT binary patch literal 54788 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 \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save ( ) { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..f955316 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..20abeeb --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'webstorm-styled-components' \ No newline at end of file diff --git a/src/SCInjector.java b/src/SCInjector.java deleted file mode 100644 index 301b96f..0000000 --- a/src/SCInjector.java +++ /dev/null @@ -1,71 +0,0 @@ -import com.intellij.lang.css.CSSLanguage; -import com.intellij.lang.ecmascript6.ES6ElementTypes; -import com.intellij.lang.javascript.JSTokenTypes; -import com.intellij.lang.javascript.psi.JSReferenceExpression; -import com.intellij.lang.javascript.psi.ecma6.JSStringTemplateExpression; -import com.intellij.psi.*; -import com.intellij.psi.util.PsiTreeUtil; -import java.util.ArrayList; -import java.util.Collection; -import com.intellij.openapi.util.TextRange; -import org.jetbrains.annotations.NotNull; - -/** - * Created by deadlock on 8/30/17. - */ -public class SCInjector implements LanguageInjector { - @Override - public void getLanguagesToInject(@NotNull PsiLanguageInjectionHost psiLanguageInjectionHost, @NotNull InjectedLanguagePlaces injectedLanguagePlaces) { - PsiElement element = psiLanguageInjectionHost; - - if (element.getParent().getNode().getElementType() != ES6ElementTypes.TAGGED_TEMPLATE_EXPRESSION) { - return; - } - - String parentExpressionText = element.getParent().getFirstChild().getText(); - if (!parentExpressionText.startsWith("styled") && !parentExpressionText.startsWith("keyframes") && !parentExpressionText.endsWith("extend")) { - return; - } - - Collection refs = PsiTreeUtil.findChildrenOfAnyType(element, PsiElement.class); - for (PsiElement c : refs) { - if (c.getNode().getElementType() == JSTokenTypes.STRING_TEMPLATE_PART) { - TextRange range = new TextRange(c.getStartOffsetInParent(), c.getStartOffsetInParent() + c.getTextLength()); - System.out.println(c.getText()); - String prefix = c.getText().trim().indexOf(":") < c.getText().trim().indexOf(";") && - c.getText().trim().indexOf(":") != -1 && - c.getText().trim().indexOf(";") != -1 ? "sel {" : "sel { fakeprop: initial "; - - if (c.getText().trim().endsWith(":")) { - prefix = "sel {"; - } - String suffix = c.getText().trim().endsWith(";") ? "}" : "initial; }"; - injectedLanguagePlaces.addPlace(CSSLanguage.findLanguageByID("SCSS"), range, prefix, suffix); - } - } - } - - Collection findSCBlocks(PsiElement file) { - Collection templates = PsiTreeUtil.findChildrenOfType(file, JSStringTemplateExpression.class); - Collection blocks = new ArrayList(); - for (PsiElement template : templates) { - Collection refs = PsiTreeUtil.findChildrenOfAnyType(template, JSReferenceExpression.class); - if (refs.size() == 0) { - templates.remove(template); - } - } - - for (PsiElement template : templates) { - //Get css block - Collection scBlocks = PsiTreeUtil.findChildrenOfType(template, PsiElement.class); - for (PsiElement e : scBlocks) { - if (e.getNode().getElementType() == JSTokenTypes.STRING_TEMPLATE_PART) { - blocks.add(e); - } - } - } - - - return blocks; - } -} diff --git a/src/main/kotlin/com/intellij/StyledComponents/InjectionUtils.kt b/src/main/kotlin/com/intellij/StyledComponents/InjectionUtils.kt new file mode 100644 index 0000000..d88759c --- /dev/null +++ b/src/main/kotlin/com/intellij/StyledComponents/InjectionUtils.kt @@ -0,0 +1,39 @@ +package com.intellij.StyledComponents + +import com.intellij.lang.javascript.JSTokenTypes +import com.intellij.lang.javascript.psi.JSLiteralExpression +import com.intellij.lang.javascript.psi.ecma6.JSStringTemplateExpression +import com.intellij.openapi.util.TextRange +import com.intellij.util.ArrayUtil +import com.intellij.util.containers.ContainerUtil +import java.util.ArrayList + +private val EXTERNAL_FRAGMENT = "EXTERNAL_FRAGMENT" + +fun getInjectionPlaces(myQuotedLiteral: JSLiteralExpression): List { + if (myQuotedLiteral is JSStringTemplateExpression) { + val templateExpression = myQuotedLiteral + val ranges = templateExpression.stringRanges + if (ranges.isNotEmpty()) { + val result = ArrayList(ranges.size) + val quotedLiteralNode = myQuotedLiteral.getNode() + val backquote = quotedLiteralNode.findChildByType(JSTokenTypes.BACKQUOTE) + val backquoteOffset = if (backquote != null) backquote.startOffset - quotedLiteralNode.startOffset else -1 + for (i in ranges.indices) { + val range = ranges[i] + val prefix = if (i == 0 && range.startOffset > backquoteOffset + 1) EXTERNAL_FRAGMENT else null + val suffix = if (i < ranges.size - 1 || range.endOffset < myQuotedLiteral.getTextLength() - 1) EXTERNAL_FRAGMENT else null + result.add(StringPlace(prefix, range, suffix)) + } + return result + } + if (!ArrayUtil.isEmpty(templateExpression.arguments)) { + return ContainerUtil.emptyList() + } + } + val endOffset = Math.max(myQuotedLiteral.textLength - 1, 1) + return listOf(StringPlace(null, TextRange.create(1, endOffset), null)) +} + + +data class StringPlace(val prefix: String?, val range: TextRange, val suffix: String?) \ No newline at end of file diff --git a/src/main/kotlin/com/intellij/StyledComponents/Patterns.kt b/src/main/kotlin/com/intellij/StyledComponents/Patterns.kt new file mode 100644 index 0000000..dfcd44e --- /dev/null +++ b/src/main/kotlin/com/intellij/StyledComponents/Patterns.kt @@ -0,0 +1,58 @@ +package com.intellij.StyledComponents + +import com.intellij.lang.javascript.psi.JSExpression +import com.intellij.lang.javascript.psi.JSReferenceExpression +import com.intellij.lang.javascript.psi.ecma6.ES6TaggedTemplateExpression +import com.intellij.lang.javascript.psi.ecma6.JSStringTemplateExpression +import com.intellij.openapi.util.text.StringUtil +import com.intellij.patterns.ElementPattern +import com.intellij.patterns.PatternCondition +import com.intellij.patterns.PlatformPatterns +import com.intellij.util.ProcessingContext +import com.intellij.util.SmartList +import com.intellij.util.containers.ContainerUtil +import java.util.* + +fun taggedTemplate(name: String): ElementPattern { + return taggedTemplate(referenceExpression().withText(name)) +} + +fun taggedTemplate(tagPattern: ElementPattern): ElementPattern { + return PlatformPatterns.psiElement(JSStringTemplateExpression::class.java) + .withParent(PlatformPatterns.psiElement(ES6TaggedTemplateExpression::class.java) + .withChild(tagPattern)) +} + +fun withReferenceName(name: String): ElementPattern { + return referenceExpression() + .with(object : PatternCondition("referenceName") { + override fun accepts(referenceExpression: JSReferenceExpression, context: ProcessingContext): Boolean { + return StringUtil.equals(referenceExpression.referenceName, name) + } + }) +} + +fun referenceExpression() = PlatformPatterns.psiElement(JSReferenceExpression::class.java)!! + +fun withNameStartingWith(vararg components: String): ElementPattern { + val componentsList = ContainerUtil.list(*components) + return referenceExpression().with(object : PatternCondition("nameStartingWith") { + override fun accepts(referenceExpression: JSReferenceExpression, context: ProcessingContext): Boolean { + return ContainerUtil.startsWith(getReferenceParts(referenceExpression), componentsList) + } + }) +} + +fun getReferenceParts(jsReferenceExpression: JSReferenceExpression): List { + val nameParts = SmartList() + + var ref: JSReferenceExpression? = jsReferenceExpression + while (ref != null) { + val name = ref.referenceName + if (StringUtil.isEmptyOrSpaces(name)) return ContainerUtil.emptyList() + nameParts.add(name) + ref = ref.qualifier as JSReferenceExpression? + } + Collections.reverse(nameParts) + return nameParts +} \ No newline at end of file diff --git a/src/main/kotlin/com/intellij/StyledComponents/StyledComponentsInjector.kt b/src/main/kotlin/com/intellij/StyledComponents/StyledComponentsInjector.kt new file mode 100644 index 0000000..3ce7ea6 --- /dev/null +++ b/src/main/kotlin/com/intellij/StyledComponents/StyledComponentsInjector.kt @@ -0,0 +1,50 @@ +package com.intellij.StyledComponents + +import com.intellij.lang.injection.MultiHostInjector +import com.intellij.lang.injection.MultiHostRegistrar +import com.intellij.lang.javascript.psi.JSExpression +import com.intellij.lang.javascript.psi.ecma6.JSStringTemplateExpression +import com.intellij.patterns.ElementPattern +import com.intellij.patterns.PlatformPatterns +import com.intellij.psi.PsiElement +import org.jetbrains.plugins.less.LESSLanguage + +class StyledComponentsInjector : MultiHostInjector { + companion object { + private val styledPattern = withNameStartingWith("styled") + val places: List = listOf( + PlaceInfo(taggedTemplate(PlatformPatterns.or(styledPattern, + PlatformPatterns.psiElement(JSExpression::class.java) + .withFirstChild(styledPattern))), "div {", "}"), + PlaceInfo(taggedTemplate(withReferenceName("extend")), "div {", "}"), + PlaceInfo(taggedTemplate("css")), + PlaceInfo(taggedTemplate("injectGlobal")), + PlaceInfo(taggedTemplate("keyframes"), "@keyframes foo {", "}") + ) + } + + override fun elementsToInjectIn(): MutableList> { + return mutableListOf(JSStringTemplateExpression::class.java) + } + + override fun getLanguagesToInject(registrar: MultiHostRegistrar, injectionHost: PsiElement) { + if (injectionHost !is JSStringTemplateExpression) + return + val acceptedPattern = places.find { (elementPattern) -> elementPattern.accepts(injectionHost) } + if (acceptedPattern != null) { + val stringPlaces = getInjectionPlaces(injectionHost) + registrar.startInjecting(LESSLanguage.INSTANCE) + stringPlaces.forEachIndexed { index, (prefix, range, suffix) -> + val thePrefix = if (index == 0) acceptedPattern.prefix else prefix + val theSuffix = if (index == stringPlaces.size - 1) acceptedPattern.suffix else suffix + registrar.addPlace(thePrefix, theSuffix, injectionHost, range) + } + registrar.doneInjecting() + } + + } + data class PlaceInfo(val elementPattern: ElementPattern, + val prefix: String? = null, + val suffix: String? = null) + +} \ No newline at end of file diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml new file mode 100644 index 0000000..958e38b --- /dev/null +++ b/src/main/resources/META-INF/plugin.xml @@ -0,0 +1,28 @@ + + com.deadlock.scsyntax + Styled Components + 1.0 + Kodehouse + + + com.intellij.modules.lang + com.intellij.css + + JavaScript + org.jetbrains.plugins.less + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/CompletionTest.kt b/src/test/CompletionTest.kt new file mode 100644 index 0000000..16f0293 --- /dev/null +++ b/src/test/CompletionTest.kt @@ -0,0 +1,18 @@ +import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase + +class CompletionTest : LightCodeInsightFixtureTestCase() { + fun testCompletionAfterInterpolationExpressionInParentheses() { + myFixture.configureByText("dummy.es6", + "const HeroImage = styled(Box)`\n" + + " position: relative;\n" + + " &:after {\n" + + " position: abs\${'out'}te;\n" + + " background-image: url('\${p => p.bgSrc}');" + + " border-radius: 6px;\n" + + " color: \n" + + " }\n" + + "`") + val lookupElements = myFixture.completeBasic().map { it.lookupString } + assertContainsElements(lookupElements, "red", "blue") + } +} diff --git a/src/test/InjectionTest.kt b/src/test/InjectionTest.kt new file mode 100644 index 0000000..c2365e8 --- /dev/null +++ b/src/test/InjectionTest.kt @@ -0,0 +1,121 @@ +import com.intellij.lang.javascript.psi.JSRecursiveElementVisitor +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiFile +import com.intellij.psi.PsiLanguageInjectionHost +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil +import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase +import com.intellij.util.containers.ContainerUtil +import org.junit.Assert + +class InjectionTest : LightCodeInsightFixtureTestCase() { + + fun testSimpleComponent() { + doTest("const Title = styled.h1`\n" + + " font-size: 1.5em;\n" + + "`;", + "div {\n" + + " font-size: 1.5em;\n" + + "}") + } + + fun testComponentWithArgs() { + doTest("const Button = styled.button`\n" + + " /* Adapt the colours based on primary prop */\n" + + " background: \${props => props.primary ? 'palevioletred' : 'white'};\n" + + " color: \${props => props.primary ? 'white' : 'palevioletred'};\n" + + " " + + " font-size: 1em;\n" + + "`;", + "div {\n" + + " /* Adapt the colours based on primary prop */\n" + + " background: EXTERNAL_FRAGMENT;\n" + + " color: EXTERNAL_FRAGMENT;\n" + + " font-size: 1em;\n" + + "}") + } + + fun testComplexExpression() { + doTest("const Input = styled.input.attrs({\n" + + " type: 'password',\n" + + "\n" + + " // or we can define dynamic ones\n" + + " margin: props => props.size || '1em',\n" + + " padding: props => props.size || '1em',\n" + + "})`\n" + + " color: palevioletred;\n" + + "`;", "div {\n" + + " color: palevioletred;\n" + + "}") + } + + fun testKeyframes() { + doTest("const rotate360 = keyframes`\n" + + " from{\n" + + " transform:rotate(0deg);\n" + + " }\n" + + "\n" + + " to{\n" + + " transform:rotate(360deg);\n" + + " }\n" + + "`;" + + "`;", + "@keyframes foo {\n" + + " from{\n" + + " transform:rotate(0deg);\n" + + " }\n" + + "\n" + + " to{\n" + + " transform:rotate(360deg);\n" + + " }\n" + + "}") + + } + + fun testExtendsComponent() { + doTest("const TomatoButton = Button.extend`\n" + + " color: tomato;\n" + + " border-color: tomato;\n" + + "`;", + "div {\n" + + " color: tomato;\n" + + " border-color: tomato;\n" + + "}") + } + + fun testInjectGlobal() { + doTest("injectGlobal`\n" + + " div{\n" + + " color:red\n" + + " }\n" + + "`", "\n" + + " div{\n" + + " color:red\n" + + " }\n") + } + + private fun doTest(fileContent: String, expected: String) { + myFixture.setCaresAboutInjection(true) + val file = myFixture.configureByText("dummy.es6", fileContent) + val injections = collectInjectedPsiContents(file) + Assert.assertEquals(1, injections.size) + Assert.assertEquals(expected, injections[0]) + } + + private fun collectInjectedPsiContents(file: PsiFile): List { + return ContainerUtil.map(collectInjectedPsiFiles(file)) { element -> element.text } + } + + private fun collectInjectedPsiFiles(file: PsiFile): List { + val result = ContainerUtil.newLinkedHashSet() + file.accept(object : JSRecursiveElementVisitor() { + override fun visitElement(element: PsiElement) { + super.visitElement(element) + val host = element as? PsiLanguageInjectionHost + if (host != null) { + InjectedLanguageUtil.enumerate(host) { injectedPsi, _ -> result.add(injectedPsi) } + } + } + }) + return ContainerUtil.newArrayList(result) + } +} diff --git a/webstorm-styled-components.jar b/webstorm-styled-components.jar deleted file mode 100644 index 1fd7e30e65b5706a104ccddf329461f7b5434c73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3478 zcmZ`+XHXN$8VyJU1eD${NC)YJB0}grln{EC5_;$YQlipJXo8@05fGFRO6c84ld9Bk z#ZZF+Qj9b&=+i$>-<^49XJ>cko89l*neWV;1BG0oUEXMMn}KG4#I-(Y;3M=k^`U+N-DpC{sYCIS>%6C=>N@4|1)Z#Z5ZGScMl5; zk#hHU4Gpcb@rz`(;Xs--jT$Rz-v`3Tt0c1JxeRQ(0SIyfD!ye^ND5vuqAGX7pS?-R zQ~2@yxhTwupVdK}^^&(=%d8Pqo?8zydVb!o$KmDogSLBh*MJ02GsK{&(wwBKyrr@g zv!y~f>DfOc?t*M4!PF~9r(L`+gUcDM+98TjLQy$28oad1#&4=!1~t`ScInC3)aLcARSmsm4F^OqMqg-M<`J#2Yva4*8*C*==#W4?7HC z**8CQX4$t0#-yG6b4V7`z{vY5nI%St=fE7uOM1pb$sFTYdPI$nfhm^3g398|#7|Kg zXO}_lw~8o?wCPlUF$lbx_U-W5adxNpPtLfsogT4CiVA!}=~AsjHTRZC?4;%l>vTn9 zs{t`PC#cCfz5g7EOWl6*U9*SKux=Nqd)r2|aHJaNIV1}cBSCL^6|DyRE#V#I>!}#3 zKOb&i{UT~d&qcFOrAmahOZS$OXK?1;tjYUF6C501uO!O9KrESD+NN2S&*C?g#|#R! znm*Nd0tOP0YnU6Za@X8F7_GV%Sm(KNu?LI1-@+Aq*G7TKc zg0Gyt)cy7K=MKzE$?Pu>Bz6vUGWQj%-RHs2!qt*RMt4gMq=hR~i^Z?^w0_K_oALBw zqMJ-pj&i%*RT}y^``Z<@mn-dYOqHD)h^gB{vNPjD3^R(gZ_y4>OF^_R6>>*!b*d(O zuTSwre?Q>EeQF5Xc#X`-^p(~bm1Ca=VG2;fK$u^#PY+Sh>qQ{TM&_oQWejg-N4?hT< zv1I`L1L_2MAD*86U|e`9u$cv?L?<*(&;=i#COS(__}IoTc%O2sVOD8QE8=oFdlRI^ z+g)%rK}NVsA)A`0k)3tg=P0$cy49DboUyzzNx6(xPo$crN51+*8q|;T^u;2?mWkii ze7Y?U8j>*U4Da-DN(Uw(2DoQ8(W|mCkb!m1-VBS4H?+R@lR)fqLDq_XGSw@^Nu)@v z0U({(T1C?Sh=ERX((?nSE5>F|5S4Mmk*mvUk7p@S#g8TwDB)-FN0!;X5uo%lS4j3H zmpVySivutnVfY%eDteU>DLVb_UZ@r>>j2f?9bD-k3E|BwY}%`fwjz}@@(B1es0j)$ zo;Ml~n;q08m95zsrucEwKL%Z$%XG$+N*Be=ybyXv)gpi|9agn`d;H4 z)yR#ia2&R+62v-nmHmk-l;nO`YG5;b6S|BB2S>ef9QII*5X@~|)sX|f_;Q{?nUTQn z>+uaPJf@YC5`%WUCz6CfLfZLMMi4Zr>J$F$MF!JY_{UHAuN2B|P6UO9yN6gGb5+#oDMDr!_HdNSgiY#@ODo7|4!qL_Lerd^m zYy>WO5{nz)w5Q6^;w;6Hkn*cuxjw4PTowb;6pAhO7xC|QZp--rm9_|`1CFb6EOnUX zop`)Q!=$s57v)TRE7OLB_@W;L$kOsqoTbRh-#oZ1?T9wf^WCkE=x7G1U2(=`OG&!E zVczqUwJh?nVH<&QhrZGqr+=&E$%M!;1MlS%cGHpFDSZb4%*r|gE{&*9c61M9?$w&{|d=8w(2aqiZgV6K+-jtzE&8)S|5=7dD6 zybeiv$7;tfI}3-P{4z-}{3!*m5d2zyM5m0C6qjx}-e#Sq#tRxuP9t{aRGS9dOvs(LK5TNShKxwPaK^T0 z94~5ySh2S+-O!;Vx(NuW?+ua`6O=S^9&a?}zVpNyeHBG$ay8PVnEF>ai`l=H!-itA z`YL{;B0gTPh}bwh@#HVgIXyYpI^iDI2GG!JDR4q@BsSM;tnShQPmf`xysxPrB521B z<*iqEYX;%7Zx^B%v<&3kgnFEW!k-!L3h=4;M1bY3I#7vMkas!!m~~tROs=$we~bc( zuvm&cCcMFqg(%uf4i+$+D#d>!677V(k}~8B+8#L%sRpF6eT)ElmD;k@sH8izmFZuU znkRH}g2{6t?vkS)!AdnYY)S*^qzI0MXl7a?zr0xot2ieC8)=iq#^{O+4HmPniV$!? ze!X*U-j^ufj9aO7_PNErVN;O-8{4(j`WV-~vPOT8V0uln641fKOJt{DHVi*dGb|m{8IH~nqD|DbVn>rr zxZ~kEuB~37)v3sU4WGYMF-0u=digxU&6QQ_v&hHK)lGRaAI5KubeOi)*VugVUg)|{ zAd>f9!1F|HHY^_vQxvdUQCzr$xtBRq9#0*Pb(Ue=PGoHDN?R$APDrwsY+#+cWZmjH z1qJkTY;FQI9zVE_tD<8b5QdKPfJptCA7MPwdtjNg0;x`w%Fqnap0px9iV{uB0Ybgp zJXc2hmPx%!;P-34q}IiGl%*s!0Kmlbr_^Hjm(2Sa{4Mi>{O@@A1V}|9{LxnCfkiU( z$SF+FU0scTZZTjbCa_@^EDBZ%wcEHs$2b*t0slfGVc-AybahFmkErxvEMYlIX-&kZ-BX%}hAl!m1T3VHfPXFqQ4kP=5j?Q(^`cPFa4 zA`-0ex-q4~7iDUdAx-Uf2^ZiU9m5_Es8bF&n4in(nz?Y=%nKJEsDJ z4>yvN$5XjB!n9X_qx}Xx>7Ig(TiEgqps#$d5kI@f<(xaXEqeq!KF$3+CEOw&Iz%&( zSS!f=aC6fwyrUh`E3ZXdy<-v3a5c~|YCVI;hr9SVoggU;ifhv68ZNucwzZ}CrA!cg z&YCnC-ca!uvRwp&gLi4#tQy4$J%YDyTVso8!IgE>(Vhy;(EaHqNB=h48Hx{!UeB@S zf)!!GYb)vL8hwZ0(>9frv=-x-)|%poq}^pLfzK7{9f~uzi)BVK|GJygtm;L%Jk51` z#2jifY#rrsC2jtaL|I?L zK!FthM=QbqZnd>C{{PvvbRfJWIDvrv3IGA|{on2X^TX(^jht(JOgu~V(#>r@N7}Ac zZ8zJlOM;^8%8fVWsq5C-^cs^Z^Xh$eZfi5o^KQ=la=#CGSG6zoPr3i~-PV>8{(*r2 z1p@;I2XiD(fcV%J{QEOs5a6MugeJr-#l-}nNErHSHoh-OsCSFt9Qn8jbk|+{-CS5x zkW-RT(FD_5vsQccmJ!2>_YK#>iuZi4Vohx8aB1jZVSRe=)$b+XELia=1OjYF2n5{t6TXw= zu3iS9PkV8%qEBO=U7&vgu!qggs$FbMa>{t-d*WDY8;TIpD6$L3bt4-jCJIaSpT$^> zXAWQ|jgM>Q%+G?DRLpyJMW3{`sMjaznAr+ksLioF2^URarIs8aNBLRj(_5z)LReY%)Evy&lS!%{{yKm8 z#tC}F{@rI=Sepu#C+n?6<3<<4SGKK%k6+UAqy+Yb2fKzH+d0jfNP`qcNH1(*eIE~g z{A_cLY+z8K03v`kQj4JPZQLI;=$ibz!Qk=su|#cnQq4V(Fu}g)pVfXISu6AZj(=Q>~TexARfE! zo=y!`XK>&6$bCeo;Yak#am=_dgozgk)d6Ee<)1$YNzQAA*IOHj$H%9EGUxy*p`xV zjNPmzUmeB*k0Bq_7_}MY>ETA++|@h!>c)ydhJ-vShz3^96EZh9OCbl6l)fFoNV`C!!CbAZ>O> z1#?!?rfUbM?mvY{;J;}0(=A}=#*C|2m2MW(kYrjEdIAvl)#i^MGx>GdJ57{;VK_^_ zQyh3j{O79=JXt~;;Ug2W4CBSz9O9gQ6mQf>VoBj;?Zpi`O$LbQoc#)P2iaJ*C z&gYmI>oVr3WK&a^XxPil$D$jQ$e$~@lalR_J6z1Q+~Vc@3KnQhvmF`@ip#%%B9L;G zXr-Dn+~zZ8g>eFIz%)UowAXFjon<(!`4vYUz`}Y)zXmv(dBFuslL3`Lr$&_4Z)6kLY zp>|1a>V=2#7Bp!p<$Xpse#VpDbtwI2ofWg}1I>vgQlsgAGDoe%jV0L}MSHzJ>c^R5fyD)}= zzj{=A)m&cLmLyw6LJbxjL7*35zR_rjtiX-xUJ0pz;L?zGj%Y8M;)I?^aofZ8>-(Y^ z>L*q;SNff8?3aZP62O64DOoNry=k6+j&BU1ZL`AplfTQjh1q#VSzo8`VVcW`-<>B4 z-;2DQOk7XPmhFyjmDa|SSv~d~P!wH(4;PB?4xM@Dd11Plii2(T9L;TJ6EmcIBYQg6 zbu&T6dzpqwn>mRZf|wb^>`M zRk#~q|HSgZj_9z|0P)J#DU(V(I?x`3FA;!WPi4PA%9Os;THNztkimRJre4BN5ygbVJ`~1SPH4{bNwlYOV z6m=ANrEO86vr?K*?r<}#p&4=VEd#rsX6nK@zeq-@Kh)9!9cQp+5g0 zhxvtVih%O~x0pnmD-*o{oD{l#bX|;3pyiR`AUdO(Q~qJ;#V@a}@)_oB986!dCk<)$%DUn8b?CFz>z=U-gSm&2gVnsuR0S_+jM%g zM{ss>sd{j^y0q8R%K-rtW*^}L7?qY&hY`ho8BA<85283c*VADQ&S9GiIy$E4EQyKp zI+J_ioRZ02oV2-0gKAwGW-LNyr9dn@wTFkBz%j(@ih>IyE;<>1BdNEOyj2YBT~q#RDE0 z8(1cD5b|;z(GjSB&N;ip(Ba7+c4}B*Ojh=bjbNFatH&8QaTZj;cLZJfl3ew;5^8rX z=MstHh+w3;_pWG(ujBP1d7o6ODq-5{KyK+9ZktjU`sC>pbXe{sA4@gc1uiu;c$IHo z>Ur3`iQyn+2*YVch|BLkkqeuFs%i_YS=_R9Tg7!ts|=QFvL|OkeZovE+)fzNwh!5cW6xRNYDgOa3*h2&J?gsF`1XA02e&<$uzwFZQ08b zY-uG68|zGf;F5{O=x3vVIgKMzL08xu%w)+MzR6}Xlevkgh`hjez*Uc;$e1noa5BBu zlP_34z`kULZNsyN@P+J>0y&X>SUEyhwBrW9zsA9^R?OmB!7R^qML9FK(rI^+NM=At z+5`x3O9DYoVB`IK-FvH{(BMY1Y(*NFJ4T`&EUD`7$-8_{bc~W6JatxT?8MynFhbP~T?qz1Sps+bNKV=>wtJhQ=?3 z`pkw)ZAW->nE|7h=YbeKj%JqoV<-?Q*9TV~UG8(Y9jw!Z@C9pLjG%h%PAgTq6KaGW`O zm2Ulz$mWP5P>4z(%RFghmR5u8xPehr6|y!_x)J+%fZr6ee-~cl6KIQ0WEVVGB=x4r zq>LR30>Q`UHN>^Yyuqx);=la$=<||EbP;-+;h^t-7e5o2;*c&gFOx5G2bBE^^ZrKL zss_}PbI$Q&_it>ZI3}T-Q%V(tVgI#;sc#Zjndg$mz9klFxqF#RajU|@R`0B0`Ndgv z{3m4*0#F?3qcK0!7`!b35+-NsK*4XSbM2DKbNO!H+55v-1{B`G=Z+`cpfY=NibPOc zA@~0Aq9Bc|c6zofrx>b#Obf@Yr?=!U3GBp#9bR{Tz8@${Z899P=9yUF@(#DMY~QDQ z!>!^YZ<5Wk!>tQ!vuHnLhae5P=+|vx93nM>C*TVLx9j`%7(cVXd0mPs)^O$$AbxWd zQ4>K6SUL`_+ALf(kmCMV(Dl>t7MF;amM;B-qL9-%e>UO3v71~lx?x=@gl8Hp^$S#7 z;jF0bQNoRJF~6vm^LT7`mIy3@5&M_*2bKkdRxP5f5~$EoAH2Z_t2HjAui4SlugYQd z1Fv2w7l?v4t3mMB$?Z@62X*{wD8x9W0c7Qs(1RA08C!Fl%VT?396`amQH}DkkO{m* zs>4G?EfuJ(qlm0QWP}85I+RF)$caiBRZCky6mLUR0U~B2#GM4wpj)4HEdfkaA6+v& z^#`0R1pq~=XD-Ytev4{mtubSS++jl`_F&Cyp}_jjtxbItPZ%=ve0$Vlr@oeJw1tU% z*Xh|Lip0fUQCTJ~L*4vqY`MR@ouVVk87n)`l`{=kMO??yW-tFhSaYj0MCJzu_8Ar~ zcu)`CZCk8}d(nr}2Cz}}s08n&&7}{p2^ts4r`ZARF^#0((fUs2olDy}5JOY`I#l0L z4O<+F>J{3yOp!_oZG~@%we4jfFh=vTv9*QTtsDLdi2I#3#yI%Ba;z!FM!jxybz^YC zM*SZ*`kQKjRz3phc>1ygEA%YQMfv+|hd1m4wIEor%+d@3*)|5ugXb4G752^C_wM<# z!F7TV)g*!-eQYCfmn}qfcAC>JSu)4NudU@&*twn7wD73Xn&wEq*a?xYODl+6?58>K zcu5@fWc6xdl$G4%(ovCZJrDL8pYm2b9Z4?u>EWf_>9*mp>mhBb`!dd*ltZ1J#?VWt z=mO%q<pJn!KQ@V!$(4V=35*#jTcpANgKl)AuyEt6Q`zN9t1vQD=NJY+AJkIq{vcLKZ7 z86mIn1uc`H*tj>9RqBU}A{ySKw6|~-*bD*FRCA|OOBU`3apeCpP8wMtvdt@W{QYZ> z3_gqCW7p~tuHe?0%(#{^cY5JUzCu8vQN$PbR4fHq2t?1_h|DOG#*ghhdpD%c-k7)`2jzgQX2rmr$g71@?s>qmQuIl)OnKh#_U`egg zK$XdpPT@ho5s4pIq0?5+C{^%X+Vp!+b&Gc~K`I<(oF9?4pL`YZxiLTIoidQ`K3J2J zhYa`GLgx)S`K)d4Kc0QBsS)43d;bFlYyXByKOKszx}fG8zL-pzuK-w2=CL#y?B>mQi+lsy2)vQ>E@NgG;0j(I~ReOXTK>)%{rvC^96SwuGiU z#TZCZnSWbHSDMRD6fDurrNCSu(4P=3s8)tXR8RhD@-&btvrBd6((SJ(b11ju$}v+2FlOHP_D;Rm86FF0`zR55+& zLVy_uGNHsE6_MxE!BJ2vEcPGa8mBbIF9z`0iI&zd__n^a>dIGj7wu3%=;{q`nI75TB99y-`UqO7lL!%%Q8t3c9of@ja@CCovJPiMd&GNMf#(Pah_alRexx z#`JyB=a`X3t9*vEm0tQ*FI5;zNr{^N6+CuEV-& zkDPrgi6qiBx-<+tL{;0uhN?GrsU*USf4>^;-zRA7T6)lpVKuKXu26#^1k30roY3g+ zEWVJdIkFeW8AZ-Zvt$y_bYv3qcyt6{CO*5cmuOP1j%k2PL@(7fP4RoeE3bMM?eR;HS!JIJo`TdY1}Na0 zJ=tmT#S5schgOGd#;8{Z1Vah=xKycU(xrq>ZMfvZ3e&5%r3q%j@bQ0 zC&vCoFm%fZ&3zA}C@Fqd90>lX55ra$Pi(`G*78$mKgk!rHzQxw?NI?%$Qd%|_nu?c z%r{Rp8SG`aQ|)h2lA!@PhEH*XIZlGC>Y20UxVyk`^QoAL{p)T}@cj^SrXtx$EAC%m zT+BD^O>slM9qMO{jyB7D>{@F?#_qY}!FzA$8ZsTI!b31Y9_oJ}ezM*ejVO^mD^(^# zaV*1O*5L{K#EZuR{~j1rBEk~#rxK0Q zC$T?Z>L8TyuN~E6O|3!p>_z7WlBk6Rf;Yo*y52}i@ja}R$CQP*uk%KctU2=ScS4!Y zpI;!$e|PgcI$BRqFwTkjn;-DsiJXZ5NM7S;hhe{1zWu|DZ?CUa_Uv=TL&=sM-Dh8n zxbtP`Eieno`s||>Agt` z*p&kcmL0x7)MHt)CF$v-AVes$ti>(8^wg1=+%buWdr$9%K zKx}KUrmDn60|>fiXvl6K5+E^}vu}ZA;uKmtnXbR|8FYQS3{+|z%kK{xjndirHM0l$ zsc9lXNz~CB;V>07lZQm(A%h(Pnv4U}cs9;-M()qI;6e+peEC}n>rEOMocrvXXHWU46^FJLC zz$Yx4uilCR=$U@~U&PgljGOkYyzogr3&(s1+{+6#jJQGS8%Ya%^ISuXkZq(45<1K+ zP90F0)08KkrB~f3;uI*bcaQDP(1b-IpBe%~rqvHjc*-Gq-@-|HuD&Ue?YrzB(G-L1 zU|4=J;r@+&a4x++Z$7*HZhUI<+YLQ(NfKdokfIVd?ER4p`_dm2nNoL8|Yq* z6*gwFOKafrpgLNGz6LlkV@7$LWFbKjX+aN#+w)&(*Dx8NJDa;OyoX=#)#mA@Wg7ENRCcMYuGQ^SQ#-yxHBH7-Y2GG$ndTVgzMhU=eNnV6*qiFYy-lSV z0SSa5BK~OHPP$;ml5j~JWPm9Jp|hFpd`sI>&GFAF)aY8MThs2HS4EC_{941?v4-*K zR0#7H3ti8$aRML2BR)l@Pc9fLF2CLjxu^Yi2qrPg^tf|Y4A}pO!Y(p3r@siZcQJ*Z z9Gd=B-PORFb;{`OhjD0B+>_TZIs2D%4 zvc7>lzb>VAcbdcq+*LVSG(hjM^720)dpVAz*>;nqQY9Aok|+NjnPDjgMPjcnRe&=y zxe6xn$w4nT;iTI6EVzmQFl$!i;6oW{Va%_O*h4rVF8Kkq(=t?uYjE}r#^upE%aItP zglw#h-#4JpvJM2!0B8zhr#4D!nNGmXYoDR$Dg|pk`5@&eb=vy2J^3pZ=@;0$9fVtSBuZK;fW=f{J zF3n21FY1166(vcQa(k_`D=mEE)8TniG`_#Da`k63Yf#n0(`s?Qm)8gHLd+EML2KI% z8vuP~`6$D{ESY9+uh>c1Rlm-O?dA3?q=?8k>5UdvSBji5E{&4%SdI%_reD@4=c#vJ zQnmLt=F_B~Bl*O0sMC@`DCk?_65}mbFKyNIqaA6rWXDN!Nt25i!NbwhA-@85^!p0QbR|rG54vt9tzqmda%V~ z4bL;zBpn45XTpPua4fvMEA4TWE82fv@qvRIi8q>7}wqWP$H8oJW3z4-8 zgcy1Q`M4U-R^-_8N+W1vZj| zgpI$DlfR$A0XapRJc&P3BqBUAKHUME?;A~HNMawJo;;6EY}%8}GayCT5;T!h!rwcR zRm`=DlH-LSdIS=<4H?wcPD@sON`J7^up!<9Qx1`214AU=lSc?<&i0*CS;Mp=I5%fz zrnhP=$Toj2CVvnAv|)hfuS3d#spe-Lg%1sPU)3_0HG2yY6el4LcvQ5#g=Q!@^(OXg zlqgOD)kOwejysqZek{67(on@6)nv^xH<;qVW|E7}bZx9#uQl-f`f(!IU=w{uboSFE zMUXrEZ4@|*9)+MkV%3H6PCD3rK{!m5{S;=2e{XXkE^#}F_F4HB=ia|^#^ORjNj7;E ze(?*3UmAoL_-5^OVt%?mg5rd4se1iPoLnPt${l68C!?VxxrmZ;vTzJOGYj=fG?5Fx zKFb|kdE=-}Zk;MWEjp4CsIQZTfFu?cpo|eV3B@kqUf`8Q1$VD=8B&hlxOZ~m#Mm=t z^tqFw*)tTtatwJD9etOJ(>ePNz|FN78sPQZcl%Lop!9$0TP;aO*wNDQfZ`4Ial{8= zhb5!GLbKbtk0%GyaJm@MM zQKXt6fO|0RNv{KKb;M{46P~F*-6fi5h!GlXe~=rriXR&-o4b+m{#`whjkL$Wecyk0 z*E?*g*Zf7H(vaR9RZWBGBo`g?j^)d0+sVcyawaTXT%j>AH(@`T)l=?HOJn>-QQeNe zGR;QFE~E7(uwCK_<=a9%jtcs{C*>Cb>%GR-cxUM*JRCTrA#P^ho{qE;+8jxIXNl?l zb$nVugaMFRsZ*iI&YBVm<;Z-$BplX%zO&x7qH#9Q`y|6b^%7;Jw$%Vbp3W*Gc3Yar zt6_yOO#tKnDMD#t%*AkwGZ3ZtxF=YH#P4gcv%PfQKFY=)#qk<{srHiF8U^irZXjh&V0 zFyTh^%8?8DmL#aXJoJ!`xDV=BYOifa@#_Jy$>T7A$DtMN{u|k-@BG{Q?9;xD>hbloCSxDRBjL)c~Dv4_e9CVL_D8 zBkPbOs{I{T7<*EoPLHgfRvVP%BJ8HNf)LK?;&XWFAQRGMdQ5vR*kV?%wLfstf@XF zsZ}E2E~p5Y?PgpXc28T-6tYo9h+m-9bnF~e?_y?lCh9+ z-3`=cnq<{0wq_fKu`I%OKz55|kL;J647aW<ndnw9)~l83QUvUq!u7@&~~h>sFfPo zT4Pe@mj3s%L&wyyB0aGqCnq4rLF%A0dY;#Xs=}Inkp5aTGu0&eO;>CB>cPev8pC)=Fo>x7hPMQF!l9ci) z6UfXJBVMg&=*LM)KydqFs%fzGuu*K*Sh@CDTuO4QU1x0v9kqxaUz~KsmN{;v&uW?o zTi|7CoD^Hd#(1OGAUU@c&1m8kK0eW#sq5iFkYysPR}}Ze z3Kw%)X|!c0HJQw%X6Xu5jr?w`M-q&|7zul%`MN$!xM~xq-;_5XIy>k(KJF#OyyWI`dic#A<%!OeYkzGe>0w1&6O*5Gh5|Il z8u@C^wo3FCI&&W=;6E*_U`zjAjgC1kD5jsz&A8ifY~w^YypON>Pr+0Tm|(eMqaI0=-l2k@&np!#_U^~2J9WKwS-*Nl@ZI;%GbDJ1TmptWa? zBrxz!FYfl0R&$cVqpaT-VBhuPxu(<(*nDvsnrjSEDj;)kKBu`iA=N@?lLW%5ce#hV zj(R5P?>`f1Mzr>BW@bEIu2R>RG^r@}_`7(pL46)~NlBhj#c}BX#dTgnjT;V}{25?U z7g#u839#NDoy7vzRs>yPE;-U>fvh(3iz0KKA=f=RFGkqMn@1!+)@bl;?>mA_QOcM_ zPYV76j)+mXO060G!(n|#KeBfZ!$T&l`9a-9Is5Ug3>5*Q5eM&(4dKxIc`BvM0FeHk za4CTmYZ1w_nj5c7O}LDQg<@9}%R%vOr)D|gb+0hF7rm*#2Px(uz(AnhDe-5y#2bMi zROH20fb9!grM|O7J922(WtCX(qXgA~`AlPs;;QPG5x%s7;t#AThWK$Uf*f z$UPhoJR%$v$l#IL;K57noId8b}-FyKzLtI`;mF{Oc5AMuiR+O$ZQ|DH`;sd z0_JFu+Q6a(y(*B-*O3<#)n_WWV+ASLtjT3w$ zsHlf*50uTaR?q3A3#L#_#G#hjutuToIC+%^YZ3P(RYQ%*l<`4~831_kFsAqp ztw7uR521|%4|Gdx7iY*rnyua_Jm2Hv)sO~>6?@aIGcX6eJ6l8hUb4wCx(0GM_Li3j zq1WK!vDZP`{2t*+QG(pq;+3tMh;6ze&-H_R!wsu+U(lmgboD# zYY(da#Fg@yAmdAoaY{3ed^FtJhO+L9*O@fF84jlR0^v&K3F{R&=Lko58+XHJH-@Fu z{`)u&v7;xV_x1#%5-6Wg@SZnh`LUsjD=gB`95JZg;CTIX=~`E{tw-SW&n@Iz%P*$TBb$Dsipj7w324%D~QWGC}(zGjk>LQ_$4B>liunnK=qIJH7#ahVx#q zSHz(kGpcoRHIqDvu613F^qa!x#GO=j$z_-0YC-}Vs-@2$$X$w_UO*ojW{JNPJFUQk zwKy>Nd@fI6R+3M6uH%RR0k@z-=wn$A!{a;?3GQNWrTnnDmKVvh9d=xqlP+Upy8?e> zXd{7~w36Zrw(~~BhZB)-P#?AyHS-McnTxQm(f!{V$OQH6d^#`R^tJ&nMdhE9*KeBD zpzZsl(hXP2day!spmJm&TK_Qw^#q;@j@XTOzrzSL3X&-hJbQVMzH9?*pocfq$XPH0 z%Lj8hHXeu0FXK`X<4YL}g5iLRtb$s~jY=)P>D?1ZYP?xJG0l`^i!4F{!bdf=PI(0p zScuvd*BjeDzS8Y@1xFaEu%o>@A8EYCCRIHiSomgw`xkbVCm(em z?C<63@y=~97$HB5f z2-Mi|`E9cKRD_$`Y9!L8k!hc7rDkA_ijnK;BV=3ObkLoIiaEudBgK>v!14Cow)D5h z&&OWM_w@Joe@Hf&uy2|~JG;@!X>I}_PSZNUY*b&4FRUBiP_;p8F7OM^+h}3y>GHNa zndlv6Y(!Vw>hZQa>&aR>I#e)qXrK00Jyg>3cU^+yvx&U``lQm;K?qNO%7>jtAyVZ4#~o{lYTQz z6HdE|E6}HhNSZPVAv(%oymTy2weejskfZ{mqUL9UYD*p*xyJ(;l&8k8H=7>^XT^R~ z`SNa%9KG^CdD9${h6tpURA(3*12=@AB^p(W`hRDq!()1Fi_qOll>6jTgH%o)gL-_Y z_fS*M#&LF!MD0rJe9sC(2a9&g`|d}!=-iJ{5TkBTo-~&{>LZh|h=_n`&HEZT6f8Wumo+(P zql=|=ac4Cqp3d|ZXCXQdQm+gVm#*N!I)kyBp#8J#42zIjtfrHvv9!LGC@K%2#lDj^ z_1H!n?nl(9^((!|q+FXY&ku920z*a^+L3P>WoABLDXRc4aJq`%x z3fJ+m6b8=fC6w}bR8}*`l}Lj7f~Hk;r0?{>zP}`d@3HWB+d*sgIO~Uum)$^U(+)%$ zKc%n6I*$Ed!#Fk&HxTx)!?Up606L0SJjHKwb2&Dzdy{2?BiY1jzTeG6)tKBa(2_Rb z-3=rYTQvKZSCcfmRs9)t=%&y0U>4Ke06kkB-?nJVV>?G6MIV ztL$$!$O^xaHa^LQzYFsB4c)p-xqkd%q$=hy=_+y;6pcr2Oys$4Y$==cT6|Ox*bO` z&$_39<{AbLvQo*xLdnG;-Zp&iD7gWKpz4*au~cNxC+m)%H!=yy8LoLOxg8G9;Iz$W zmZ}jT6}Dp>dw+m-@yLAiHQ8R$d!p_9i!4I7Epb-wpE2pp$(+q~n*@h4uX~}BQd0Sm z)-8h5pBs2PUy-g~X0a6dEOM5J8)ooc;oQMVbw~pXGYyB-NXqf$r(B>MD5sb}%+yN> zf2ilfKYhh zd{`hq9T6EGZyO&B92p)z9Ul}892FB#P|)UGzO{&4{cL};U%7Id9u^~h8k?Lp8=ifO z72b{cP47LOQ(uc9B&0i4i{mfmQuO;T3?I)$|P{iSj93m$s~PEh|PLwNj__VkN5qGUy?w&jxJMIr6PUI}Qxo zl2uvf``r$V9xGUSuAG@`tfp#H1~;2UT#((|lzioI>QSjGuiJ;aQbKA0hb;ub2r{Oz zJRP<^JZs!2Tt?qjG98+*^=n%-_}|5c9u-jCqmak)jpIPaHp4jl-mq8~XDggCr7;MQ zoZJLs3{qckWanN`Kqf5CrIcaYH@+)b_OqEGoOsU5L?$x*@hR;`-KFu#$2bR#)_!So zPnCsjG+Jfvo5Y~;Gai{}o@o&!!A}Uev`z51*$Qt{c+I*+LKEY*Umn2k4*--5w^nFT z$_mt}2PROZNsHYD-vzFcoC+$~MR5;mm_kNSk{6{~KOd6Ndw(UO)5PIsgw)K^!By+M z@{My*(RVX52+KcOYbrXMF+EwxKK=(>np*83A*SInG*;OG|<>2ptpb&(p8|#d~}hm@5&~)4$&}f$r~o7=hnfGzi6SgGs?( zKEsB7;O_5Bn9tqEzrWcMfP9;WfPZMe4t2x7_j(fo#@|{PAFB$GkU#Zmkw1}l7NwI0 zP_T->a&9yM!arVG-wcvUZ@+QXmjMUgUV6_AJrGB~SI5f&Ccj>nNA+vSYrp3_lmQUG zkG_xfd%PjPdgZwR#y?(94;bXw=K-ri)A<30( d{m*y(H%F-`0}k Date: Thu, 31 Aug 2017 17:57:31 +0300 Subject: [PATCH 2/2] suppress error highlighting if error intersects template string argument --- .../StyledComponents/InjectionUtils.kt | 2 + .../InterpolationArgumentsErrorFilter.kt | 36 +++++++++++++++ .../StyledComponentsInjector.kt | 18 +++++++- src/main/resources/META-INF/plugin.xml | 2 + src/test/HighlightingTest.kt | 43 ++++++++++++++++++ webstorm-styled-components.zip | Bin 14899 -> 18067 bytes 6 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 src/main/kotlin/com/intellij/StyledComponents/InterpolationArgumentsErrorFilter.kt create mode 100644 src/test/HighlightingTest.kt diff --git a/src/main/kotlin/com/intellij/StyledComponents/InjectionUtils.kt b/src/main/kotlin/com/intellij/StyledComponents/InjectionUtils.kt index d88759c..fb5671f 100644 --- a/src/main/kotlin/com/intellij/StyledComponents/InjectionUtils.kt +++ b/src/main/kotlin/com/intellij/StyledComponents/InjectionUtils.kt @@ -3,11 +3,13 @@ package com.intellij.StyledComponents import com.intellij.lang.javascript.JSTokenTypes import com.intellij.lang.javascript.psi.JSLiteralExpression import com.intellij.lang.javascript.psi.ecma6.JSStringTemplateExpression +import com.intellij.openapi.util.Key import com.intellij.openapi.util.TextRange import com.intellij.util.ArrayUtil import com.intellij.util.containers.ContainerUtil import java.util.ArrayList +val INJECTED_FILE_RANGES_KEY = Key?>("INJECTED_FILE_RANGES_KEY") private val EXTERNAL_FRAGMENT = "EXTERNAL_FRAGMENT" fun getInjectionPlaces(myQuotedLiteral: JSLiteralExpression): List { diff --git a/src/main/kotlin/com/intellij/StyledComponents/InterpolationArgumentsErrorFilter.kt b/src/main/kotlin/com/intellij/StyledComponents/InterpolationArgumentsErrorFilter.kt new file mode 100644 index 0000000..ef113a4 --- /dev/null +++ b/src/main/kotlin/com/intellij/StyledComponents/InterpolationArgumentsErrorFilter.kt @@ -0,0 +1,36 @@ +package com.intellij.StyledComponents + +import com.intellij.codeInsight.daemon.impl.HighlightInfo +import com.intellij.codeInsight.daemon.impl.HighlightInfoFilter +import com.intellij.codeInsight.highlighting.HighlightErrorFilter +import com.intellij.lang.annotation.HighlightSeverity +import com.intellij.psi.PsiErrorElement +import com.intellij.psi.PsiFile + +class InterpolationArgumentsErrorFilter : HighlightErrorFilter(), HighlightInfoFilter { + override fun shouldHighlightErrorElement(element: PsiErrorElement): Boolean { + val acceptedRanges = element.containingFile.getUserData(INJECTED_FILE_RANGES_KEY) + if (acceptedRanges == null) { + return true + } + return acceptedRanges.any { range -> range.contains(element.textRange) } + } + + override fun accept(highlightInfo: HighlightInfo, file: PsiFile?): Boolean { + val acceptedRanges = file?.getUserData(INJECTED_FILE_RANGES_KEY) + if (acceptedRanges == null) { + return true + } + if (highlightInfo.severity === HighlightSeverity.WARNING + || highlightInfo.severity === HighlightSeverity.WEAK_WARNING + || highlightInfo.severity === HighlightSeverity.ERROR) { + return acceptedRanges.any { range -> + highlightInfo.startOffset > range.startOffset + && highlightInfo.endOffset < range.endOffset + } + } + return true + } + +} + diff --git a/src/main/kotlin/com/intellij/StyledComponents/StyledComponentsInjector.kt b/src/main/kotlin/com/intellij/StyledComponents/StyledComponentsInjector.kt index 3ce7ea6..5e560a0 100644 --- a/src/main/kotlin/com/intellij/StyledComponents/StyledComponentsInjector.kt +++ b/src/main/kotlin/com/intellij/StyledComponents/StyledComponentsInjector.kt @@ -4,9 +4,14 @@ import com.intellij.lang.injection.MultiHostInjector import com.intellij.lang.injection.MultiHostRegistrar import com.intellij.lang.javascript.psi.JSExpression import com.intellij.lang.javascript.psi.ecma6.JSStringTemplateExpression +import com.intellij.openapi.util.Pair +import com.intellij.openapi.util.TextRange import com.intellij.patterns.ElementPattern import com.intellij.patterns.PlatformPatterns import com.intellij.psi.PsiElement +import com.intellij.psi.PsiFile +import com.intellij.psi.impl.source.tree.injected.MultiHostRegistrarImpl +import com.intellij.psi.impl.source.tree.injected.Place import org.jetbrains.plugins.less.LESSLanguage class StyledComponentsInjector : MultiHostInjector { @@ -40,11 +45,22 @@ class StyledComponentsInjector : MultiHostInjector { registrar.addPlace(thePrefix, theSuffix, injectionHost, range) } registrar.doneInjecting() + val result = getInjectionResult(registrar) ?: return + val injectedFile = result.second + val injectedFileRanges = result.first.map { TextRange(it.range.startOffset, it.range.endOffset - it.suffix.length) } + + if (injectedFileRanges.size > 1) { + injectedFile.putUserData(INJECTED_FILE_RANGES_KEY, injectedFileRanges) + } } + } + private fun getInjectionResult(registrar: MultiHostRegistrar): Pair? { + val result = (registrar as MultiHostRegistrarImpl).result + return if (result == null || result.isEmpty()) null + else result[result.size - 1] } data class PlaceInfo(val elementPattern: ElementPattern, val prefix: String? = null, val suffix: String? = null) - } \ No newline at end of file diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 958e38b..10bd0e9 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -24,5 +24,7 @@ + + \ No newline at end of file diff --git a/src/test/HighlightingTest.kt b/src/test/HighlightingTest.kt new file mode 100644 index 0000000..6282c6e --- /dev/null +++ b/src/test/HighlightingTest.kt @@ -0,0 +1,43 @@ +import com.intellij.psi.css.inspections.invalid.CssInvalidPropertyValueInspection +import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase + +class HighlightingTest : LightCodeInsightFixtureTestCase() { + + fun testWithoutArguments_ErrorsHighlighted() { + myFixture.enableInspections(CssInvalidPropertyValueInspection::class.java) + doTest("var someCss = css`div {\n" + + " color: {}\n" + + "};`") + } + + fun testErrorSurroundsInterpolationArgument_NotHighlighted() { + myFixture.enableInspections(CssInvalidPropertyValueInspection::class.java) + doTest("var someCss = css`\n" + + "//should not highlight\n" + + "withArgument{\n" + + " border: 5px \${foobar} red;\n" + + "},\n" + + "//should highlight\n" + + "withoutArgument {\n" + + " border: 5px foobar-not-acceptable red;\n" + + "};;`") + } + + fun testErrorAdjacentToInterpolationArgument_NotHighlighted() { + doTest("var styledSomething = styled.something`\n" + + " perspective: 1000px;\n" + + " \${value}\n" + + " \${anotherValue}\n" + + "`\n" + + "const Triangle = styled.span`\n" + + " \${({ right }) => (right ? 'right: 0;' : 'left: 0;')}\n" + + "`") + } + + private fun doTest(expected: String) { + myFixture.setCaresAboutInjection(false) + myFixture.configureByText("dummy.es6", expected) + myFixture.testHighlighting(true, false, true) + } + +} \ No newline at end of file diff --git a/webstorm-styled-components.zip b/webstorm-styled-components.zip index f4ac782a7da0ad2428bc593334a0c5ffc98c0624..1a515ead644f8c1c433d5a22db5d7e27e56970f6 100644 GIT binary patch delta 17805 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 delta 14597 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