示例#1
0
 internal AnonymousType(IIntermediateAssembly parent, params AnonymousTypeMember[] members)
     : base(parent.PrivateImplementationDetails)
 {
     this.index   = parent.PrivateImplementationDetails.AnonymousTypes.Count;
     this.members = members;
     this.Lock();
 }
示例#2
0
        private static string[] WriteProject(string resultPath, IIntermediateAssembly newAssembly)
        {
            var opts = new IntermediateCodeTranslatorOptions(/*HtmlCodeFormatterProvider.Singleton/**/ new DefaultCodeTranslatorFormatterProvider() /**/);

            opts.AllowPartials = true;
            /* Below controls the emission order of the elements.  The default would be verbatim order (the order they were inserted.) */
            CSharpProjectTranslator cspt = new CSharpProjectTranslator(opts);

            opts.TranslationOrder.Add(DeclarationTranslationOrder.Fields);
            opts.TranslationOrder.Add(DeclarationTranslationOrder.Constructors);
            opts.TranslationOrder.Add(DeclarationTranslationOrder.UnaryOperatorCoercions);
            opts.TranslationOrder.Add(DeclarationTranslationOrder.BinaryOperatorCoercions);
            opts.TranslationOrder.Add(DeclarationTranslationOrder.TypeCoercions);
            opts.TranslationOrder.Add(DeclarationTranslationOrder.Properties);
            opts.TranslationOrder.Add(DeclarationTranslationOrder.Methods);
            opts.TranslationOrder.Add(DeclarationTranslationOrder.Classes);
            opts.TranslationOrder.Add(DeclarationTranslationOrder.Delegates);
            opts.TranslationOrder.Add(DeclarationTranslationOrder.Enums);
            opts.TranslationOrder.Add(DeclarationTranslationOrder.Interfaces);
            /* Make it follow the preferred two-space format. */
            opts.IndentationSpaceCount = 2;
            opts.TranslationOrder.Add(DeclarationTranslationOrder.Structs);
            opts.ElementOrderingMethod = TranslationOrderKind.Specific | TranslationOrderKind.Alphabetic;
            return(cspt.WriteProject(newAssembly, resultPath));
        }
示例#3
0
 public void Build(ParserCompiler compiler, IIntermediateAssembly assembly)
 {
     this._compiler        = compiler;
     this._assembly        = assembly;
     this._identityManager = ((IIntermediateCliManager)(this._assembly.IdentityManager));
     this.BuildFixedTokenClass();
 }
示例#4
0
 private void CreateICharStreamSegment(IIntermediateAssembly assembly)
 {
     this._charStreamSegmentInterface             = assembly.DefaultNamespace.Parts.Add().Interfaces.Add("I{0}CharStreamSegment", this._compiler.Source.Options.AssemblyName);
     this._charStreamSegmentInterface.AccessLevel = AccessLevelModifiers.Public;
     this.CreatePosition();
     this.CreateLength();
 }
示例#5
0
 public IAssemblyUniqueIdentifier GetIdentifier(IIntermediateAssembly assembly)
 {
     //if (assembly.PublicKeyInfo == null || assembly.PublicKeyInfo.PublicToken.Token == null || assembly.PublicKeyInfo.PublicToken.Token.Length == 0)
     return(TypeSystemIdentifiers.GetAssemblyIdentifier(assembly.Name, assembly.AssemblyInformation.AssemblyVersion, assembly.AssemblyInformation.Culture));
     //else
     //    return TypeSystemIdentifiers.GetAssemblyIdentifier(assembly.Name, assembly.AssemblyInformation.AssemblyVersion, assembly.AssemblyInformation.Culture, assembly.PublicKeyInfo.PublicToken.Token);
 }
