cmd/protoc-gen-go: generate package documentation for well-known types

Change-Id: Ia079805e24d3490301355e09693255b157cabaed
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/239167
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/cmd/protoc-gen-go/internal_gengo/main.go b/cmd/protoc-gen-go/internal_gengo/main.go
index 40cb614..b2e3930 100644
--- a/cmd/protoc-gen-go/internal_gengo/main.go
+++ b/cmd/protoc-gen-go/internal_gengo/main.go
@@ -75,7 +75,9 @@
 	genStandaloneComments(g, f, int32(genid.FileDescriptorProto_Syntax_field_number))
 	genGeneratedHeader(gen, g, f)
 	genStandaloneComments(g, f, int32(genid.FileDescriptorProto_Package_field_number))
-	g.P("package ", f.GoPackageName)
+
+	packageDoc := genPackageKnownComment(f)
+	g.P(packageDoc, "package ", f.GoPackageName)
 	g.P()
 
 	// Emit a static check that enforces a minimum version of the proto package.
diff --git a/cmd/protoc-gen-go/internal_gengo/well_known_types.go b/cmd/protoc-gen-go/internal_gengo/well_known_types.go
index 7f6ca2c..9a1b7bd 100644
--- a/cmd/protoc-gen-go/internal_gengo/well_known_types.go
+++ b/cmd/protoc-gen-go/internal_gengo/well_known_types.go
@@ -16,6 +16,325 @@
 // in order to support specialized build systems like Bazel that always generate
 // dynamically from the source .proto files.
 
