Skip to content
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

Making name of script globals type hidden #43425

Merged
merged 11 commits into from
Jun 18, 2020
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,9 @@ public sealed partial class CSharpCompilation : Compilation
private readonly Lazy<AliasSymbol> _globalNamespaceAlias; // alias symbol used to resolve "global::".
private readonly Lazy<ImplicitNamedTypeSymbol?> _scriptClass;

// The type of host object model if available.
private TypeSymbol? _lazyHostObjectTypeSymbol;

// All imports (using directives and extern aliases) in syntax trees in this compilation.
// NOTE: We need to de-dup since the Imports objects that populate the list may be GC'd
// and re-created.
Expand Down Expand Up @@ -1452,8 +1455,8 @@ private static CSDiagnosticInfo CreateReflectionTypeNotFoundError(Type type)
);
}

// The type of host object model if available.
private TypeSymbol? _lazyHostObjectTypeSymbol;
protected override ITypeSymbol? CommonScriptGlobalsType
=> GetHostObjectTypeSymbol()?.GetPublicSymbol();

internal TypeSymbol? GetHostObjectTypeSymbol()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -367,9 +367,22 @@ private bool ShouldVisitNamespace(ISymbol containingSymbol)

private bool IncludeNamedType(INamedTypeSymbol namedType)
{
return
namedType != null &&
(!namedType.IsScriptClass || format.CompilerInternalOptions.IncludesOption(SymbolDisplayCompilerInternalOptions.IncludeScriptType));
if (namedType is null)
{
return false;
}

if (namedType.IsScriptClass && !format.CompilerInternalOptions.IncludesOption(SymbolDisplayCompilerInternalOptions.IncludeScriptType))
{
return false;
}

if (namedType == semanticModelOpt?.Compilation.ScriptGlobalsType)
tmat marked this conversation as resolved.
Show resolved Hide resolved
{
return false;
}

return true;
}

private static bool IsEnumMember(ISymbol symbol)
Expand Down
193 changes: 193 additions & 0 deletions src/Compilers/CSharp/Test/Symbol/SymbolDisplay/SymbolDisplayTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2530,6 +2530,199 @@ class C2 {} } } } }
SymbolDisplayPartKind.NamespaceName);
}

public class ScriptGlobals
{
public void Method(int p) { Event.Invoke(); }
public delegate void MyDelegate(int x);
public int Field;
public int Property => 1;
public event Action Event;

public class NestedType
{
public void Method(int p) { Event.Invoke(); }
public delegate void MyDelegate(int x);
public int Field;
public int Property => 1;
public event Action Event;
}
}

