From a0f402f20de292cd7c086369174d510cbbbfb340 Mon Sep 17 00:00:00 2001 From: Vasil Vasilev Date: Mon, 8 Jul 2024 16:04:34 +0200 Subject: [PATCH] [compiler] Update zinc to version 1.10.1 and add tests for javac compiler error position information #SCL-22799 fixed - https://github.com/sbt/zinc/pull/1373 --- project/dependencies.scala | 2 +- .../zinc/JavacErrorsPositionTest.scala | 72 +++++++++++++++++++ 2 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 scala/compiler-integration/test/org/jetbrains/plugins/scala/compiler/zinc/JavacErrorsPositionTest.scala diff --git a/project/dependencies.scala b/project/dependencies.scala index 68e8c2dd65e..7b9760e8e03 100644 --- a/project/dependencies.scala +++ b/project/dependencies.scala @@ -12,7 +12,7 @@ object Versions { // run runtimeDependencies/update manually val sbtVersion: String = Sbt.latest val bloopVersion = "1.5.6" - val zincVersion = "1.10.0" + val zincVersion = "1.10.1" // ATTENTION: check the comment in `Common.newProjectWithKotlin` when updating this version val intellijVersion = "242.19890.5" diff --git a/scala/compiler-integration/test/org/jetbrains/plugins/scala/compiler/zinc/JavacErrorsPositionTest.scala b/scala/compiler-integration/test/org/jetbrains/plugins/scala/compiler/zinc/JavacErrorsPositionTest.scala new file mode 100644 index 00000000000..b0982aadf35 --- /dev/null +++ b/scala/compiler-integration/test/org/jetbrains/plugins/scala/compiler/zinc/JavacErrorsPositionTest.scala @@ -0,0 +1,72 @@ +package org.jetbrains.plugins.scala.compiler.zinc + +import com.intellij.compiler.CompilerMessageImpl +import com.intellij.openapi.compiler.CompilerMessageCategory +import com.intellij.openapi.module.ModuleManager +import com.intellij.testFramework.CompilerTester +import org.jetbrains.plugins.scala.CompilationTests +import org.jetbrains.plugins.scala.compiler.data.IncrementalityType +import org.jetbrains.plugins.scala.project.settings.ScalaCompilerConfiguration +import org.junit.Assert.{assertEquals, assertTrue} +import org.junit.experimental.categories.Category + +import scala.jdk.CollectionConverters._ + +@Category(Array(classOf[CompilationTests])) +class JavacErrorsPositionTest extends ZincTestBase { + + def testJavacErrorsPosition_Zinc(): Unit = { + runJavacErrorsPositionTest(IncrementalityType.SBT) + } + + def testJavacErrorsPosition_IDEA(): Unit = { + runJavacErrorsPositionTest(IncrementalityType.IDEA) + } + + private def runJavacErrorsPositionTest(incrementality: IncrementalityType): Unit = { + createProjectSubDirs("project", "src/main/java") + createProjectSubFile("project/build.properties", "sbt.version=1.10.1") + createProjectSubFile("src/main/java/StringFactorial.java", + """import java.math.BigInteger; + | + |public final class StringFactorial { + | public static String factorial(String n) { + | BigInteger fact = BigInteger.ONE; + | for (BigInteger N = new BigInteger(n); N.compareTo(BigInteger.ZERO) > 0; N--) { + | fact *= N; + | } + | return fact; + | } + |} + |""".stripMargin) + createProjectConfig( + """lazy val root = project.in(file(".")) + | .settings(scalaVersion := "2.13.14") + |""".stripMargin) + + importProject(false) + ScalaCompilerConfiguration.instanceIn(myProject).incrementalityType = incrementality + val modules = ModuleManager.getInstance(myProject).getModules + rootModule = modules.find(_.getName == "root").orNull + compiler = new CompilerTester(myProject, java.util.Arrays.asList(modules: _*), null, false) + + val errors = compiler.make().asScala.toSeq.filter(_.getCategory == CompilerMessageCategory.ERROR) + assertEquals(3, errors.size) + + val Seq(error1, error2, error3) = errors.map { case impl: CompilerMessageImpl => impl } + + val message1 = error1.getMessage + assertTrue(message1.contains("bad operand type") && message1.contains("BigInteger for unary operator '--'")) + assertEquals(6, error1.getLine) + assertEquals(83, error1.getColumn) + + assertTrue(error2.getMessage.contains("bad operand types for binary operator '*'")) + assertEquals(7, error2.getLine) + assertEquals(18, error2.getColumn) + + val message3 = error3.getMessage + assertTrue(message3.contains("incompatible types: ") && message3.contains("BigInteger cannot be converted to ") && message3.contains("String")) + assertEquals(9, error3.getLine) + assertEquals(16, error3.getColumn) + } +}