Skip to content

Commit 9a9ffbf

Browse files
author
builduser
committed
Merged branch idea241.release-dnaumenko into idea241.release
2 parents 4150b8b + e933a82 commit 9a9ffbf

File tree

5 files changed

+115
-4
lines changed

5 files changed

+115
-4
lines changed

CONTRIBUTING.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ In case of any questions you are welcome on our [discord channel](https://discor
99
### Useful links:
1010
- [How to contribute to IntelliJ Scala plugin](https://blog.jetbrains.com/scala/2016/04/21/how-to-contribute-to-intellij-scala-plugin/) (includes YouTube video)
1111
- [Building IntelliJ IDEA plugins in Scala by Igal Tabachnik: Scala in the City Conference](https://www.youtube.com/watch?v=IPO-cY_giNA) (YouTube video)
12+
- [Up For Grabs](https://youtrack.jetbrains.com/issues/SCL?q=tag:%20%7BUp%20For%20Grabs%7D%20%23Unresolved%20order%20by:%20created) contains a list of easy-to start YouTrack tickets
1213
- [Glossary of IntelliJ Platform](https://plugins.jetbrains.com/docs/intellij/glossary.html)
1314
- [Explore the IntelliJ Platform API](https://plugins.jetbrains.com/docs/intellij/explore-api.html)
1415
- [PSI Viewer](https://www.jetbrains.com/help/idea/psi-viewer.html) is an essential tool to dig into the structure of a source code.

scala/integration/intellilang/test/org/jetbrains/plugins/scala/injection/ScalaInjectedLanguageEditInsideOriginalLiteralTest.scala

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,13 @@ class ScalaInjectedLanguageEditInsideOriginalLiteralTest extends EditorActionTes
3030
}
3131
}
3232

33+
private def doTypingTestInInjection(textToType: String, before: String, after: String): Unit = {
34+
performTest(before, after) { () =>
35+
scalaInjectionTestFixture.assertHasSomeInjectedLanguageAtCaret()
36+
performTypingAction(textToType)
37+
}
38+
}
39+
3340
def testInsertMarginCharOnEnterInsideInjectedFileInMultilineString(): Unit = {
3441
val before =
3542
s"""val x =
@@ -121,4 +128,87 @@ class ScalaInjectedLanguageEditInsideOriginalLiteralTest extends EditorActionTes
121128

122129
doEnterTestInInjection(before, after)
123130
}
131+
132+
//SCL-22507
133+
def testTypeColonAfterInvalidJsonProperty_CommentInjection_Multiline(): Unit = {
134+
doTypingTestInInjection(
135+
":",
136+
s"""object Example {
137+
| //language=JSON
138+
| \"\"\"{"a":"aaa", b$CARET }\"\"\"
139+
|}
140+
|""".stripMargin,
141+
s"""object Example {
142+
| //language=JSON
143+
| \"\"\"{"a":"aaa", "b": $CARET }\"\"\"
144+
|}
145+
|""".stripMargin
146+
)
147+
}
148+
149+
//SCL-22507
150+
def testTypeColonAfterInvalidJsonProperty_InterpolatorInjection_Multiline(): Unit = {
151+
doTypingTestInInjection(
152+
":",
153+
s"""object Example {
154+
| //1. Via interpolator
155+
| implicit class JsonHelper(val sc: StringContext) extends AnyVal {
156+
| def json(args: Any*): String = ???
157+
| }
158+
| json\"\"\"{"a":"aaa", b$CARET }\"\"\"
159+
|}
160+
|""".stripMargin,
161+
s"""object Example {
162+
| //1. Via interpolator
163+
| implicit class JsonHelper(val sc: StringContext) extends AnyVal {
164+
| def json(args: Any*): String = ???
165+
| }
166+
| json\"\"\"{"a":"aaa", "b": $CARET }\"\"\"
167+
|}
168+
|""".stripMargin
169+
)
170+
}
171+
172+
//SCL-22507
173+
def testTypeColonAfterInvalidJsonProperty_CommentInjection_OneLine(): Unit = {
174+
//TODO: ignore IJPL-149605 is fixed (we might need to review our implementation as well)
175+
return
176+
doTypingTestInInjection(
177+
":",
178+
s"""object Example {
179+
| //language=JSON
180+
| "{\\"a\\":\\"aaa\\", b$CARET }"
181+
|}
182+
|""".stripMargin,
183+
s"""object Example {
184+
| //language=JSON
185+
| "{\\"a\\":\\"aaa\\", \\"b\\": $CARET }"
186+
|}
187+
|""".stripMargin
188+
)
189+
}
190+
191+
//SCL-22507
192+
def testTypeColonAfterInvalidJsonProperty_InterpolatorInjection_OneLine(): Unit = {
193+
//TODO: patch expected data once IJPL-149605 is fixed
194+
doTypingTestInInjection(
195+
":",
196+
s"""object Example {
197+
| //1. Via interpolator
198+
| implicit class JsonHelper(val sc: StringContext) extends AnyVal {
199+
| def json(args: Any*): String = ???
200+
| }
201+
| json"{\\"a\\":\\"aaa\\", b$CARET }"
202+
|}
203+
|""".stripMargin,
204+
s"""object Example {
205+
| //1. Via interpolator
206+
| implicit class JsonHelper(val sc: StringContext) extends AnyVal {
207+
| def json(args: Any*): String = ???
208+
| }
209+
| json"{\\"a\\":\\"aaa\\", b: $CARET }"
210+
|}
211+
|""".stripMargin
212+
)
213+
}
124214
}

scala/scala-impl/src/org/jetbrains/plugins/scala/lang/psi/impl/base/ScInterpolatedStringLiteralImpl.scala

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package org.jetbrains.plugins.scala.lang.psi.impl.base
22

33
import com.intellij.lang.{ASTNode, LanguageNamesValidation}
4+
import com.intellij.openapi.diagnostic.Logger
45
import com.intellij.psi.LiteralTextEscaper
6+
import com.intellij.psi.impl.source.tree.LeafElement
57
import com.intellij.util.IncorrectOperationException
68
import org.jetbrains.plugins.scala.ScalaBundle
79
import org.jetbrains.plugins.scala.caches.{BlockModificationTracker, cachedInUserData}
@@ -10,11 +12,13 @@ import org.jetbrains.plugins.scala.lang.psi.api.base.ScInterpolatedStringLiteral
1012
import org.jetbrains.plugins.scala.lang.psi.api.base.literals.ScStringLiteral
1113
import org.jetbrains.plugins.scala.lang.psi.api.expr.{ScMethodCall, ScReferenceExpression}
1214
import org.jetbrains.plugins.scala.lang.psi.impl.ScalaPsiElementFactory
15+
import org.jetbrains.plugins.scala.lang.psi.impl.base.ScInterpolatedStringLiteralImpl.Log
1316
import org.jetbrains.plugins.scala.lang.psi.impl.base.literals.escapers.{ScLiteralEscaper, ScLiteralRawEscaper}
1417
import org.jetbrains.plugins.scala.lang.psi.types.result._
1518
import org.jetbrains.plugins.scala.util.CommonQualifiedNames.StringContextCanonical
1619

1720
import scala.meta.intellij.QuasiquoteInferUtil._
21+
import scala.util.control.NonFatal
1822

1923
// todo: move to "literals" subpackage, but check usages
2024
final class ScInterpolatedStringLiteralImpl(node: ASTNode,
@@ -102,4 +106,20 @@ final class ScInterpolatedStringLiteralImpl(node: ASTNode,
102106
new ScLiteralRawEscaper(this)
103107
else
104108
new ScLiteralEscaper(this)
109+
110+
override def updateText(text: String): ScStringLiteralImpl = try {
111+
val newStringLiteral = ScalaPsiElementFactory.createStringLiteralFromText(text, this.features).asInstanceOf[ScStringLiteralImpl]
112+
getParent.getNode.replaceChild(getNode, newStringLiteral.getNode)
113+
newStringLiteral
114+
} catch {
115+
case NonFatal(ex) =>
116+
Log.warn(ex)
117+
//TODO: this is a fallback workaround for SCL-22507 and IJPL-149605
118+
// it should be removed once IJPL-149605 is resolved
119+
this
120+
}
105121
}
122+
123+
object ScInterpolatedStringLiteralImpl {
124+
private val Log = Logger.getInstance(this.getClass)
125+
}

scala/test-integration/testing-support/src/org/jetbrains/plugins/scala/testingSupport/test/munit/MUnitConfigurationProducer.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ final class MUnitConfigurationProducer extends AbstractTestConfigurationProducer
2727

2828
override protected def configurationName(contextInfo: CreateFromContextInfo): String = contextInfo match {
2929
case AllInPackage(_, packageName) =>
30-
s"UTest in '$packageName'"
30+
s"MUnit in '$packageName'"
3131
case ClassWithTestName(testClass, testName) =>
3232
StringUtil.getShortName(testClass.qualifiedName) + testName.fold("")("." + _)
3333
}

scala/test-integration/testing-support/test/org/jetbrains/plugins/scala/testingSupport/munit/MUnitConfigPackageTest.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class MUnitConfigPackageTest extends MUnitTestCase {
5252
runTestByLocation2(
5353
packageLoc(packageName0),
5454
config => {
55-
assertPackageConfigAndSettings(config, packageName0, "UTest in 'org'")
55+
assertPackageConfigAndSettings(config, packageName0, "MUnit in 'org'")
5656
},
5757
root => assertResultTreePathsEqualsUnordered(root.testTreeRoot.get)(Seq(
5858
TestNodePathWithStatus(Magnitude.FAILED_INDEX, TestNodePath.parse("[root] / MyTest01 / MyTest01.test error 01")),
@@ -74,7 +74,7 @@ class MUnitConfigPackageTest extends MUnitTestCase {
7474
runTestByLocation2(
7575
packageLoc(packageName1),
7676
config => {
77-
assertPackageConfigAndSettings(config, packageName1, "UTest in 'example1'")
77+
assertPackageConfigAndSettings(config, packageName1, "MUnit in 'example1'")
7878
},
7979
root => assertResultTreePathsEqualsUnordered(root.testTreeRoot.get)(Seq(
8080
TestNodePathWithStatus(Magnitude.FAILED_INDEX, TestNodePath.parse("[root] / MyTest11 / MyTest11.test error 11")),
@@ -88,7 +88,7 @@ class MUnitConfigPackageTest extends MUnitTestCase {
8888
runTestByLocation2(
8989
packageLoc(packageName2),
9090
config => {
91-
assertPackageConfigAndSettings(config, packageName2, "UTest in 'example2'")
91+
assertPackageConfigAndSettings(config, packageName2, "MUnit in 'example2'")
9292
},
9393
root => assertResultTreePathsEqualsUnordered(root.testTreeRoot.get)(Seq(
9494
TestNodePathWithStatus(Magnitude.FAILED_INDEX, TestNodePath.parse("[root] / MyTest21 / MyTest21.test error 21")),

0 commit comments

Comments
 (0)