@@ -517,18 +517,6 @@ protected override StringBuilder AppendModifiers (StringBuilder buf, MethodDefin
517517 if ( method . IsFinal ) modifiers += " sealed" ;
518518 if ( modifiers == " virtual sealed" ) modifiers = "" ;
519519
520- if ( ( method . ReturnType . IsRequiredModifier
521- && ( ( RequiredModifierType ) method . ReturnType ) . ElementType . IsByReference )
522- || method . ReturnType . IsByReference )
523- {
524- modifiers += " ref" ;
525- }
526-
527- if ( method . ReturnType . IsRequiredModifier && DocUtils . HasCustomAttribute ( method . MethodReturnType , Consts . IsReadOnlyAttribute ) )
528- {
529- modifiers += " readonly" ;
530- }
531-
532520 switch ( method . Name )
533521 {
534522 case "op_Implicit" :
@@ -542,6 +530,24 @@ protected override StringBuilder AppendModifiers (StringBuilder buf, MethodDefin
542530 return buf . Append ( modifiers ) ;
543531 }
544532
533+ protected override StringBuilder AppendRefTypeName ( StringBuilder buf , ByReferenceType type , IAttributeParserContext context )
534+ {
535+ buf . Append ( "ref " ) ;
536+ return base . AppendRefTypeName ( buf , type , context ) ;
537+ }
538+
539+ protected override StringBuilder AppendRequiredModifierTypeName (
540+ StringBuilder buf , RequiredModifierType type , IAttributeParserContext context )
541+ {
542+ if ( type . ModifierType . FullName == Consts . InAttribute && type . ElementType is ByReferenceType refType )
543+ {
544+ buf . Append ( "ref readonly " ) ;
545+ return _AppendTypeName ( buf , refType . ElementType , context ) ;
546+ }
547+
548+ return base . AppendRequiredModifierTypeName ( buf , type , context ) ;
549+ }
550+
545551 protected override StringBuilder AppendGenericMethod ( StringBuilder buf , MethodDefinition method )
546552 {
547553 if ( method . IsGenericMethod ( ) )
@@ -585,19 +591,23 @@ private StringBuilder AppendParameters (StringBuilder buf, MethodDefinition meth
585591
586592 private StringBuilder AppendParameter ( StringBuilder buf , ParameterDefinition parameter )
587593 {
588- if ( parameter . ParameterType is ByReferenceType )
594+ TypeReference parameterType = parameter . ParameterType ;
595+
596+ if ( parameterType is ByReferenceType byReferenceType )
589597 {
590598 if ( parameter . IsOut )
591599 {
592600 buf . Append ( "out " ) ;
593601 }
602+ else if ( parameter . IsIn )
603+ {
604+ buf . Append ( "in " ) ;
605+ }
594606 else
595607 {
596- if ( parameter . HasCustomAttributes && parameter . CustomAttributes . Any ( ca => ca . AttributeType . Name == "IsReadOnlyAttribute" ) )
597- buf . Append ( "in " ) ;
598- else
599- buf . Append ( "ref " ) ;
608+ buf . Append ( "ref " ) ;
600609 }
610+ parameterType = byReferenceType . ElementType ;
601611 }
602612
603613 if ( parameter . HasCustomAttributes )
@@ -609,7 +619,7 @@ private StringBuilder AppendParameter (StringBuilder buf, ParameterDefinition pa
609619
610620 var context = AttributeParserContext . Create ( parameter ) ;
611621 var isNullableType = context . IsNullable ( ) ;
612- buf . Append ( GetTypeName ( parameter . ParameterType , context ) ) ;
622+ buf . Append ( GetTypeName ( parameterType , context ) ) ;
613623 buf . Append ( GetTypeNullableSymbol ( parameter . ParameterType , isNullableType ) ) ;
614624 buf . Append ( " " ) ;
615625 buf . Append ( parameter . Name ) ;
@@ -673,9 +683,6 @@ protected override string GetPropertyDeclaration (PropertyDefinition property)
673683 modifiers = "" ;
674684 buf . Append ( modifiers ) . Append ( ' ' ) ;
675685
676- if ( property . PropertyType . IsByReference )
677- buf . Append ( "ref " ) ;
678-
679686 var context = AttributeParserContext . Create ( property ) ;
680687 var isNullableType = context . IsNullable ( ) ;
681688 var propertyReturnTypeName = GetTypeName ( property . PropertyType , context ) ;
0 commit comments