Skip to content

'class file is broken' error when extending Java static inner classes #2464

Closed
@scabug

Description

@scabug

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

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions