示例#1
0
        public void AddMetadataReference(IMetadataReference metadataReference)
        {
            if (MetadataReferences.Any(x => x.Name == metadataReference.Name))
                return;

            MetadataReferences.Add(metadataReference);
        }
示例#2
0
        public static TMetadata Resolve <TMetadata>(this IMetadataReference <TMetadata> reference, IMetadata @base)
            where TMetadata : class, IMetadata
        {
            @base.EnsureNotNull(nameof(@base));
            //
            var resolvedMetadata = P_Resolve(reference: reference, @base: @base);

            if (resolvedMetadata == null)
            {
                return(null);
            }
            else
            {
                var result = resolvedMetadata as TMetadata;
                if (result == null)
                {
                    throw
                        new MetadataNotCompliantReferenceException(reference, resolvedMetadata);
                }
                else
                {
                    return(result);
                }
            }
        }
示例#3
0
        private MetadataReference ConvertMetadataReference(IMetadataReference metadataReference)
        {
            var embeddedReference = metadataReference as IMetadataEmbeddedReference;

            if (embeddedReference != null)
            {
                return(MetadataReference.CreateFromImage(embeddedReference.Contents));
            }
            var fileMetadataReference = metadataReference as IMetadataFileReference;

            if (fileMetadataReference != null)
            {
                return(MetadataReference.CreateFromFile(fileMetadataReference.Path));
            }
            var projectReference = metadataReference as IMetadataProjectReference;

            if (projectReference != null)
            {
                using (var ms = new MemoryStream())
                {
                    projectReference.EmitReferenceAssembly(ms);
                    return(MetadataReference.CreateFromImage(ms.ToArray()));
                }
            }
            throw new NotSupportedException();
        }
示例#4
0
 public MetadataReferenceException(IMetadataReference reference, IMetadata @base, string message, Exception innerException)
     : base(P_ConstructMessage(reference, @base, message, innerException), innerException)
 {
     _reference         = reference;
     _referenceAsString = reference?.ToString();
     _base         = @base;
     _baseAsString = @base?.ToString();
 }
示例#5
0
 public static void EnsureReachable(this IMetadataReference reference, IMetadata @base)
 {
     if (!(reference is null))
     {
         // TODO: Implement logic without factual resolution.
         //
         Resolve(reference, @base);
     }
 }
示例#6
0
        public void AddMetadataReference(IMetadataReference metadataReference)
        {
            if (MetadataReferences.Any(x => x.Name == metadataReference.Name))
            {
                return;
            }

            MetadataReferences.Add(metadataReference);
        }
示例#7
0
        public LibraryExport(IMetadataReference metadataReference)
        {
            MetadataReferences = new List<IMetadataReference>
            {
                metadataReference
            };

            SourceReferences = new List<ISourceReference>();
        }
示例#8
0
        public LibraryExport(IMetadataReference metadataReference)
        {
            MetadataReferences = new List <IMetadataReference>
            {
                metadataReference
            };

            SourceReferences = new List <ISourceReference>();
        }
示例#9
0
 static string P_ConstructMessage(IMetadataReference reference, IMetadata @base, string message, Exception innerException)
 {
     if (!(string.IsNullOrEmpty(message) && reference == null && @base == null))
     {
         if (innerException == null)
         {
             return(FormatXResource(typeof(MetadataReferenceException), "Detailed", message, reference.FmtStr().G(), @base.FmtStr().G()));
         }
         return(FormatXResource(typeof(MetadataReferenceException), "Detailed/InnerException", message, reference.FmtStr().G(), @base.FmtStr().G()));
     }
     else if (innerException == null)
     {
         return(FormatXResource(typeof(MetadataReferenceException), subpath: null));
     }
     return(FormatXResource(typeof(MetadataReferenceException), "InnerException"));
 }
示例#10
0
        /// <summary>
        /// Converts an <see cref="IMetadataReference"/> to a <see cref="MetadataReference"/> instance.
        /// </summary>
        /// <param name="metadataReference">The <see cref="IMetadataReference"/> to convert.</param>
        /// <param name="assemblyMetadataFactory">Factory invoked to get instances of <see cref="AssemblyMetadata"/>.</param>
        /// <returns>The converted <see cref="MetadataReference"/>.</returns>
        public static MetadataReference ConvertMetadataReference(
            this IMetadataReference metadataReference,
            Func <IMetadataFileReference, AssemblyMetadata> assemblyMetadataFactory)
        {
            var roslynReference = metadataReference as IRoslynMetadataReference;

            if (roslynReference != null)
            {
                return(roslynReference.MetadataReference);
            }

            var embeddedReference = metadataReference as IMetadataEmbeddedReference;

            if (embeddedReference != null)
            {
                return(MetadataReference.CreateFromImage(embeddedReference.Contents));
            }

            var fileMetadataReference = metadataReference as IMetadataFileReference;

            if (fileMetadataReference != null)
            {
                var metadata = assemblyMetadataFactory(fileMetadataReference);
                return(metadata.GetReference(filePath: fileMetadataReference.Path));
            }

            var projectReference = metadataReference as IMetadataProjectReference;

            if (projectReference != null)
            {
                using (var ms = new MemoryStream())
                {
                    projectReference.EmitReferenceAssembly(ms);

                    return(MetadataReference.CreateFromStream(ms, filePath: projectReference.ProjectPath));
                }
            }

            throw new NotSupportedException($"Unsupported type '{metadataReference.GetType()}'.");
        }
示例#11
0
        private MetadataReference ConvertMetadataReference(IMetadataReference metadataReference)
        {
            var roslynReference = metadataReference as IRoslynMetadataReference;

            if (roslynReference != null)
            {
                return(roslynReference.MetadataReference);
            }

            var embeddedReference = metadataReference as IMetadataEmbeddedReference;

            if (embeddedReference != null)
            {
                return(new MetadataImageReference(embeddedReference.Contents));
            }

            var fileMetadataReference = metadataReference as IMetadataFileReference;

            if (fileMetadataReference != null)
            {
                return(CreateMetadataFileReference(fileMetadataReference.Path));
            }

            var projectReference = metadataReference as IMetadataProjectReference;

            if (projectReference != null)
            {
                using (var ms = new MemoryStream())
                {
                    projectReference.EmitReferenceAssembly(ms);

                    ms.Seek(0, SeekOrigin.Begin);

                    return(new MetadataImageReference(ms));
                }
            }

            throw new NotSupportedException();
        }
示例#12
0
        static IMetadata P_Resolve(this IMetadataReference reference, IMetadata @base)
        {
            @base.EnsureNotNull(nameof(@base));
            //
            IMetadata result;

            if (reference == null)
            {
                result = null;
                @base.EnsureNotDisposeState();
            }
            else
            {
                var resolver = reference.GetResolver();
                if (resolver == null)
                {
                    throw new MetadataReferenceException(reference, @base, FormatXResource(typeof(MetadataReference), "NoPreferredResolver"));
                }
                try {
                    IMetadata resolvedMetadata;
                    if (resolver.Resolve(@base, reference, out resolvedMetadata))
                    {
                        result = resolvedMetadata;
                    }
                    else
                    {
                        throw
                            new MetadataReferenceNotResolvedException(reference, @base);
                    }
                    // TODO: Validate compliance.
                    //
                }
                catch (Exception firstException) when(!(firstException is MetadataReferenceException))
                {
                    throw new MetadataReferenceNotResolvedException(reference: reference, @base: @base, innerException: firstException);
                }
            }
            return(result);
        }
        private MetadataReference ConvertMetadataReference(IMetadataReference metadataReference)
        {
            var roslynReference = metadataReference as IRoslynMetadataReference;

            if (roslynReference != null)
            {
                return roslynReference.MetadataReference;
            }

            var embeddedReference = metadataReference as IMetadataEmbeddedReference;

            if (embeddedReference != null)
            {
                return MetadataReference.CreateFromImage(embeddedReference.Contents);
            }

            var fileMetadataReference = metadataReference as IMetadataFileReference;

            if (fileMetadataReference != null)
            {
                return CreateMetadataFileReference(fileMetadataReference.Path);
            }

            var projectReference = metadataReference as IMetadataProjectReference;
            if (projectReference != null)
            {
                using (var ms = new MemoryStream())
                {
                    projectReference.EmitReferenceAssembly(ms);

                    return MetadataReference.CreateFromImage(ms.ToArray());
                }
            }

            throw new NotSupportedException();
        }
