提交 d0a377e6 编写于 作者: C CyrusNajmabadi 提交者: GitHub

Merge pull request #16087 from CyrusNajmabadi/parserDiagnostics

Move diagnostic from parser to later phase.
......@@ -138,6 +138,11 @@ internal string GetDebuggerDisplay()
if (usingDirective.Alias != null)
{
if (usingDirective.Alias.Name.Identifier.ContextualKind() == SyntaxKind.GlobalKeyword)
{
diagnostics.Add(ErrorCode.WRN_GlobalAliasDefn, usingDirective.Alias.Name.Location);
}
if (usingDirective.StaticKeyword != default(SyntaxToken))
{
diagnostics.Add(ErrorCode.ERR_NoAliasHere, usingDirective.Alias.Name.Location);
......
......@@ -59,11 +59,6 @@ private static bool IsName(CSharpSyntaxNode node, SyntaxKind kind)
}
}
private static bool IsNameGlobal(CSharpSyntaxNode node)
{
return IsName(node, SyntaxKind.GlobalKeyword);
}
private static bool IsNameGet(CSharpSyntaxNode node)
{
return IsName(node, SyntaxKind.GetKeyword);
......@@ -865,20 +860,12 @@ private ExternAliasDirectiveSyntax ParseExternAliasDirective()
return _syntaxFactory.ExternAliasDirective(externToken, aliasToken, name, semicolon);
}
private NameEqualsSyntax ParseNameEquals(bool warnOnGlobal = false)
private NameEqualsSyntax ParseNameEquals()
{
Debug.Assert(this.IsNamedAssignment());
var id = this.ParseIdentifierToken();
var equals = this.EatToken(SyntaxKind.EqualsToken);
// Warn on "using global = X".
if (warnOnGlobal && IsNameGlobal(id))
{
id = this.AddError(id, ErrorCode.WRN_GlobalAliasDefn);
}
return _syntaxFactory.NameEquals(_syntaxFactory.IdentifierName(id), equals);
return _syntaxFactory.NameEquals(
_syntaxFactory.IdentifierName(this.ParseIdentifierToken()),
this.EatToken(SyntaxKind.EqualsToken));
}
private UsingDirectiveSyntax ParseUsingDirective()
......@@ -898,11 +885,7 @@ private UsingDirectiveSyntax ParseUsingDirective()
staticToken = this.EatToken(SyntaxKind.StaticKeyword);
}
NameEqualsSyntax alias = null;
if (this.IsNamedAssignment())
{
alias = ParseNameEquals(warnOnGlobal: true);
}
var alias = this.IsNamedAssignment() ? ParseNameEquals() : null;
NameSyntax name;
SyntaxToken semicolon;
......
......@@ -3326,18 +3326,21 @@ public void TestPragmaWarningDisableWithMultipleCodes()
[Trait("Feature", "Directives")]
public void TestRegressPragmaWarningDisableWithWarningCode()
{
var text = @"#pragma warning disable 440
using global = A; // CS0440
var text = @"
class A
{
static void Main() { }
static void Main(bool b)
{
#pragma warning disable 642
if (b);{}
}
}
";
// verify that error still appears in GetDiagnostics
var tree = SyntaxFactory.ParseSyntaxTree(text);
var diagnostic = tree.GetDiagnostics().Single();
Assert.Equal(DiagnosticSeverity.Warning, diagnostic.Severity);
Assert.Equal(440, diagnostic.Code);
Assert.Equal(642, diagnostic.Code);
// verify pragma information
var node = tree.GetCompilationUnitRoot();
......@@ -3346,7 +3349,7 @@ class A
PragmaKind = SyntaxKind.PragmaWarningDirectiveTrivia,
WarningOrChecksumKind = SyntaxKind.WarningKeyword,
DisableOrRestoreKind = SyntaxKind.DisableKeyword,
WarningList = new[] { "440" }
WarningList = new[] { "642" }
});
// verify that GetParseDiagnostics filters disabled warning
......
......@@ -4543,7 +4543,13 @@ static void Main()
}
";
ParseAndValidate(test, Diagnostic(ErrorCode.WRN_GlobalAliasDefn, "global"));
CreateCompilationWithMscorlib(test).VerifyDiagnostics(
// (2,7): warning CS0440: Defining an alias named 'global' is ill-advised since 'global::' always references the global namespace and not an alias
// using global = MyClass; // CS0440
Diagnostic(ErrorCode.WRN_GlobalAliasDefn, "global").WithLocation(2, 7),
// (2,1): hidden CS8019: Unnecessary using directive.
// using global = MyClass; // CS0440
Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using global = MyClass;").WithLocation(2, 1));
}
[Fact]
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册