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 => (this as FieldSymbol)?.isStatic ?? (this as EventSymbol)?.isStatic ?? (this as MethodOrPropertySymbol)?.isStatic ?? (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 = this as MethodOrPropertySymbol;
if (methodOrPropertySymbol != null)
return methodOrPropertySymbol.RetType;
FieldSymbol fieldSymbol = this as FieldSymbol;
if (fieldSymbol != null)
return fieldSymbol.GetType();
return (this as EventSymbol)?.type;
}
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()
{
return (this as MethodSymbol)?.isUserCallable() ?? true;
}
}
}