Skip to content

Commit f831448

Browse files
committed
Unify logic and comments
1 parent 920c259 commit f831448

File tree

1 file changed

+62
-42
lines changed

1 file changed

+62
-42
lines changed

src/Compiler/Checking/AttributeChecking.fs

+62-42
Original file line numberDiff line numberDiff line change
@@ -249,77 +249,97 @@ let private CheckCompilerFeatureRequiredAttribute (g: TcGlobals) cattrs msg m =
249249
| _ ->
250250
ErrorD (ObsoleteDiagnostic(true, "", msg, "", m))
251251

252-
let private CheckILObsoleteAttributes (g: TcGlobals) isByrefLikeTyconRef cattrs m =
252+
let private extractILObsoleteAttributeInfo namedArgs =
253253
let extractILAttribValueFrom name namedArgs =
254254
match namedArgs with
255255
| ExtractILAttributeNamedArg name (AttribElemStringArg v) -> v
256256
| _ -> ""
257-
let (AttribInfo(tref,_)) = g.attrib_SystemObsolete
258-
match TryDecodeILAttribute tref cattrs with
259-
| Some ([ILAttribElem.String (Some msg) ], namedArgs) when not isByrefLikeTyconRef ->
260-
let diagnosticId = extractILAttribValueFrom "DiagnosticId" namedArgs
261-
let urlFormat = extractILAttribValueFrom "UrlFormat" namedArgs
262-
WarnD(ObsoleteDiagnostic(false, diagnosticId, msg, urlFormat, m))
263-
| Some ([ILAttribElem.String (Some msg); ILAttribElem.Bool isError ], namedArgs) when not isByrefLikeTyconRef ->
264-
let diagnosticId = extractILAttribValueFrom "DiagnosticId" namedArgs
265-
let urlFormat = extractILAttribValueFrom "UrlFormat" namedArgs
266-
if isError then
267-
if g.langVersion.SupportsFeature(LanguageFeature.RequiredPropertiesSupport) then
268-
CheckCompilerFeatureRequiredAttribute g cattrs msg m
269-
else
270-
ErrorD (ObsoleteDiagnostic(true, diagnosticId, msg, urlFormat, m))
271-
else
272-
WarnD (ObsoleteDiagnostic(false, diagnosticId, msg, urlFormat, m))
257+
let diagnosticId = extractILAttribValueFrom "DiagnosticId" namedArgs
258+
let urlFormat = extractILAttribValueFrom "UrlFormat" namedArgs
259+
(diagnosticId, urlFormat)
273260

274-
| Some ([ILAttribElem.String None ], namedArgs) when not isByrefLikeTyconRef ->
275-
let diagnosticId = extractILAttribValueFrom "DiagnosticId" namedArgs
276-
let urlFormat = extractILAttribValueFrom "UrlFormat" namedArgs
277-
WarnD(ObsoleteDiagnostic(false, diagnosticId, "", urlFormat, m))
278-
| Some (_, namedArgs) when not isByrefLikeTyconRef ->
279-
let diagnosticId = extractILAttribValueFrom "DiagnosticId" namedArgs
280-
let urlFormat = extractILAttribValueFrom "UrlFormat" namedArgs
281-
WarnD(ObsoleteDiagnostic(false, diagnosticId, "", urlFormat, m))
282-
| _ ->
261+
let private CheckILObsoleteAttributes (g: TcGlobals) isByrefLikeTyconRef cattrs m =
262+
if isByrefLikeTyconRef then
283263
CompleteD
264+
else
265+
let (AttribInfo(tref,_)) = g.attrib_SystemObsolete
266+
match TryDecodeILAttribute tref cattrs with
267+
// [<Obsolete>]
268+
// [<Obsolete("Message")>]
269+
// [<Obsolete("Message", true)>]
270+
// [<Obsolete("Message", DiagnosticId = "DiagnosticId")>]
271+
// [<Obsolete("Message", DiagnosticId = "DiagnosticId", UrlFormat = "UrlFormat")>]
272+
// [<Obsolete(DiagnosticId = "DiagnosticId")>]
273+
// [<Obsolete(DiagnosticId = "DiagnosticId", UrlFormat = "UrlFormat")>]
274+
// [<Obsolete("Message", true, DiagnosticId = "DiagnosticId")>]
275+
// [<Obsolete("Message", true, DiagnosticId = "DiagnosticId", UrlFormat = "UrlFormat")>]
276+
// Constructors deciding on IsError and Message properties.
277+
| Some ([ attribElement ], namedArgs) ->
278+
let diagnosticId, urlFormat = extractILObsoleteAttributeInfo namedArgs
279+
let msg =
280+
match attribElement with
281+
| ILAttribElem.String (Some msg) -> msg
282+
| ILAttribElem.String None
283+
| _ -> ""
284+
285+
WarnD (ObsoleteDiagnostic(false, diagnosticId, msg, urlFormat, m))
286+
| Some ([ILAttribElem.String (Some msg); ILAttribElem.Bool isError ], namedArgs) ->
287+
let diagnosticId, urlFormat = extractILObsoleteAttributeInfo namedArgs
288+
if isError then
289+
if g.langVersion.SupportsFeature(LanguageFeature.RequiredPropertiesSupport) then
290+
CheckCompilerFeatureRequiredAttribute g cattrs msg m
291+
else
292+
ErrorD (ObsoleteDiagnostic(true, diagnosticId, msg, urlFormat, m))
293+
else
294+
WarnD (ObsoleteDiagnostic(false, diagnosticId, msg, urlFormat, m))
295+
296+
// No message, no error, no diagnostic id, no url format
297+
| Some _ -> WarnD(ObsoleteDiagnostic(false, "", "", "", m))
298+
| None -> CompleteD
284299

285300
/// Check IL attributes for 'ObsoleteAttribute', returning errors and warnings as data
286301
let private CheckILAttributes (g: TcGlobals) isByrefLikeTyconRef cattrs m =
287302
trackErrors {
288303
do! CheckILObsoleteAttributes g isByrefLikeTyconRef cattrs m
289304
}
305+
290306
let langVersionPrefix = "--langversion:preview"
291307

292-
let private CheckObsoleteAttributes g attribs m =
293-
let extractAttribValueFrom name namedArgs =
308+
let private extractObsoleteAttributeInfo namedArgs =
309+
let extractILAttribValueFrom name namedArgs =
294310
match namedArgs with
295311
| ExtractAttribNamedArg name (AttribStringArg v) -> v
296312
| _ -> ""
313+
let diagnosticId = extractILAttribValueFrom "DiagnosticId" namedArgs
314+
let urlFormat = extractILAttribValueFrom "UrlFormat" namedArgs
315+
(diagnosticId, urlFormat)
297316

317+
let private CheckObsoleteAttributes g attribs m =
298318
trackErrors {
299319
match TryFindFSharpAttribute g g.attrib_SystemObsolete attribs with
320+
// [<Obsolete>]
321+
// [<Obsolete("Message")>]
322+
// [<Obsolete("Message", true)>]
323+
// [<Obsolete("Message", DiagnosticId = "DiagnosticId")>]
324+
// [<Obsolete("Message", DiagnosticId = "DiagnosticId", UrlFormat = "UrlFormat")>]
325+
// [<Obsolete(DiagnosticId = "DiagnosticId")>]
326+
// [<Obsolete(DiagnosticId = "DiagnosticId", UrlFormat = "UrlFormat")>]
327+
// [<Obsolete("Message", true, DiagnosticId = "DiagnosticId")>]
328+
// [<Obsolete("Message", true, DiagnosticId = "DiagnosticId", UrlFormat = "UrlFormat")>]
329+
// Constructors deciding on IsError and Message properties.
300330
| Some(Attrib(unnamedArgs= [ AttribStringArg s ]; propVal= namedArgs)) ->
301-
let diagnosticId = extractAttribValueFrom "DiagnosticId" namedArgs
302-
let urlFormat = extractAttribValueFrom "UrlFormat" namedArgs
331+
let diagnosticId, urlFormat = extractObsoleteAttributeInfo namedArgs
303332
do! WarnD(ObsoleteDiagnostic(false, diagnosticId, s, urlFormat, m))
304-
305333
| Some(Attrib(unnamedArgs= [ AttribStringArg s; AttribBoolArg(isError) ]; propVal= namedArgs)) ->
306-
let diagnosticId = extractAttribValueFrom "DiagnosticId" namedArgs
307-
let urlFormat = extractAttribValueFrom "UrlFormat" namedArgs
334+
let diagnosticId, urlFormat = extractObsoleteAttributeInfo namedArgs
308335
if isError then
309336
do! ErrorD (ObsoleteDiagnostic(true, diagnosticId, s, urlFormat, m))
310337
else
311338
do! WarnD (ObsoleteDiagnostic(false, diagnosticId, s, urlFormat, m))
312-
| Some(Attrib(unnamedArgs= [ AttribStringArg s ]; propVal= namedArgs)) ->
313-
let diagnosticId = extractAttribValueFrom "DiagnosticId" namedArgs
314-
let urlFormat = extractAttribValueFrom "UrlFormat" namedArgs
315-
316-
do! WarnD(ObsoleteDiagnostic(false, diagnosticId, s, urlFormat, m))
317339
| Some(Attrib(propVal= namedArgs)) ->
318-
let diagnosticId = extractAttribValueFrom "DiagnosticId" namedArgs
319-
let urlFormat = extractAttribValueFrom "UrlFormat" namedArgs
340+
let diagnosticId, urlFormat = extractObsoleteAttributeInfo namedArgs
320341
do! WarnD(ObsoleteDiagnostic(false, diagnosticId, "", urlFormat, m))
321-
| None ->
322-
()
342+
| None -> ()
323343
}
324344

325345
let private CheckCompilerMessageAttribute g attribs m =

0 commit comments

Comments
 (0)