Skip to content

Commit

Permalink
Merge branch 'master' into zinc
Browse files Browse the repository at this point in the history
Conflicts:
      org.scala-ide.sdt.core.tests/src/org/scalaide/TestsSuite.scala
      org.scala-ide.sdt.core/src/org/scalaide/core/internal/builder/zinc/JavaEclipseCompiler.scala
  • Loading branch information
kiritsuku committed Sep 19, 2016
2 parents c1e9780 + 4021a0d commit 53aa3fc
Show file tree
Hide file tree
Showing 35 changed files with 710 additions and 251 deletions.
Expand Up @@ -40,6 +40,7 @@ import org.scalaide.core.sbtbuilder.OutputFoldersTest
import org.scalaide.core.sbtbuilder.ProjectDependenciesTest
import org.scalaide.core.sbtbuilder.SbtBuilderTest
import org.scalaide.core.sbtbuilder.ScalaCompilerClasspathTest
import org.scalaide.core.sbtbuilder.ScalacNotUnderstandJavaTest
import org.scalaide.core.sbtbuilder.ScalaJavaDepTest
import org.scalaide.core.sbtbuilder.ScalaJavaDepTicket_1000607Test
import org.scalaide.core.sbtbuilder.ScalaJavaDepWhenJavaIsWrongTest
Expand All @@ -64,6 +65,7 @@ import org.scalaide.ui.wizards.WizardTests
import org.scalaide.util.eclipse.RegionUtilsTest
import org.scalaide.util.internal.eclipse.TextSelectionTest
import org.scalaide.core.sbtbuilder.CompilerBridgeStoreTest
import org.scalaide.ui.internal.preferences.StringListMapperTest

@RunWith(classOf[Suite])
@Suite.SuiteClasses(
Expand Down Expand Up @@ -128,7 +130,9 @@ import org.scalaide.core.sbtbuilder.CompilerBridgeStoreTest
classOf[JavaDependsOnScalaBothAreOkTest],
classOf[ScopeCompileConfigurationTest],
classOf[OutlineModelTest],
classOf[StringListMapperTest],
classOf[NonScalaSourceErrorMarkersTest],
classOf[CompilerBridgeStoreTest]
classOf[CompilerBridgeStoreTest],
classOf[ScalacNotUnderstandJavaTest]
))
class TestsSuite
@@ -0,0 +1,58 @@
package org.scalaide.core
package sbtbuilder

import org.eclipse.core.resources.IFile
import org.eclipse.core.resources.IncrementalProjectBuilder
import org.eclipse.core.runtime.NullProgressMonitor
import org.junit.Assert._
import org.junit.BeforeClass
import org.junit.Test
import org.scalaide.core.testsetup.SDTTestUtils

object ScalacNotUnderstandJavaTest extends testsetup.TestProjectSetup("scalacnotunderstandjava") {
@BeforeClass def setup(): Unit = {
SDTTestUtils.enableAutoBuild(false)
}
}

class ScalacNotUnderstandJavaTest {
import ScalacNotUnderstandJavaTest._
import testsetup.SDTTestUtils._

@Test def shouldContinueJavaCompilationEvenWhenScalacDoesNotUnderstandJavaFile(): Unit = {
val NoErrors = 0
val JavaCannotConvertFromStringToInt = 1
cleanProject()

val SScalaCU = compilationUnit("test/S.scala")
val JJavaCU = compilationUnit("test/J.java")
def findProblems() = getProblemMarkers(JJavaCU, SScalaCU)

rebuild()
val problems0 = findProblems()
assertTrue("One build error expected, got: " + markersMessages(problems0), problems0.length == NoErrors)

val originalSScala = slurpAndClose(project.underlying.getFile("src/test/S.scala").getContents)
changeContentOfFile(SScalaCU.getResource().getAdapter(classOf[IFile]).asInstanceOf[IFile], changedSScala)
rebuild()
val problems1 = findProblems()
assertTrue("One build error expected, got: " + markersMessages(problems1), problems1.length == JavaCannotConvertFromStringToInt)

changeContentOfFile(SScalaCU.getResource().getAdapter(classOf[IFile]).asInstanceOf[IFile], originalSScala)
rebuild()
val problems2 = findProblems()
assertTrue("Build errors found: " + markersMessages(problems2), problems2.isEmpty)
}

private def rebuild(): Unit = {
project.underlying.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, new NullProgressMonitor)
}

