@@ -26,6 +26,7 @@ internal partial class DiagnosticInfo : IFormattable, IObjectWritable, IObjectRe
2626 private readonly DiagnosticSeverity _defaultSeverity ;
2727 private readonly DiagnosticSeverity _effectiveSeverity ;
2828 private readonly object [ ] _arguments ;
29+ private string _arg = null ;
2930
3031 private static ImmutableDictionary < int , DiagnosticDescriptor > s_errorCodeToDescriptorMap = ImmutableDictionary < int , DiagnosticDescriptor > . Empty ;
3132
@@ -41,10 +42,19 @@ internal DiagnosticInfo(CommonMessageProvider messageProvider, int errorCode)
4142 _defaultSeverity = messageProvider . GetSeverity ( errorCode ) ;
4243 _effectiveSeverity = _defaultSeverity ;
4344 }
45+ // Only the compiler creates instances.
46+ internal DiagnosticInfo ( CommonMessageProvider messageProvider , int errorCode , string arg )
47+ {
48+ _messageProvider = messageProvider ;
49+ _errorCode = errorCode ;
50+ _defaultSeverity = messageProvider . GetSeverity ( errorCode ) ;
51+ _effectiveSeverity = _defaultSeverity ;
52+ _arg = arg ;
53+ }
4454
4555 // Only the compiler creates instances.
4656 internal DiagnosticInfo ( CommonMessageProvider messageProvider , int errorCode , params object [ ] arguments )
47- : this ( messageProvider , errorCode )
57+ : this ( messageProvider , errorCode )
4858 {
4959 AssertMessageSerializable ( arguments ) ;
5060
@@ -53,11 +63,10 @@ internal DiagnosticInfo(CommonMessageProvider messageProvider, int errorCode, pa
5363
5464 private DiagnosticInfo ( DiagnosticInfo original , DiagnosticSeverity overridenSeverity )
5565 {
56- _messageProvider = original . MessageProvider ;
57- _errorCode = original . _errorCode ;
58- _defaultSeverity = original . DefaultSeverity ;
59- _arguments = original . _arguments ;
60-
66+ _messageProvider = original . MessageProvider ;
67+ _errorCode = original . _errorCode ;
68+ _defaultSeverity = original . DefaultSeverity ;
69+ _arguments = original . _arguments ;
6170 _effectiveSeverity = overridenSeverity ;
6271 }
6372
@@ -74,13 +83,13 @@ private static DiagnosticDescriptor GetOrCreateDescriptor(int errorCode, Diagnos
7483
7584 private static DiagnosticDescriptor CreateDescriptor ( int errorCode , DiagnosticSeverity defaultSeverity , CommonMessageProvider messageProvider )
7685 {
77- var id = messageProvider . GetIdForErrorCode ( errorCode ) ;
78- var title = messageProvider . GetTitle ( errorCode ) ;
79- var description = messageProvider . GetDescription ( errorCode ) ;
86+ var id = messageProvider . GetIdForErrorCode ( errorCode ) ;
87+ var title = messageProvider . GetTitle ( errorCode ) ;
88+ var description = messageProvider . GetDescription ( errorCode ) ;
8089 var messageFormat = messageProvider . GetMessageFormat ( errorCode ) ;
81- var helpLink = messageProvider . GetHelpLink ( errorCode ) ;
82- var category = messageProvider . GetCategory ( errorCode ) ;
83- var customTags = GetCustomTags ( defaultSeverity ) ;
90+ var helpLink = messageProvider . GetHelpLink ( errorCode ) ;
91+ var category = messageProvider . GetCategory ( errorCode ) ;
92+ var customTags = GetCustomTags ( defaultSeverity ) ;
8493 return new DiagnosticDescriptor ( id , title , messageFormat , category , defaultSeverity ,
8594 isEnabledByDefault : true , description : description , helpLinkUri : helpLink , customTags : customTags ) ;
8695 }
@@ -91,25 +100,16 @@ internal static void AssertMessageSerializable(object[] args)
91100 foreach ( var arg in args )
92101 {
93102 Debug . Assert ( arg != null ) ;
94-
95- if ( arg is IMessageSerializable )
96- {
97- continue ;
98- }
103+ if ( arg is IMessageSerializable ) continue ;
99104
100105 var type = arg . GetType ( ) ;
101- if ( type == typeof ( string ) || type == typeof ( AssemblyIdentity ) )
102- {
103- continue ;
104- }
106+ if ( type == typeof ( string ) || type == typeof ( AssemblyIdentity ) ) continue ;
105107
106108 var info = type . GetTypeInfo ( ) ;
107- if ( info . IsPrimitive )
108- {
109- continue ;
110- }
109+ if ( info . IsPrimitive ) continue ;
110+
111111
112- Debug . Assert ( false , "Unexpected type: " + type ) ;
112+ Debug . Assert ( false , $ "Unexpected type: { type } " ) ;
113113 }
114114 }
115115
@@ -119,10 +119,8 @@ internal DiagnosticInfo(CommonMessageProvider messageProvider, bool isWarningAsE
119119 {
120120 Debug . Assert ( ! isWarningAsError || _defaultSeverity == DiagnosticSeverity . Warning ) ;
121121
122- if ( isWarningAsError )
123- {
124- _effectiveSeverity = DiagnosticSeverity . Error ;
125- }
122+ if ( isWarningAsError ) _effectiveSeverity = DiagnosticSeverity . Error ;
123+
126124 }
127125
128126 // Create a copy of this instance with a explicit overridden severity
@@ -155,12 +153,20 @@ protected virtual void WriteTo(ObjectWriter writer)
155153 writer . WriteString ( arg . ToString ( ) ) ;
156154 }
157155 }
156+ else if ( count == 0 )
157+ {
158+ if ( _arg != null )
159+ {
160+ writer . WriteString ( _arg ) ;
161+ }
162+ }
158163 }
159164
160165 Func < ObjectReader , object > IObjectReadable . GetReader ( )
161166 {
162167 return this . GetReader ( ) ;
163168 }
169+
164170
165171 protected virtual Func < ObjectReader , object > GetReader ( )
166172 {
@@ -341,26 +347,33 @@ public virtual string GetMessage(IFormatProvider formatProvider = null)
341347
342348 protected object [ ] GetArgumentsToUse ( IFormatProvider formatProvider )
343349 {
344- object [ ] argumentsToUse = null ;
345- for ( int i = 0 ; i < _arguments . Length ; i ++ )
350+ if ( _arguments != null )
346351 {
347- var embedded = _arguments [ i ] as DiagnosticInfo ;
348- if ( embedded != null )
352+ object [ ] argumentsToUse = null ;
353+ for ( int i = 0 ; i < _arguments . Length ; i ++ )
349354 {
350- argumentsToUse = InitializeArgumentListIfNeeded ( argumentsToUse ) ;
351- argumentsToUse [ i ] = embedded . GetMessage ( formatProvider ) ;
352- continue ;
353- }
355+ var embedded = _arguments [ i ] as DiagnosticInfo ;
356+ if ( embedded != null )
357+ {
358+ argumentsToUse = InitializeArgumentListIfNeeded ( argumentsToUse ) ;
359+ argumentsToUse [ i ] = embedded . GetMessage ( formatProvider ) ;
360+ continue ;
361+ }
354362
355- var symbol = _arguments [ i ] as ISymbol ;
356- if ( symbol != null )
357- {
358- argumentsToUse = InitializeArgumentListIfNeeded ( argumentsToUse ) ;
359- argumentsToUse [ i ] = _messageProvider . ConvertSymbolToString ( _errorCode , symbol ) ;
363+ var symbol = _arguments [ i ] as ISymbol ;
364+ if ( symbol != null )
365+ {
366+ argumentsToUse = InitializeArgumentListIfNeeded ( argumentsToUse ) ;
367+ argumentsToUse [ i ] = _messageProvider . ConvertSymbolToString ( _errorCode , symbol ) ;
368+ }
360369 }
361- }
362370
363- return argumentsToUse ?? _arguments ;
371+ return argumentsToUse ?? _arguments ;
372+ }
373+ else
374+ {
375+ return new object [ ] { _arg } ;
376+ }
364377 }
365378
366379 private object [ ] InitializeArgumentListIfNeeded ( object [ ] argumentsToUse )
@@ -378,7 +391,7 @@ private object[] InitializeArgumentListIfNeeded(object[] argumentsToUse)
378391
379392 internal object [ ] Arguments
380393 {
381- get { return _arguments ; }
394+ get { return ( _arg == null ) ? _arguments : new object [ ] { _arg } ; }
382395 }
383396
384397 internal CommonMessageProvider MessageProvider
@@ -455,14 +468,14 @@ private string GetDebuggerDisplay()
455468 // sure we don't call ToString for those.
456469 switch ( Code )
457470 {
458- case InternalErrorCode . Unknown :
459- return "Unresolved DiagnosticInfo" ;
471+ case InternalErrorCode . Unknown :
472+ return "Unresolved DiagnosticInfo" ;
460473
461- case InternalErrorCode . Void :
462- return "Void DiagnosticInfo" ;
474+ case InternalErrorCode . Void :
475+ return "Void DiagnosticInfo" ;
463476
464- default :
465- return ToString ( ) ;
477+ default :
478+ return ToString ( ) ;
466479 }
467480 }
468481
0 commit comments