@@ -24,7 +24,9 @@ import (
2424
2525// JavaTraceInterface generates a suitable interface capturing the given schema,
2626// as outlined in the source map.
27- func JavaTraceInterface (filename string , pkgname string , binfiles []binfile.BinaryFile ) (string , error ) {
27+ func JavaTraceInterface (filename string , pkgname string , super string , isRoot bool ,
28+ binfiles []binfile.BinaryFile ) (string , error ) {
29+ //
2830 var root corset.SourceModule
2931 // Intersect roots to determine set of common functionality.
3032 for i , bf := range binfiles {
@@ -38,10 +40,12 @@ func JavaTraceInterface(filename string, pkgname string, binfiles []binfile.Bina
3840 }
3941 }
4042 // Finally, generate the interface
41- return generateInterface (filename , pkgname , root )
43+ return generateInterface (filename , pkgname , super , isRoot , root )
4244}
4345
44- func generateInterface (filename string , pkgname string , root corset.SourceModule ) (string , error ) {
46+ func generateInterface (filename string , pkgname string , super string , isRoot bool ,
47+ root corset.SourceModule ) (string , error ) {
48+ //
4549 var builder strings.Builder
4650 // Extract base of filename
4751 basename := filepath .Base (filename )
@@ -53,7 +57,7 @@ func generateInterface(filename string, pkgname string, root corset.SourceModule
5357 classname := strings .TrimSuffix (basename , ".java" )
5458 // begin generation
5559 generateInterfaceHeader (pkgname , & builder )
56- generateInterfaceContents (classname , root , indentBuilder {0 , & builder })
60+ generateInterfaceContents (classname , super , isRoot , root , indentBuilder {0 , & builder })
5761
5862 return builder .String (), nil
5963}
@@ -71,8 +75,17 @@ func generateInterfaceHeader(pkgname string, builder *strings.Builder) {
7175 builder .WriteString (" */\n " )
7276}
7377
74- func generateInterfaceContents (className string , mod corset.SourceModule , builder indentBuilder ) {
75- builder .WriteIndentedString ("public interface " , className , " {\n " )
78+ func generateInterfaceContents (className string , super string , isRoot bool , mod corset.SourceModule ,
79+ builder indentBuilder ) {
80+ //
81+ builder .WriteIndentedString ("public interface " , className )
82+ //
83+ if super != "" {
84+ builder .WriteString (" extends " )
85+ builder .WriteString (super )
86+ }
87+ //
88+ builder .WriteString (" {\n " )
7689 //
7790 generateInterfaceConstants (mod .Constants , builder .Indent ())
7891 generateInterfaceSubmoduleAccessors (mod .Submodules , builder .Indent ())
@@ -82,20 +95,34 @@ func generateInterfaceContents(className string, mod corset.SourceModule, builde
8295 // Generate any submodules
8396 for _ , submod := range mod .Submodules {
8497 if ! submod .Virtual {
85- generateInterfaceContents (toPascalCase (submod .Name ), submod , builder .Indent ())
98+ subclass , subinterface := determineSubNames (submod .Name , super )
99+ generateInterfaceContents (subclass , subinterface , false , submod , builder .Indent ())
86100 } else {
87101 generateInterfaceColumnSetters (className , submod , builder .Indent ())
88102 }
89103 }
90104 //
91105 if mod .Name == "" {
92- builder .WriteString (javaColumnHeader )
106+ if isRoot {
107+ builder .WriteString (javaColumnHeader )
108+ }
109+ //
93110 builder .WriteString (javaAddMetadataSignature )
94111 builder .WriteString (javaOpenSignature )
95112 }
96113 //
97114 builder .WriteIndentedString ("}\n " )
98115}
116+
117+ func determineSubNames (modName , superName string ) (string , string ) {
118+ modName = toPascalCase (modName )
119+ if superName != "" {
120+ superName = fmt .Sprintf ("%s.%s" , superName , modName )
121+ }
122+
123+ return modName , superName
124+ }
125+
99126func generateInterfaceSubmoduleAccessors (submodules []corset.SourceModule , builder indentBuilder ) {
100127 first := true
101128 //
0 commit comments