[Fact]
public void TestMembersInScriptGlobals()
{
var text = @"1";
var tree = SyntaxFactory.ParseSyntaxTree(text, TestOptions.Script);
var hostReference = MetadataReference.CreateFromFile(typeof(ScriptGlobals).Assembly.Location);

var comp = CSharpCompilation.CreateScriptCompilation(
"submission1",
tree,
TargetFrameworkUtil.GetReferences(TargetFramework.Standard).Concat(hostReference),
returnType: typeof(object),
globalsType: typeof(ScriptGlobals));

var model = comp.GetSemanticModel(tree);
var hostTypeSymbol = comp.GetHostObjectTypeSymbol();

var methodSymbol = hostTypeSymbol.GetMember("Method");
var delegateSymbol = hostTypeSymbol.GetMember("MyDelegate");
var fieldSymbol = hostTypeSymbol.GetMember("Field");
var propertySymbol = hostTypeSymbol.GetMember("Property");
var eventSymbol = hostTypeSymbol.GetMember("Event");

var nestedTypeSymbol = (TypeSymbol)hostTypeSymbol.GetMember("NestedType");
var nestedMethodSymbol = nestedTypeSymbol.GetMember("Method");
var nestedDelegateSymbol = nestedTypeSymbol.GetMember("MyDelegate");
var nestedFieldSymbol = nestedTypeSymbol.GetMember("Field");
var nestedPropertySymbol = nestedTypeSymbol.GetMember("Property");
var nestedEventSymbol = nestedTypeSymbol.GetMember("Event");

Verify(methodSymbol.ToMinimalDisplayParts(model, position: 0, s_memberSignatureDisplayFormat),
"void Method(int p)",
SymbolDisplayPartKind.Keyword,
SymbolDisplayPartKind.Space,
SymbolDisplayPartKind.MethodName,
SymbolDisplayPartKind.Punctuation,
SymbolDisplayPartKind.Keyword,
SymbolDisplayPartKind.Space,
SymbolDisplayPartKind.ParameterName,
SymbolDisplayPartKind.Punctuation);

Verify(delegateSymbol.ToMinimalDisplayParts(model, position: 0, s_memberSignatureDisplayFormat),
"MyDelegate(int x)",
SymbolDisplayPartKind.DelegateName,
SymbolDisplayPartKind.Punctuation,
SymbolDisplayPartKind.Keyword,
SymbolDisplayPartKind.Space,
SymbolDisplayPartKind.ParameterName,
SymbolDisplayPartKind.Punctuation);

Verify(fieldSymbol.ToMinimalDisplayParts(model, position: 0, s_memberSignatureDisplayFormat),
"int Field",
SymbolDisplayPartKind.Keyword,
SymbolDisplayPartKind.Space,
SymbolDisplayPartKind.FieldName);

Verify(propertySymbol.ToMinimalDisplayParts(model, position: 0, s_memberSignatureDisplayFormat),
"int Property { get; }",
SymbolDisplayPartKind.Keyword,
SymbolDisplayPartKind.Space,
SymbolDisplayPartKind.PropertyName,
SymbolDisplayPartKind.Space,
SymbolDisplayPartKind.Punctuation,
SymbolDisplayPartKind.Space,
SymbolDisplayPartKind.Keyword,
SymbolDisplayPartKind.Punctuation,
SymbolDisplayPartKind.Space,
SymbolDisplayPartKind.Punctuation);

Verify(eventSymbol.ToMinimalDisplayParts(model, position: 0, s_memberSignatureDisplayFormat),
"event System.Action Event",
SymbolDisplayPartKind.Keyword,
SymbolDisplayPartKind.Space,
SymbolDisplayPartKind.NamespaceName,
SymbolDisplayPartKind.Punctuation,
SymbolDisplayPartKind.DelegateName,
SymbolDisplayPartKind.Space,
SymbolDisplayPartKind.EventName);

Verify(nestedTypeSymbol.ToMinimalDisplayParts(model, position: 0, s_memberSignatureDisplayFormat),
"NestedType",
SymbolDisplayPartKind.ClassName);

Verify(nestedMethodSymbol.ToMinimalDisplayParts(model, position: 0, s_memberSignatureDisplayFormat),
"void NestedType.Method(int p)",
SymbolDisplayPartKind.Keyword,
SymbolDisplayPartKind.Space,
SymbolDisplayPartKind.ClassName,
SymbolDisplayPartKind.Punctuation,
SymbolDisplayPartKind.MethodName,
SymbolDisplayPartKind.Punctuation,
SymbolDisplayPartKind.Keyword,
SymbolDisplayPartKind.Space,
SymbolDisplayPartKind.ParameterName,
SymbolDisplayPartKind.Punctuation);

Verify(nestedDelegateSymbol.ToMinimalDisplayParts(model, position: 0, s_memberSignatureDisplayFormat),
"NestedType.MyDelegate(int x)",
SymbolDisplayPartKind.ClassName,
SymbolDisplayPartKind.Punctuation,
SymbolDisplayPartKind.DelegateName,
SymbolDisplayPartKind.Punctuation,
SymbolDisplayPartKind.Keyword,
SymbolDisplayPartKind.Space,
SymbolDisplayPartKind.ParameterName,
SymbolDisplayPartKind.Punctuation);

Verify(nestedFieldSymbol.ToMinimalDisplayParts(model, position: 0, s_memberSignatureDisplayFormat),
"int NestedType.Field",
SymbolDisplayPartKind.Keyword,
SymbolDisplayPartKind.Space,
SymbolDisplayPartKind.ClassName,
SymbolDisplayPartKind.Punctuation,
SymbolDisplayPartKind.FieldName);

Verify(nestedPropertySymbol.ToMinimalDisplayParts(model, position: 0, s_memberSignatureDisplayFormat),
"int NestedType.Property { get; }",
SymbolDisplayPartKind.Keyword,
SymbolDisplayPartKind.Space,
SymbolDisplayPartKind.ClassName,
SymbolDisplayPartKind.Punctuation,
SymbolDisplayPartKind.PropertyName,
SymbolDisplayPartKind.Space,
SymbolDisplayPartKind.Punctuation,
SymbolDisplayPartKind.Space,
SymbolDisplayPartKind.Keyword,
SymbolDisplayPartKind.Punctuation,
SymbolDisplayPartKind.Space,
SymbolDisplayPartKind.Punctuation);

Verify(nestedEventSymbol.ToMinimalDisplayParts(model, position: 0, s_memberSignatureDisplayFormat),
"event System.Action NestedType.Event",
SymbolDisplayPartKind.Keyword,
SymbolDisplayPartKind.Space,
SymbolDisplayPartKind.NamespaceName,
SymbolDisplayPartKind.Punctuation,
SymbolDisplayPartKind.DelegateName,
SymbolDisplayPartKind.Space,
SymbolDisplayPartKind.ClassName,
SymbolDisplayPartKind.Punctuation,
SymbolDisplayPartKind.EventName);
}

