internal/impl: abstract away ExtensionDescV1 as the underlying descriptor

Add ExtensionField.{SetType,GetType} to hide the fact that the underlying
descriptor is actually an ExtensionDescV1.

Change-Id: I1d0595484ced0a88d2df0852a732fdf0fe9aa232
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/180538
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/internal/impl/pointer_unsafe.go b/internal/impl/pointer_unsafe.go
index f04a561..39f1995 100644
--- a/internal/impl/pointer_unsafe.go
+++ b/internal/impl/pointer_unsafe.go
@@ -73,33 +73,33 @@
 	return p.AsValueOf(t).Interface()
 }
 
-func (p pointer) Bool() *bool                     { return (*bool)(p.p) }
-func (p pointer) BoolPtr() **bool                 { return (**bool)(p.p) }
-func (p pointer) BoolSlice() *[]bool              { return (*[]bool)(p.p) }
-func (p pointer) Int32() *int32                   { return (*int32)(p.p) }
-func (p pointer) Int32Ptr() **int32               { return (**int32)(p.p) }
-func (p pointer) Int32Slice() *[]int32            { return (*[]int32)(p.p) }
-func (p pointer) Int64() *int64                   { return (*int64)(p.p) }
-func (p pointer) Int64Ptr() **int64               { return (**int64)(p.p) }
-func (p pointer) Int64Slice() *[]int64            { return (*[]int64)(p.p) }
-func (p pointer) Uint32() *uint32                 { return (*uint32)(p.p) }
-func (p pointer) Uint32Ptr() **uint32             { return (**uint32)(p.p) }
-func (p pointer) Uint32Slice() *[]uint32          { return (*[]uint32)(p.p) }
-func (p pointer) Uint64() *uint64                 { return (*uint64)(p.p) }
-func (p pointer) Uint64Ptr() **uint64             { return (**uint64)(p.p) }
-func (p pointer) Uint64Slice() *[]uint64          { return (*[]uint64)(p.p) }
-func (p pointer) Float32() *float32               { return (*float32)(p.p) }
-func (p pointer) Float32Ptr() **float32           { return (**float32)(p.p) }
-func (p pointer) Float32Slice() *[]float32        { return (*[]float32)(p.p) }
-func (p pointer) Float64() *float64               { return (*float64)(p.p) }
-func (p pointer) Float64Ptr() **float64           { return (**float64)(p.p) }
-func (p pointer) Float64Slice() *[]float64        { return (*[]float64)(p.p) }
-func (p pointer) String() *string                 { return (*string)(p.p) }
-func (p pointer) StringPtr() **string             { return (**string)(p.p) }
-func (p pointer) StringSlice() *[]string          { return (*[]string)(p.p) }
-func (p pointer) Bytes() *[]byte                  { return (*[]byte)(p.p) }
-func (p pointer) BytesSlice() *[][]byte           { return (*[][]byte)(p.p) }
-func (p pointer) Extensions() *legacyExtensionMap { return (*legacyExtensionMap)(p.p) }
+func (p pointer) Bool() *bool                           { return (*bool)(p.p) }
+func (p pointer) BoolPtr() **bool                       { return (**bool)(p.p) }
+func (p pointer) BoolSlice() *[]bool                    { return (*[]bool)(p.p) }
+func (p pointer) Int32() *int32                         { return (*int32)(p.p) }
+func (p pointer) Int32Ptr() **int32                     { return (**int32)(p.p) }
+func (p pointer) Int32Slice() *[]int32                  { return (*[]int32)(p.p) }
+func (p pointer) Int64() *int64                         { return (*int64)(p.p) }
+func (p pointer) Int64Ptr() **int64                     { return (**int64)(p.p) }
+func (p pointer) Int64Slice() *[]int64                  { return (*[]int64)(p.p) }
+func (p pointer) Uint32() *uint32                       { return (*uint32)(p.p) }
+func (p pointer) Uint32Ptr() **uint32                   { return (**uint32)(p.p) }
+func (p pointer) Uint32Slice() *[]uint32                { return (*[]uint32)(p.p) }
+func (p pointer) Uint64() *uint64                       { return (*uint64)(p.p) }
+func (p pointer) Uint64Ptr() **uint64                   { return (**uint64)(p.p) }
+func (p pointer) Uint64Slice() *[]uint64                { return (*[]uint64)(p.p) }
+func (p pointer) Float32() *float32                     { return (*float32)(p.p) }
+func (p pointer) Float32Ptr() **float32                 { return (**float32)(p.p) }
+func (p pointer) Float32Slice() *[]float32              { return (*[]float32)(p.p) }
+func (p pointer) Float64() *float64                     { return (*float64)(p.p) }
+func (p pointer) Float64Ptr() **float64                 { return (**float64)(p.p) }
+func (p pointer) Float64Slice() *[]float64              { return (*[]float64)(p.p) }
+func (p pointer) String() *string                       { return (*string)(p.p) }
+func (p pointer) StringPtr() **string                   { return (**string)(p.p) }
+func (p pointer) StringSlice() *[]string                { return (*[]string)(p.p) }
+func (p pointer) Bytes() *[]byte                        { return (*[]byte)(p.p) }
+func (p pointer) BytesSlice() *[][]byte                 { return (*[][]byte)(p.p) }
+func (p pointer) Extensions() *map[int32]ExtensionField { return (*map[int32]ExtensionField)(p.p) }
 
 func (p pointer) Elem() pointer {
 	return pointer{p: *(*unsafe.Pointer)(p.p)}