lazy private val changedSScala = """
package test
class S {
def foo = "51"
}
"""
}
Expand Up @@ -59,8 +59,8 @@ class ProposalRelevanceCalculatorTest {
def favoritePackages =
""".*favorite.*""".r :: Nil

def preferedPackages =
""".*prefered.*""".r :: Nil
def preferredPackages =
""".*preferred.*""".r :: Nil

def unpopularPackages =
""".*unpopular.*""".r :: Nil
Expand All @@ -71,11 +71,11 @@ class ProposalRelevanceCalculatorTest {

makeSureThatJdtProposalsAreOrderedLike(cfg)(
"z.favorite" -> "A",
"y.prefered" -> "A",
"y.preferred" -> "A",
"x.unpopular" -> "A",
"w.shunned" -> "A",
"z.favorite" -> "Aaaa",
"y.prefered" -> "Aaaa",
"y.preferred" -> "Aaaa",
"x.unpopular" -> "Aaaa",
"w.shunned" -> "Aaaa")
}
Expand Down
@@ -0,0 +1,70 @@
package org.scalaide.ui.internal.preferences

import org.junit.Assert._
import org.junit.Test

class StringListMapperTest {
private def testWith(strs: String*): Unit = {
val encoded = StringListMapper.encode(strs)
val decoded = StringListMapper.decode(encoded)
assertEquals(s"Error related to encoded representation '$encoded'", strs, decoded)
}

private def expectExceptionOnDecode(str: String): Unit = {
try {
StringListMapper.decode(str)
throw new AssertionError(s"Expected IllegalArgumentException for input $str")
} catch {
case _: IllegalArgumentException => ()
}
}

@Test
def emptyList(): Unit = {
testWith()
}

@Test
def emptyString(): Unit = {
testWith("")
}

@Test
def singleString(): Unit = {
testWith("single")
testWith("0")
testWith("1")
}

@Test
def mulitpleStrings(): Unit = {
testWith("a", "b")
testWith("", "")
testWith("", "", "")
testWith("0", "0", "0")
testWith("", "", "", "a", "b", "abc")
testWith("0", "1", " ", "a", "b", "abc", "\n", "12340")
}

@Test
def withListOfEncodedLists(): Unit = {
testWith(
StringListMapper.encode(Seq()),
StringListMapper.encode(Seq("")),
StringListMapper.encode(Seq("", "1", "22")))
}

@Test
def noStackOverflow(): Unit = {
testWith(Seq.fill(10000)(""): _*)
}

@Test
def testWithIllegalInput(): Unit = {
expectExceptionOnDecode("1")
expectExceptionOnDecode("2|a")
expectExceptionOnDecode("1|1|2|1")
expectExceptionOnDecode("asdf3|||")
expectExceptionOnDecode("9|8|")
}
}
@@ -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.8"/>
<classpathentry kind="output" path="bin"/>
</classpath>
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>scalacnotunderstandjava</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,14 @@
package test;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(value=RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE_USE, ElementType.PARAMETER, ElementType.METHOD, ElementType.TYPE})
@interface ScalacDoesNotGetMe {}

class J<@ScalacDoesNotGetMe X> {
public int f = (new S()).foo();
}
@@ -0,0 +1,5 @@
package test

