Ejemplo n.º 1
0
        object TryGetMemberCached(Namescope namescope, string name, int?typeParamCount)
        {
            var key = new NamescopeKey(namescope, name, typeParamCount ?? 0);

            object result;

            if (!_scopeMembers.TryGetValue(key, out result))
            {
                result             = TryGetMemberInternal(namescope, name, typeParamCount);
                _scopeMembers[key] = result;
            }

            return(result);
        }
Ejemplo n.º 2
0
        public Namespace GetNamespace(Namespace parent, string name)
        {
            var key = new NamescopeKey(parent, name);

            object result;

            if (!_scopeMembers.TryGetValue(key, out result))
            {
                result             = new Namespace(parent, name);
                _scopeMembers[key] = result;
                parent.Namespaces.Add((Namespace)result);
            }

            return((Namespace)result);
        }
Ejemplo n.º 3
0
        internal object TryGetTypeMemberCached(DataType dt, string name, int?typeParamCount)
        {
            var key = new NamescopeKey(dt, name, typeParamCount ?? 0);

            object result;

            if (!_typeMembers.TryGetValue(key, out result))
            {
                result = TryGetTypeMemberInternal(dt, name, typeParamCount);
                if (!dt.Stats.HasFlag(EntityStats.PopulatingMembers) || result != null)
                {
                    _typeMembers[key] = result;
                }
            }

            return(result);
        }
Ejemplo n.º 4
0
        List <NamespaceUsings> GetUsingsList(Namescope namescope, Source src)
        {
            var key = new NamescopeKey(namescope, src.FullPath, src.Part);

            List <NamespaceUsings> list;

            if (!_usings.TryGetValue(key, out list))
            {
                list = namescope.NamescopeType == NamescopeType.Namespace
                    ? new List <NamespaceUsings>()
                    : GetUsingsList(namescope.Parent, src);

                _usings.Add(key, list);
            }

            return(list);
        }
Ejemplo n.º 5
0
        public void AddUsings(List <AstILNode> nodes, ICollection <Namespace> parentNamespaces, ICollection <DataType> parentTypes)
        {
            foreach (var node in nodes)
            {
                var key    = new NamescopeKey(node.IL, node.Ast.Name.Source.FullPath, node.Ast.Name.Source.Part);
                var result = new NamespaceUsings(node.Ast.Name.Source.Line, parentNamespaces, parentTypes);
                _usings.Add(key, result);

                foreach (var directive in node.Ast.Usings)
                {
                    var partial = ResolveExpression(node.IL, directive.Expression, null);

                    if (partial.IsInvalid)
                    {
                        continue;
                    }

                    switch (partial.ExpressionType)
                    {
                    case PartialExpressionType.Type:
                    {
                        var dt = ((PartialType)partial).Type;

                        switch (dt.TypeType)
                        {
                        case TypeType.Class:
                        case TypeType.Struct:
                            break;

                        default:
                            Log.Error(directive.Expression.Source, ErrorCode.E0000, "Invalid 'using' on " + dt.TypeType.ToString().ToLower());
                            continue;
                        }

                        if (dt.IsFlattenedDefinition)
                        {
                            Log.Error(directive.Expression.Source, ErrorCode.E0000, "Invalid 'using' on a generic type definition");
                            continue;
                        }

                        result.Types.Add(dt);
                        break;
                    }

                    case PartialExpressionType.Namespace:
                    {
                        var ns = ((PartialNamespace)partial).Namespace;

                        for (Namescope parent = node.IL;
                             parent != null;
                             parent = parent.Parent)
                        {
                            if (ns == parent)
                            {
                                Log.Error(directive.Expression.Source, ErrorCode.E0000, "Invalid 'using' on a parent namespace");
                            }
                        }

                        result.Namespaces.Add(ns);
                        break;
                    }

                    default:
                    {
                        Log.Error(directive.Expression.Source, ErrorCode.E0000, "Invalid 'using' on " + partial.Quote());
                        break;
                    }
                    }
                }

                AddUsings(node.Nodes, result.Namespaces, result.Types);
            }
        }