-
Notifications
You must be signed in to change notification settings - Fork 4.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add support for enable/safeonly/nullable within #pragma directive #32208
Add support for enable/safeonly/nullable within #pragma directive #32208
Conversation
@@ -127,7 +127,7 @@ internal enum MessageID | |||
IDS_FeatureTuples = MessageBase + 12711, | |||
IDS_FeatureOutVar = MessageBase + 12713, | |||
|
|||
// IDS_FeatureIOperation = MessageBase + 12714, | |||
IDS_FeaturePragmaWarningEnableOrSafeOnly = MessageBase + 12714, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
IDS_FeaturePragmaWarningEnableOrSafeOnly [](start = 8, length = 40)
What's the benefit of using a discrete feature. Feels like IDS_FeatureNullableReferenceTypes
would be good for this, since tightly related to nullability. #Resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What's the benefit of using a discrete feature. Feels like IDS_FeatureNullableReferenceTypes would be good for this, since tightly related to nullability.
The following code is not related to nullability, but is going to cause problems with legacy compiler.
#pragma warning enable
In reply to: 245817714 [](ancestors = 245817714)
@@ -22253,21 +22253,33 @@ public SyntaxToken DisableOrRestoreKeyword | |||
get { return new SyntaxToken(this, ((Microsoft.CodeAnalysis.CSharp.Syntax.InternalSyntax.PragmaWarningDirectiveTriviaSyntax)this.Green).disableOrRestoreKeyword, this.GetChildPosition(3), this.GetChildIndex(3)); } | |||
} | |||
|
|||
public SyntaxToken NullableKeyword |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
NullableKeyword [](start = 23, length = 15)
Consider using a more generic name, such as Target
or Group
. Feels like we introduce more targets/groups in the future.
@@ -461,64 +461,86 @@ private DirectiveTriviaSyntax ParsePragmaDirective(SyntaxToken hash, SyntaxToken | |||
{ | |||
var warning = this.EatContextualToken(SyntaxKind.WarningKeyword); | |||
SyntaxToken style; | |||
if (this.CurrentToken.Kind == SyntaxKind.DisableKeyword || this.CurrentToken.Kind == SyntaxKind.RestoreKeyword) | |||
if (this.CurrentToken.Kind == SyntaxKind.DisableKeyword || this.CurrentToken.Kind == SyntaxKind.RestoreKeyword || |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if [](start = 16, length = 2)
Consider using switch (this.CurrentToken.Kind)
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Consider using switch (this.CurrentToken.Kind).
I do not think the use of switch is warranted here. If you are concerned about multiple evaluations of this.CurrentToken.Kind
property, I can cache its value in a local and reuse. Let me know.
In reply to: 245823259 [](ancestors = 245823259)
{ | ||
var source = | ||
@" | ||
#pragma warning disable nullable |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please update the nullable speclet for #pragma change.
It looks like previous #nullable change were also not captured. #WontFix
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please update the nullable speclet for #pragma change.
It looks like previous #nullable change were also not captured.
There is nothing to update in the speclet because it does not contain obsolete/invalid information. I see no good reason to reflect every implementation step in the speclet or duplicate specification in multiple places, implemented specification can be found here https://github.com/dotnet/csharplang/blob/master/proposals/nullable-reference-types-specification.md
In reply to: 245828755 [](ancestors = 245828755)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I forgot that Mads covered that in his spec. That works indeed
In reply to: 245830615 [](ancestors = 245830615,245828755)
{ | ||
var source = | ||
@" | ||
#pragma warning safeonly nullable |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's a language question, but this seems strange. I expected #pragma warning enable safeonly
for this #Resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I see that's documented that way in Mads's spec. I'll shoot him an email, but that should not block the PR.
In reply to: 245829621 [](ancestors = 245829621)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's a language question, but this seems strange. I expected #pragma warning enable safeonly for this
There is a language spec for this here https://github.com/dotnet/csharplang/blob/master/proposals/nullable-reference-types-specification.md and I believe the relevant portion has been reviewed before cristmas.
In reply to: 245829621 [](ancestors = 245829621)
directiveState = PragmaWarningState.Disabled; | ||
break; | ||
case SyntaxKind.RestoreKeyword: | ||
directiveState = PragmaWarningState.Default; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Allowing restore
for error codes too is not covered in https://github.com/dotnet/csharplang/blob/master/proposals/nullable-reference-types-specification.md
Please confirm with Mads and get it added to the spec if appropriate.
#Resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Allowing restore for error codes too is not covered in https://github.com/dotnet/csharplang/blob/master/proposals/nullable-reference-types-specification.md
Please confirm with Mads and get it added to the spec if appropriate.
There is no change around restore
, it was always supported. The added actions are enable
and safeonly
.
In reply to: 245837409 [](ancestors = 245837409)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
My bad, I thought we previously supported enable
and disable
.
Then my question should be on enable
. What happens with #pragma warning enable 1234
?
In reply to: 245838133 [](ancestors = 245838133,245837409)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Then my question should be on enable. What happens with #pragma warning enable 1234?
It enables the warning, this is also part of the spec
In reply to: 245839503 [](ancestors = 245839503,245838133,245837409)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM Thanks
#pragma warning safeonly 1695 | ||
"; | ||
CreateCompilation(text, parseOptions: TestOptions.Regular7_3).VerifyDiagnostics( | ||
// (3,17): warning CS1658: Feature 'warning action enable or safeonly' is not available in C# 7.3. Please use language version 8.0 or greater.. See also error CS8370. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
.. [](start = 157, length = 2)
Extra .
#Resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Extra .
Preexisting condition. This happens due to the way CS1658 is created. We have several instances in src\Compilers\CSharp\Test\Syntax\Parsing\ParserErrorMessageTests.cs already:
// (2,17): warning CS1658: Feature 'generics' is not available in C# 1. Please use language version 2 or greater.. See also error CS8022.
// (2,16): warning CS1658: Feature 'namespace alias qualifier' is not available in C# 1. Please use language version 2 or greater.. See also error CS8022.
// (3,16): warning CS1658: Feature 'namespace alias qualifier' is not available in C# 1. Please use language version 2 or greater.. See also error CS8022.
In reply to: 245846819 [](ancestors = 245846819)
#pragma warning safeonly 1695 | ||
"; | ||
CreateCompilation(text, parseOptions: TestOptions.Regular7_3).VerifyDiagnostics( | ||
// (3,17): warning CS1658: Feature 'warning action enable or safeonly' is not available in C# 7.3. Please use language version 8.0 or greater.. See also error CS8370. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
See also error CS8370. [](start = 160, length = 22)
What does this mean? #Resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What does this mean?
I assume this means that that error was changed to a warning and documentation for it should be looked at for more information about why the warning is reported. In this case it is a language version mismatch error converted to a warning
In reply to: 245846859 [](ancestors = 245846859)
approved |
Customer scenario
The spec the nullable reference types in C# 8.0 beta includes support for
#pragma warning enable|safeonly nullable
.Bugs this fixes
Umbrella for nullable feature: #22152
Workarounds, if any
You could control/suppress warnings individually, but the "nullable" group has many warnings.
Risk
Performance impact
Low. This is a shorthand to suppress many warnings at once, which is already possible today (just quite long/verbose compared to this new syntax).
Is this a regression from a previous update?
No
Root cause analysis
Part of new C# 8.0 beta feature
How was the bug found?
Filed https://devdiv.visualstudio.com/DevDiv/_workitems/edit/763407 for shiproom purpose
The relevant portion of the spec https://github.com/dotnet/csharplang/blob/master/proposals/nullable-reference-types-specification.md is implemented.