class S {
def foo = 51
}
9 changes: 9 additions & 0 deletions org.scala-ide.sdt.core/plugin.xml
Expand Up @@ -159,6 +159,12 @@
id="org.scalaide.ui.preferences.editor.autoedits"
name="Auto Edits">
</page>
<page
category="org.scalaide.ui.preferences.editor"
class="org.scalaide.ui.internal.preferences.CompletionPreferencePage"
id="org.scalaide.ui.preferences.editor.completions"
name="Completions">
</page>
</extension>

<extension point="org.eclipse.core.contenttype.contentTypes">
Expand Down Expand Up @@ -897,6 +903,9 @@
<initializer
class="org.scalaide.ui.internal.preferences.AutoEditsPreferenceInitializer">
</initializer>
<initializer
class="org.scalaide.ui.internal.preferences.CompletionPreferenceInitializer">
</initializer>
</extension>

<extension point="org.eclipse.core.expressions.propertyTesters">
Expand Down
2 changes: 1 addition & 1 deletion org.scala-ide.sdt.core/scala-ide-style-config.xml
Expand Up @@ -114,5 +114,5 @@
<check level="warning" class="org.scalastyle.scalariform.PublicMethodsHaveTypeChecker" enabled="false"/>
<check level="warning" class="org.scalastyle.file.NewLineAtEofChecker" enabled="false"/>
<check level="warning" class="org.scalastyle.scalariform.NotImplementedErrorUsage" enabled="false" />
<check level="error" class="org.scalastyle.scalariform.BlockImportChecker" enabled="true"/>
<check level="error" class="org.scalastyle.scalariform.BlockImportChecker" enabled="false"/>
</scalastyle>
Expand Up @@ -3,6 +3,7 @@ package org.scalaide.core.completion
import scala.tools.nsc.interactive.Global
import org.scalaide.logging.HasLogger
import scala.util.matching.Regex
import org.scalaide.ui.internal.preferences.CompletionPreferencePage

object ProposalRelevanceCalculator {
private final val MaxInternalRelevance = 1000
Expand All @@ -16,7 +17,7 @@ object ProposalRelevanceCalculator {
}
}

