From 0adff0428089f4c914d22b1ae3abc7f36bb808d2 Mon Sep 17 00:00:00 2001 From: Maxim Kropotov Date: Thu, 31 Aug 2017 17:57:31 +0300 Subject: [PATCH] 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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