|  | @@ -208,28 +208,28 @@ string GetPath(const GeneratorOptions& options,
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -// Forward declare, so that GetPrefix can call this method,
 | 
	
		
			
				|  |  | -// which in turn, calls GetPrefix.
 | 
	
		
			
				|  |  | -string GetPath(const GeneratorOptions& options,
 | 
	
		
			
				|  |  | -               const Descriptor* descriptor);
 | 
	
		
			
				|  |  | +// Returns the name of the message with a leading dot and taking into account
 | 
	
		
			
				|  |  | +// nesting, for example ".OuterMessage.InnerMessage", or returns empty if
 | 
	
		
			
				|  |  | +// descriptor is null. This function does not handle namespacing, only message
 | 
	
		
			
				|  |  | +// nesting.
 | 
	
		
			
				|  |  | +string GetNestedMessageName(const Descriptor* descriptor) {
 | 
	
		
			
				|  |  | +  if (descriptor == NULL) {
 | 
	
		
			
				|  |  | +    return "";
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  return StripPrefixString(descriptor->full_name(),
 | 
	
		
			
				|  |  | +                           descriptor->file()->package());
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // Returns the path prefix for a message or enumeration that
 | 
	
		
			
				|  |  |  // lives under the given file and containing type.
 | 
	
		
			
				|  |  |  string GetPrefix(const GeneratorOptions& options,
 | 
	
		
			
				|  |  |                   const FileDescriptor* file_descriptor,
 | 
	
		
			
				|  |  |                   const Descriptor* containing_type) {
 | 
	
		
			
				|  |  | -  string prefix = "";
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  if (containing_type == NULL) {
 | 
	
		
			
				|  |  | -    prefix = GetPath(options, file_descriptor);
 | 
	
		
			
				|  |  | -  } else {
 | 
	
		
			
				|  |  | -    prefix = GetPath(options, containing_type);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +  string prefix = GetPath(options, file_descriptor) +
 | 
	
		
			
				|  |  | +      GetNestedMessageName(containing_type);
 | 
	
		
			
				|  |  |    if (!prefix.empty()) {
 | 
	
		
			
				|  |  |      prefix += ".";
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |    return prefix;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -277,7 +277,9 @@ string MaybeCrossFileRef(const GeneratorOptions& options,
 | 
	
		
			
				|  |  |        from_file != to_message->file()) {
 | 
	
		
			
				|  |  |      // Cross-file ref in CommonJS needs to use the module alias instead of
 | 
	
		
			
				|  |  |      // the global name.
 | 
	
		
			
				|  |  | -    return ModuleAlias(to_message->file()->name()) + "." + to_message->name();
 | 
	
		
			
				|  |  | +    return ModuleAlias(to_message->file()->name()) +
 | 
	
		
			
				|  |  | +        GetNestedMessageName(to_message->containing_type()) +
 | 
	
		
			
				|  |  | +        "." + to_message->name();
 | 
	
		
			
				|  |  |    } else {
 | 
	
		
			
				|  |  |      // Within a single file we use a full name.
 | 
	
		
			
				|  |  |      return GetPath(options, to_message);
 |