Skip to content
Merged
Show file tree
Hide file tree
Changes from 17 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/Compilers/CSharp/Portable/CSharpResources.resx
Original file line number Diff line number Diff line change
Expand Up @@ -699,6 +699,9 @@
<data name="ERR_NamespaceUnexpected" xml:space="preserve">
<value>A namespace cannot directly contain members such as fields, methods or statements</value>
</data>
<data name="ERR_CompilationUnitUnexpected" xml:space="preserve">
<value>A compilation unit cannot directly contain members such as fields, methods or properties</value>
</data>
<data name="ERR_NoSuchMember" xml:space="preserve">
<value>'{0}' does not contain a definition for '{1}'</value>
</data>
Expand Down
1 change: 1 addition & 0 deletions src/Compilers/CSharp/Portable/Errors/ErrorCode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2445,6 +2445,7 @@ internal enum ErrorCode
ERR_EqualityOperatorInPatternNotSupported = 9344,
ERR_InequalityOperatorInPatternNotSupported = 9345,
ERR_EncUpdateRequiresEmittingExplicitInterfaceImplementationNotSupportedByTheRuntime = 9346,
ERR_CompilationUnitUnexpected = 9347,

// Note: you will need to do the following after adding errors:
// 1) Update ErrorFacts.IsBuildOnlyDiagnostic (src/Compilers/CSharp/Portable/Errors/ErrorFacts.cs)
Expand Down
1 change: 1 addition & 0 deletions src/Compilers/CSharp/Portable/Errors/ErrorFacts.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2553,6 +2553,7 @@ or ErrorCode.ERR_UnexpectedArgumentListInBaseTypeWithoutParameterList
or ErrorCode.ERR_EqualityOperatorInPatternNotSupported
or ErrorCode.ERR_InequalityOperatorInPatternNotSupported
or ErrorCode.ERR_DesignatorBeforePropertyPattern
or ErrorCode.ERR_CompilationUnitUnexpected
=> false,
};
#pragma warning restore CS8524 // The switch expression does not handle some values of its input type (it is not exhaustive) involving an unnamed enum value.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5516,12 +5516,10 @@ private void AddNonTypeMembers(

// Lang version check for ref-fields is done inside SourceMemberFieldSymbol;
_ = fieldSyntax.Declaration.Type.SkipScoped(out _).SkipRefInField(out var refKind);

if (IsImplicitClass && reportMisplacedGlobalCode)
{
diagnostics.Add(ErrorCode.ERR_NamespaceUnexpected,
new SourceLocation(fieldSyntax.Declaration.Variables.First().Identifier));
}
reportMisplacedMemberInNamespace(
fieldSyntax,
fieldSyntax.Declaration.Variables.First().Identifier,
reportMisplacedGlobalCode);

