internal/impl: try to work with ExtensionDescs when legacy is absent

Don't rely on legacyWrapper.ExtensionTypeFromDesc when desc.Type
is populated. Avoids panics when working with extensions when
internal/legacy has not been imported.

Change-Id: Id41ffa3c60b6e5503d0a3e29ef48e4f523fad588
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/167465
Reviewed-by: Joe Tsai <joetsai@google.com>
diff --git a/internal/impl/legacy_extension.go b/internal/impl/legacy_extension.go
index 932dbf1..ff464dc 100644
--- a/internal/impl/legacy_extension.go
+++ b/internal/impl/legacy_extension.go
@@ -70,7 +70,7 @@
 	if x.Value == nil {
 		return false
 	}
-	t := legacyWrapper.ExtensionTypeFromDesc(x.Desc)
+	t := extensionTypeFromDesc(x.Desc)
 	if t.Cardinality() == pref.Repeated {
 		return t.ValueOf(x.Value).List().Len() > 0
 	}
@@ -82,7 +82,7 @@
 	if x.Desc == nil {
 		return pref.Value{}
 	}
-	t := legacyWrapper.ExtensionTypeFromDesc(x.Desc)
+	t := extensionTypeFromDesc(x.Desc)
 	if x.Value == nil {
 		// NOTE: x.Value is never nil for Lists since they are always populated
 		// during ExtensionFieldTypes.Register.
@@ -99,7 +99,7 @@
 	if x.Desc == nil {
 		panic("no extension descriptor registered")
 	}
-	t := legacyWrapper.ExtensionTypeFromDesc(x.Desc)
+	t := extensionTypeFromDesc(x.Desc)
 	x.Value = t.InterfaceOf(v)
 	p.x.Set(n, x)
 }
@@ -109,7 +109,7 @@
 	if x.Desc == nil {
 		return
 	}
-	t := legacyWrapper.ExtensionTypeFromDesc(x.Desc)
+	t := extensionTypeFromDesc(x.Desc)
 	if t.Cardinality() == pref.Repeated {
 		t.ValueOf(x.Value).List().Truncate(0)
 		return
@@ -132,7 +132,7 @@
 	if x.Desc == nil {
 		panic("no extension descriptor registered")
 	}
-	xt := legacyWrapper.ExtensionTypeFromDesc(x.Desc)
+	xt := extensionTypeFromDesc(x.Desc)
 	return xt.New().Message()
 }
 
@@ -198,7 +198,7 @@
 func (p legacyExtensionTypes) ByNumber(n pref.FieldNumber) pref.ExtensionType {
 	x := p.x.Get(n)
 	if x.Desc != nil {
-		return legacyWrapper.ExtensionTypeFromDesc(x.Desc)
+		return extensionTypeFromDesc(x.Desc)
 	}
 	return nil
 }
@@ -206,7 +206,7 @@
 func (p legacyExtensionTypes) ByName(s pref.FullName) (t pref.ExtensionType) {
 	p.x.Range(func(_ pref.FieldNumber, x papi.ExtensionField) bool {
 		if x.Desc != nil && x.Desc.Name == string(s) {
-			t = legacyWrapper.ExtensionTypeFromDesc(x.Desc)
+			t = extensionTypeFromDesc(x.Desc)
 			return false
 		}
 		return true
@@ -217,10 +217,17 @@
 func (p legacyExtensionTypes) Range(f func(pref.ExtensionType) bool) {
 	p.x.Range(func(_ pref.FieldNumber, x papi.ExtensionField) bool {
 		if x.Desc != nil {
-			if !f(legacyWrapper.ExtensionTypeFromDesc(x.Desc)) {
+			if !f(extensionTypeFromDesc(x.Desc)) {
 				return false
 			}
 		}
 		return true
 	})
 }
+
+func extensionTypeFromDesc(desc *papi.ExtensionDesc) pref.ExtensionType {
+	if desc.Type != nil {
+		return desc.Type
+	}
+	return legacyWrapper.ExtensionTypeFromDesc(desc)
+}