all: remove dependency on proto v1

This does not remove all dependencies,
but all of the cases where it can now be implemented in terms of v2.

Change-Id: Idc5b0273f0d35c284bf2141eb9cce998692ceb15
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/184878
Reviewed-by: Herbie Ong <herbie@google.com>
diff --git a/proto/decode_test.go b/proto/decode_test.go
index b2b6227..3b919aa 100644
--- a/proto/decode_test.go
+++ b/proto/decode_test.go
@@ -135,22 +135,22 @@
 			OptionalNestedEnum: test3pb.TestAllTypes_BAR,
 		}, build(
 			&testpb.TestAllExtensions{},
-			extend(testpb.E_OptionalInt32Extension, scalar.Int32(1001)),
-			extend(testpb.E_OptionalInt64Extension, scalar.Int64(1002)),
-			extend(testpb.E_OptionalUint32Extension, scalar.Uint32(1003)),
-			extend(testpb.E_OptionalUint64Extension, scalar.Uint64(1004)),
-			extend(testpb.E_OptionalSint32Extension, scalar.Int32(1005)),
-			extend(testpb.E_OptionalSint64Extension, scalar.Int64(1006)),
-			extend(testpb.E_OptionalFixed32Extension, scalar.Uint32(1007)),
-			extend(testpb.E_OptionalFixed64Extension, scalar.Uint64(1008)),
-			extend(testpb.E_OptionalSfixed32Extension, scalar.Int32(1009)),
-			extend(testpb.E_OptionalSfixed64Extension, scalar.Int64(1010)),
-			extend(testpb.E_OptionalFloatExtension, scalar.Float32(1011.5)),
-			extend(testpb.E_OptionalDoubleExtension, scalar.Float64(1012.5)),
-			extend(testpb.E_OptionalBoolExtension, scalar.Bool(true)),
-			extend(testpb.E_OptionalStringExtension, scalar.String("string")),
+			extend(testpb.E_OptionalInt32Extension, int32(1001)),
+			extend(testpb.E_OptionalInt64Extension, int64(1002)),
+			extend(testpb.E_OptionalUint32Extension, uint32(1003)),
+			extend(testpb.E_OptionalUint64Extension, uint64(1004)),
+			extend(testpb.E_OptionalSint32Extension, int32(1005)),
+			extend(testpb.E_OptionalSint64Extension, int64(1006)),
+			extend(testpb.E_OptionalFixed32Extension, uint32(1007)),
+			extend(testpb.E_OptionalFixed64Extension, uint64(1008)),
+			extend(testpb.E_OptionalSfixed32Extension, int32(1009)),
+			extend(testpb.E_OptionalSfixed64Extension, int64(1010)),
+			extend(testpb.E_OptionalFloatExtension, float32(1011.5)),
+			extend(testpb.E_OptionalDoubleExtension, float64(1012.5)),
+			extend(testpb.E_OptionalBoolExtension, bool(true)),
+			extend(testpb.E_OptionalStringExtension, string("string")),
 			extend(testpb.E_OptionalBytesExtension, []byte("bytes")),
-			extend(testpb.E_OptionalNestedEnumExtension, testpb.TestAllTypes_BAR.Enum()),
+			extend(testpb.E_OptionalNestedEnumExtension, testpb.TestAllTypes_BAR),
 		)},
 		wire: pack.Message{
 			pack.Tag{1, pack.VarintType}, pack.Varint(1001),
@@ -1370,14 +1370,21 @@
 }
 
 func extend(desc *protoV1.ExtensionDesc, value interface{}) buildOpt {
+	// TODO: Should ExtensionType.ValueOf accept []T instead of *[]T?
+	t := reflect.TypeOf(value)
+	if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 {
+		v := reflect.New(t)
+		v.Elem().Set(reflect.ValueOf(value))
+		value = v.Interface()
+	}
+
 	return func(m proto.Message) {
-		if err := protoV1.SetExtension(m.(protoV1.Message), desc, value); err != nil {
-			panic(err)
-		}
+		xt := desc.Type
+		m.ProtoReflect().Set(xt, xt.ValueOf(value))
 	}
 }
 
 func marshalText(m proto.Message) string {
-	b, _ := prototext.Marshal(m)
+	b, _ := prototext.MarshalOptions{Indent: "\t", AllowPartial: true}.Marshal(m)
 	return string(b)
 }