Skip to content

Commit f95472f

Browse files
authored
File types emit (#61646)
1 parent 1386ea6 commit f95472f

File tree

66 files changed

+1582
-115
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+1582
-115
lines changed

src/Compilers/CSharp/Portable/Binder/Binder_Symbols.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2493,7 +2493,8 @@ protected AssemblySymbol GetForwardedToAssembly(string name, int arity, ref Name
24932493

24942494
// NOTE: This won't work if the type isn't using CLS-style generic naming (i.e. `arity), but this code is
24952495
// only intended to improve diagnostic messages, so false negatives in corner cases aren't a big deal.
2496-
var metadataName = MetadataHelpers.ComposeAritySuffixedMetadataName(name, arity);
2496+
// File types can't be forwarded, so we won't attempt to determine a file identifier to attach to the metadata name.
2497+
var metadataName = MetadataHelpers.ComposeAritySuffixedMetadataName(name, arity, associatedFileIdentifier: null);
24972498
var fullMetadataName = MetadataHelpers.BuildQualifiedName(qualifierOpt?.ToDisplayString(SymbolDisplayFormat.QualifiedNameOnlyFormat), metadataName);
24982499
var result = GetForwardedToAssembly(fullMetadataName, diagnostics, location);
24992500
if ((object)result != null)

src/Compilers/CSharp/Portable/CSharpResources.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7112,6 +7112,9 @@ To remove the warning, you can use /reference instead (set the Embed Interop Typ
71127112
<data name="ERR_FileTypeBase" xml:space="preserve">
71137113
<value>File type '{0}' cannot be used as a base type of non-file type '{1}'.</value>
71147114
</data>
7115+
<data name="ERR_FileTypeNested" xml:space="preserve">
7116+
<value>File type '{0}' must be defined in a top level type; '{0}' is a nested type.</value>
7117+
</data>
71157118
<data name="IDS_FeatureUnsignedRightShift" xml:space="preserve">
71167119
<value>unsigned right shift</value>
71177120
</data>

src/Compilers/CSharp/Portable/Emitter/Model/NamedTypeReference.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,16 @@ bool Cci.INamedTypeReference.MangleName
4040
}
4141
}
4242

43+
#nullable enable
44+
string? Cci.INamedTypeReference.AssociatedFileIdentifier
45+
{
46+
get
47+
{
48+
return UnderlyingNamedType.AssociatedFileIdentifier();
49+
}
50+
}
51+
#nullable disable
52+
4353
string Cci.INamedEntity.Name
4454
{
4555
get

src/Compilers/CSharp/Portable/Emitter/Model/NamedTypeSymbolAdapter.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -756,6 +756,16 @@ bool Cci.INamedTypeReference.MangleName
756756
}
757757
}
758758