class ProposalRelevanceCalculator(cfg: ProposalRelevanceCfg = DefaultProposalRelevanceCfg) extends HasLogger {
class ProposalRelevanceCalculator(cfg: ProposalRelevanceCfg = CompletionPreferencePage.ProposalRelevanceCfg) extends HasLogger {
import ProposalRelevanceCalculator._

def forScala[CompilerT <: Global](pc: CompilerT)(prefix: String, name: String, sym: pc.Symbol, viaView: pc.Symbol, inherited: Option[Boolean]): Int = {
Expand Down Expand Up @@ -72,7 +73,7 @@ class ProposalRelevanceCalculator(cfg: ProposalRelevanceCfg = DefaultProposalRel

val bonus =
deltaForPrefix(3, cfg.favoritePackages) +
deltaForPrefix(1, cfg.preferedPackages)
deltaForPrefix(1, cfg.preferredPackages)

val penalty =
deltaForPrefix(3, cfg.shunnedPackages) +
Expand Down
Expand Up @@ -4,18 +4,22 @@ import scala.util.matching.Regex

trait ProposalRelevanceCfg {
def favoritePackages: Seq[Regex]
def preferedPackages: Seq[Regex]
def preferredPackages: Seq[Regex]

def unpopularPackages: Seq[Regex]
def shunnedPackages: Seq[Regex]

override def toString = {
s"ProposalRelevanceCfg[favoritePackages=$favoritePackages, preferredPackages=$preferredPackages,unpopularPackages=$unpopularPackages,shunnedPackages=$shunnedPackages]"
}
}

object DefaultProposalRelevanceCfg extends ProposalRelevanceCfg {
val favoritePackages =
"""scala\..*""".r ::
Nil

val preferedPackages =
val preferredPackages =
"""java\..*""".r ::
""".*\.scala.*""".r ::
"""akka\..*""".r ::
Expand Down
@@ -1,23 +1,25 @@
package org.scalaide.core.internal.builder

import scala.collection.mutable.HashSet
import java.{ util => ju }

import scala.collection.mutable.HashSet

import org.eclipse.core.resources.IFile
import org.eclipse.core.resources.IncrementalProjectBuilder
import org.eclipse.core.resources.IProject
import org.eclipse.core.resources.IResourceDelta
import org.eclipse.core.resources.IResourceDeltaVisitor
import org.eclipse.core.resources.IncrementalProjectBuilder
import org.eclipse.core.runtime.IProgressMonitor
import org.eclipse.core.runtime.SubMonitor
import org.eclipse.core.runtime.jobs.ISchedulingRule
import org.eclipse.jdt.internal.core.builder.JavaBuilder
import org.eclipse.jdt.internal.core.builder.State
import org.scalaide.core.IScalaPlugin
import org.scalaide.core.SdtConstants
import org.scalaide.core.internal.jdt.util.JDTUtils
import org.scalaide.logging.HasLogger
import org.scalaide.util.eclipse.FileUtils
import org.scalaide.util.internal.ReflectionUtils
import org.scalaide.logging.HasLogger
import org.eclipse.core.runtime.jobs.ISchedulingRule
import org.scalaide.core.internal.jdt.util.JDTUtils
import org.scalaide.core.SdtConstants
import org.scalaide.core.IScalaPlugin

class ScalaBuilder extends IncrementalProjectBuilder with JDTBuilderFacade with HasLogger {

Expand All @@ -38,7 +40,7 @@ class ScalaBuilder extends IncrementalProjectBuilder with JDTBuilderFacade with
}

override def build(kind: Int, ignored: ju.Map[String, String], monitor: IProgressMonitor): Array[IProject] = {
import IncrementalProjectBuilder._
import org.eclipse.core.resources.IncrementalProjectBuilder._

val project = IScalaPlugin().getScalaProject(this.project)

Expand All @@ -62,7 +64,7 @@ class ScalaBuilder extends IncrementalProjectBuilder with JDTBuilderFacade with
val removed0 = new HashSet[IFile]

getDelta(project.underlying).accept(new IResourceDeltaVisitor {
def visit(delta: IResourceDelta) = {
override def visit(delta: IResourceDelta) = {
delta.getResource match {
case file: IFile if FileUtils.isBuildable(file) && project.sourceFolders.exists(_.isPrefixOf(file.getLocation)) =>
delta.getKind match {
Expand All @@ -86,7 +88,7 @@ class ScalaBuilder extends IncrementalProjectBuilder with JDTBuilderFacade with

if (project.directDependencies.exists(hasChanges)) {
// reset presentation compilers if a dependency has been rebuilt
logger.debug("Resetting presentation compiler for %s due to dependent project change".format(project.underlying.getName()))
logger.debug(s"Restart presentation compiler for ${project.underlying.getName} due to dependent project change.")
project.presentationCompiler.askRestart()

// in theory need to be able to identify the exact dependencies
Expand All @@ -111,10 +113,10 @@ class ScalaBuilder extends IncrementalProjectBuilder with JDTBuilderFacade with

val depends = project.transitiveDependencies

/** The Java builder has to be run for copying resources (non-source files) to the output directory.
/* The Java builder has to be run for copying resources (non-source files) to the output directory.
*
* We need to run it when no Java sources have been modified
* (since the SBT builder automatically calls the JDT builder internally if there are modified Java sources).
* We need to run it when no Java sources have been modified
* (since the SBT builder automatically calls the JDT builder internally if there are modified Java sources).
*/
def shouldRunJavaBuilder: Boolean = {
(needToCopyResources && !addedOrUpdated.exists(_.getName().endsWith(SdtConstants.JavaFileExtn)))
Expand Down

0 comments on commit 53aa3fc

Please sign in to comment.