diff options
-rw-r--r-- | stage1/Stage1Lib.scala | 37 | ||||
-rw-r--r-- | stage2/BasicBuild.scala | 7 |
2 files changed, 43 insertions, 1 deletions
diff --git a/stage1/Stage1Lib.scala b/stage1/Stage1Lib.scala index c427b77..3a1fe45 100644 --- a/stage1/Stage1Lib.scala +++ b/stage1/Stage1Lib.scala @@ -118,6 +118,43 @@ class Stage1Lib( val logger: Logger ) extends BaseLib{ } } + def mainClasses(compileTarget : File, classLoader : ClassLoader): Seq[String] = { + val targetLength = compileTarget.toString.length + 1 // compile target and slash + + def className(file : File) : String = { + file.toString.dropRight(".class".length).drop(targetLength).replace(File.separator, ".") + } + + /* for packaged applications */ + def retrieveFiles(file: File): Seq[File] = { + file.listFiles.toSeq.map(currFile => { + if (currFile.isDirectory) retrieveFiles(currFile) + else Seq(currFile) + } + ).flatten + } + + def classesWithMain(target : File, classLoader : ClassLoader): Seq[File] = { + def hasMainClass(file : File) : Boolean = { + val name = className(file) + val inspectClass = classLoader.loadClass(name) + inspectClass.getDeclaredMethods().map(_.getName).contains("main") + } + + // FIXME: Check if argument list has exactly one element of type Array[String] + def isInnerClass(file : File) : Boolean = file.toString.contains("$") + val files = retrieveFiles(target) + + val classFiles = files.filter(file => file.toString.endsWith(".class") && !isInnerClass(file)).toSeq + + classFiles.filter(hasMainClass(_)) + } + + val hasMain = classesWithMain(compileTarget, classLoader) + + hasMain.map(className(_)) + } + implicit class ClassLoaderExtensions(classLoader: ClassLoader){ def canLoad(className: String) = { try{ diff --git a/stage2/BasicBuild.scala b/stage2/BasicBuild.scala index bcc3646..baa6d26 100644 --- a/stage2/BasicBuild.scala +++ b/stage2/BasicBuild.scala @@ -136,7 +136,12 @@ trait BaseBuild extends DependencyImplementation with BuildInterface with Trigge ) } - def runClass: String = "Main" + def runClass: String = lib.mainClasses ( compileTarget, classLoader(context.classLoaderCache) ) match { + case f if f.length == 1 => f.head + case f if f.length > 2 => System.err.println( " Multiple main classes defined in project." ); "None" + case _ => "Main" + } + def run: ExitCode = lib.runMainIfFound( runClass, context.args, classLoader(context.classLoaderCache) ) def clean = { |