|  | @@ -1021,27 +1021,11 @@ bool ValidateObjCClassPrefix(const FileDescriptor* file,
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // If there was no prefix option, we're done at this point.
 | 
	
		
			
				|  |  | -  if (prefix.length() == 0) {
 | 
	
		
			
				|  |  | +  if (prefix.empty()) {
 | 
	
		
			
				|  |  |      // No prefix, nothing left to check.
 | 
	
		
			
				|  |  |      return true;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  // Check: Error - Make sure the prefix wasn't expected for a different
 | 
	
		
			
				|  |  | -  // package (overlap is allowed, but it has to be listed as an expected
 | 
	
		
			
				|  |  | -  // overlap).
 | 
	
		
			
				|  |  | -  for (map<string, string>::iterator i = expected_package_prefixes.begin();
 | 
	
		
			
				|  |  | -       i != expected_package_prefixes.end(); ++i) {
 | 
	
		
			
				|  |  | -    if (i->second == prefix) {
 | 
	
		
			
				|  |  | -      *out_error =
 | 
	
		
			
				|  |  | -          "error: Found 'option objc_class_prefix = \"" + prefix +
 | 
	
		
			
				|  |  | -          "\";' in '" + file->name() +
 | 
	
		
			
				|  |  | -          "'; that prefix is already used for 'package " + i->first +
 | 
	
		
			
				|  |  | -          ";'. It can only be reused by listing it in the expected file (" +
 | 
	
		
			
				|  |  | -          generation_options.expected_prefixes_path + ").";
 | 
	
		
			
				|  |  | -      return false;  // Only report first usage of the prefix.
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |    // Check: Warning - Make sure the prefix is is a reasonable value according
 | 
	
		
			
				|  |  |    // to Apple's rules (the checks above implicitly whitelist anything that
 | 
	
		
			
				|  |  |    // doesn't meet these rules).
 | 
	
	
		
			
				|  | @@ -1063,6 +1047,56 @@ bool ValidateObjCClassPrefix(const FileDescriptor* file,
 | 
	
		
			
				|  |  |      cerr.flush();
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  // Look for any other package that uses the same prefix.
 | 
	
		
			
				|  |  | +  string other_package_for_prefix;
 | 
	
		
			
				|  |  | +  for (map<string, string>::iterator i = expected_package_prefixes.begin();
 | 
	
		
			
				|  |  | +       i != expected_package_prefixes.end(); ++i) {
 | 
	
		
			
				|  |  | +    if (i->second == prefix) {
 | 
	
		
			
				|  |  | +      other_package_for_prefix = i->first;
 | 
	
		
			
				|  |  | +      break;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Check: Warning - If the file does not have a package, check whether
 | 
	
		
			
				|  |  | +  // the prefix declared is being used by another package or not.
 | 
	
		
			
				|  |  | +  if (package.empty()) {
 | 
	
		
			
				|  |  | +    // The file does not have a package and ...
 | 
	
		
			
				|  |  | +    if (other_package_for_prefix.empty()) {
 | 
	
		
			
				|  |  | +      // ... no other package has declared that prefix.
 | 
	
		
			
				|  |  | +      cerr << endl
 | 
	
		
			
				|  |  | +           << "protoc:0: warning: File '" << file->name() << "' has no "
 | 
	
		
			
				|  |  | +           << "package. Consider adding a new package to the proto and adding '"
 | 
	
		
			
				|  |  | +           << "new.package = " << prefix << "' to the expected prefixes file ("
 | 
	
		
			
				|  |  | +           << generation_options.expected_prefixes_path << ")." << endl;
 | 
	
		
			
				|  |  | +      cerr.flush();
 | 
	
		
			
				|  |  | +    } else {
 | 
	
		
			
				|  |  | +      // ... another package has declared the same prefix.
 | 
	
		
			
				|  |  | +      cerr << endl
 | 
	
		
			
				|  |  | +           << "protoc:0: warning: File '" << file->name() << "' has no package "
 | 
	
		
			
				|  |  | +           << "and package '" << other_package_for_prefix << "' already uses '"
 | 
	
		
			
				|  |  | +           << prefix << "' as its prefix. Consider either adding a new package "
 | 
	
		
			
				|  |  | +           << "to the proto, or reusing one of the packages already using this "
 | 
	
		
			
				|  |  | +           << "prefix in the expected prefixes file ("
 | 
	
		
			
				|  |  | +           << generation_options.expected_prefixes_path << ")." << endl;
 | 
	
		
			
				|  |  | +      cerr.flush();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    return true;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Check: Error - Make sure the prefix wasn't expected for a different
 | 
	
		
			
				|  |  | +  // package (overlap is allowed, but it has to be listed as an expected
 | 
	
		
			
				|  |  | +  // overlap).
 | 
	
		
			
				|  |  | +  if (!other_package_for_prefix.empty()) {
 | 
	
		
			
				|  |  | +    *out_error =
 | 
	
		
			
				|  |  | +        "error: Found 'option objc_class_prefix = \"" + prefix +
 | 
	
		
			
				|  |  | +        "\";' in '" + file->name() +
 | 
	
		
			
				|  |  | +        "'; that prefix is already used for 'package " +
 | 
	
		
			
				|  |  | +        other_package_for_prefix + ";'. It can only be reused by listing " +
 | 
	
		
			
				|  |  | +        "it in the expected file (" +
 | 
	
		
			
				|  |  | +        generation_options.expected_prefixes_path + ").";
 | 
	
		
			
				|  |  | +    return false;  // Only report first usage of the prefix.
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    // Check: Warning - If the given package/prefix pair wasn't expected, issue a
 | 
	
		
			
				|  |  |    // warning issue a warning suggesting it gets added to the file.
 | 
	
		
			
				|  |  |    if (!expected_package_prefixes.empty()) {
 |