internal/impl: refactor makeStructInfo

Simplify the implementation of makeStructInfo by checking the
names of the internal fields in a switch statement.
Also, add "weakFields" as the unexported name for weak fields
in preparation for actually unexporting it.

Change-Id: Ide970a39e9caa5a24bc288ba3e3a0d223a6bfcb6
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/207057
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/internal/impl/message.go b/internal/impl/message.go
index fe8f039..786f434 100644
--- a/internal/impl/message.go
+++ b/internal/impl/message.go
@@ -132,46 +132,38 @@
 		oneofWrappersByNumber: map[pref.FieldNumber]reflect.Type{},
 	}
 
-	if f, _ := t.FieldByName("sizeCache"); f.Type == sizecacheType {
-		si.sizecacheOffset = offsetOf(f, mi.Exporter)
-	}
-	if f, _ := t.FieldByName("XXX_sizecache"); f.Type == sizecacheType {
-		si.sizecacheOffset = offsetOf(f, mi.Exporter)
-	}
-	if f, _ := t.FieldByName("XXX_weak"); f.Type == weakFieldsType {
-		si.weakOffset = offsetOf(f, mi.Exporter)
-	}
-	if f, _ := t.FieldByName("unknownFields"); f.Type == unknownFieldsType {
-		si.unknownOffset = offsetOf(f, mi.Exporter)
-	}
-	if f, _ := t.FieldByName("XXX_unrecognized"); f.Type == unknownFieldsType {
-		si.unknownOffset = offsetOf(f, mi.Exporter)
-	}
-	if f, _ := t.FieldByName("extensionFields"); f.Type == extensionFieldsType {
-		si.extensionOffset = offsetOf(f, mi.Exporter)
-	}
-	if f, _ := t.FieldByName("XXX_InternalExtensions"); f.Type == extensionFieldsType {
-		si.extensionOffset = offsetOf(f, mi.Exporter)
-	}
-	if f, _ := t.FieldByName("XXX_extensions"); f.Type == extensionFieldsType {
-		si.extensionOffset = offsetOf(f, mi.Exporter)
-	}
-
-	// Generate a mapping of field numbers and names to Go struct field or type.
 fieldLoop:
 	for i := 0; i < t.NumField(); i++ {
-		f := t.Field(i)
-		for _, s := range strings.Split(f.Tag.Get("protobuf"), ",") {
-			if len(s) > 0 && strings.Trim(s, "0123456789") == "" {
-				n, _ := strconv.ParseUint(s, 10, 64)
-				si.fieldsByNumber[pref.FieldNumber(n)] = f
+		switch f := t.Field(i); f.Name {
+		case "sizeCache", "XXX_sizecache":
+			if f.Type == sizecacheType {
+				si.sizecacheOffset = offsetOf(f, mi.Exporter)
+			}
+		case "weakFields", "XXX_weak":
+			if f.Type == weakFieldsType {
+				si.weakOffset = offsetOf(f, mi.Exporter)
+			}
+		case "unknownFields", "XXX_unrecognized":
+			if f.Type == unknownFieldsType {
+				si.unknownOffset = offsetOf(f, mi.Exporter)
+			}
+		case "extensionFields", "XXX_InternalExtensions", "XXX_extensions":
+			if f.Type == extensionFieldsType {
+				si.extensionOffset = offsetOf(f, mi.Exporter)
+			}
+		default:
+			for _, s := range strings.Split(f.Tag.Get("protobuf"), ",") {
+				if len(s) > 0 && strings.Trim(s, "0123456789") == "" {
+					n, _ := strconv.ParseUint(s, 10, 64)
+					si.fieldsByNumber[pref.FieldNumber(n)] = f
+					continue fieldLoop
+				}
+			}
+			if s := f.Tag.Get("protobuf_oneof"); len(s) > 0 {
+				si.oneofsByName[pref.Name(s)] = f
 				continue fieldLoop
 			}
 		}
-		if s := f.Tag.Get("protobuf_oneof"); len(s) > 0 {
-			si.oneofsByName[pref.Name(s)] = f
-			continue fieldLoop
-		}
 	}
 
 	// Derive a mapping of oneof wrappers to fields.