示例#6
0
        private static void Test <TLanguage, TProvider>(ILanguageProvider <TLanguage, TProvider> provider)
            where TLanguage :
        ILanguage <TLanguage, TProvider>
            where TProvider :
        ILanguageProvider <TLanguage, TProvider>
        {
            IIntermediateAssembly iia = (IIntermediateAssembly)provider.CreateAssembly("TestAssembly");
            var idm                     = iia.IdentityManager;
            var ienumerableType         = (IInterfaceType)idm.ObtainTypeReference(TypeSystemIdentifiers.GetTypeIdentifier("System.Collections.Generic", "IEnumerable", 1));
            var structuralExampleMethod = iia.Methods.Add("StructuralExample");
            var tdataset                = structuralExampleMethod.TypeParameters.Add("TDataset");
            var tdatabase               = structuralExampleMethod.TypeParameters.Add("TDatabase");
            var byteRef                 = idm.ObtainTypeReference(idm.RuntimeEnvironment.Byte);
            var datasetIndex            = tdataset.Indexers.Add(byteRef, new TypedNameSeries(new TypedName("index", idm.ObtainTypeReference(idm.RuntimeEnvironment.Int32))), true, true);
            var database                = tdataset.Properties.Add(new TypedName("Database", tdatabase), true, false);
            var dataCopy                = tdataset.Methods.Add(new TypedName("GetDataCopy", byteRef.MakeArray()));
            var clone                   = tdataset.Methods.Add(new TypedName("Clone", tdataset));
            var ctor                    = tdataset.Constructors.Add(new TypedName("uInst", tdatabase), new TypedName("data", byteRef.MakeArray()));
            var d              = datasetIndex.GetMethod.GetReference(new SpecialReferenceExpression(SpecialReferenceKind.This)).Invoke();
            var gvm            = datasetIndex.GetMethod.UniqueIdentifier;
            var parameters     = datasetIndex.Parameters;
            var nextParameter  = parameters.Add(new TypedName("testIndex", idm.ObtainTypeReference(RuntimeCoreType.Int16)));
            var valueParameter = datasetIndex.SetMethod.ValueParameter;

            nextParameter.ParameterType = idm.ObtainTypeReference(RuntimeCoreType.SByte);

            iia.Dispose();
        }
示例#7
0
 public void Build(ParserCompiler compiler, IIntermediateAssembly assembly)
 {
     this._compiler        = compiler;
     this._assembly        = assembly;
     this._identityManager = ((IIntermediateCliManager)(assembly.IdentityManager));
     CreateICharStreamSegment(assembly);
     CreateCharStreamSegment(assembly);
 }
示例#8
0
 public void Build(ParserCompiler compiler, IIntermediateAssembly targetAssembly)
 {
     this._targetAssembly         = targetAssembly;
     this._compiler               = compiler;
     this._symbolStore            = targetAssembly.DefaultNamespace.Parts.Add().Classes.Add("{0}SymbolStore", this._compiler.Source.Options.AssemblyName);
     this._singletons             = _symbolStore.Parts.Add().Classes.Add("Singletons");
     this._identityEnum           = targetAssembly.DefaultNamespace.Parts.Add().Enums.Add("{0}Symbols", this._compiler.Source.Options.AssemblyName);
     _symbolStore.AccessLevel     = AccessLevelModifiers.Internal;
     _symbolStore.SpecialModifier = SpecialClassModifier.Static;
     _singletons.AccessLevel      = AccessLevelModifiers.Internal;
     _symbolStore.SummaryText     = string.Format("Defines the used symbols for the {0} language, effectively each unique set of combinations is outlined within this symbol store.", compiler.Source.Options.GrammarName);
 }
示例#9
0
 private void CreateCharStreamSegment(IIntermediateAssembly assembly)
 {
     this._charStreamSegmentClass = assembly.DefaultNamespace.Parts.Add().Classes.Add("{0}CharStreamSegment", this._compiler.Source.Options.AssemblyName);
     this._charStreamSegmentClass.ImplementedInterfaces.ImplementInterfaceQuick(this._charStreamSegmentInterface);
     this.CreateStartPositionImpl();
     this.CreateEndPositionImpl();
     this.CreateLengthImpl();
     this.CreateOwnerImpl();
     this.LengthImpl.AccessLevel         = this.StartPositionImpl.AccessLevel = this.EndPositionImpl.AccessLevel = AccessLevelModifiers.Public;
     this._StartPositionImpl.AccessLevel = this._EndPositionImpl.AccessLevel = AccessLevelModifiers.Private;
     this.CharStreamSegment.AccessLevel  = AccessLevelModifiers.Public;
 }
        public string Visit(IIntermediateAssembly assembly, DefaultAssemblyFilenameVisitorContext context)
        {
            if (!assembly.UsesDefaultFileName)
            {
                context.CurrentResult = assembly.FileName;
            }
            else
            {
                VisitNamespaceParent(assembly, context);
            }

            return(context.CurrentResult);
        }
