internal/scalar: add scalar package for primitive wrappers

Add the scalar package to reduce dependencies on the v1 proto runtime package.
It may very well be the case that these functions should be exposed in the
public API of v2, but that is not a decision we need to make now.

Change-Id: Ifbc6d15311ba5837909ac72af47c630a80a142ef
Reviewed-on: https://go-review.googlesource.com/c/151402
Reviewed-by: Herbie Ong <herbie@google.com>
diff --git a/internal/impl/legacy_message.go b/internal/impl/legacy_message.go
index 4b64359..440b283 100644
--- a/internal/impl/legacy_message.go
+++ b/internal/impl/legacy_message.go
@@ -11,9 +11,9 @@
 	"sync"
 	"unicode"
 
-	protoV1 "github.com/golang/protobuf/proto"
 	descriptorV1 "github.com/golang/protobuf/protoc-gen-go/descriptor"
 	ptag "github.com/golang/protobuf/v2/internal/encoding/tag"
+	scalar "github.com/golang/protobuf/v2/internal/scalar"
 	pvalue "github.com/golang/protobuf/v2/internal/value"
 	pref "github.com/golang/protobuf/v2/reflect/protoreflect"
 	ptype "github.com/golang/protobuf/v2/reflect/prototype"
@@ -253,7 +253,7 @@
 			m := &ptype.StandaloneMessage{
 				Syntax:   parent.Syntax,
 				FullName: parent.FullName.Append(mapEntryName(f.Name)),
-				Options:  &descriptorV1.MessageOptions{MapEntry: protoV1.Bool(true)},
+				Options:  &descriptorV1.MessageOptions{MapEntry: scalar.Bool(true)},
 				Fields: []ptype.Field{
 					ms.parseField(tagKey, "", "", t.Key(), nil),
 					ms.parseField(tagVal, "", "", t.Elem(), nil),
diff --git a/internal/impl/legacy_test.go b/internal/impl/legacy_test.go
index 2333fc5..71b4db2 100644
--- a/internal/impl/legacy_test.go
+++ b/internal/impl/legacy_test.go
@@ -13,6 +13,7 @@
 	protoV1 "github.com/golang/protobuf/proto"
 	pack "github.com/golang/protobuf/v2/internal/encoding/pack"
 	pragma "github.com/golang/protobuf/v2/internal/pragma"
+	scalar "github.com/golang/protobuf/v2/internal/scalar"
 	pref "github.com/golang/protobuf/v2/reflect/protoreflect"
 	ptype "github.com/golang/protobuf/v2/reflect/prototype"
 	cmp "github.com/google/go-cmp/cmp"
@@ -848,8 +849,8 @@
 	}
 
 	// Set some values and append to values to the lists.
-	m1a := &proto2_20180125.Message_ChildMessage{F1: protoV1.String("m1a")}
-	m1b := &proto2_20180125.Message_ChildMessage{F1: protoV1.String("m2b")}
+	m1a := &proto2_20180125.Message_ChildMessage{F1: scalar.String("m1a")}
+	m1b := &proto2_20180125.Message_ChildMessage{F1: scalar.String("m2b")}
 	m2a := &EnumMessages{EnumP2: EnumProto2(0x1b).Enum()}
 	m2b := &EnumMessages{EnumP2: EnumProto2(0x2b).Enum()}
 	setValues := []interface{}{
diff --git a/internal/impl/message_test.go b/internal/impl/message_test.go
index 999bdd6..5637b92 100644
--- a/internal/impl/message_test.go
+++ b/internal/impl/message_test.go
@@ -12,6 +12,7 @@
 
 	protoV1 "github.com/golang/protobuf/proto"
 	descriptorV1 "github.com/golang/protobuf/protoc-gen-go/descriptor"
+	scalar "github.com/golang/protobuf/v2/internal/scalar"
 	pref "github.com/golang/protobuf/v2/reflect/protoreflect"
 	ptype "github.com/golang/protobuf/v2/reflect/prototype"
 	cmp "github.com/google/go-cmp/cmp"
@@ -559,7 +560,7 @@
 				{Name: "key", Number: 1, Cardinality: pref.Optional, Kind: keyKind},
 				{Name: "value", Number: 2, Cardinality: pref.Optional, Kind: valKind},
 			},
-			Options: &descriptorV1.MessageOptions{MapEntry: protoV1.Bool(true)},
+			Options: &descriptorV1.MessageOptions{MapEntry: scalar.Bool(true)},
 		}),
 	}
 }
@@ -964,7 +965,7 @@
 		{Name: "key", Number: 1, Cardinality: pref.Optional, Kind: pref.StringKind},
 		{Name: "value", Number: 2, Cardinality: pref.Optional, Kind: pref.EnumKind, EnumType: enumProto3Type},
 	},
-	Options: &descriptorV1.MessageOptions{MapEntry: protoV1.Bool(true)},
+	Options: &descriptorV1.MessageOptions{MapEntry: scalar.Bool(true)},
 })
 
 var messageMapDesc = mustMakeMessageDesc(ptype.StandaloneMessage{
@@ -974,7 +975,7 @@
 		{Name: "key", Number: 1, Cardinality: pref.Optional, Kind: pref.StringKind},
 		{Name: "value", Number: 2, Cardinality: pref.Optional, Kind: pref.MessageKind, MessageType: scalarProto3Type.Type},
 	},
-	Options: &descriptorV1.MessageOptions{MapEntry: protoV1.Bool(true)},
+	Options: &descriptorV1.MessageOptions{MapEntry: scalar.Bool(true)},
 })
 
 func (m *EnumMessages) Type() pref.MessageType            { return enumMessagesType.Type }
@@ -1017,10 +1018,10 @@
 func (*EnumMessages_OneofM3) isEnumMessages_Union() {}
 
 func TestEnumMessages(t *testing.T) {
-	wantL := MessageOf(&proto2_20180125.Message{OptionalFloat: protoV1.Float32(math.E)})
+	wantL := MessageOf(&proto2_20180125.Message{OptionalFloat: scalar.Float32(math.E)})
 	wantM := &EnumMessages{EnumP2: EnumProto2(1234).Enum()}
-	wantM2a := &ScalarProto2{Float32: protoV1.Float32(math.Pi)}
-	wantM2b := &ScalarProto2{Float32: protoV1.Float32(math.Phi)}
+	wantM2a := &ScalarProto2{Float32: scalar.Float32(math.Pi)}
+	wantM2b := &ScalarProto2{Float32: scalar.Float32(math.Phi)}
 	wantM3a := &ScalarProto3{Float32: math.Pi}
 	wantM3b := &ScalarProto3{Float32: math.Ln2}
 
@@ -1104,7 +1105,7 @@
 		equalMessage{&EnumMessages{
 			EnumP2:        EnumProto2(0xdead).Enum(),
 			EnumP3:        EnumProto3(0).Enum(),
-			MessageLegacy: &proto2_20180125.Message{OptionalFloat: protoV1.Float32(math.E)},
+			MessageLegacy: &proto2_20180125.Message{OptionalFloat: scalar.Float32(math.E)},
 			MessageCycle:  wantM,
 			MessageList:   []*ScalarProto2{wantM2a, wantM2b},
 			EnumMap:       map[string]EnumProto3{"one": 1, "two": 2},