Skip to content

Commit 3a876cd

Browse files
authored
feat: support interface inheritance (#914)
support interface inheritance This puts in place a simple modification to enable inheritance of interfaces.
1 parent d90c9d8 commit 3a876cd

File tree

3 files changed

+40
-12
lines changed

3 files changed

+40
-12
lines changed

pkg/cmd/generate.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ var generateCmd = &cobra.Command{
4848
filename := GetString(cmd, "output")
4949
pkgname := GetString(cmd, "package")
5050
extends := GetString(cmd, "extend")
51+
root := GetFlag(cmd, "root")
5152
//
5253
if inteface := GetString(cmd, "interface"); inteface != "" {
5354
genInterface = true
@@ -57,7 +58,7 @@ var generateCmd = &cobra.Command{
5758
binfiles = readConstraintSets(corsetConfig, asmConfig, args)
5859
//
5960
if genInterface {
60-
source, err = generate.JavaTraceInterface(filename, pkgname, binfiles)
61+
source, err = generate.JavaTraceInterface(filename, pkgname, extends, root, binfiles)
6162
} else {
6263
for _, bf := range binfiles {
6364
// NOTE: assume defensive padding is enabled.
@@ -109,6 +110,7 @@ func init() {
109110
rootCmd.AddCommand(generateCmd)
110111
generateCmd.Flags().StringP("output", "o", "Trace.java", "specify output file.")
111112
generateCmd.Flags().StringP("interface", "i", "", "generate interface file.")
112-
generateCmd.Flags().StringP("extend", "e", "Trace", "specify interface to extend or implement.")
113+
generateCmd.Flags().StringP("extend", "e", "", "specify interface to extend or implement.")
113114
generateCmd.Flags().StringP("package", "p", "", "specify Java package.")
115+
generateCmd.Flags().Bool("root", false, "specify root class or interface.")
114116
}

pkg/cmd/generate/class.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,7 @@ func generateClassContents(className string, super string, mod corset.SourceModu
126126
// Generate any submodules
127127
for _, submod := range mod.Submodules {
128128
if !submod.Virtual {
129-
name := toPascalCase(submod.Name)
130-
superSub := fmt.Sprintf("%s.%s", super, name)
129+
name, superSub := determineSubNames(submod.Name, super)
131130
generateClassContents(name, superSub, submod, metadata, spillage, hirSchema, visible, builder.Indent())
132131
} else {
133132
generateJavaModuleColumnSetters(className, submod, hirSchema, builder.Indent())

pkg/cmd/generate/interface.go

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
99126
func generateInterfaceSubmoduleAccessors(submodules []corset.SourceModule, builder indentBuilder) {
100127
first := true
101128
//

0 commit comments

Comments
 (0)