internal/impl: allow reflection on typed nil pointers

Similar to how generated messages allow you to call Get methods on a
nil pointer, we permit similar functionality when protobuf reflection
is used on a nil pointer.

Change-Id: Ie2f596d39105c191073b42d7d689525c3b715240
Reviewed-on: https://go-review.googlesource.com/c/152021
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/internal/impl/legacy_extension.go b/internal/impl/legacy_extension.go
index df92f02..baa13fd 100644
--- a/internal/impl/legacy_extension.go
+++ b/internal/impl/legacy_extension.go
@@ -17,6 +17,9 @@
 		return nil
 	}
 	return func(p *messageDataType) pref.KnownFields {
+		if p.p.IsNil() {
+			return emptyExtensionFields{}
+		}
 		return legacyExtensionFields{p.mi, f(p)}
 	}
 }
@@ -33,13 +36,13 @@
 	case fx1.Type == extTypeA:
 		fieldOffset := offsetOf(fx1)
 		return func(p *messageDataType) papi.ExtensionFields {
-			v := p.p.apply(fieldOffset).asType(fx1.Type).Interface()
+			v := p.p.Apply(fieldOffset).AsValueOf(fx1.Type).Interface()
 			return papi.ExtensionFieldsOf(v)
 		}
 	case fx2.Type == extTypeB:
 		fieldOffset := offsetOf(fx2)
 		return func(p *messageDataType) papi.ExtensionFields {
-			v := p.p.apply(fieldOffset).asType(fx2.Type).Interface()
+			v := p.p.Apply(fieldOffset).AsValueOf(fx2.Type).Interface()
 			return papi.ExtensionFieldsOf(v)
 		}
 	default: