Esempio n. 1
0
File: Method.cs Progetto: s0/ql
        /// <summary>
        /// Creates a method of the appropriate subtype.
        /// </summary>
        /// <param name="cx"></param>
        /// <param name="methodDecl"></param>
        /// <returns></returns>
        public static Method Create(Context cx, IMethodSymbol methodDecl)
        {
            if (methodDecl == null)
            {
                return(null);
            }

            switch (methodDecl.MethodKind)
            {
            case MethodKind.StaticConstructor:
            case MethodKind.Constructor:
                return(Constructor.Create(cx, methodDecl));

            case MethodKind.ReducedExtension:
            case MethodKind.Ordinary:
            case MethodKind.DelegateInvoke:
            case MethodKind.ExplicitInterfaceImplementation:
                return(OrdinaryMethod.Create(cx, methodDecl));

            case MethodKind.Destructor:
                return(Destructor.Create(cx, methodDecl));

            case MethodKind.PropertyGet:
            case MethodKind.PropertySet:
                return(Accessor.Create(cx, methodDecl));

            case MethodKind.EventAdd:
            case MethodKind.EventRemove:
                return(EventAccessor.Create(cx, methodDecl));

            case MethodKind.UserDefinedOperator:
            case MethodKind.BuiltinOperator:
                return(UserOperator.Create(cx, methodDecl));

            case MethodKind.Conversion:
                return(Conversion.Create(cx, methodDecl));

            case MethodKind.AnonymousFunction:
                throw new InternalError(methodDecl, "Attempt to create a lambda");

            case MethodKind.LocalFunction:
                return(LocalFunction.Create(cx, methodDecl));

            default:
                throw new InternalError(methodDecl, "Unhandled method '{0}' of kind '{1}'", methodDecl, methodDecl.MethodKind);
            }
        }
Esempio n. 2
0
File: Indexer.cs Progetto: s0/ql
        public override void Populate()
        {
            var type = Type.Create(Context, symbol.Type);

            Context.Emit(Tuples.indexers(this, symbol.GetName(useMetadataName: true), ContainingType, type.TypeRef, OriginalDefinition));
            foreach (var l in Locations)
            {
                Context.Emit(Tuples.indexer_location(this, l));
            }

            var getter = symbol.GetMethod;
            var setter = symbol.SetMethod;

            if (getter == null && setter == null)
            {
                Context.ModelError(symbol, "No indexer accessor defined");
            }

            if (getter != null)
            {
                Getter = Accessor.Create(Context, getter);
            }

            if (setter != null)
            {
                Setter = Accessor.Create(Context, setter);
            }

            for (var i = 0; i < symbol.Parameters.Length; ++i)
            {
                var original = Parameter.Create(Context, symbol.OriginalDefinition.Parameters[i], OriginalDefinition);
                Parameter.Create(Context, symbol.Parameters[i], this, original);
            }

            if (getter != null)
            {
                Getter = Accessor.Create(Context, getter);
                Context.Emit(Tuples.accessors(Getter, 1, getter.Name, this, Getter.OriginalDefinition));

                Context.Emit(Tuples.accessor_location(Getter, Getter.Location));
                Getter.Overrides();
                Getter.ExtractModifiers();
            }

            if (setter != null)
            {
                Setter = Accessor.Create(Context, setter);
                Context.Emit(Tuples.accessors(Setter, 2, setter.Name, this, Setter.OriginalDefinition));

                Context.Emit(Tuples.accessor_location(Setter, Setter.Location));
                Setter.Overrides();
                Setter.ExtractModifiers();
            }

            if (IsSourceDeclaration)
            {
                var expressionBody = ExpressionBody;
                if (expressionBody != null)
                {
                    // The expression may need to reference parameters in the getter.
                    // So we need to arrange that the expression is populated after the getter.
                    Context.PopulateLater(() => Expression.CreateFromNode(new ExpressionNodeInfo(Context, expressionBody, this, 0)
                    {
                        Type = Type.Create(Context, symbol.Type)
                    }));
                }
            }

            ExtractModifiers();
            BindComments();

            var declSyntaxReferences = IsSourceDeclaration
                ? symbol.DeclaringSyntaxReferences.
                                       Select(d => d.GetSyntax()).OfType <IndexerDeclarationSyntax>().ToArray()
                : Enumerable.Empty <IndexerDeclarationSyntax>();

            foreach (var explicitInterface in symbol.ExplicitInterfaceImplementations.Select(impl => Type.Create(Context, impl.ContainingType)))
            {
                Context.Emit(Tuples.explicitly_implements(this, explicitInterface.TypeRef));

                foreach (var syntax in declSyntaxReferences)
                {
                    TypeMention.Create(Context, syntax.ExplicitInterfaceSpecifier.Name, this, explicitInterface);
                }
            }


            foreach (var syntax in declSyntaxReferences)
            {
                TypeMention.Create(Context, syntax.Type, this, type);
            }
        }
Esempio n. 3
0
File: Method.cs Progetto: xcorail/ql
        /// <summary>
        /// Creates a method of the appropriate subtype.
        /// </summary>
        /// <param name="cx"></param>
        /// <param name="methodDecl"></param>
        /// <returns></returns>
        public static Method Create(Context cx, IMethodSymbol methodDecl)
        {
            if (methodDecl == null)
            {
                return(null);
            }

            var methodKind = methodDecl.MethodKind;

            if (methodKind == MethodKind.ExplicitInterfaceImplementation)
            {
                // Retrieve the original method kind
                methodKind = methodDecl.ExplicitInterfaceImplementations.Select(m => m.MethodKind).FirstOrDefault();
            }

            switch (methodKind)
            {
            case MethodKind.StaticConstructor:
            case MethodKind.Constructor:
                return(Constructor.Create(cx, methodDecl));

            case MethodKind.ReducedExtension:
            case MethodKind.Ordinary:
            case MethodKind.DelegateInvoke:
                return(OrdinaryMethod.Create(cx, methodDecl));

            case MethodKind.Destructor:
                return(Destructor.Create(cx, methodDecl));

            case MethodKind.PropertyGet:
            case MethodKind.PropertySet:
                return(methodDecl.AssociatedSymbol is null?OrdinaryMethod.Create(cx, methodDecl) : (Method)Accessor.Create(cx, methodDecl));

            case MethodKind.EventAdd:
            case MethodKind.EventRemove:
                return(EventAccessor.Create(cx, methodDecl));

            case MethodKind.UserDefinedOperator:
            case MethodKind.BuiltinOperator:
                return(UserOperator.Create(cx, methodDecl));

            case MethodKind.Conversion:
                return(Conversion.Create(cx, methodDecl));

            case MethodKind.AnonymousFunction:
                throw new InternalError(methodDecl, "Attempt to create a lambda");

            case MethodKind.LocalFunction:
                return(LocalFunction.Create(cx, methodDecl));

            default:
                throw new InternalError(methodDecl, $"Unhandled method '{methodDecl}' of kind '{methodDecl.MethodKind}'");
            }
        }
Esempio n. 4
0
        public override void Populate()
        {
            ExtractAttributes();
            ExtractModifiers();
            BindComments();

            var type = Type.Create(Context, symbol.Type);

            Context.Emit(Tuples.properties(this, symbol.GetName(), ContainingType, type.TypeRef, Create(Context, symbol.OriginalDefinition)));

            var getter = symbol.GetMethod;

            if (getter != null)
            {
                Getter = Accessor.Create(Context, getter);
            }

            var setter = symbol.SetMethod;

            if (setter != null)
            {
                Setter = Accessor.Create(Context, setter);
            }

            var declSyntaxReferences = IsSourceDeclaration ?
                                       symbol.DeclaringSyntaxReferences.
                                       Select(d => d.GetSyntax()).OfType <PropertyDeclarationSyntax>().ToArray()
                : Enumerable.Empty <PropertyDeclarationSyntax>();

            foreach (var explicitInterface in symbol.ExplicitInterfaceImplementations.Select(impl => Type.Create(Context, impl.ContainingType)))
            {
                Context.Emit(Tuples.explicitly_implements(this, explicitInterface.TypeRef));

                foreach (var syntax in declSyntaxReferences)
                {
                    TypeMention.Create(Context, syntax.ExplicitInterfaceSpecifier.Name, this, explicitInterface);
                }
            }

            foreach (var l in Locations)
            {
                Context.Emit(Tuples.property_location(this, l));
            }

            if (IsSourceDeclaration && symbol.FromSource())
            {
                var expressionBody = ExpressionBody;
                if (expressionBody != null)
                {
                    Context.PopulateLater(() => Expression.Create(Context, expressionBody, this, 0));
                }

                foreach (var initializer in declSyntaxReferences.
                         Select(n => n.Initializer).
                         Where(i => i != null).
                         Select(i => i.Value))
                {
                    Context.PopulateLater(() => Expression.Create(Context, initializer, this, 1));
                }

                foreach (var syntax in declSyntaxReferences)
                {
                    TypeMention.Create(Context, syntax.Type, this, type);
                }
            }
        }
Esempio n. 5
0
        public static Method?Create(Context cx, IMethodSymbol?methodDecl)
        {
            if (methodDecl is null)
            {
                return(null);
            }

            var methodKind = methodDecl.MethodKind;

            if (methodKind == MethodKind.ExplicitInterfaceImplementation)
            {
                // Retrieve the original method kind
                methodKind = methodDecl.ExplicitInterfaceImplementations.Select(m => m.MethodKind).FirstOrDefault();
            }

            switch (methodKind)
            {
            case MethodKind.StaticConstructor:
            case MethodKind.Constructor:
                return(Constructor.Create(cx, methodDecl));

            case MethodKind.ReducedExtension:
                if (SymbolEqualityComparer.Default.Equals(methodDecl, methodDecl.ConstructedFrom))
                {
                    return(OrdinaryMethod.Create(cx, methodDecl.ReducedFrom !));
                }
                return(OrdinaryMethod.Create(cx, methodDecl.ReducedFrom !.Construct(methodDecl.TypeArguments, methodDecl.TypeArgumentNullableAnnotations)));

            case MethodKind.Ordinary:
            case MethodKind.DelegateInvoke:
                return(OrdinaryMethod.Create(cx, methodDecl));

            case MethodKind.Destructor:
                return(Destructor.Create(cx, methodDecl));

            case MethodKind.PropertyGet:
            case MethodKind.PropertySet:
                return(Accessor.GetPropertySymbol(methodDecl) is IPropertySymbol prop?Accessor.Create(cx, methodDecl, prop) : OrdinaryMethod.Create(cx, methodDecl));

            case MethodKind.EventAdd:
            case MethodKind.EventRemove:
                return(EventAccessor.GetEventSymbol(methodDecl) is IEventSymbol @event?EventAccessor.Create(cx, methodDecl, @event) : OrdinaryMethod.Create(cx, methodDecl));

            case MethodKind.UserDefinedOperator:
            case MethodKind.BuiltinOperator:
                return(UserOperator.Create(cx, methodDecl));

            case MethodKind.Conversion:
                return(Conversion.Create(cx, methodDecl));

            case MethodKind.AnonymousFunction:
                throw new InternalError(methodDecl, "Attempt to create a lambda");

            case MethodKind.LocalFunction:
                return(LocalFunction.Create(cx, methodDecl));

            default:
                throw new InternalError(methodDecl, $"Unhandled method '{methodDecl}' of kind '{methodDecl.MethodKind}'");
            }
        }