From fbef29a8af75b688dd2e898f19c688d950a6c6f0 Mon Sep 17 00:00:00 2001 From: wpopielarski Date: Tue, 14 Jul 2015 15:40:23 +0200 Subject: [PATCH] Fix for #1002486 Solves problem with not compiled java files when they depend on scala files. Additionally there was a problem of disappearing error markers. Fix #1002486 --- .../src/org/scalaide/TestsSuite.scala | 6 +- .../JavaDependsOnScalaBothAreOkTest.scala | 67 ++++++++++++++++++ .../sbtbuilder/JavaDependsOnScalaTest.scala | 68 +++++++++++++++++++ .../javaDependsOnScala/.classpath | 7 ++ .../javaDependsOnScala/.project | 18 +++++ .../javaDependsOnScala/src/main/A.scala | 5 ++ .../javaDependsOnScala/src/main/B.java | 5 ++ .../javaDependsOnScalaBothAreOk/.classpath | 7 ++ .../javaDependsOnScalaBothAreOk/.project | 18 +++++ .../src/main/A.scala | 5 ++ .../src/main/B.java | 5 ++ .../internal/builder/zinc/SbtInputs.scala | 11 ++- .../project/scopes/BuildScopeUnit.scala | 9 +-- 13 files changed, 221 insertions(+), 10 deletions(-) create mode 100644 org.scala-ide.sdt.core.tests/src/org/scalaide/core/sbtbuilder/JavaDependsOnScalaBothAreOkTest.scala create mode 100644 org.scala-ide.sdt.core.tests/src/org/scalaide/core/sbtbuilder/JavaDependsOnScalaTest.scala create mode 100644 org.scala-ide.sdt.core.tests/test-workspace/javaDependsOnScala/.classpath create mode 100644 org.scala-ide.sdt.core.tests/test-workspace/javaDependsOnScala/.project create mode 100644 org.scala-ide.sdt.core.tests/test-workspace/javaDependsOnScala/src/main/A.scala create mode 100644 org.scala-ide.sdt.core.tests/test-workspace/javaDependsOnScala/src/main/B.java create mode 100644 org.scala-ide.sdt.core.tests/test-workspace/javaDependsOnScalaBothAreOk/.classpath create mode 100644 org.scala-ide.sdt.core.tests/test-workspace/javaDependsOnScalaBothAreOk/.project create mode 100644 org.scala-ide.sdt.core.tests/test-workspace/javaDependsOnScalaBothAreOk/src/main/A.scala create mode 100644 org.scala-ide.sdt.core.tests/test-workspace/javaDependsOnScalaBothAreOk/src/main/B.java diff --git a/org.scala-ide.sdt.core.tests/src/org/scalaide/TestsSuite.scala b/org.scala-ide.sdt.core.tests/src/org/scalaide/TestsSuite.scala index 559211e739..f0a286e606 100644 --- a/org.scala-ide.sdt.core.tests/src/org/scalaide/TestsSuite.scala +++ b/org.scala-ide.sdt.core.tests/src/org/scalaide/TestsSuite.scala @@ -27,6 +27,8 @@ import org.scalaide.core.pc.PresentationCompilerTest import org.scalaide.core.project.DirectoryScalaInstallationTest import org.scalaide.core.project.ScalaInstallationTest import org.scalaide.core.sbtbuilder.DeprecationWarningsTests +import org.scalaide.core.sbtbuilder.JavaDependsOnScalaBothAreOkTest +import org.scalaide.core.sbtbuilder.JavaDependsOnScalaTest import org.scalaide.core.sbtbuilder.MultiScalaVersionTest import org.scalaide.core.sbtbuilder.MultipleErrorsTest import org.scalaide.core.sbtbuilder.NameHashingVulnerabilityTest @@ -114,6 +116,8 @@ import org.scalaide.util.internal.eclipse.TextSelectionTest classOf[ScalaJavaDepWhenJavaIsWrongTest], classOf[ScopeCompileTest], classOf[ScalaProjectDependedOnJavaProjectTest], - classOf[NameHashingVulnerabilityTest] + classOf[NameHashingVulnerabilityTest], + classOf[JavaDependsOnScalaTest], + classOf[JavaDependsOnScalaBothAreOkTest] )) class TestsSuite diff --git a/org.scala-ide.sdt.core.tests/src/org/scalaide/core/sbtbuilder/JavaDependsOnScalaBothAreOkTest.scala b/org.scala-ide.sdt.core.tests/src/org/scalaide/core/sbtbuilder/JavaDependsOnScalaBothAreOkTest.scala new file mode 100644 index 0000000000..ce9c049ff3 --- /dev/null +++ b/org.scala-ide.sdt.core.tests/src/org/scalaide/core/sbtbuilder/JavaDependsOnScalaBothAreOkTest.scala @@ -0,0 +1,67 @@ +package org.scalaide.core +package sbtbuilder + +import org.junit.BeforeClass +import org.scalaide.core.testsetup.SDTTestUtils +import org.junit.Assert._ +import org.junit.Test +import org.eclipse.core.resources.IFile +import org.eclipse.core.runtime.NullProgressMonitor +import org.eclipse.core.resources.IncrementalProjectBuilder +import org.eclipse.core.resources.IMarker + +object JavaDependsOnScalaBothAreOkTest extends testsetup.TestProjectSetup("javaDependsOnScalaBothAreOk") { + @BeforeClass def setup(): Unit = { + SDTTestUtils.enableAutoBuild(false) + } +} + +class JavaDependsOnScalaBothAreOkTest { + import JavaDependsOnScalaBothAreOkTest._ + + @Test def shouldCreateProjectFromOkJavaAndSpoilAndFixIt(): Unit = { + val TypeBMustImplementFoo = 1 + cleanProject() + import SDTTestUtils._ + + val aClass = compilationUnit("main/A.scala") + val bClass = compilationUnit("main/B.java") + def rebuildAndCollectProblems(): List[IMarker] = { + project.underlying.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, new NullProgressMonitor) + getProblemMarkers(aClass, bClass) + } + + step("first compile scala and dependent java classes") { + val problems = rebuildAndCollectProblems() + assertTrue("No build error expected, got: " + markersMessages(problems), problems.isEmpty) + } + + step("then extends java B with abstract A") { + changeContentOfFile(bClass.getResource().getAdapter(classOf[IFile]).asInstanceOf[IFile], changed_main_B) + val problems = rebuildAndCollectProblems() + assertTrue("One build error expected, got: " + markersMessages(problems), problems.length == TypeBMustImplementFoo) + } + + step("and then give body to 'foo' in abstract A") { + changeContentOfFile(aClass.getResource().getAdapter(classOf[IFile]).asInstanceOf[IFile], changed_main_A) + val problems = rebuildAndCollectProblems() + assertTrue("No build error expected, got: " + markersMessages(problems), problems.isEmpty) + } + } + + private def step(description: String)(runInStep: => Unit): Unit = runInStep + + lazy val changed_main_A = """ +package main + +abstract class A { + def foo(s: String): Unit = {} +} +""" + lazy val changed_main_B = """ +package main; + +public class B extends A { +} +""" +} diff --git a/org.scala-ide.sdt.core.tests/src/org/scalaide/core/sbtbuilder/JavaDependsOnScalaTest.scala b/org.scala-ide.sdt.core.tests/src/org/scalaide/core/sbtbuilder/JavaDependsOnScalaTest.scala new file mode 100644 index 0000000000..ce87afff5f --- /dev/null +++ b/org.scala-ide.sdt.core.tests/src/org/scalaide/core/sbtbuilder/JavaDependsOnScalaTest.scala @@ -0,0 +1,68 @@ +package org.scalaide.core +package sbtbuilder + +import org.junit.BeforeClass +import org.scalaide.core.testsetup.SDTTestUtils +import org.junit.Assert._ +import org.junit.Test +import org.eclipse.core.resources.IFile +import org.eclipse.core.runtime.NullProgressMonitor +import org.eclipse.core.resources.IncrementalProjectBuilder +import org.eclipse.core.resources.IMarker + +object JavaDependsOnScalaTest extends testsetup.TestProjectSetup("javaDependsOnScala") { + @BeforeClass def setup(): Unit = { + SDTTestUtils.enableAutoBuild(false) + } +} + +class JavaDependsOnScalaTest { + import JavaDependsOnScalaTest._ + + @Test def shouldCreateProjectFromWrongJavaAndSpoilAndFixScalaClass(): Unit = { + val TypeBMustImplementFoo = 1 + cleanProject() + import SDTTestUtils._ + + val aClass = compilationUnit("main/A.scala") + val initiallyWrongAclass = slurpAndClose(project.underlying.getFile("src/main/A.scala").getContents) + val bClass = compilationUnit("main/B.java") + def rebuildAndCollectProblems(): List[IMarker] = { + project.underlying.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, new NullProgressMonitor) + getProblemMarkers(aClass, bClass) + } + + step("first compile scala and dependent java classes") { + val problems = rebuildAndCollectProblems() + assertTrue("One build error expected, got: " + markersMessages(problems), problems.length == TypeBMustImplementFoo) + } + + step("then fix scala class") { + changeContentOfFile(aClass.getResource().getAdapter(classOf[IFile]).asInstanceOf[IFile], changed_main_A) + val problems = rebuildAndCollectProblems() + assertTrue("No build error expected, got: " + markersMessages(problems), problems.isEmpty) + } + + step("and then flaw scala class again") { + changeContentOfFile(aClass.getResource().getAdapter(classOf[IFile]).asInstanceOf[IFile], initiallyWrongAclass) + val problems = rebuildAndCollectProblems() + assertTrue("One build error expected, got: " + markersMessages(problems), problems.length == TypeBMustImplementFoo) + } + + step("finally fix scala class") { + changeContentOfFile(aClass.getResource().getAdapter(classOf[IFile]).asInstanceOf[IFile], changed_main_A) + val problems = rebuildAndCollectProblems() + assertTrue("No build error expected, got: " + markersMessages(problems), problems.isEmpty) + } + } + + private def step(description: String)(runInStep: => Unit): Unit = runInStep + + lazy val changed_main_A = """ +package main + +abstract class A { + def foo(s: String): Unit = {} +} +""" +} diff --git a/org.scala-ide.sdt.core.tests/test-workspace/javaDependsOnScala/.classpath b/org.scala-ide.sdt.core.tests/test-workspace/javaDependsOnScala/.classpath new file mode 100644 index 0000000000..bc01bff4ca --- /dev/null +++ b/org.scala-ide.sdt.core.tests/test-workspace/javaDependsOnScala/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/org.scala-ide.sdt.core.tests/test-workspace/javaDependsOnScala/.project b/org.scala-ide.sdt.core.tests/test-workspace/javaDependsOnScala/.project new file mode 100644 index 0000000000..527f844cfb --- /dev/null +++ b/org.scala-ide.sdt.core.tests/test-workspace/javaDependsOnScala/.project @@ -0,0 +1,18 @@ + + + javaDependsOnScala + + + + + + org.scala-ide.sdt.core.scalabuilder + + + + + + org.scala-ide.sdt.core.scalanature + org.eclipse.jdt.core.javanature + + diff --git a/org.scala-ide.sdt.core.tests/test-workspace/javaDependsOnScala/src/main/A.scala b/org.scala-ide.sdt.core.tests/test-workspace/javaDependsOnScala/src/main/A.scala new file mode 100644 index 0000000000..7f1aa8daa4 --- /dev/null +++ b/org.scala-ide.sdt.core.tests/test-workspace/javaDependsOnScala/src/main/A.scala @@ -0,0 +1,5 @@ +package main + +abstract class A { + def foo(s: String): Unit //= {} +} diff --git a/org.scala-ide.sdt.core.tests/test-workspace/javaDependsOnScala/src/main/B.java b/org.scala-ide.sdt.core.tests/test-workspace/javaDependsOnScala/src/main/B.java new file mode 100644 index 0000000000..81f3680333 --- /dev/null +++ b/org.scala-ide.sdt.core.tests/test-workspace/javaDependsOnScala/src/main/B.java @@ -0,0 +1,5 @@ +package main; + +public class B extends A { +} + diff --git a/org.scala-ide.sdt.core.tests/test-workspace/javaDependsOnScalaBothAreOk/.classpath b/org.scala-ide.sdt.core.tests/test-workspace/javaDependsOnScalaBothAreOk/.classpath new file mode 100644 index 0000000000..bc01bff4ca --- /dev/null +++ b/org.scala-ide.sdt.core.tests/test-workspace/javaDependsOnScalaBothAreOk/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/org.scala-ide.sdt.core.tests/test-workspace/javaDependsOnScalaBothAreOk/.project b/org.scala-ide.sdt.core.tests/test-workspace/javaDependsOnScalaBothAreOk/.project new file mode 100644 index 0000000000..4f6302c96b --- /dev/null +++ b/org.scala-ide.sdt.core.tests/test-workspace/javaDependsOnScalaBothAreOk/.project @@ -0,0 +1,18 @@ + + + javaDependsOnScalaBothAreOk + + + + + + org.scala-ide.sdt.core.scalabuilder + + + + + + org.scala-ide.sdt.core.scalanature + org.eclipse.jdt.core.javanature + + diff --git a/org.scala-ide.sdt.core.tests/test-workspace/javaDependsOnScalaBothAreOk/src/main/A.scala b/org.scala-ide.sdt.core.tests/test-workspace/javaDependsOnScalaBothAreOk/src/main/A.scala new file mode 100644 index 0000000000..5a11c2f8ca --- /dev/null +++ b/org.scala-ide.sdt.core.tests/test-workspace/javaDependsOnScalaBothAreOk/src/main/A.scala @@ -0,0 +1,5 @@ +package main + +abstract class A { + def foo(s: String): Unit +} diff --git a/org.scala-ide.sdt.core.tests/test-workspace/javaDependsOnScalaBothAreOk/src/main/B.java b/org.scala-ide.sdt.core.tests/test-workspace/javaDependsOnScalaBothAreOk/src/main/B.java new file mode 100644 index 0000000000..d684262f70 --- /dev/null +++ b/org.scala-ide.sdt.core.tests/test-workspace/javaDependsOnScalaBothAreOk/src/main/B.java @@ -0,0 +1,5 @@ +package main; + +public class B { +} + diff --git a/org.scala-ide.sdt.core/src/org/scalaide/core/internal/builder/zinc/SbtInputs.scala b/org.scala-ide.sdt.core/src/org/scalaide/core/internal/builder/zinc/SbtInputs.scala index 90bbe23990..0c652c8773 100644 --- a/org.scala-ide.sdt.core/src/org/scalaide/core/internal/builder/zinc/SbtInputs.scala +++ b/org.scala-ide.sdt.core/src/org/scalaide/core/internal/builder/zinc/SbtInputs.scala @@ -79,7 +79,13 @@ class SbtInputs(installation: IScalaInstallation, } def options = new Options { - def classpath = (project.scalaClasspath.userCp ++ addToClasspath).map(_.toFile.getAbsoluteFile).toArray + def outputFolders = srcOutputs.map { + case (_, out) => out.getRawLocation + } + + def classpath = (project.scalaClasspath.userCp ++ addToClasspath ++ outputFolders) + .distinct + .map(_.toFile.getAbsoluteFile).toArray def sources = sourceFiles.toArray @@ -119,7 +125,8 @@ class SbtInputs(installation: IScalaInstallation, } } - /** @return Right-biased instance of Either (error message in Left, value in Right) + /** + * @return Right-biased instance of Either (error message in Left, value in Right) */ def compilers: Either[String, Compilers[sbt.compiler.AnalyzingCompiler]] = { val scalaInstance = scalaInstanceForInstallation(installation) diff --git a/org.scala-ide.sdt.core/src/org/scalaide/core/internal/project/scopes/BuildScopeUnit.scala b/org.scala-ide.sdt.core/src/org/scalaide/core/internal/project/scopes/BuildScopeUnit.scala index 6cc88d6c76..02920c9650 100644 --- a/org.scala-ide.sdt.core/src/org/scalaide/core/internal/project/scopes/BuildScopeUnit.scala +++ b/org.scala-ide.sdt.core/src/org/scalaide/core/internal/project/scopes/BuildScopeUnit.scala @@ -93,7 +93,7 @@ private case class ScopeFilesToCompile(toCompile: Set[IFile] => Set[IFile], owni run = forever toCompile(owningProject.allSourceFiles) } - private def forever(sources: Set[IFile]): Set[IFile] = toCompile(sources) ++ resetJavaMarkers(getValidJavaSourcesOfThisScope) + private def forever(sources: Set[IFile]): Set[IFile] = toCompile(sources) ++ getValidJavaSourcesOfThisScope def apply(sources: Set[IFile]): Set[IFile] = run(sources) @@ -102,9 +102,4 @@ private case class ScopeFilesToCompile(toCompile: Set[IFile] => Set[IFile], owni toCompile(owningProject.allSourceFiles .filter { _.getLocation.getFileExtension == SdtConstants.JavaFileExtn.drop(Dot) }) } - - private def resetJavaMarkers(javaFiles: Set[IFile]): Set[IFile] = { - javaFiles.foreach { _.deleteMarkers(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER, true, IResource.DEPTH_INFINITE) } - javaFiles - } -} \ No newline at end of file +}