Beispiel #1
0
        /// <summary>
        /// </summary>
        /// <param name="anonimClass"></param>
        /// <param name="anonymousObjectCreastionExpression"></param>
        /// <returns></returns>
        private Class FillClassProperties(INamedTypeSymbol anonimClass, AnonimClass anonymousObjectCreastionExpression)
        {
            var limClass = anonimClass.ConvertToLimNode( ) as Class;

            limClass.Accessibility = Types.AccessibilityKind.ackInternal;
            limClass.Name          = anonimClass.ToString( );
            var parent =
                ( Scope )MainDeclaration.Instance.LimFactory.getRef(MainDeclaration.Instance.MethodStack.Peek( ).Id);

            limClass.MangledName         = limClass.DemangledName = parent.MangledName + "." + anonimClass;
            limClass.IsCompilerGenerated = true;
            limClass.IsAnonymous         = true;
            limClass.ClassKind           = Types.ClassKind.clkClass;

            Commons.Common.Safe_Edge(parent, "HasMember", limClass.Id);
            MainDeclaration.Instance.LimOrigin.addCompIdCsharpIdLimIdToMap(MainDeclaration.Instance.Component.Id,
                                                                           map[anonymousObjectCreastionExpression], limClass.Id);
            MainDeclaration.Instance.ClassStack.Push(new ClassInfo(limClass.Id));
            LLOC.CollectLineInfos(anonymousObjectCreastionExpression);
            MainDeclaration.Instance.ClassStack.Pop( );
            limClass.SetCLOC(anonymousObjectCreastionExpression);
            Commons.Common.AddIsContainedInEdge(limClass, anonymousObjectCreastionExpression);
            Commons.Common.Safe_Edge(limClass, "BelongsTo", MainDeclaration.Instance.Component.Id);

            return(limClass);
        }
Beispiel #2
0
        /// <summary>
        /// Create ClassGenericInstance and connect to the Class, through the Instance edge.
        /// Furthermore, added GenericParameter to the ClassGenericInstance.
        /// </summary>
        /// <param name="symbol">Instanced class</param>
        /// <param name="refersTo">Instanced class definiton</param>
        /// <returns>ClassGenericInstnace from the LIM</returns>
        public static ClassGenericInstance GetCGI(this ISymbol symbol, INamedTypeSymbol refersTo)
        {
            string uName = symbol.ToString();
            ClassGenericInstance cgi;

            if (MainDeclaration.Instance.CgiMap.TryGetValue(uName, out cgi))
            {
                return(cgi);
            }

            cgi = MainDeclaration.Instance.LimFactory.createClassGenericInstanceNode();
            cgi.IsRealInstance = true;
            cgi.Name           = symbol.ToDisplayString(SymbolDisplayFormat.MinimallyQualifiedFormat);
            cgi.MangledName    = uName;
            cgi.DemangledName  = uName;
            cgi.Language       = Types.LanguageKind.lnkCsharp;

            INamedTypeSymbol roslynNode = symbol as INamedTypeSymbol;
            bool             isInMeta   = false;

            if (refersTo == null)
            {
                refersTo = (INamedTypeSymbol)symbol.OriginalDefinition; isInMeta = true;
            }
            if (refersTo != null)
            {
                Base owner = refersTo.ConvertToLimNode();
                if (isInMeta)
                {
                    Commons.Common.MetaDataNameFiller(symbol, (Member)owner);
                }

                if (Lim.Asg.Common.getIsClass(owner))
                {
                    Class ownerClass = owner as Class;
                    Commons.Common.Safe_Edge(ownerClass, "Instance", cgi.Id);

                    int i = 0;
                    foreach (var argument in roslynNode.TypeArguments)
                    {
                        ITypeSymbol arg = null;
                        if (!argument.IsInMetadata() && argument.TypeKind != TypeKind.TypeParameter)
                        {
                            SyntaxNode tmp;
                            arg = (INamedTypeSymbol)argument.GetDefinition(out tmp);
                        }
                        Lim.Asg.Nodes.Type.Type param = (arg != null) ? arg.GetLimType() : argument.GetLimType();
                        MainDeclaration.Instance.UsesStack.Peek().Remove(param.Id);

                        Types.TypeArgumentConstraintKind tack = Types.TypeArgumentConstraintKind.tackUpperBounded;
                        if (roslynNode.TypeParameters[i].ConstraintTypes.Length > 0)
                        {
                            tack = Types.TypeArgumentConstraintKind.tackUnbounded;
                        }

                        bool found = false;
                        ListIteratorAssocTypeArgumentConstraintKind <Lim.Asg.Nodes.Type.Type> cIt = cgi.HasArgumentsListIteratorAssocBegin;
                        while (cIt.getValue() != null)
                        {
                            Lim.Asg.Nodes.Type.Type value = cIt.getValue();
                            if (param.Id == value.Id)
                            {
                                found = true;
                                break;
                            }
                            cIt = cIt.getNext();
                        }
                        if (!found)
                        {
                            cgi.addHasArguments(param, tack);
                        }
                        i++;
                    }
                }
            }

            MainDeclaration.Instance.CgiMap.Add(uName, cgi);

            return(cgi);
        }