+func genPackageKnownComment(f *fileInfo) protogen.Comments {
+	switch f.Desc.Path() {
+	case genid.File_google_protobuf_any_proto:
+		return ` Package anypb contains generated types for ` + genid.File_google_protobuf_any_proto + `.
+
+ The Any message is a dynamic representation of any other message value.
+ It is functionally a tuple of the full name of the remote message type and
+ the serialized bytes of the remote message value.
+
+
+ Constructing an Any
+
+ An Any message containing another message value is constructed using New:
+
+	any, err := anypb.New(m)
+	if err != nil {
+		... // handle error
+	}
+	... // make use of any
+
+
+ Unmarshaling an Any
+
+ With a populated Any message, the underlying message can be serialized into
+ a remote concrete message value in a few ways.
+
+ If the exact concrete type is known, then a new (or pre-existing) instance
+ of that message can be passed to the UnmarshalTo method:
+
+	m := new(foopb.MyMessage)
+	if err := any.UnmarshalTo(m); err != nil {
+		... // handle error
+	}
+	... // make use of m
+
+ If the exact concrete type is not known, then the UnmarshalNew method can be
+ used to unmarshal the contents into a new instance of the remote message type:
+
+	m, err := any.UnmarshalNew()
+	if err != nil {
+		... // handle error
+	}
+	... // make use of m
+
+ UnmarshalNew uses the global type registry to resolve the message type and
+ construct a new instance of that message to unmarshal into. In order for a
+ message type to appear in the global registry, the Go type representing that
+ protobuf message type must be linked into the Go binary. For messages
+ generated by protoc-gen-go, this is achieved through an import of the
+ generated Go package representing a .proto file.
+
+ A common pattern with UnmarshalNew is to use a type switch with the resulting
+ proto.Message value:
+
+	switch m := m.(type) {
+	case *foopb.MyMessage:
+		... // make use of m as a *foopb.MyMessage
+	case *barpb.OtherMessage:
+		... // make use of m as a *barpb.OtherMessage
+	case *bazpb.SomeMessage:
+		... // make use of m as a *bazpb.SomeMessage
+	}
+
+ This pattern ensures that the generated packages containing the message types
+ listed in the case clauses are linked into the Go binary and therefore also
+ registered in the global registry.
+
+
+ Type checking an Any
+
+ In order to type check whether an Any message represents some other message,
+ then use the MessageIs method:
+
+	if any.MessageIs((*foopb.MyMessage)(nil)) {
+		... // make use of any, knowing that it contains a foopb.MyMessage
+	}
+
+ The MessageIs method can also be used with an allocated instance of the target
+ message type if the intention is to unmarshal into it if the type matches:
+
+	m := new(foopb.MyMessage)
+	if any.MessageIs(m) {
+		if err := any.UnmarshalTo(m); err != nil {
+			... // handle error
+		}
+		... // make use of m
+	}
+
+`
+	case genid.File_google_protobuf_timestamp_proto:
+		return ` Package timestamppb contains generated types for ` + genid.File_google_protobuf_timestamp_proto + `.
+
+ The Timestamp message represents a timestamp,
+ an instant in time since the Unix epoch (January 1st, 1970).
+
+
+ Conversion to a Go Time
+
+ The AsTime method can be used to convert a Timestamp message to a
+ standard Go time.Time value in UTC:
+
+	t := ts.AsTime()
+	... // make use of t as a time.Time
+
+ Converting to a time.Time is a common operation so that the extensive
+ set of time-based operations provided by the time package can be leveraged.
+ See https://golang.org/pkg/time for more information.
+
+ The AsTime method performs the conversion on a best-effort basis. Timestamps
+ with denormal values (e.g., nanoseconds beyond 0 and 99999999, inclusive)
+ are normalized during the conversion to a time.Time. To manually check for
+ invalid Timestamps per the documented limitations in timestamp.proto,
+ additionally call the CheckValid method:
+
+	if err := ts.CheckValid(); err != nil {
+		... // handle error
+	}
+
+
+ Conversion from a Go Time
+
+ The timestamppb.New function can be used to construct a Timestamp message
+ from a standard Go time.Time value:
+
+	ts := timestamppb.New(t)
+	... // make use of ts as a *timestamppb.Timestamp
+
+ In order to construct a Timestamp representing the current time, use Now:
+
+	ts := timestamppb.Now()
+	... // make use of ts as a *timestamppb.Timestamp
+
+`
+	case genid.File_google_protobuf_duration_proto:
+		return ` Package durationpb contains generated types for ` + genid.File_google_protobuf_duration_proto + `.
+
+ The Duration message represents a signed span of time.
+
+
+ Conversion to a Go Duration
+
+ The AsDuration method can be used to convert a Duration message to a
+ standard Go time.Duration value:
+
+	d := dur.AsDuration()
+	... // make use of d as a time.Duration
+
+ Converting to a time.Duration is a common operation so that the extensive
+ set of time-based operations provided by the time package can be leveraged.
+ See https://golang.org/pkg/time for more information.
+
+ The AsDuration method performs the conversion on a best-effort basis.
+ Durations with denormal values (e.g., nanoseconds beyond -99999999 and
+ +99999999, inclusive; or seconds and nanoseconds with opposite signs)
+ are normalized during the conversion to a time.Duration. To manually check for
+ invalid Duration per the documented limitations in duration.proto,
+ additionally call the CheckValid method:
+
+	if err := dur.CheckValid(); err != nil {
+		... // handle error
+	}
+
+ Note that the documented limitations in duration.proto does not protect a
+ Duration from overflowing the representable range of a time.Duration in Go.
+ The AsDuration method uses saturation arithmetic such that an overflow clamps
+ the resulting value to the closest representable value (e.g., math.MaxInt64
+ for positive overflow and math.MinInt64 for negative overflow).
+
+
+ Conversion from a Go Duration
+
+ The durationpb.New function can be used to construct a Duration message
+ from a standard Go time.Duration value:
+
+	dur := durationpb.New(d)
+	... // make use of d as a *durationpb.Duration
+
+`
+	case genid.File_google_protobuf_struct_proto:
+		return ` Package structpb contains generated types for ` + genid.File_google_protobuf_struct_proto + `.
+
+ The messages (i.e., Value, Struct, and ListValue) defined in struct.proto are
+ used to represent arbitrary JSON. The Value message represents a JSON value,
+ the Struct message represents a JSON object, and the ListValue message
+ represents a JSON array. See https://json.org for more information.
+
+ The Value, Struct, and ListValue types have generated MarshalJSON and
+ UnmarshalJSON methods such that they serialize JSON equivalent to what the
+ messages themselves represent. Use of these types with the
+ "google.golang.org/protobuf/encoding/protojson" package
+ ensures that they will be serialized as their JSON equivalent.
+
+
+ Conversion to and from a Go interface
+
+ The standard Go "encoding/json" package has functionality to serialize
+ arbitrary types to a large degree. The Value.AsInterface, Struct.AsMap, and
+ ListValue.AsSlice methods can convert the protobuf message representation into
+ a form represented by interface{}, map[string]interface{}, and []interface{}.
+ This form can be used with other packages that operate on such data structures
+ and also directly with the standard json package.
+
+ In order to convert the interface{}, map[string]interface{}, and []interface{}
+ forms back as Value, Struct, and ListValue messages, use the NewStruct,
+ NewList, and NewValue constructor functions.
+
+
+ Example usage
+
+ Consider the following example JSON object:
+
+	{
+		"firstName": "John",
+		"lastName": "Smith",
+		"isAlive": true,
+		"age": 27,
+		"address": {
+			"streetAddress": "21 2nd Street",
+			"city": "New York",
+			"state": "NY",
+			"postalCode": "10021-3100"
+		},
+		"phoneNumbers": [
+			{
+				"type": "home",
+				"number": "212 555-1234"
+			},
+			{
+				"type": "office",
+				"number": "646 555-4567"
+			}
+		],
+		"children": [],
+		"spouse": null
+	}
+
+ To construct a Value message representing the above JSON object:
+
+	m, err := structpb.NewValue(map[string]interface{}{
+		"firstName": "John",
+		"lastName":  "Smith",
+		"isAlive":   true,
+		"age":       27,
+		"address": map[string]interface{}{
+			"streetAddress": "21 2nd Street",
+			"city":          "New York",
+			"state":         "NY",
+			"postalCode":    "10021-3100",
+		},
+		"phoneNumbers": []interface{}{
+			map[string]interface{}{
+				"type":   "home",
+				"number": "212 555-1234",
+			},
+			map[string]interface{}{
+				"type":   "office",
+				"number": "646 555-4567",
+			},
+		},
+		"children": []interface{}{},
+		"spouse":   nil,
+	})
+	if err != nil {
+		... // handle error
+	}
+	... // make use of m as a *structpb.Value
+
+`
+	case genid.File_google_protobuf_field_mask_proto:
+		return ` Package fieldmaskpb contains generated types for ` + genid.File_google_protobuf_field_mask_proto + `.
+
+ The FieldMask message represents a set of symbolic field paths.
+ The paths are specific to some target message type,
+ which is not stored within the FieldMask message itself.
+
+
+ Constructing a FieldMask
+
+ The New function is used construct a FieldMask:
+
+	var messageType *descriptorpb.DescriptorProto
+	fm, err := fieldmaskpb.New(messageType, "field.name", "field.number")
+	if err != nil {
+		... // handle error
+	}
+	... // make use of fm
+
+ The "field.name" and "field.number" paths are valid paths according to the
+ google.protobuf.DescriptorProto message. Use of a path that does not correlate
+ to valid fields reachable from DescriptorProto would result in an error.
+
+ Once a FieldMask message has been constructed,
+ the Append method can be used to insert additional paths to the path set:
+
+	var messageType *descriptorpb.DescriptorProto
+	if err := fm.Append(messageType, "options"); err != nil {
+		... // handle error
+	}
+
+
+ Type checking a FieldMask
+
+ In order to verify that a FieldMask represents a set of fields that are
+ reachable from some target message type, use the IsValid method:
+
+	var messageType *descriptorpb.DescriptorProto
+	if fm.IsValid(messageType) {
+		... // make use of fm
+	}
+
+ IsValid needs to be passed the target message type as an input since the
+ FieldMask message itself does not store the message type that the set of paths
+ are for.
+`
+	default:
+		return ""
+	}
+}
+
 func genMessageKnownFunctions(g *protogen.GeneratedFile, f *fileInfo, m *messageInfo) {
 	switch m.Desc.FullName() {
 	case genid.Any_message_fullname:
diff --git a/internal/cmd/generate-protos/main.go b/internal/cmd/generate-protos/main.go
index b5ca588..48dda63 100644
--- a/internal/cmd/generate-protos/main.go
+++ b/internal/cmd/generate-protos/main.go
@@ -290,7 +290,10 @@
 		g.P(s)
 	}
 	g.P("package ", path.Base(importPath))
-	g.P("")
+	g.P()
+
+	g.P("const ", file.GoDescriptorIdent.GoName, " = ", strconv.Quote(file.Desc.Path()))
+	g.P()
 
 	var processEnums func([]*protogen.Enum)
 	var processMessages func([]*protogen.Message)
diff --git a/internal/genid/any_gen.go b/internal/genid/any_gen.go
index 68bc959..e6f7d47 100644
--- a/internal/genid/any_gen.go
+++ b/internal/genid/any_gen.go
@@ -10,6 +10,8 @@
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 )
 
+const File_google_protobuf_any_proto = "google/protobuf/any.proto"
+
 // Names for google.protobuf.Any.
 const (
 	Any_message_name     protoreflect.Name     = "Any"
diff --git a/internal/genid/api_gen.go b/internal/genid/api_gen.go
index 6d37b31..df8f918 100644
--- a/internal/genid/api_gen.go
+++ b/internal/genid/api_gen.go
@@ -10,6 +10,8 @@
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 )
 
+const File_google_protobuf_api_proto = "google/protobuf/api.proto"
+
 // Names for google.protobuf.Api.
 const (
 	Api_message_name     protoreflect.Name     = "Api"
diff --git a/internal/genid/descriptor_gen.go b/internal/genid/descriptor_gen.go
index 6e92768..e3cdf1c 100644
--- a/internal/genid/descriptor_gen.go
+++ b/internal/genid/descriptor_gen.go
@@ -10,6 +10,8 @@
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 )
 
+const File_google_protobuf_descriptor_proto = "google/protobuf/descriptor.proto"
+
 // Names for google.protobuf.FileDescriptorSet.
 const (
 	FileDescriptorSet_message_name     protoreflect.Name     = "FileDescriptorSet"
diff --git a/internal/genid/duration_gen.go b/internal/genid/duration_gen.go
index 8eeaeb1..b070ef4 100644
--- a/internal/genid/duration_gen.go
+++ b/internal/genid/duration_gen.go
@@ -10,6 +10,8 @@
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 )
 
