Exemple #1
0
            public override Symbol VisitFunctionPointerType(FunctionPointerTypeSymbol symbol)
            {
                var sig = symbol.Signature;
                var translatedReturnType = (TypeSymbol)Visit(sig.ReturnType);
                var translatedReturnTypeWithAnnotations = sig.ReturnTypeWithAnnotations.WithTypeAndModifiers(translatedReturnType, VisitCustomModifiers(sig.ReturnTypeWithAnnotations.CustomModifiers));
                var translatedRefCustomModifiers        = VisitCustomModifiers(sig.RefCustomModifiers);

                var translatedParameterTypes = ImmutableArray <TypeWithAnnotations> .Empty;
                ImmutableArray <ImmutableArray <CustomModifier> > translatedParamRefCustomModifiers = default;

                if (sig.ParameterCount > 0)
                {
                    var translatedParamsBuilder = ArrayBuilder <TypeWithAnnotations> .GetInstance(sig.ParameterCount);

                    var translatedParamRefCustomModifiersBuilder = ArrayBuilder <ImmutableArray <CustomModifier> > .GetInstance(sig.ParameterCount);

                    foreach (var param in sig.Parameters)
                    {
                        var translatedParamType = (TypeSymbol)Visit(param.Type);
                        translatedParamsBuilder.Add(param.TypeWithAnnotations.WithTypeAndModifiers(translatedParamType, VisitCustomModifiers(param.TypeWithAnnotations.CustomModifiers)));
                        translatedParamRefCustomModifiersBuilder.Add(VisitCustomModifiers(param.RefCustomModifiers));
                    }

                    translatedParameterTypes          = translatedParamsBuilder.ToImmutableAndFree();
                    translatedParamRefCustomModifiers = translatedParamRefCustomModifiersBuilder.ToImmutableAndFree();
                }

                return(symbol.SubstituteTypeSymbol(translatedReturnTypeWithAnnotations, translatedParameterTypes, translatedRefCustomModifiers, translatedParamRefCustomModifiers));
            }
        private FunctionPointerTypeSymbol DecodeFunctionPointerType(FunctionPointerTypeSymbol type)
        {
            var parameterTypes = ImmutableArray <TypeWithAnnotations> .Empty;
            var paramsModified = false;

            if (type.Signature.ParameterCount > 0)
            {
                var paramsBuilder = ArrayBuilder <TypeWithAnnotations> .GetInstance(type.Signature.ParameterCount);

                for (int i = type.Signature.ParameterCount - 1; i >= 0; i--)
                {
                    var param        = type.Signature.Parameters[i];
                    var decodedParam = DecodeTypeInternal(param.TypeWithAnnotations);
                    paramsModified = paramsModified || !decodedParam.IsSameAs(param.TypeWithAnnotations);
                    paramsBuilder.Add(decodedParam);
                }

                if (paramsModified)
                {
                    paramsBuilder.ReverseContents();
                    parameterTypes = paramsBuilder.ToImmutableAndFree();
                }
                else
                {
                    parameterTypes = type.Signature.ParameterTypesWithAnnotations;
                    paramsBuilder.Free();
                }
            }

            var decodedReturnType = DecodeTypeInternal(type.Signature.ReturnTypeWithAnnotations);

            if (paramsModified || !decodedReturnType.IsSameAs(type.Signature.ReturnTypeWithAnnotations))
            {
                return(type.SubstituteTypeSymbol(decodedReturnType, parameterTypes, refCustomModifiers: default, paramRefCustomModifiers: default));
        private FunctionPointerTypeSymbol TransformFunctionPointerType(FunctionPointerTypeSymbol type)
        {
            IgnoreIndex();

            var transformedReturnType     = TransformTypeWithAnnotations(type.Signature.ReturnTypeWithAnnotations);
            var transformedParameterTypes = ImmutableArray <TypeWithAnnotations> .Empty;
            var paramsModified            = false;

            if (type.Signature.ParameterCount > 0)
            {
                var builder = ArrayBuilder <TypeWithAnnotations> .GetInstance(type.Signature.ParameterCount);

                foreach (var param in type.Signature.Parameters)
                {
                    var transformedParam = TransformTypeWithAnnotations(param.TypeWithAnnotations);
                    paramsModified = paramsModified || !transformedParam.IsSameAs(param.TypeWithAnnotations);
                    builder.Add(transformedParam);
                }

                if (paramsModified)
                {
                    transformedParameterTypes = builder.ToImmutableAndFree();
                }
                else
                {
                    transformedParameterTypes = type.Signature.ParameterTypesWithAnnotations;
                    builder.Free();
                }
            }

            if (paramsModified || !transformedReturnType.IsSameAs(type.Signature.ReturnTypeWithAnnotations))
            {
                return(type.SubstituteTypeSymbol(transformedReturnType, transformedParameterTypes, refCustomModifiers: default, paramRefCustomModifiers: default));
        private FunctionPointerTypeSymbol?TransformFunctionPointerType(FunctionPointerTypeSymbol type)
        {
            var flag = ConsumeFlag();

            Debug.Assert(!flag);

            var sig = type.Signature;

            var(transformedReturnWithAnnotations, madeChanges) = handle(ref this, sig.RefKind, sig.RefCustomModifiers, sig.ReturnTypeWithAnnotations);
            if (transformedReturnWithAnnotations.IsDefault)
            {
                return(null);
            }

            var transformedParameters = ImmutableArray <TypeWithAnnotations> .Empty;

            if (sig.ParameterCount > 0)
            {
                var paramsTransformed = false;
                var paramsBuilder     = ArrayBuilder <TypeWithAnnotations> .GetInstance(sig.ParameterCount);

                try
                {
                    foreach (var param in sig.Parameters)
                    {
                        var(transformedParamType, paramTransformed) = handle(ref this, param.RefKind, param.RefCustomModifiers, param.TypeWithAnnotations);
                        if (transformedParamType.IsDefault)
                        {
                            return(null);
                        }

                        paramsBuilder.Add(transformedParamType);
                        paramsTransformed |= paramTransformed;
                    }

                    transformedParameters = paramsTransformed ? paramsBuilder.ToImmutable() : sig.ParameterTypesWithAnnotations;
                    madeChanges          |= paramsTransformed;
                }
                finally
                {
                    paramsBuilder.Free();
                }
            }

            if (madeChanges)
            {
                return(type.SubstituteTypeSymbol(transformedReturnWithAnnotations, transformedParameters,
                                                 refCustomModifiers: default, paramRefCustomModifiers: default));