示例#11
0
            private static CSharpAssemblyFileInfo GetFileInfo(IIntermediateAssembly target, List <string> otherFiles, bool allowPartials)
            {
                var context = new CSharpAssemblyFileContext()
                {
                    RootAssembly = target.GetRoot(), OtherFiles = otherFiles
                };

                if (!allowPartials)
                {
                    if (target.IsRoot)
                    {
                        context.CurrentResult = new CSharpAssemblyFileInfo()
                        {
                            FileName = target.Name
                        }
                    }
                    ;
                    else
                    {
                        context.CurrentResult = new CSharpAssemblyFileInfo();
                    }
                    return(context.CurrentResult);
                }
                var visitor = new AssemblyFileVisitor();

                target.Accept(visitor, context);
                if (context.CurrentResult.YieldsFile)
                {
                    if (context.CurrentResult.FileName.Contains('+'))
                    {
                    }
                    if (context.OtherFiles.Contains(context.CurrentResult.FileName))
                    {
                        string fnameCurrent = context.CurrentResult.FileName;
                        var    path         = Path.GetDirectoryName(fnameCurrent);
                        var    fileName     = Path.GetFileNameWithoutExtension(fnameCurrent);
                        int    offset       = 0;
                        while (context.OtherFiles.Contains(fnameCurrent))
                        {
                            fnameCurrent = string.Format("{0}{1}{2}{3}{4}", path, Path.DirectorySeparatorChar, fileName, '-', ++offset);
                        }
                        context.CurrentResult.FileName = fnameCurrent;
                        context.OtherFiles.Add(fnameCurrent);
                    }
                    else
                    {
                        context.OtherFiles.Add(context.CurrentResult.FileName);
                    }
                }
                return(context.CurrentResult);
            }
示例#12
0
 public void AssemblyCreated(IIntermediateAssembly assembly)
 {
     if (this.intermediateAssemblies.ContainsKey(assembly.UniqueIdentifier))
     {
         throw new InvalidOperationException("A similarly named assembly within the current scope already exists.");
     }
     if (assembly == null)
     {
         throw new ArgumentNullException("assembly");
     }
     this.intermediateAssemblies._Add(assembly.UniqueIdentifier, assembly);
     assembly.IdentifierChanged += assembly_IdentifierChanged;
     assembly.Disposed          += assembly_Disposed;
 }
示例#13
0
            public CSharpAssemblyFileInfo Visit(IIntermediateAssembly assembly, CSharpAssemblyFileContext context)
            {
                CSharpAssemblyFileInfo result = new CSharpAssemblyFileInfo();

                context.CurrentResult = result;
                if (!assembly.UsesDefaultFileName)//(string.IsNullOrEmpty(assembly.FileName) || string.IsNullOrWhiteSpace(assembly.FileName)))
                {
                    context.CurrentResult.FileName = assembly.FileName;
                }
                else
                {
                    VisitNamespaceParent(assembly, context);
                }
                return(result);
            }
示例#14
0
        public void ScaffoldInterface(IIntermediateAssembly assembly)
        {
            this._assembly = assembly;
            var namespaceNames = this._relevantTypes.Select(k => k.NamespaceName).Distinct().ToArray();
            /* We're going to throw-out cases where there's only one type, as it's likely a special case, not the standard. */
            var totalTypeCount        = this._relevantTypes.Count;
            var namespaceNamesTrimmed =
                (from name in namespaceNames
                 join type in this._relevantTypes on name equals type.NamespaceName into set
                 where (((float)set.Count()) / (float)totalTypeCount) * 100 > 20
                 select name).Distinct().ToArray();

            if (namespaceNamesTrimmed.Length > 0)
            {
                namespaceNames = namespaceNamesTrimmed;
            }
            var relativeRoot = namespaceNames.GetRelativeRoot(".");

            if (!assembly.Namespaces.PathExists(relativeRoot))
            {
                assembly.Namespaces.Add(relativeRoot);
            }
            var ns = assembly.Namespaces[relativeRoot];

            GenericParameterData[] gpData = new GenericParameterData[(this._detail.ContextualVisitor ? 1 : 0) + (this._detail.YieldingVisitor ? 1 : 0)];
            if (this._detail.YieldingVisitor)
            {
                gpData[0] = new GenericParameterData("TResult");
            }
            if (this._detail.ContextualVisitor)
            {
                gpData[this._detail.YieldingVisitor ? 1 : 0] = new GenericParameterData("TContext");
            }
            var nameParts = this._detail.TargetContext.TitleCaseIdentifierSplit();

            this.NameParts = nameParts;
            if (!this._detail.YieldingVisitor && this._detail.ContextualVisitor)
            {
                var npList = new List <string>(nameParts);
                npList.Insert(npList.Count - 1, "Contextual");
                nameParts = npList.ToArray();
            }

            var visitorInterface = ns.Parts.Add().Interfaces.Add(string.Format("I{0}", string.Join(string.Empty, nameParts)), gpData);

            this.VisitorInterface             = visitorInterface;
            this.VisitorInterface.AccessLevel = AccessLevelModifiers.Public;
        }
