aboutsummaryrefslogblamecommitdiff
path: root/compiler/test/dotty/tools/dotc/InterfaceEntryPointTest.scala
blob: e27b0f7b8ed9373f2eb458bb5a860f64d1f12517 (plain) (tree)
1
2
3
4
5
6

                  


                         
                   














                                                                                
                 
                                                                                   
                                                             
























                                                                                 

                           













                                                                 
package dotty
package tools.dotc

import org.junit.Test
import org.junit.Assert._
import interfaces._
import scala.collection.mutable.ListBuffer

/** Test that demonstrates how to use dotty-interfaces
 *
 *  This test requires:
 *  - dotty-interfaces to be present at compile-time
 *  - dotty-interfaces and dotty to be present at run-time
 *
 *  Since the ABI of dotty-interfaces is stable, this means that users can write
 *  code that works with multiple versions of dotty without recompilation.
 *
 *  @see [[OtherEntryPointsTest]]
 */
class InterfaceEntryPointTest {
  @Test def runCompilerFromInterface = {
    val sources =
      List("../tests/pos/HelloWorld.scala").map(p => new java.io.File(p).getPath())
    val args = sources ++ List("-d", "../out/", "-usejavacp")

    val mainClass = Class.forName("dotty.tools.dotc.Main")
    val process = mainClass.getMethod("process",
      classOf[Array[String]], classOf[SimpleReporter], classOf[CompilerCallback])

    val reporter = new CustomSimpleReporter
    val callback = new CustomCompilerCallback

    // Run the compiler by calling dotty.tools.dotc.Main.process
    process.invoke(null, args.toArray, reporter, callback)

    assertEquals("Number of errors", 0, reporter.errorCount)
    assertEquals("Number of warnings", 0, reporter.warningCount)
    assertEquals("Compiled sources", sources, callback.paths)
  }

  private class CustomSimpleReporter extends SimpleReporter {
    var errorCount = 0
    var warningCount = 0

    def report(diag: Diagnostic): Unit = {
      if (diag.level == Diagnostic.ERROR)
        errorCount += 1
      if (diag.level == Diagnostic.WARNING)
        warningCount += 1

      println(diag.message)
    }
  }

  private class CustomCompilerCallback extends CompilerCallback {
    private val pathsBuffer = new ListBuffer[String]
    def paths = pathsBuffer.toList

    override def onSourceCompiled(source: SourceFile): Unit = {
      if (source.jfile.isPresent)
        pathsBuffer += source.jfile.get.getPath
    }
  }
}