示例#14
0
 public void AddMetadataReference(string name, IMetadataReference metadataReference) {
     MetadataReferences[name] = metadataReference;
 }
示例#15
0
 public LibraryExport(IMetadataReference metadataReference) : this(new List <IMetadataReference>() { metadataReference })
 {
 }
示例#16
0
 public MetadataReferenceNotResolvedException(IMetadataReference reference, IMetadata @base, Exception innerException)
     : this(reference, @base, (string)null, innerException)
 {
 }
示例#17
0
        public bool Resolve(IMetadata @base, IMetadataReference reference, out IMetadata metadata)
        {
            @base.EnsureNotNull(nameof(@base));
            var pathNameReference =
                reference
                .EnsureNotNull(nameof(reference))
                .EnsureOfType <IMetadataReference, IMetadataPathNameReference>()
                .Value;
            //
            var requiredMetadataType = pathNameReference.TargetMetadataType;
            var name = pathNameReference.Name;
            var firstNameComponent = true;
            var currentSearchPlace = @base;
            var locMetadata        = default(IMetadata);

            foreach (var currentComponentName in name.Components)
            {
                if (firstNameComponent)
                {
                    locMetadata =
                        currentSearchPlace
                        .Sequence()
                        .Concat(currentSearchPlace.Parent.Sequence())
                        .Concat(currentSearchPlace.Siblings)
                        .Concat(currentSearchPlace.Children)
                        .Concat(currentSearchPlace.Ancestors.Skip(1))
                        .Where(i => MetadataName.Equals(i?.Name, currentComponentName))
                        .FirstOrDefault();
                    firstNameComponent = false;
                }
                else
                {
                    locMetadata =
                        currentSearchPlace
                        .Children
                        .Where(i => MetadataName.Equals(i.Name, currentComponentName))
                        .FirstOrDefault();
                }
                if (locMetadata == null)
                {
                    break;
                }
                else
                {
                    currentSearchPlace = locMetadata;
                }
            }
            if (locMetadata == null)
            {
                metadata = null;
                return(false);
            }
            else if (requiredMetadataType.IsAssignableFrom(locMetadata.GetType()))
            {
                metadata = locMetadata;
                return(true);
            }
            else
            {
                throw new MetadataNotCompliantReferenceException(reference, locMetadata);
            }
        }
示例#18
0
 public MetadataReferenceNotResolvedException(IMetadataReference reference, IMetadata @base, string message, Exception innerException)
     : base(reference, @base, string.IsNullOrEmpty(message) ? FormatXResource(typeof(MetadataReferenceNotResolvedException), null) : message, innerException)
 {
     this.SetErrorCode(MetadataErrorCodes.Reference.NotResolved);
 }
示例#19
0
 public MetadataReferenceNotResolvedException(IMetadataReference reference, IMetadata @base)
     : this(reference, @base, (string)null, (Exception)null)
 {
 }
示例#20
0
 public static IMetadata Resolve(this IMetadataReference reference, IMetadata @base)
 => P_Resolve(reference, @base);
示例#21
0
 public LibraryExport(IMetadataReference metadataReference) : this(new List<IMetadataReference>() { metadataReference }) { }
示例#22
0
 public MetadataNotCompliantReferenceException(IMetadataReference reference, IMetadata metadata)
     : this(reference, metadata, null, null)
 {
 }
示例#23
0
 public MetadataNotCompliantReferenceException(IMetadataReference reference, IMetadata metadata, string message, Exception innerException)
     : base(reference, null, string.IsNullOrEmpty(message) ? xres.FormatXResource(typeof(MetadataNotCompliantReferenceException), null, metadata.Fluent().NullCond(i => i.GetType()), reference.Fluent().NullCond(i => i.TargetMetadataType)) : xres.FormatXResource(typeof(MetadataNotCompliantReferenceException), "WithMessage", metadata.Fluent().NullCond(i => i.GetType()), reference.Fluent().NullCond(i => i.TargetMetadataType), message), innerException)
 {
     _metadata         = metadata;
     _metadataAsString = metadata?.ToString();
 }
示例#24
0
 public void AddMetadataReference(string name, IMetadataReference metadataReference)
 {
     MetadataReferences[name] = metadataReference;
 }
示例#25
0
 public MetadataReferenceException(IMetadataReference reference, IMetadata @base, string message)
     : this(reference, @base, message, null)
 {
 }