759+
#nullable enable
760+
string? Cci.INamedTypeReference.AssociatedFileIdentifier
761+
{
762+
get
763+
{
764+
return AdaptedNamedTypeSymbol.AssociatedFileIdentifier();
765+
}
766+
}
767+
#nullable disable
768+
759769
string Cci.INamedEntity.Name
760770
{
761771
get

src/Compilers/CSharp/Portable/Emitter/Model/PEModuleBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -660,7 +660,7 @@ private void ReportExportedTypeNameCollisions(ImmutableArray<Cci.ExportedType> e
660660
// exported types are not emitted in EnC deltas (hence generation 0):
661661
string fullEmittedName = MetadataHelpers.BuildQualifiedName(
662662
((Cci.INamespaceTypeReference)type.GetCciAdapter()).NamespaceName,
663-
Cci.MetadataWriter.GetMangledName(type.GetCciAdapter(), generation: 0));
663+
Cci.MetadataWriter.GetMetadataName(type.GetCciAdapter(), generation: 0));
664664

665665
// First check against types declared in the primary module
666666
if (ContainsTopLevelType(fullEmittedName))

src/Compilers/CSharp/Portable/Errors/ErrorCode.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2095,6 +2095,7 @@ internal enum ErrorCode
20952095
ERR_FileTypeDisallowedInSignature = 9300,
20962096
ERR_FileTypeNoExplicitAccessibility = 9301,
20972097
ERR_FileTypeBase = 9302,
2098+
ERR_FileTypeNested = 9303,
20982099

20992100
#endregion
21002101

src/Compilers/CSharp/Portable/SymbolDisplay/SymbolDisplayVisitor.Types.cs

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using System.Linq;
1111
using Microsoft.CodeAnalysis;
1212
using Microsoft.CodeAnalysis.CSharp.Symbols;
13+
using Microsoft.CodeAnalysis.PooledObjects;
1314
using Microsoft.CodeAnalysis.SymbolDisplay;
1415
using Roslyn.Utilities;
1516

@@ -182,17 +183,28 @@ public override void VisitNamedType(INamedTypeSymbol symbol)
182183
AddNullableAnnotations(symbol);
183184

184185
if ((format.CompilerInternalOptions & SymbolDisplayCompilerInternalOptions.IncludeContainingFileForFileTypes) != 0
185-
// PROTOTYPE(ft): public API?
186-
&& symbol.GetSymbol() is SourceMemberContainerTypeSymbol { IsFile: true } fileType)
186+
&& symbol is Symbols.PublicModel.Symbol { UnderlyingSymbol: NamedTypeSymbol { AssociatedSyntaxTree: SyntaxTree tree } internalSymbol })
187187
{
188-
var tree = symbol.DeclaringSyntaxReferences[0].SyntaxTree;
189-
var fileDescription = tree.FilePath is { Length: not 0 } path
190-
? Path.GetFileNameWithoutExtension(path)
191-
: $"<tree {fileType.DeclaringCompilation.SyntaxTrees.IndexOf(tree)}>";
188+
var fileDescription = getDisplayFileName(tree) is { Length: not 0 } path
189+
? path
190+
: $"<tree {internalSymbol.DeclaringCompilation.SyntaxTrees.IndexOf(tree)}>";
192191

193192
builder.Add(CreatePart(SymbolDisplayPartKind.Punctuation, symbol, "@"));
194193
builder.Add(CreatePart(SymbolDisplayPartKind.ModuleName, symbol, fileDescription));
195194
}
195+
196+
static string getDisplayFileName(SyntaxTree tree)
197+
{
198+
if (tree.FilePath.Length == 0)
199+
{
200+
return "";
201+
}
202+
203+
var pooledBuilder = PooledStringBuilder.GetInstance();
204+
var sb = pooledBuilder.Builder;
205+
GeneratedNames.AppendFileName(tree.FilePath, sb);
206+
return pooledBuilder.ToStringAndFree();
207+
}
196208
}
197209

198210
private void VisitNamedTypeWithoutNullability(INamedTypeSymbol symbol)

src/Compilers/CSharp/Portable/Symbols/AnonymousTypes/PublicSymbols/AnonymousManager.TypeOrDelegatePublicSymbol.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ internal sealed override bool MangleName
7373
get { return false; }
7474
}
7575

76+
internal sealed override SyntaxTree? AssociatedSyntaxTree => null;
77+
7678
public sealed override int Arity
7779
{
7880
get { return 0; }

src/Compilers/CSharp/Portable/Symbols/AnonymousTypes/SynthesizedSymbols/AnonymousType.TypeOrDelegateTemplateSymbol.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,8 @@ internal sealed override bool MangleName
237237
get { return this.Arity > 0; }
238238
}
239239

240+
internal sealed override SyntaxTree? AssociatedSyntaxTree => null;
241+
240242
internal sealed override ImmutableArray<TypeWithAnnotations> TypeArgumentsWithAnnotationsNoUseSiteDiagnostics
241243
{
242244
get { return GetTypeParametersAsTypeArguments(); }

src/Compilers/CSharp/Portable/Symbols/ErrorTypeSymbol.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -578,6 +578,8 @@ internal override bool MangleName
578578
get { return _originalDefinition.MangleName; }
579579
}
580580

581+
internal override SyntaxTree? AssociatedSyntaxTree => _originalDefinition.AssociatedSyntaxTree;
582+
581583
internal override DiagnosticInfo? ErrorInfo
582584
{
583585
get { return _originalDefinition.ErrorInfo; }

0 commit comments

Comments
 (0)