bool modifierErrors;
var modifiers = SourceMemberFieldSymbol.MakeModifiers(this, fieldSyntax.Declaration.Variables[0].Identifier, fieldSyntax.Modifiers, isRefField: refKind != RefKind.None, diagnostics, out modifierErrors);
Expand Down Expand Up @@ -5561,11 +5559,10 @@ private void AddNonTypeMembers(
case SyntaxKind.MethodDeclaration:
{
var methodSyntax = (MethodDeclarationSyntax)m;
if (IsImplicitClass && reportMisplacedGlobalCode)
{
diagnostics.Add(ErrorCode.ERR_NamespaceUnexpected,
new SourceLocation(methodSyntax.Identifier));
}
reportMisplacedMemberInNamespace(
methodSyntax,
methodSyntax.Identifier,
reportMisplacedGlobalCode);

var method = SourceOrdinaryMethodSymbol.CreateMethodSymbol(this, bodyBinder, methodSyntax, compilation.IsNullableAnalysisEnabledIn(methodSyntax), diagnostics);
builder.NonTypeMembersWithPartialImplementations.Add(method);
Expand All @@ -5575,11 +5572,10 @@ private void AddNonTypeMembers(
case SyntaxKind.ConstructorDeclaration:
{
var constructorSyntax = (ConstructorDeclarationSyntax)m;
if (IsImplicitClass && reportMisplacedGlobalCode)
{
diagnostics.Add(ErrorCode.ERR_NamespaceUnexpected,
new SourceLocation(constructorSyntax.Identifier));
}
reportMisplacedMemberInNamespace(
constructorSyntax,
constructorSyntax.Identifier,
reportMisplacedGlobalCode);

bool isNullableEnabled = compilation.IsNullableAnalysisEnabledIn(constructorSyntax);
var constructor = SourceConstructorSymbol.CreateConstructorSymbol(this, constructorSyntax, isNullableEnabled, diagnostics);
Expand All @@ -5594,11 +5590,10 @@ private void AddNonTypeMembers(
case SyntaxKind.DestructorDeclaration:
{
var destructorSyntax = (DestructorDeclarationSyntax)m;
if (IsImplicitClass && reportMisplacedGlobalCode)
{
diagnostics.Add(ErrorCode.ERR_NamespaceUnexpected,
new SourceLocation(destructorSyntax.Identifier));
}
reportMisplacedMemberInNamespace(
destructorSyntax,
destructorSyntax.Identifier,
reportMisplacedGlobalCode);

// CONSIDER: if this doesn't (directly or indirectly) override object.Finalize, the
// runtime won't consider it a finalizer and it will not be marked as a destructor
Expand All @@ -5612,11 +5607,10 @@ private void AddNonTypeMembers(
case SyntaxKind.PropertyDeclaration:
{
var propertySyntax = (PropertyDeclarationSyntax)m;
if (IsImplicitClass && reportMisplacedGlobalCode)
{
diagnostics.Add(ErrorCode.ERR_NamespaceUnexpected,
new SourceLocation(propertySyntax.Identifier));
}
reportMisplacedMemberInNamespace(
propertySyntax,
propertySyntax.Identifier,
reportMisplacedGlobalCode);

var property = SourcePropertySymbol.Create(this, bodyBinder, propertySyntax, diagnostics);
builder.NonTypeMembersWithPartialImplementations.Add(property);
Expand Down Expand Up @@ -5663,12 +5657,10 @@ private void AddNonTypeMembers(
case SyntaxKind.EventFieldDeclaration:
{
var eventFieldSyntax = (EventFieldDeclarationSyntax)m;
if (IsImplicitClass && reportMisplacedGlobalCode)
{
diagnostics.Add(
ErrorCode.ERR_NamespaceUnexpected,
new SourceLocation(eventFieldSyntax.Declaration.Variables.First().Identifier));
}
reportMisplacedMemberInNamespace(
eventFieldSyntax,
eventFieldSyntax.Declaration.Variables.First().Identifier,
reportMisplacedGlobalCode);

foreach (VariableDeclaratorSyntax declarator in eventFieldSyntax.Declaration.Variables)
{
Expand Down Expand Up @@ -5717,11 +5709,10 @@ private void AddNonTypeMembers(
case SyntaxKind.EventDeclaration:
{
var eventSyntax = (EventDeclarationSyntax)m;
if (IsImplicitClass && reportMisplacedGlobalCode)
{
diagnostics.Add(ErrorCode.ERR_NamespaceUnexpected,
new SourceLocation(eventSyntax.Identifier));
}
reportMisplacedMemberInNamespace(
eventSyntax,
eventSyntax.Identifier,
reportMisplacedGlobalCode);

var @event = new SourceCustomEventSymbol(this, bodyBinder, eventSyntax, diagnostics);

Expand All @@ -5737,11 +5728,10 @@ private void AddNonTypeMembers(
case SyntaxKind.IndexerDeclaration:
{
var indexerSyntax = (IndexerDeclarationSyntax)m;
if (IsImplicitClass && reportMisplacedGlobalCode)
{
diagnostics.Add(ErrorCode.ERR_NamespaceUnexpected,
new SourceLocation(indexerSyntax.ThisKeyword));
}
reportMisplacedMemberInNamespace(
indexerSyntax,
indexerSyntax.ThisKeyword,
reportMisplacedGlobalCode);

var indexer = SourcePropertySymbol.Create(this, bodyBinder, indexerSyntax, diagnostics);
builder.HaveIndexers = true;
Expand All @@ -5754,11 +5744,10 @@ private void AddNonTypeMembers(
case SyntaxKind.ConversionOperatorDeclaration:
{
var conversionOperatorSyntax = (ConversionOperatorDeclarationSyntax)m;
if (IsImplicitClass && reportMisplacedGlobalCode)
{
diagnostics.Add(ErrorCode.ERR_NamespaceUnexpected,
new SourceLocation(conversionOperatorSyntax.OperatorKeyword));
}
reportMisplacedMemberInNamespace(
conversionOperatorSyntax,
conversionOperatorSyntax.OperatorKeyword,
reportMisplacedGlobalCode);

var method = SourceUserDefinedConversionSymbol.CreateUserDefinedConversionSymbol(
this, bodyBinder, conversionOperatorSyntax, compilation.IsNullableAnalysisEnabledIn(conversionOperatorSyntax), diagnostics);
Expand All @@ -5769,11 +5758,10 @@ private void AddNonTypeMembers(
case SyntaxKind.OperatorDeclaration:
{
var operatorSyntax = (OperatorDeclarationSyntax)m;
if (IsImplicitClass && reportMisplacedGlobalCode)
{
diagnostics.Add(ErrorCode.ERR_NamespaceUnexpected,
new SourceLocation(operatorSyntax.OperatorKeyword));
}
reportMisplacedMemberInNamespace(
operatorSyntax,
operatorSyntax.OperatorKeyword,
reportMisplacedGlobalCode);

var method = SourceUserDefinedOperatorSymbol.CreateUserDefinedOperatorSymbol(
this, bodyBinder, operatorSyntax, compilation.IsNullableAnalysisEnabledIn(operatorSyntax), diagnostics);
Expand Down Expand Up @@ -5849,6 +5837,18 @@ SyntaxKind.FileScopedNamespaceDeclaration or

AddInitializers(builder.InstanceInitializers, instanceInitializers);
AddInitializers(builder.StaticInitializers, staticInitializers);

void reportMisplacedMemberInNamespace(SyntaxNode member, SyntaxToken locationSyntax, bool reportMisplacedGlobalCode)
{
if (IsImplicitClass && reportMisplacedGlobalCode)
{
var parentSyntax = member.Parent;
var errorCode = parentSyntax.IsKind(SyntaxKind.CompilationUnit)
? ErrorCode.ERR_CompilationUnitUnexpected
: ErrorCode.ERR_NamespaceUnexpected;
diagnostics.Add(errorCode, new SourceLocation(locationSyntax));
}
}
}

private void AddAccessorIfAvailable(ArrayBuilder<Symbol> symbols, MethodSymbol? accessorOpt)
Expand Down
5 changes: 5 additions & 0 deletions src/Compilers/CSharp/Portable/xlf/CSharpResources.cs.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Compilers/CSharp/Portable/xlf/CSharpResources.de.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Compilers/CSharp/Portable/xlf/CSharpResources.es.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Compilers/CSharp/Portable/xlf/CSharpResources.fr.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Compilers/CSharp/Portable/xlf/CSharpResources.it.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Compilers/CSharp/Portable/xlf/CSharpResources.ja.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Compilers/CSharp/Portable/xlf/CSharpResources.ko.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Compilers/CSharp/Portable/xlf/CSharpResources.pl.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading