Skip to content

Commit

Permalink
Go: Handle Alias types by extracting the underlying types
Browse files Browse the repository at this point in the history
  • Loading branch information
mbg committed Sep 3, 2024
1 parent 9a61d4e commit 11aaf06
Showing 1 changed file with 10 additions and 0 deletions.
10 changes: 10 additions & 0 deletions go/extractor/extractor.go
Original file line number Diff line number Diff line change
Expand Up @@ -1507,9 +1507,18 @@ func extractSpec(tw *trap.Writer, spec ast.Spec, parent trap.Label, idx int) {
extractNodeLocation(tw, spec, lbl)
}

// If the given type is a type alias, this function resolves it to its underlying type.
func resolveTypeAlias(tp types.Type) types.Type {
if _, ok := tp.(*types.Alias); ok {
return tp.Underlying()
}
return tp
}

// extractType extracts type information for `tp` and returns its associated label;
// types are only extracted once, so the second time `extractType` is invoked it simply returns the label
func extractType(tw *trap.Writer, tp types.Type) trap.Label {
tp = resolveTypeAlias(tp)
lbl, exists := getTypeLabel(tw, tp)
if !exists {
var kind int
Expand Down Expand Up @@ -1666,6 +1675,7 @@ func extractType(tw *trap.Writer, tp types.Type) trap.Label {
// is constructed from their globally unique ID. This prevents cyclic type keys
// since type recursion in Go always goes through named types.
func getTypeLabel(tw *trap.Writer, tp types.Type) (trap.Label, bool) {
tp = resolveTypeAlias(tp)
lbl, exists := tw.Labeler.TypeLabels[tp]
if !exists {
switch tp := tp.(type) {
Expand Down

0 comments on commit 11aaf06

Please sign in to comment.