Symbol
using Microsoft.CSharp.RuntimeBinder.Syntax;
using System.Reflection;
namespace Microsoft.CSharp.RuntimeBinder.Semantics
{
internal abstract class Symbol
{
private SYMKIND _kind;
private ACCESS _access;
public Name name;
public ParentSymbol parent;
public Symbol nextChild;
public Symbol nextSameName;
public bool isStatic {
get {
FieldSymbol fieldSymbol;
if ((fieldSymbol = (this as FieldSymbol)) != null)
return fieldSymbol.isStatic;
EventSymbol eventSymbol;
if ((eventSymbol = (this as EventSymbol)) != null)
return eventSymbol.isStatic;
MethodOrPropertySymbol methodOrPropertySymbol;
if ((methodOrPropertySymbol = (this as MethodOrPropertySymbol)) != null)
return methodOrPropertySymbol.isStatic;
return this is AggregateSymbol;
}
}
public Symbol LookupNext(symbmask_t kindmask)
{
for (Symbol symbol = nextSameName; symbol != null; symbol = symbol.nextSameName) {
if ((kindmask & symbol.mask()) != (symbmask_t)0)
return symbol;
}
return null;
}
public ACCESS GetAccess()
{
return _access;
}
public void SetAccess(ACCESS access)
{
_access = access;
}
public SYMKIND getKind()
{
return _kind;
}
public void setKind(SYMKIND kind)
{
_kind = kind;
}
public symbmask_t mask()
{
return (symbmask_t)(1 << (int)_kind);
}
public CType getType()
{
MethodOrPropertySymbol methodOrPropertySymbol;
if ((methodOrPropertySymbol = (this as MethodOrPropertySymbol)) != null)
return methodOrPropertySymbol.RetType;
FieldSymbol fieldSymbol;
if ((fieldSymbol = (this as FieldSymbol)) != null)
return fieldSymbol.GetType();
EventSymbol eventSymbol;
if ((eventSymbol = (this as EventSymbol)) != null)
return eventSymbol.type;
return null;
}
private Assembly GetAssembly()
{
switch (_kind) {
case SYMKIND.SK_TypeParameterSymbol:
case SYMKIND.SK_FieldSymbol:
case SYMKIND.SK_MethodSymbol:
case SYMKIND.SK_PropertySymbol:
case SYMKIND.SK_EventSymbol:
return ((AggregateSymbol)parent).AssociatedAssembly;
case SYMKIND.SK_AggregateSymbol:
return ((AggregateSymbol)this).AssociatedAssembly;
default:
return null;
}
}
private bool InternalsVisibleTo(Assembly assembly)
{
switch (_kind) {
case SYMKIND.SK_TypeParameterSymbol:
case SYMKIND.SK_FieldSymbol:
case SYMKIND.SK_MethodSymbol:
case SYMKIND.SK_PropertySymbol:
case SYMKIND.SK_EventSymbol:
return ((AggregateSymbol)parent).InternalsVisibleTo(assembly);
case SYMKIND.SK_AggregateSymbol:
return ((AggregateSymbol)this).InternalsVisibleTo(assembly);
default:
return false;
}
}
public bool SameAssemOrFriend(Symbol sym)
{
Assembly assembly = GetAssembly();
if (!(assembly == sym.GetAssembly()))
return sym.InternalsVisibleTo(assembly);
return true;
}
public bool IsOverride()
{
SYMKIND kind = _kind;
if ((uint)(kind - 5) <= 1)
return ((MethodOrPropertySymbol)this).isOverride;
if (kind == SYMKIND.SK_EventSymbol)
return ((EventSymbol)this).isOverride;
return false;
}
public bool IsHideByName()
{
SYMKIND kind = _kind;
if ((uint)(kind - 5) <= 1)
return ((MethodOrPropertySymbol)this).isHideByName;
if (kind == SYMKIND.SK_EventSymbol)
return ((EventSymbol)this).methAdd?.isHideByName ?? false;
return true;
}
public bool isUserCallable()
{
MethodSymbol methodSymbol;
if ((methodSymbol = (this as MethodSymbol)) != null)
return methodSymbol.isUserCallable();
return true;
}
}
}