reflect/protodesc: fix handling of unresolved identifiers

Change-Id: I09a6384de5591d77d99e5646ccc9137f42424845
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/183779
Reviewed-by: Herbie Ong <herbie@google.com>
diff --git a/reflect/protodesc/protodesc.go b/reflect/protodesc/protodesc.go
index bb6d245..7865dd1 100644
--- a/reflect/protodesc/protodesc.go
+++ b/reflect/protodesc/protodesc.go
@@ -502,6 +502,14 @@
 		return nil, err
 	}
 	if ed, ok := d.(protoreflect.EnumDescriptor); ok {
+		if err == protoregistry.NotFound {
+			if isWeak {
+				return filedesc.PlaceholderEnum(protoreflect.FullName(s[1:])), nil
+			}
+			// TODO: This should be an error.
+			return filedesc.PlaceholderEnum(protoreflect.FullName(s[1:])), nil
+			// return nil, errors.New("could not resolve enum: %v", name)
+		}
 		return ed, nil
 	}
 	return nil, errors.New("invalid descriptor type")
@@ -510,6 +518,14 @@
 func findMessageDescriptor(s string, isWeak bool, imps importSet, r Resolver) (protoreflect.MessageDescriptor, error) {
 	d, err := findDescriptor(s, isWeak, imps, r)
 	if err != nil {
+		if err == protoregistry.NotFound {
+			if isWeak {
+				return filedesc.PlaceholderMessage(protoreflect.FullName(s[1:])), nil
+			}
+			// TODO: This should be an error.
+			return filedesc.PlaceholderMessage(protoreflect.FullName(s[1:])), nil
+			// return nil, errors.New("could not resolve enum: %v", name)
+		}
 		return nil, err
 	}
 	if md, ok := d.(protoreflect.MessageDescriptor); ok {
@@ -525,14 +541,6 @@
 	name := protoreflect.FullName(strings.TrimPrefix(s, "."))
 	d, err := r.FindDescriptorByName(name)
 	if err != nil {
-		if err == protoregistry.NotFound {
-			if isWeak {
-				return filedesc.PlaceholderEnum(name), nil
-			}
-			// TODO: This should be an error.
-			return filedesc.PlaceholderEnum(name), nil
-			// return nil, errors.New("could not resolve enum: %v", name)
-		}
 		return nil, err
 	}
 	if err := imps.check(d); err != nil {