コード例 #1
0
ファイル: EnumerationSymbol.cs プロジェクト: sgnurf/dsharp
 public EnumerationSymbol(string name, NamespaceSymbol parent, bool flags)
     : base(SymbolType.Enumeration, name, parent)
 {
     Flags = flags;
     TransformationCookie = -1;
 }
コード例 #2
0
        /// <summary>
        ///     This maps C# intrinsic types (managed types that have an equivalent
        ///     C# keyword)
        /// </summary>
        public TypeSymbol ResolveIntrinsicType(IntrinsicType type)
        {
            string mappedTypeName  = null;
            string mappedNamespace = null;

            switch (type)
            {
            case IntrinsicType.Object:
                mappedTypeName = "Object";

                break;

            case IntrinsicType.Boolean:
                mappedTypeName = "Boolean";

                break;

            case IntrinsicType.String:
                mappedTypeName = "String";

                break;

            case IntrinsicType.Integer:
                mappedTypeName = "Int32";

                break;

            case IntrinsicType.UnsignedInteger:
                mappedTypeName = "UInt32";

                break;

            case IntrinsicType.Long:
                mappedTypeName = "Int64";

                break;

            case IntrinsicType.UnsignedLong:
                mappedTypeName = "UInt64";

                break;

            case IntrinsicType.Short:
                mappedTypeName = "Int16";

                break;

            case IntrinsicType.UnsignedShort:
                mappedTypeName = "UInt16";

                break;

            case IntrinsicType.Byte:
                mappedTypeName = "Byte";

                break;

            case IntrinsicType.SignedByte:
                mappedTypeName = "SByte";

                break;

            case IntrinsicType.Single:
                mappedTypeName = "Single";

                break;

            case IntrinsicType.Date:
                mappedTypeName = "Date";

                break;

            case IntrinsicType.Decimal:
                mappedTypeName = "Decimal";

                break;

            case IntrinsicType.Double:
                mappedTypeName = "Double";

                break;

            case IntrinsicType.Delegate:
                mappedTypeName = "Delegate";

                break;

            case IntrinsicType.Function:
                mappedTypeName = "Function";

                break;

            case IntrinsicType.Void:
                mappedTypeName = "Void";

                break;

            case IntrinsicType.Array:
                mappedTypeName = "Array";
                break;

            case IntrinsicType.GenericList:
                mappedTypeName  = "List`1";
                mappedNamespace = "System.Collections.Generic";
                break;

            case IntrinsicType.GenericDictionary:
                mappedTypeName  = "Dictionary`2";
                mappedNamespace = "System.Collections.Generic";
                break;

            case IntrinsicType.IDictionary:
                mappedTypeName  = "IDictionary";
                mappedNamespace = "System.Collections";
                break;

            case IntrinsicType.GenericIDictionary:
                mappedTypeName  = "IDictionary`2";
                mappedNamespace = "System.Collections.Generic";
                break;

            case IntrinsicType.GenericIReadOnlyDictionary:
                mappedTypeName  = "IReadOnlyDictionary`2";
                mappedNamespace = "System.Collections.Generic";
                break;

            case IntrinsicType.Type:
                mappedTypeName  = "Type";
                mappedNamespace = "System";

                break;

            case IntrinsicType.MemberInfo:
                mappedTypeName  = "MemberInfo";
                mappedNamespace = "System.Reflection";

                break;

            case IntrinsicType.Enumerator:
                mappedTypeName  = "IEnumerator";
                mappedNamespace = "System.Collections";

                break;

            case IntrinsicType.Enum:
                mappedTypeName = "Enum";

                break;

            case IntrinsicType.Exception:
                mappedTypeName = "Exception";

                break;

            case IntrinsicType.Script:
                mappedTypeName = "Script";

                break;

            case IntrinsicType.Number:
                mappedTypeName = "Number";

                break;

            case IntrinsicType.Arguments:
                mappedTypeName = "Arguments";

                break;

            case IntrinsicType.Nullable:
                mappedTypeName = "Nullable`1";

                break;

            default:
                Debug.Fail("Unmapped intrinsic type " + type);

                break;
            }

            NamespaceSymbol ns = SystemNamespace;

            if (mappedNamespace != null)
            {
                ns = GetNamespace(mappedNamespace);
                Debug.Assert(ns != null);
            }

            if (mappedTypeName != null)
            {
                TypeSymbol typeSymbol =
                    (TypeSymbol)((ISymbolTable)ns).FindSymbol(mappedTypeName, null, SymbolFilter.Types);
                Debug.Assert(typeSymbol != null);

                return(typeSymbol);
            }

            return(null);
        }
コード例 #3
0
ファイル: InterfaceSymbol.cs プロジェクト: isc30/dsharp
 public InterfaceSymbol(string name, NamespaceSymbol parent)
     : base(SymbolType.Interface, name, parent)
 {
 }
コード例 #4
0
        public Symbol FindSymbol(string name, Symbol context, SymbolFilter filter)
        {
            if ((filter & SymbolFilter.Types) == 0)
            {
                return(null);
            }

            Symbol symbol = null;

            if (name.IndexOf('.') > 0)
            {
                symbol = FindSymbolFromNamespace(name, context);
            }
            else
            {
                Debug.Assert(context != null);

                if (context is MethodSymbol methodContext)
                {
                    GenericParameterSymbol genericType = FindGenericType(name, methodContext);

                    if (genericType != null)
                    {
                        return(genericType);
                    }
                }

                TypeSymbol typeSymbol = context as TypeSymbol;

                if (typeSymbol == null)
                {
                    Symbol parentSymbol = context.Parent;

                    while (parentSymbol != null)
                    {
                        typeSymbol = parentSymbol as TypeSymbol;

                        if (typeSymbol != null)
                        {
                            break;
                        }

                        parentSymbol = parentSymbol.Parent;
                    }
                }

                Debug.Assert(typeSymbol != null);

                if (typeSymbol == null)
                {
                    return(null);
                }

                if (typeSymbol.IsGeneric)
                {
                    var resolved = typeSymbol.GenericParameters.FirstOrDefault(param => param.Name == name);
                    if (resolved != null)
                    {
                        return(resolved);
                    }
                }

                bool systemNamespaceChecked = false;

                NamespaceSymbol containerNamespace = (NamespaceSymbol)typeSymbol.Parent;
                Debug.Assert(containerNamespace != null);

                symbol = ((ISymbolTable)containerNamespace).FindSymbol(name, /* context */ typeSymbol, SymbolFilter.Types);

                if (containerNamespace == SystemNamespace)
                {
                    systemNamespaceChecked = true;
                }

                if (symbol == null)
                {
                    if (typeSymbol.Aliases != null && typeSymbol.Aliases.ContainsKey(name))
                    {
                        string typeReference = typeSymbol.Aliases[name];
                        symbol = ((ISymbolTable)this).FindSymbol(typeReference, /* context */ null,
                                                                 SymbolFilter.Types);
                    }
                    else if (typeSymbol.Imports != null)
                    {
                        foreach (string importedNamespaceReference in typeSymbol.Imports)
                        {
                            if (namespaceMap.ContainsKey(importedNamespaceReference) == false)
                            {
                                // Since we included all parent namespaces of the current type's
                                // namespace, we might run into a namespace that doesn't contain
                                // any defined types, i.e. doesn't exist.

                                continue;
                            }

                            NamespaceSymbol importedNamespace = namespaceMap[importedNamespaceReference];

                            if (importedNamespace == containerNamespace)
                            {
                                continue;
                            }

                            symbol = ((ISymbolTable)importedNamespace).FindSymbol(name, /* context */ null,
                                                                                  SymbolFilter.Types);

                            if (importedNamespace == SystemNamespace)
                            {
                                systemNamespaceChecked = true;
                            }

                            if (symbol != null)
                            {
                                break;
                            }
                        }
                    }
                }

                if (symbol == null && systemNamespaceChecked == false)
                {
                    symbol = ((ISymbolTable)SystemNamespace).FindSymbol(name, /* context */ null, SymbolFilter.Types);
                }

                if (symbol == null)
                {
                    symbol = ((ISymbolTable)GlobalNamespace).FindSymbol(name, /* context */ null, SymbolFilter.Types);
                }
            }

            return(symbol);
        }