示例#15
0
            public string Visit(IIntermediateAssembly assembly, IntermediateNameRequestDetails context)
            {
                string name = null;

                switch (context)
                {
                case IntermediateNameRequestDetails.TargetFileName:
                    this.fileNameLookup.TryGetValue(assembly, out name);
                    break;

                case IntermediateNameRequestDetails.SourceFileName:
                    name = assembly.FileName;
                    break;

                case IntermediateNameRequestDetails.DisplayName:
                    name = assembly.Name;
                    break;
                }
                return(name);
            }
示例#16
0
            public void BeginDocument(IIntermediateAssembly target)
            {
                this.CreateStream();
                this.HandleWriteInternal("<!DOCTYPE html>");
                this.HandleWriteInternal("<html>");
                this.HandleWriteLine();
                string targetFileName;

                TryGetAssemblyFileName(out targetFileName);
                if (targetFileName != null)
                {
                    targetFileName = Path.GetFileNameWithoutExtension(targetFileName);
                }
                else
                {
                    targetFileName = string.Empty;
                }
                this.HandleWriteInternal(@"    <head>
        <title>" + targetFileName + @"</title>
        <style>
            a
            {
                text-decoration:none;
            }
            a:hover.ref
            {
                text-decoration:none;
                border-bottom:1px dotted #CFCFCF;
                color:inherit;
            }
        </style>
    </head>");
                this.HandleWriteLine();
                this.HandleWriteInternal(string.Format("<body style=\"background-color:#{0};\">", GetColorCssRgb(backgroundColor1)));
                this.HandleWriteLine();
                this.HandleWriteInternal("<pre>");
                this.HandleWriteLine();
            }
示例#17
0
        public string[] WriteProject(IIntermediateAssembly assembly, string rootFolder, string extension = ".cs")
        {
            List<string> fileTracker = new List<string>();
            Dictionary<IIntermediateAssembly, string> fileNameLookup = new Dictionary<IIntermediateAssembly, string>();
            this.nameProvider = new NameProvider(this, fileNameLookup);
            var information =
                (from part in new[] { assembly }.Concat(assembly.Parts)
                 let partFile = CSharpProjectTranslator.AssemblyFileVisitor.GetFileInfo(part, this, fileTracker)
                 where partFile.YieldsFile
                 let fnTrans = GetTranslatorAndFinalName(rootFolder, extension, partFile.FileName, part, fileNameLookup)
                 select new { Part = part, FileName = partFile.FileName, FinalName = fnTrans.Item2, Translator = fnTrans.Item1 }).ToArray();
#if !DO_NOT_WRITE_MULTITHREADED
            Parallel.ForEach(information, async assemblyFileInfo =>
#else
            foreach (var assemblyFileInfo in information)
#endif
            {
                CodeTranslator translator = assemblyFileInfo.Translator;
                var fileStream = new FileStream(assemblyFileInfo.FinalName, FileMode.Create, FileAccess.Write, FileShare.Read);
                var streamWriter = new StreamWriter(fileStream);
                IndentedTextWriter itw ;
                if (options.IndentationSpaceCount != null)
                    itw = new IndentedTextWriter(streamWriter, new string(' ', options.IndentationSpaceCount.Value));
                else
                    itw = new IndentedTextWriter(streamWriter);
                translator.Target = itw;
                translator.Translate(assemblyFileInfo.Part);
#if !DO_NOT_WRITE_MULTITHREADED
                await streamWriter.FlushAsync();
#else
                streamWriter.Flush();
#endif
                streamWriter.Dispose();
                fileStream.Close();
                fileStream.Dispose();
            }
 /// <summary>
 /// Creates a new <see cref="IntermediateIndexerSignatureMember{TIndexer, TIntermediateIndexer, TIndexerParent, TIntermediateIndexerParent, TMethodMember}"/>
 /// with the <paramref name="name"/>, <paramref name="parent"/> and <paramref name="assembly"/> provided.
 /// </summary>
 /// <param name="name">The <see cref="String"/> value representing the unique name of the
 /// <see cref="IntermediateIndexerSignatureMember{TIndexer, TIntermediateIndexer, TIndexerParent, TIntermediateIndexerParent, TMethodMember}"/>.</param>
 /// <param name="parent">The <typeparamref name="TIntermediateIndexerParent"/> which contains the
 /// <see cref="IntermediateIndexerSignatureMember{TIndexer, TIntermediateIndexer, TIndexerParent, TIntermediateIndexerParent, TMethodMember}"/>.</param>
 /// <param name="assembly">The <see cref="IIntermediateAssembly"/> which
 /// contains the <see cref="IntermediateIndexerSignatureMember{TIndexer, TIntermediateIndexer, TIndexerParent, TIntermediateIndexerParent, TMethodMember}"/>.</param>
 public IntermediateIndexerSignatureMember(string name, TIntermediateIndexerParent parent, IIntermediateAssembly assembly)
     : base(name, parent, assembly)
 {
 }
示例#19
0
            //#region ILanguageCSTTranslator<IOilexerGrammarFile> Members

            public void Process(IOilexerGrammarFile nextInput, IIntermediateAssembly currentAssembly)
            {
                throw new NotSupportedException("Inputs are linked explicitly in grammar files, next input processing is not supported.");
            }
示例#20
0
 public void BeginDocument(IIntermediateAssembly target)
 {
 }
示例#21
0
 public TestLinkerResult Visit(IIntermediateAssembly assembly, ICompilationContext context)
 {
     throw new NotImplementedException();
 }
 /// <summary>
 /// Creates a new <see cref="IntermediatePropertyMember{TProperty, TIntermediateProperty, TPropertyParent, TIntermediatePropertyParent, TMethodMember}"/>
 /// with the <paramref name="parent"/> provided.
 /// </summary>
 /// <param name="parent">The <typeparamref name="TIntermediatePropertyParent"/>
 /// which contains the <see cref="IntermediatePropertyMember{TProperty, TIntermediateProperty, TPropertyParent, TIntermediatePropertyParent, TMethodMember}"/>.</param>
 /// <param name="assembly">The <see cref="IIntermediateAssembly"/> contains the <see cref="IntermediatePropertyMember{TProperty, TIntermediateProperty, TPropertyParent, TIntermediatePropertyParent, TMethodMember}"/>.
 /// </param>
 public IntermediatePropertyMember(TIntermediatePropertyParent parent, IIntermediateAssembly assembly)
     : base(parent)
 {
     this.assembly = assembly;
 }
 /// <summary>
 /// Creates a new <see cref="IntermediatePropertyMember{TProperty, TIntermediateProperty, TPropertyParent, TIntermediatePropertyParent, TMethodMember}"/>
 /// with the <paramref name="name"/> and <paramref name="parent"/>
 /// provided.
 /// </summary>
 /// <param name="name">The <see cref="String"/> value representing the
 /// unique name of the <see cref="IntermediatePropertyMember{TProperty, TIntermediateProperty, TPropertyParent, TIntermediatePropertyParent, TMethodMember}"/>.
 /// </param>
 /// <param name="parent">The <typeparamref name="TIntermediatePropertyParent"/>
 /// which contains the <see cref="IntermediatePropertyMember{TProperty, TIntermediateProperty, TPropertyParent, TIntermediatePropertyParent, TMethodMember}"/>.</param>
 /// <param name="assembly">The <see cref="IIntermediateAssembly"/> contains the <see cref="IntermediatePropertyMember{TProperty, TIntermediateProperty, TPropertyParent, TIntermediatePropertyParent, TMethodMember}"/>.
 /// </param>
 public IntermediatePropertyMember(string name, TIntermediatePropertyParent parent, IIntermediateAssembly assembly)
     : base(parent)
 {
     base.OnSetName(name);
     this.assembly = assembly;
 }
示例#24
0
 /// <summary>
 /// Creates a new <see cref="IntermediateParameterParentMemberBase{TParentIdentifier, TParent, TIntermediateParent, TParameter, TIntermediateParameter, TGrandParent, TIntermediateGrandParent}"/>
 /// with the <paramref name="name"/> and <paramref name="parent"/> provided.
 /// </summary>
 /// <param name="name">The <see cref="String"/> representing the unique identifier of the
 /// <see cref="IntermediateParameterParentMemberBase{TParentIdentifier, TParent, TIntermediateParent, TParameter, TIntermediateParameter, TGrandParent, TIntermediateGrandParent}"/>.</param>
 /// <param name="parent">The <typeparamref name="TIntermediateGrandParent"/>
 /// which contains the <see cref="IntermediateParameterParentMemberBase{TParentIdentifier, TParent, TIntermediateParent, TParameter, TIntermediateParameter, TGrandParent, TIntermediateGrandParent}"/>.</param>
 /// <param name="assembly">The <see cref="IIntermediateAssembly"/>
 /// which contains the parameter parent member.</param>
 public IntermediateParameterParentMemberBase(string name, TIntermediateGrandParent parent, IIntermediateAssembly assembly)
     : base(name, parent)
 {
     this.assembly = assembly;
 }
示例#25
0
 void IIntermediateDeclarationVisitor.Visit(IIntermediateAssembly intermediateDeclaration)
 {
     this.Translate(intermediateDeclaration);
 }
 /// <summary>
 /// Creates a new <see cref="IntermediateConstructorSignatureMemberBase{TCtor, TIntermediateCtor, TType, TIntermediateType}"/>
 /// with the <paramref name="parent"/> provdied.
 /// </summary>
 /// <param name="parent">The <typeparamref name="TIntermediateType"/>
 /// which the <see cref="IntermediateConstructorSignatureMemberBase{TCtor, TIntermediateCtor, TType, TIntermediateType}"/>
 /// belongs to.</param>
 /// <param name="assembly">The <see cref="IIntermediateAssembly"/>
 /// which contains the intermediate signature member and contains context relative
 /// to disambiguating type identities.</param>
 /// <param name="typeInitializer">Whether the <see cref="IntermediateConstructorSignatureMemberBase{TCtor, TIntermediateCtor, TType, TIntermediateType}"/>
 /// is a type initializer</param>
 internal IntermediateConstructorSignatureMemberBase(TIntermediateType parent, IIntermediateAssembly assembly, bool typeInitializer = false)
     : base(parent, assembly)
 {
     this.typeInitializer = typeInitializer;
     this.AssignName(typeInitializer ? ".cctor" : ".ctor");
 }
 /// <summary>
 /// Creates a new <see cref="IntermediateModule"/> with the <paramref name="parent"/>
 /// provided.
 /// </summary>
 /// <param name="name">The string value representing the unique name of the <see cref="IntermediateModule"/>.</param>
 /// <param name="parent">The <see cref="IIntermediateAssembly"/> which contains the <see cref="IntermediateModule"/></param>
 public IntermediateModule(string name, IIntermediateAssembly parent)
     : base(parent)
 {
     this.name = name;
 }
 public ParameterMember(string name, TIntermediateIndexer parent, IIntermediateAssembly assembly)
     : base(parent, assembly)
 {
     this.AssignName(name);
 }
 public ParameterMember(TIntermediateIndexer parent, IIntermediateAssembly assembly)
     : base(parent, assembly)
 {
 }
示例#30
0
        public override void ChangeSignatureParameterArraySupport <TParent, TIntermediateParent, TParameter, TIntermediateParameter>(IIntermediateParameterParent <TParent, TIntermediateParent, TParameter, TIntermediateParameter> target, IIntermediateAssembly associatedAssembly, bool support)
        {
            var metadatumType = this.IdentityManager.ObtainTypeReference(this.IdentityManager.RuntimeEnvironment.GetCoreIdentifier(CliRuntimeCoreType.ParamArrayMetadatum, associatedAssembly));

            if (metadatumType == null)
            {
                return;
            }
            if (target.Parameters.Count == 0)
            {
                return;
            }
            IIntermediateParameterMember <TParent, TIntermediateParent> lastParameter = target.Parameters.Values[target.Parameters.Count - 1];

            if (SignatureSupportsParameterArray(target, associatedAssembly))
            {
                if (support)
                {
                    return;
                }
                var metadatum = lastParameter.Metadata[metadatumType];
                lastParameter.Metadata.Remove(metadatum);
                return;
            }
            else if (support)
            {
                lastParameter.Metadata.Add(new MetadatumDefinitionParameterValueCollection(metadatumType));
            }
        }