+const File_google_protobuf_duration_proto = "google/protobuf/duration.proto"
+
 // Names for google.protobuf.Duration.
 const (
 	Duration_message_name     protoreflect.Name     = "Duration"
diff --git a/internal/genid/empty_gen.go b/internal/genid/empty_gen.go
index 3a38d5e..762abb3 100644
--- a/internal/genid/empty_gen.go
+++ b/internal/genid/empty_gen.go
@@ -10,6 +10,8 @@
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 )
 
+const File_google_protobuf_empty_proto = "google/protobuf/empty.proto"
+
 // Names for google.protobuf.Empty.
 const (
 	Empty_message_name     protoreflect.Name     = "Empty"
diff --git a/internal/genid/field_mask_gen.go b/internal/genid/field_mask_gen.go
index e93f682..70bed45 100644
--- a/internal/genid/field_mask_gen.go
+++ b/internal/genid/field_mask_gen.go
@@ -10,6 +10,8 @@
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 )
 
+const File_google_protobuf_field_mask_proto = "google/protobuf/field_mask.proto"
+
 // Names for google.protobuf.FieldMask.
 const (
 	FieldMask_message_name     protoreflect.Name     = "FieldMask"
diff --git a/internal/genid/source_context_gen.go b/internal/genid/source_context_gen.go
index e6618f0..3e99ae1 100644
--- a/internal/genid/source_context_gen.go
+++ b/internal/genid/source_context_gen.go
@@ -10,6 +10,8 @@
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 )
 
+const File_google_protobuf_source_context_proto = "google/protobuf/source_context.proto"
+
 // Names for google.protobuf.SourceContext.
 const (
 	SourceContext_message_name     protoreflect.Name     = "SourceContext"
diff --git a/internal/genid/struct_gen.go b/internal/genid/struct_gen.go
index 175d9fc..1a38944 100644
--- a/internal/genid/struct_gen.go
+++ b/internal/genid/struct_gen.go
@@ -10,6 +10,8 @@
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 )
 
+const File_google_protobuf_struct_proto = "google/protobuf/struct.proto"
+
 // Full and short names for google.protobuf.NullValue.
 const (
 	NullValue_enum_fullname = "google.protobuf.NullValue"
diff --git a/internal/genid/timestamp_gen.go b/internal/genid/timestamp_gen.go
index bfd7d5d..f5cd563 100644
--- a/internal/genid/timestamp_gen.go
+++ b/internal/genid/timestamp_gen.go
@@ -10,6 +10,8 @@
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 )
 
+const File_google_protobuf_timestamp_proto = "google/protobuf/timestamp.proto"
+
 // Names for google.protobuf.Timestamp.
 const (
 	Timestamp_message_name     protoreflect.Name     = "Timestamp"
diff --git a/internal/genid/type_gen.go b/internal/genid/type_gen.go
index 0f1e223..3bc7101 100644
--- a/internal/genid/type_gen.go
+++ b/internal/genid/type_gen.go
@@ -10,6 +10,8 @@
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 )
 