private static readonly SymbolDisplayFormat s_memberSignatureDisplayFormat =
new SymbolDisplayFormat(
globalNamespaceStyle: SymbolDisplayGlobalNamespaceStyle.Omitted,
genericsOptions: SymbolDisplayGenericsOptions.IncludeTypeParameters | SymbolDisplayGenericsOptions.IncludeTypeConstraints,
memberOptions:
SymbolDisplayMemberOptions.IncludeRef |
SymbolDisplayMemberOptions.IncludeType |
SymbolDisplayMemberOptions.IncludeParameters |
SymbolDisplayMemberOptions.IncludeContainingType,
delegateStyle:
SymbolDisplayDelegateStyle.NameAndSignature,
kindOptions:
SymbolDisplayKindOptions.IncludeMemberKeyword,
propertyStyle:
SymbolDisplayPropertyStyle.ShowReadWriteDescriptor,
parameterOptions:
SymbolDisplayParameterOptions.IncludeName |
SymbolDisplayParameterOptions.IncludeType |
SymbolDisplayParameterOptions.IncludeParamsRefOut |
SymbolDisplayParameterOptions.IncludeExtensionThis |
SymbolDisplayParameterOptions.IncludeDefaultValue |
SymbolDisplayParameterOptions.IncludeOptionalBrackets,
localOptions:
SymbolDisplayLocalOptions.IncludeRef |
SymbolDisplayLocalOptions.IncludeType,
miscellaneousOptions:
SymbolDisplayMiscellaneousOptions.EscapeKeywordIdentifiers |
SymbolDisplayMiscellaneousOptions.UseSpecialTypes |
SymbolDisplayMiscellaneousOptions.UseErrorTypeSymbolName |
SymbolDisplayMiscellaneousOptions.IncludeNullableReferenceTypeModifier |
SymbolDisplayMiscellaneousOptions.AllowDefaultLiteral);

[Fact]
public void TestRemoveAttributeSuffix1()
{
Expand Down
6 changes: 6 additions & 0 deletions src/Compilers/Core/Portable/Compilation/Compilation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -854,6 +854,12 @@ public INamedTypeSymbol GetSpecialType(SpecialType specialType)
public ITypeSymbol DynamicType { get { return CommonDynamicType; } }
protected abstract ITypeSymbol CommonDynamicType { get; }

/// <summary>
/// A symbol representing the script globals type.
/// </summary>
internal ITypeSymbol? ScriptGlobalsType => CommonScriptGlobalsType;
protected abstract ITypeSymbol? CommonScriptGlobalsType { get; }

/// <summary>
/// A symbol representing the implicit Script class. This is null if the class is not
/// defined in the compilation.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -771,6 +771,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
Nothing)
End Function

Protected Overrides ReadOnly Property CommonScriptGlobalsType As ITypeSymbol
Get
Throw New NotImplementedException()
tmat marked this conversation as resolved.
Show resolved Hide resolved
End Get
End Property

#End Region

#Region "Syntax Trees"
Expand Down