@@ -279,9 +279,20 @@ void WriteMemberDeclarationName(IMember member, TokenWriter writer, CSharpFormat
279279 ConvertType ( member . DeclaringType , writer , formattingPolicy ) ;
280280 writer . WriteToken ( Roles . Dot , "." ) ;
281281 }
282+ IType explicitInterfaceType = GetExplicitInterfaceType ( member ) ;
283+ string name = member . Name ;
284+ if ( explicitInterfaceType != null )
285+ {
286+ name = name . Substring ( name . LastIndexOf ( '.' ) + 1 ) ;
287+ }
282288 switch ( member . SymbolKind )
283289 {
284290 case SymbolKind . Indexer :
291+ if ( explicitInterfaceType != null )
292+ {
293+ ConvertType ( explicitInterfaceType , writer , formattingPolicy ) ;
294+ writer . WriteToken ( Roles . Dot , "." ) ;
295+ }
285296 writer . WriteKeyword ( Roles . Identifier , "this" ) ;
286297 break ;
287298 case SymbolKind . Constructor :
@@ -292,11 +303,16 @@ void WriteMemberDeclarationName(IMember member, TokenWriter writer, CSharpFormat
292303 WriteQualifiedName ( member . DeclaringType . Name , writer , formattingPolicy ) ;
293304 break ;
294305 case SymbolKind . Operator :
295- switch ( member . Name )
306+ switch ( name )
296307 {
297308 case "op_Implicit" :
298309 writer . WriteKeyword ( OperatorDeclaration . ImplicitRole , "implicit" ) ;
299310 writer . Space ( ) ;
311+ if ( explicitInterfaceType != null )
312+ {
313+ ConvertType ( explicitInterfaceType , writer , formattingPolicy ) ;
314+ writer . WriteToken ( Roles . Dot , "." ) ;
315+ }
300316 writer . WriteKeyword ( OperatorDeclaration . OperatorKeywordRole , "operator" ) ;
301317 writer . Space ( ) ;
302318 ConvertType ( member . ReturnType , writer , formattingPolicy ) ;
@@ -305,19 +321,29 @@ void WriteMemberDeclarationName(IMember member, TokenWriter writer, CSharpFormat
305321 case "op_CheckedExplicit" :
306322 writer . WriteKeyword ( OperatorDeclaration . ExplicitRole , "explicit" ) ;
307323 writer . Space ( ) ;
324+ if ( explicitInterfaceType != null )
325+ {
326+ ConvertType ( explicitInterfaceType , writer , formattingPolicy ) ;
327+ writer . WriteToken ( Roles . Dot , "." ) ;
328+ }
308329 writer . WriteKeyword ( OperatorDeclaration . OperatorKeywordRole , "operator" ) ;
309330 writer . Space ( ) ;
310- if ( member . Name == "op_CheckedExplicit" )
331+ if ( name == "op_CheckedExplicit" )
311332 {
312333 writer . WriteToken ( OperatorDeclaration . CheckedKeywordRole , "checked" ) ;
313334 writer . Space ( ) ;
314335 }
315336 ConvertType ( member . ReturnType , writer , formattingPolicy ) ;
316337 break ;
317338 default :
339+ if ( explicitInterfaceType != null )
340+ {
341+ ConvertType ( explicitInterfaceType , writer , formattingPolicy ) ;
342+ writer . WriteToken ( Roles . Dot , "." ) ;
343+ }
318344 writer . WriteKeyword ( OperatorDeclaration . OperatorKeywordRole , "operator" ) ;
319345 writer . Space ( ) ;
320- var operatorType = OperatorDeclaration . GetOperatorType ( member . Name ) ;
346+ var operatorType = OperatorDeclaration . GetOperatorType ( name ) ;
321347 if ( operatorType . HasValue && ! ( ( ConversionFlags & ConversionFlags . SupportOperatorChecked ) == 0 && OperatorDeclaration . IsChecked ( operatorType . Value ) ) )
322348 {
323349 if ( OperatorDeclaration . IsChecked ( operatorType . Value ) )
@@ -335,7 +361,12 @@ void WriteMemberDeclarationName(IMember member, TokenWriter writer, CSharpFormat
335361 }
336362 break ;
337363 default :
338- writer . WriteIdentifier ( Identifier . Create ( member . Name ) ) ;
364+ if ( explicitInterfaceType != null )
365+ {
366+ ConvertType ( explicitInterfaceType , writer , formattingPolicy ) ;
367+ writer . WriteToken ( Roles . Dot , "." ) ;
368+ }
369+ writer . WriteIdentifier ( Identifier . Create ( name ) ) ;
339370 break ;
340371 }
341372 WriteTypeParameters ( node , writer , formattingPolicy ) ;
@@ -407,6 +438,17 @@ public void ConvertType(IType type, TokenWriter writer, CSharpFormattingOptions
407438 astType . AcceptVisitor ( new CSharpOutputVisitor ( writer , formattingPolicy ) ) ;
408439 }
409440
441+ IType GetExplicitInterfaceType ( IMember member )
442+ {
443+ if ( member . IsExplicitInterfaceImplementation )
444+ {
445+ var baseMember = member . ExplicitlyImplementedInterfaceMembers . FirstOrDefault ( ) ;
446+ if ( baseMember != null )
447+ return baseMember . DeclaringType ;
448+ }
449+ return null ;
450+ }
451+
410452 public string ConvertConstantValue ( object constantValue )
411453 {
412454 return TextWriterTokenWriter . PrintPrimitiveValue ( constantValue ) ;
0 commit comments