You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@beam.apache.org by lo...@apache.org on 2020/09/08 16:24:36 UTC

[beam] 01/01: [BEAM-3612] Support use of non map derived types.

This is an automated email from the ASF dual-hosted git repository.

lostluck pushed a commit to branch lostluck-gen-1
in repository https://gitbox.apache.org/repos/asf/beam.git

commit d77f13c24cdbc437602685bf88e4886c384d927a
Author: Robert Burke <lo...@users.noreply.github.com>
AuthorDate: Tue Sep 8 09:24:05 2020 -0700

    [BEAM-3612] Support use of non map derived types.
    
    Recursively unwrap slice and array types, in addition to pointer types when extracting base types to register.
---
 sdks/go/pkg/beam/util/starcgenx/starcgenx.go | 34 +++++++++++++++++++++-------
 1 file changed, 26 insertions(+), 8 deletions(-)

diff --git a/sdks/go/pkg/beam/util/starcgenx/starcgenx.go b/sdks/go/pkg/beam/util/starcgenx/starcgenx.go
index 8961761..21deee8 100644
--- a/sdks/go/pkg/beam/util/starcgenx/starcgenx.go
+++ b/sdks/go/pkg/beam/util/starcgenx/starcgenx.go
@@ -328,18 +328,36 @@ func (e *Extractor) extractFromSignature(sig *types.Signature) {
 	e.extractFromTuple(sig.Results())
 }
 
+// extractFromContainer recurses through nested non-map container types to a non-derived
+// element type.
+func (e *Extractor) extractFromContainer(t types.Type) types.Type {
+	// Container types need to be iteratively unwrapped until we're at the base type,
+	// so we can get the import if necessary.
+	for {
+		if s, ok := t.(*types.Slice); ok {
+			t = s.Elem()
+			continue
+		}
+
+		if p, ok := t.(*types.Pointer); ok {
+			t = p.Elem()
+			continue
+		}
+
+		if a, ok := t.(*types.Array); ok {
+			t = a.Elem()
+			continue
+		}
+
+		return t
+	}
+}
+
 func (e *Extractor) extractFromTuple(tuple *types.Tuple) {
 	for i := 0; i < tuple.Len(); i++ {
 		s := tuple.At(i) // *types.Var
 
-		// Pointer types need to be iteratively unwrapped until we're at the base type,
-		// so we can get the import if necessary.
-		t := s.Type()
-		p, ok := t.(*types.Pointer)
-		for ok {
-			t = p.Elem()
-			p, ok = t.(*types.Pointer)
-		}
+		t := e.extractFromContainer(s.Type())
 		// Here's where we ensure we register new imports.
 		if t, ok := t.(*types.Named); ok {
 			if pkg := t.Obj().Pkg(); pkg != nil {