cvogt / cbt

CBT - fun, fast, intuitive, compositional, statically checked builds written in Scala
Other
488 stars 60 forks source link

Existence of mains in a class with a parameterful constructor leads to cbt fail #585

Open buzden opened 6 years ago

buzden commented 6 years ago

Consider I have (accidentially or not) some class X which has def main(args: Array[String]): Unit. CBT considers this as one of the variants of possible entry points during cbt run unless the class is abstract.

This behaviour is not fatal but a little bit annoying when you accidentially have written class instead of object and everything works fine with cbt but does not work with other tools (e.g. running with pure scala runner). In the code it's written that it's done because of dottydoc.

The really strange behaviour of cbt is when you have a really strange class having both constructor parameters and def main, something like this:

class X(whatever: Int) {
  def main(args: Array[String]): Unit = ???
}

Having this leads to (guess what):

Exception in thread "main" java.lang.InstantiationException: X
        at java.lang.Class.newInstance(Class.java:427)
        at cbt.reflect.Module$class.typeStaticMethod(reflect.scala:168)
        ...
Caused by: java.lang.NoSuchMethodException: X.<init>()
        ...

So, generally, cbt's reflection sublibrary assumes that it works with classes having a constructor with empty parameters list when talking about static methods (typeStaticMethod(Method) function).

cvogt commented 6 years ago

fix in #587, let's keep this open to still add a test as described there. Probably by copying cbt/test/simple, adding the suggested classes and calling something like .mainMethods on the build and check it doesn't throw