+const File_google_protobuf_type_proto = "google/protobuf/type.proto"
+
 // Full and short names for google.protobuf.Syntax.
 const (
 	Syntax_enum_fullname = "google.protobuf.Syntax"
diff --git a/internal/genid/wrappers_gen.go b/internal/genid/wrappers_gen.go
index 001976a..72527d2 100644
--- a/internal/genid/wrappers_gen.go
+++ b/internal/genid/wrappers_gen.go
@@ -10,6 +10,8 @@
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 )
 
+const File_google_protobuf_wrappers_proto = "google/protobuf/wrappers.proto"
+
 // Names for google.protobuf.DoubleValue.
 const (
 	DoubleValue_message_name     protoreflect.Name     = "DoubleValue"
diff --git a/types/known/anypb/any.pb.go b/types/known/anypb/any.pb.go
index 47bc555..82a473e 100644
--- a/types/known/anypb/any.pb.go
+++ b/types/known/anypb/any.pb.go
@@ -31,6 +31,91 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // source: google/protobuf/any.proto
 
+// Package anypb contains generated types for google/protobuf/any.proto.
+//
+// The Any message is a dynamic representation of any other message value.
+// It is functionally a tuple of the full name of the remote message type and
+// the serialized bytes of the remote message value.
+//
+//
+// Constructing an Any
+//
+// An Any message containing another message value is constructed using New:
+//
+//	any, err := anypb.New(m)
+//	if err != nil {
+//		... // handle error
+//	}
+//	... // make use of any
+//
+//
+// Unmarshaling an Any
+//
+// With a populated Any message, the underlying message can be serialized into
+// a remote concrete message value in a few ways.
+//
+// If the exact concrete type is known, then a new (or pre-existing) instance
+// of that message can be passed to the UnmarshalTo method:
+//
+//	m := new(foopb.MyMessage)
+//	if err := any.UnmarshalTo(m); err != nil {
+//		... // handle error
+//	}
+//	... // make use of m
+//
+// If the exact concrete type is not known, then the UnmarshalNew method can be
+// used to unmarshal the contents into a new instance of the remote message type:
+//
+//	m, err := any.UnmarshalNew()
+//	if err != nil {
+//		... // handle error
+//	}
+//	... // make use of m
+//
+// UnmarshalNew uses the global type registry to resolve the message type and
+// construct a new instance of that message to unmarshal into. In order for a
+// message type to appear in the global registry, the Go type representing that
+// protobuf message type must be linked into the Go binary. For messages
+// generated by protoc-gen-go, this is achieved through an import of the
+// generated Go package representing a .proto file.
+//
+// A common pattern with UnmarshalNew is to use a type switch with the resulting
+// proto.Message value:
+//
+//	switch m := m.(type) {
+//	case *foopb.MyMessage:
+//		... // make use of m as a *foopb.MyMessage
+//	case *barpb.OtherMessage:
+//		... // make use of m as a *barpb.OtherMessage
+//	case *bazpb.SomeMessage:
+//		... // make use of m as a *bazpb.SomeMessage
+//	}
+//
+// This pattern ensures that the generated packages containing the message types
+// listed in the case clauses are linked into the Go binary and therefore also
+// registered in the global registry.
+//
+//
+// Type checking an Any
+//
+// In order to type check whether an Any message represents some other message,
+// then use the MessageIs method:
+//
+//	if any.MessageIs((*foopb.MyMessage)(nil)) {
+//		... // make use of any, knowing that it contains a foopb.MyMessage
+//	}
+//
+// The MessageIs method can also be used with an allocated instance of the target
+// message type if the intention is to unmarshal into it if the type matches:
+//
+//	m := new(foopb.MyMessage)
+//	if any.MessageIs(m) {
+//		if err := any.UnmarshalTo(m); err != nil {
+//			... // handle error
+//		}
+//		... // make use of m
+//	}
+//
 package anypb
 
 import (
diff --git a/types/known/durationpb/duration.pb.go b/types/known/durationpb/duration.pb.go
index 67dbea2..f7a1109 100644
--- a/types/known/durationpb/duration.pb.go
+++ b/types/known/durationpb/duration.pb.go
@@ -31,6 +31,49 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // source: google/protobuf/duration.proto
 
+// Package durationpb contains generated types for google/protobuf/duration.proto.
+//
+// The Duration message represents a signed span of time.
+//
+//
+// Conversion to a Go Duration
+//
+// The AsDuration method can be used to convert a Duration message to a
+// standard Go time.Duration value:
+//
+//	d := dur.AsDuration()
+//	... // make use of d as a time.Duration
+//
+// Converting to a time.Duration is a common operation so that the extensive
+// set of time-based operations provided by the time package can be leveraged.
+// See https://golang.org/pkg/time for more information.
+//
+// The AsDuration method performs the conversion on a best-effort basis.
+// Durations with denormal values (e.g., nanoseconds beyond -99999999 and
+// +99999999, inclusive; or seconds and nanoseconds with opposite signs)
+// are normalized during the conversion to a time.Duration. To manually check for
+// invalid Duration per the documented limitations in duration.proto,
+// additionally call the CheckValid method:
+//
+//	if err := dur.CheckValid(); err != nil {
+//		... // handle error
+//	}
+//
+// Note that the documented limitations in duration.proto does not protect a
+// Duration from overflowing the representable range of a time.Duration in Go.
+// The AsDuration method uses saturation arithmetic such that an overflow clamps
+// the resulting value to the closest representable value (e.g., math.MaxInt64
+// for positive overflow and math.MinInt64 for negative overflow).
+//
+//
+// Conversion from a Go Duration
+//
+// The durationpb.New function can be used to construct a Duration message
+// from a standard Go time.Duration value:
+//
+//	dur := durationpb.New(d)
+//	... // make use of d as a *durationpb.Duration
+//
 package durationpb
 
 import (
diff --git a/types/known/fieldmaskpb/field_mask.pb.go b/types/known/fieldmaskpb/field_mask.pb.go
index da32aa5..6a8d872 100644
--- a/types/known/fieldmaskpb/field_mask.pb.go
+++ b/types/known/fieldmaskpb/field_mask.pb.go
@@ -31,6 +31,50 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // source: google/protobuf/field_mask.proto
 
+// Package fieldmaskpb contains generated types for google/protobuf/field_mask.proto.
+//
+// The FieldMask message represents a set of symbolic field paths.
+// The paths are specific to some target message type,
+// which is not stored within the FieldMask message itself.
+//
+//
+// Constructing a FieldMask
+//
+// The New function is used construct a FieldMask:
+//
+//	var messageType *descriptorpb.DescriptorProto
+//	fm, err := fieldmaskpb.New(messageType, "field.name", "field.number")
+//	if err != nil {
+//		... // handle error
+//	}
+//	... // make use of fm
+//
+// The "field.name" and "field.number" paths are valid paths according to the
+// google.protobuf.DescriptorProto message. Use of a path that does not correlate
+// to valid fields reachable from DescriptorProto would result in an error.
+//
+// Once a FieldMask message has been constructed,
+// the Append method can be used to insert additional paths to the path set:
+//
+//	var messageType *descriptorpb.DescriptorProto
+//	if err := fm.Append(messageType, "options"); err != nil {
+//		... // handle error
+//	}
+//
+//
+// Type checking a FieldMask
+//
+// In order to verify that a FieldMask represents a set of fields that are
+// reachable from some target message type, use the IsValid method:
+//
+//	var messageType *descriptorpb.DescriptorProto
+//	if fm.IsValid(messageType) {
+//		... // make use of fm
+//	}
+//
+// IsValid needs to be passed the target message type as an input since the
+// FieldMask message itself does not store the message type that the set of paths
+// are for.
 package fieldmaskpb
 
 import (
diff --git a/types/known/structpb/struct.pb.go b/types/known/structpb/struct.pb.go
index f246b87..7433a4c 100644
--- a/types/known/structpb/struct.pb.go
+++ b/types/known/structpb/struct.pb.go
@@ -31,6 +31,94 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // source: google/protobuf/struct.proto
 
+// Package structpb contains generated types for google/protobuf/struct.proto.
+//
+// The messages (i.e., Value, Struct, and ListValue) defined in struct.proto are
+// used to represent arbitrary JSON. The Value message represents a JSON value,
+// the Struct message represents a JSON object, and the ListValue message
+// represents a JSON array. See https://json.org for more information.
+//
+// The Value, Struct, and ListValue types have generated MarshalJSON and
+// UnmarshalJSON methods such that they serialize JSON equivalent to what the
+// messages themselves represent. Use of these types with the
+// "google.golang.org/protobuf/encoding/protojson" package
+// ensures that they will be serialized as their JSON equivalent.
+//
+//
+// Conversion to and from a Go interface
+//
+// The standard Go "encoding/json" package has functionality to serialize
+// arbitrary types to a large degree. The Value.AsInterface, Struct.AsMap, and
+// ListValue.AsSlice methods can convert the protobuf message representation into
+// a form represented by interface{}, map[string]interface{}, and []interface{}.
+// This form can be used with other packages that operate on such data structures
+// and also directly with the standard json package.
+//
+// In order to convert the interface{}, map[string]interface{}, and []interface{}
+// forms back as Value, Struct, and ListValue messages, use the NewStruct,
+// NewList, and NewValue constructor functions.
+//
+//
+// Example usage
+//
+// Consider the following example JSON object:
+//
+//	{
+//		"firstName": "John",
+//		"lastName": "Smith",
+//		"isAlive": true,
+//		"age": 27,
+//		"address": {
+//			"streetAddress": "21 2nd Street",
+//			"city": "New York",
+//			"state": "NY",
+//			"postalCode": "10021-3100"
+//		},
+//		"phoneNumbers": [
+//			{
+//				"type": "home",
+//				"number": "212 555-1234"
+//			},
+//			{
+//				"type": "office",
+//				"number": "646 555-4567"
+//			}
+//		],
+//		"children": [],
+//		"spouse": null
+//	}
+//
+// To construct a Value message representing the above JSON object:
+//
+//	m, err := structpb.NewValue(map[string]interface{}{
+//		"firstName": "John",
+//		"lastName":  "Smith",
+//		"isAlive":   true,
+//		"age":       27,
+//		"address": map[string]interface{}{
+//			"streetAddress": "21 2nd Street",
+//			"city":          "New York",
+//			"state":         "NY",
+//			"postalCode":    "10021-3100",
+//		},
+//		"phoneNumbers": []interface{}{
+//			map[string]interface{}{
+//				"type":   "home",
+//				"number": "212 555-1234",
+//			},
+//			map[string]interface{}{
+//				"type":   "office",
+//				"number": "646 555-4567",
+//			},
+//		},
+//		"children": []interface{}{},
+//		"spouse":   nil,
+//	})
+//	if err != nil {
+//		... // handle error
+//	}
+//	... // make use of m as a *structpb.Value
+//
 package structpb
 
 import (
diff --git a/types/known/timestamppb/timestamp.pb.go b/types/known/timestamppb/timestamp.pb.go
index 1988eb4..c25e4bd 100644
--- a/types/known/timestamppb/timestamp.pb.go
+++ b/types/known/timestamppb/timestamp.pb.go
@@ -31,6 +31,48 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // source: google/protobuf/timestamp.proto
 
+// Package timestamppb contains generated types for google/protobuf/timestamp.proto.
+//
+// The Timestamp message represents a timestamp,
+// an instant in time since the Unix epoch (January 1st, 1970).
+//
+//
+// Conversion to a Go Time
+//
+// The AsTime method can be used to convert a Timestamp message to a
+// standard Go time.Time value in UTC:
+//
+//	t := ts.AsTime()
+//	... // make use of t as a time.Time
+//
+// Converting to a time.Time is a common operation so that the extensive
+// set of time-based operations provided by the time package can be leveraged.
+// See https://golang.org/pkg/time for more information.
+//
+// The AsTime method performs the conversion on a best-effort basis. Timestamps
+// with denormal values (e.g., nanoseconds beyond 0 and 99999999, inclusive)
+// are normalized during the conversion to a time.Time. To manually check for
+// invalid Timestamps per the documented limitations in timestamp.proto,
+// additionally call the CheckValid method:
+//
+//	if err := ts.CheckValid(); err != nil {
+//		... // handle error
+//	}
+//
+//
+// Conversion from a Go Time
+//
+// The timestamppb.New function can be used to construct a Timestamp message
+// from a standard Go time.Time value:
+//
+//	ts := timestamppb.New(t)
+//	... // make use of ts as a *timestamppb.Timestamp
+//
+// In order to construct a Timestamp representing the current time, use Now:
+//
+//	ts := timestamppb.Now()
+//	... // make use of ts as a *timestamppb.Timestamp
+//
 package timestamppb
 
 import (