Skip to content

Commit

Permalink
Fix for #1002486
Browse files Browse the repository at this point in the history
Solves problem with not compiled java files when they depend on scala
files. Additionally there was a problem of disappearing error markers.

Fix #1002486
  • Loading branch information
wpopielarski committed Jul 21, 2015
1 parent 32e220e commit fbef29a
Show file tree
Hide file tree
Showing 13 changed files with 221 additions and 10 deletions.
Expand Up @@ -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
Expand Down Expand Up @@ -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
@@ -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 {
}
"""
}
@@ -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 = {}
}
"""
}
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.scala-ide.sdt.launching.SCALA_CONTAINER"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
<classpathentry kind="output" path="bin"/>
</classpath>
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>javaDependsOnScala</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.scala-ide.sdt.core.scalabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.scala-ide.sdt.core.scalanature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>
@@ -0,0 +1,5 @@
package main

abstract class A {
def foo(s: String): Unit //= {}
}
@@ -0,0 +1,5 @@
package main;

public class B extends A {
}

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.scala-ide.sdt.launching.SCALA_CONTAINER"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
<classpathentry kind="output" path="bin"/>
</classpath>
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>javaDependsOnScalaBothAreOk</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.scala-ide.sdt.core.scalabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.scala-ide.sdt.core.scalanature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>
@@ -0,0 +1,5 @@
package main

abstract class A {
def foo(s: String): Unit
}
@@ -0,0 +1,5 @@
package main;

public class B {
}

Expand Up @@ -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

Expand Down Expand Up @@ -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)
Expand Down
Expand Up @@ -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)

Expand All @@ -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
}
}
}

0 comments on commit fbef29a

Please sign in to comment.