Closed
Description
The Scala compiler gives an erroneous 'class file broken' error when trying to use classes that inherit from static Java inner classes. This is particularly a problem when integrating with Java code generated by the [http://incubator.apache.org/thrift/ Apache Thrift] compiler. Below are the files and steps needed to reproduce the problem.
!ClassOne.java:
public class ClassOne {
public interface Iface {
public void func1();
}
public static class Child implements Iface {
public void func1() {return ;}
}
}
!ClassTwo.java:
public class ClassTwo {
public interface Iface extends ClassOne.Iface {
public void func2();
}
public static class Child extends ClassOne.Child implements Iface {
public void func2() {return ;}
}
}
!ScalaClasses.scala:
class ScalaClassOne extends ClassTwo.Child {
def func4() = {
func1
func2
}
}
class ScalaClassTwo extends ClassTwo.Iface {
def func1() = null
def func2() = null
}
Bug.scala:
object Test {
val c2 = new ScalaClassTwo
val c1 = new ScalaClassOne
}
And the following compilation sequence:
javac *.java
scalac ScalaClasses.scala
scalac Bug.scala
The compilation of Bug.scala will fail with the following error on 2.7.5:
error: error while loading ScalaClassOne, class file './ScalaClassOne.class' is broken
(package <empty> does not have a member ClassThree$$Child)
User.scala:3: error: ScalaClassOne does not have a constructor
val c1 = new ScalaClassOne
^
two errors found
And this error on 2.8.0-b20090919135825:
scala.tools.nsc.FatalError: package <empty> does not have a member ClassTwo$$Child
at scala.tools.nsc.symtab.Definitions$$definitions$$.getMember(Definitions.scala:406)
at scala.tools.nsc.symtab.classfile.ClassfileParser.lookupClass$$1(ClassfileParser.scala:382)
at scala.tools.nsc.symtab.classfile.ClassfileParser.classNameToSymbol(ClassfileParser.scala:394)
at scala.tools.nsc.symtab.classfile.ClassfileParser$$ConstantPool.getClassSymbol(ClassfileParser.scala:180)
at scala.tools.nsc.symtab.classfile.ClassfileParser$$ConstantPool.getSuperClass(ClassfileParser.scala:317)
at scala.tools.nsc.symtab.classfile.ClassfileParser.parseClass(ClassfileParser.scala:415)
at scala.tools.nsc.symtab.classfile.ClassfileParser.parse(ClassfileParser.scala:92)
at scala.tools.nsc.symtab.SymbolLoaders$$ClassfileLoader$$$$anonfun$$doComplete$$4.apply(SymbolLoaders.scala:291)
at scala.tools.nsc.symtab.SymbolLoaders$$ClassfileLoader$$$$anonfun$$doComplete$$4.apply(SymbolLoaders.scala:291)
at scala.tools.nsc.symtab.SymbolLoaders.completeClassfile(SymbolLoaders.scala:278)
at scala.tools.nsc.symtab.SymbolLoaders$$ClassfileLoader.doComplete(SymbolLoaders.scala:290)
at scala.tools.nsc.symtab.SymbolLoaders$$SymbolLoader.complete(SymbolLoaders.scala:55)
at scala.tools.nsc.symtab.SymbolLoaders$$SymbolLoader.load(SymbolLoaders.scala:75)
at scala.tools.nsc.symtab.Symbols$$Symbol.exists(Symbols.scala:600)
at scala.tools.nsc.typechecker.Typers$$Typer.qualifies$$1(Typers.scala:3316)
at scala.tools.nsc.typechecker.Typers$$Typer.typedIdent$$1(Typers.scala:3332)
at scala.tools.nsc.typechecker.Typers$$Typer.typed1(Typers.scala:3697)
at scala.tools.nsc.typechecker.Typers$$Typer.typed(Typers.scala:3768)
at scala.tools.nsc.typechecker.Typers$$Typer.typedTypeConstructor(Typers.scala:3866)
at scala.tools.nsc.typechecker.Typers$$Typer.typedTypeConstructor(Typers.scala:3874)
at scala.tools.nsc.typechecker.Typers$$Typer.typedNew$$1(Typers.scala:2854)
at scala.tools.nsc.typechecker.Typers$$Typer.typed1(Typers.scala:3599)
at scala.tools.nsc.typechecker.Typers$$Typer.typed(Typers.scala:3768)
at scala.tools.nsc.typechecker.Typers$$Typer.typedQualifier(Typers.scala:3835)
at scala.tools.nsc.typechecker.Typers$$Typer.typed1(Typers.scala:3685)
at scala.tools.nsc.typechecker.Typers$$Typer.typed(Typers.scala:3768)
at scala.tools.nsc.typechecker.Typers$$Typer$$$$anonfun$$typedApply$$1$$1.apply(Typers.scala:3045)
at scala.tools.nsc.typechecker.Typers$$Typer$$$$anonfun$$typedApply$$1$$1.apply(Typers.scala:3045)
at scala.tools.nsc.typechecker.Typers$$Typer.silent(Typers.scala:698)
at scala.tools.nsc.typechecker.Typers$$Typer.typedApply$$1(Typers.scala:3045)
at scala.tools.nsc.typechecker.Typers$$Typer.typed1(Typers.scala:3663)
at scala.tools.nsc.typechecker.Typers$$Typer.typed(Typers.scala:3768)
at scala.tools.nsc.typechecker.Typers$$Typer.typed(Typers.scala:3826)
at scala.tools.nsc.typechecker.Typers$$Typer.computeType(Typers.scala:3877)
at scala.tools.nsc.typechecker.Namers$$Namer.typeSig(Namers.scala:1141)
at scala.tools.nsc.typechecker.Namers$$Namer$$$$anonfun$$typeCompleter$$1.apply(Namers.scala:509)
at scala.tools.nsc.typechecker.Namers$$Namer$$$$anonfun$$typeCompleter$$1.apply(Namers.scala:507)
at scala.tools.nsc.typechecker.Namers$$$$anon$$1.complete(Namers.scala:1288)
at scala.tools.nsc.symtab.Symbols$$Symbol.info(Symbols.scala:728)
at scala.tools.nsc.symtab.Symbols$$Symbol.initialize(Symbols.scala:837)
at scala.tools.nsc.symtab.Symbols$$Symbol.annotations(Symbols.scala:111)
at scala.tools.nsc.typechecker.Typers$$Typer.addGetterSetter(Typers.scala:1277)
at scala.tools.nsc.typechecker.Typers$$Typer$$$$anonfun$$10.apply(Typers.scala:1385)
at scala.tools.nsc.typechecker.Typers$$Typer$$$$anonfun$$10.apply(Typers.scala:1385)
at scala.collection.TraversableLike$$$$anonfun$$flatMap$$1.apply(TraversableLike.scala:167)
at scala.collection.TraversableLike$$$$anonfun$$flatMap$$1.apply(TraversableLike.scala:167)
at scala.collection.LinearSequenceLike$$class.foreach(LinearSequenceLike.scala:85)
at scala.collection.immutable.List.foreach(List.scala:27)
at scala.collection.TraversableLike$$class.flatMap(TraversableLike.scala:167)
at scala.collection.immutable.List.flatMap(List.scala:27)
at scala.tools.nsc.typechecker.Typers$$Typer.typedTemplate(Typers.scala:1385)
at scala.tools.nsc.typechecker.Typers$$Typer.typedModuleDef(Typers.scala:1256)
at scala.tools.nsc.typechecker.Typers$$Typer.typed1(Typers.scala:3498)
at scala.tools.nsc.typechecker.Typers$$Typer.typed(Typers.scala:3768)
at scala.tools.nsc.typechecker.Typers$$Typer.typed(Typers.scala:3813)
at scala.tools.nsc.typechecker.Typers$$Typer.typedStat$$1(Typers.scala:1815)
at scala.tools.nsc.typechecker.Typers$$Typer$$$$anonfun$$20.apply(Typers.scala:1872)
at scala.tools.nsc.typechecker.Typers$$Typer$$$$anonfun$$20.apply(Typers.scala:1872)
at scala.collection.immutable.List.loop$$2(List.scala:123)
at scala.collection.immutable.List.mapConserve(List.scala:140)
at scala.tools.nsc.typechecker.Typers$$Typer.typedStats(Typers.scala:1872)
at scala.tools.nsc.typechecker.Typers$$Typer.typed1(Typers.scala:3491)
at scala.tools.nsc.typechecker.Typers$$Typer.typed(Typers.scala:3768)
at scala.tools.nsc.typechecker.Typers$$Typer.typed(Typers.scala:3813)
at scala.tools.nsc.typechecker.Analyzer$$typerFactory$$$$anon$$2.apply(Analyzer.scala:57)
at scala.tools.nsc.Global$$GlobalPhase.applyPhase(Global.scala:329)
at scala.tools.nsc.typechecker.Analyzer$$typerFactory$$$$anon$$2$$$$anonfun$$run$$1.apply(Analyzer.scala:51)
at scala.tools.nsc.typechecker.Analyzer$$typerFactory$$$$anon$$2$$$$anonfun$$run$$1.apply(Analyzer.scala:51)
at scala.collection.Iterator$$class.foreach(Iterator.scala:525)
at scala.collection.mutable.ListBuffer$$$$anon$$1.foreach(ListBuffer.scala:281)
at scala.tools.nsc.typechecker.Analyzer$$typerFactory$$$$anon$$2.run(Analyzer.scala:51)
at scala.tools.nsc.Global$$Run.compileSources(Global.scala:799)
at scala.tools.nsc.Global$$Run.compile(Global.scala:882)
at scala.tools.nsc.Main$$.process(Main.scala:91)
at scala.tools.nsc.Main$$.main(Main.scala:105)
at scala.tools.nsc.Main.main(Main.scala)
error: fatal error: package <empty> does not have a member ClassTwo$$Child
make: *** [all] Error 1