Esempio n. 1
0
        private IEntity FindEntityInRelevantAssemblies(string navigateTo, IEnumerable <LoadedAssembly> relevantAssemblies)
        {
            ITypeReference   typeRef   = null;
            IMemberReference memberRef = null;

            if (navigateTo.StartsWith("T:", StringComparison.Ordinal))
            {
                typeRef = IdStringProvider.ParseTypeName(navigateTo);
            }
            else
            {
                memberRef = IdStringProvider.ParseMemberIdString(navigateTo);
                typeRef   = memberRef.DeclaringTypeReference;
            }
            foreach (LoadedAssembly asm in relevantAssemblies.ToList())
            {
                var module = asm.GetPEFileOrNull();
                if (CanResolveTypeInPEFile(module, typeRef, out var typeHandle))
                {
                    ICompilation compilation = typeHandle.Kind == HandleKind.ExportedType
                                                ? new DecompilerTypeSystem(module, module.GetAssemblyResolver())
                                                : new SimpleCompilation(module, MinimalCorlib.Instance);
                    return(memberRef == null
                                                ? typeRef.Resolve(new SimpleTypeResolveContext(compilation)) as ITypeDefinition
                                                : (IEntity)memberRef.Resolve(new SimpleTypeResolveContext(compilation)));
                }
            }
            return(null);
        }
		public IEnumerable<ExceptionSources> this [IMemberReference member] {
			get {
				if (member == null)
					throw new ArgumentNullException ("member");
				IMemberReference memberDef = member.Resolve ();
				if (memberDef == null) {
					ArrayType array = member.DeclaringType as ArrayType;
					if (array != null && array.Rank > 1) {
						// Multi-dimensional array; the member is runtime generated, 
						// doesn't "really" exist (in a form that we can resolve),
						// so we can't do anything further.
						return new ExceptionSources[0];
					}
					throw new NotSupportedException (string.Format (
								"Unable to resolve member {0}::{1}.",
								member.DeclaringType.FullName, member.Name));
				}
				string memberDecl = xdoc.GetDeclaration (member.Resolve ());
				Dictionary<string, ExceptionSources> e;
				if (!db.TryGetValue (memberDecl, out e)) {
					e = new Dictionary<string, ExceptionSources> ();
					var bodies = GetMethodBodies (member);
					foreach (var body in bodies) {
						if (body == null)
							continue;
						FillExceptions (body, e);
					}
					db.Add (memberDecl, e);
				}
				return e.Values;
			}
		}
        public IMember Resolve(ITypeResolveContext context)
        {
            IType   declaringType   = typeReference.Resolve(context);
            IMember interfaceMember = interfaceMemberReference.Resolve(context.WithCurrentTypeDefinition(declaringType.GetDefinition()));

            if (interfaceMember == null)
            {
                return(null);
            }
            IEnumerable <IMember> members;

            if (interfaceMember.SymbolKind == SymbolKind.Accessor)
            {
                members = declaringType.GetAccessors(
                    m => m.IsExplicitInterfaceImplementation,
                    GetMemberOptions.IgnoreInheritedMembers);
            }
            else
            {
                members = declaringType.GetMembers(
                    m => m.SymbolKind == interfaceMember.SymbolKind && m.IsExplicitInterfaceImplementation,
                    GetMemberOptions.IgnoreInheritedMembers);
            }
            return(members.FirstOrDefault(m => m.ImplementedInterfaceMembers.Count == 1 && interfaceMember.Equals(m.ImplementedInterfaceMembers[0])));
        }
 public IMember Resolve(ITypeResolveContext context)
 {
     if (accessorReference.Resolve(context) is IMethod method)
         return method.AccessorOwner;
     else
         return null;
 }
        public IMember Resolve(ITypeResolveContext context)
        {
            var memberDefinition = memberDefinitionReference.Resolve(context);

            return(memberDefinition.Specialize(
                       new TypeParameterSubstitution(
                           classTypeArgumentReferences != null ? classTypeArgumentReferences.Resolve(context) : null,
                           methodTypeArgumentReferences != null ? methodTypeArgumentReferences.Resolve(context) : null
                           )
                       ));
        }
Esempio n. 6
0
 public IMember Resolve(ITypeResolveContext context)
 {
     if (accessorReference.Resolve(context) is IMethod method)
     {
         return(method.AccessorOwner);
     }
     else
     {
         return(null);
     }
 }
Esempio n. 7
0
 public IEnumerable <ExceptionSources> this [IMemberReference member] {
     get {
         if (member == null)
         {
             throw new ArgumentNullException("member");
         }
         IMemberReference memberDef = member.Resolve();
         if (memberDef == null)
         {
             ArrayType array = member.DeclaringType as ArrayType;
             if (array != null && array.Rank > 1)
             {
                 // Multi-dimensional array; the member is runtime generated,
                 // doesn't "really" exist (in a form that we can resolve),
                 // so we can't do anything further.
                 return(new ExceptionSources[0]);
             }
             throw new NotSupportedException(string.Format(
                                                 "Unable to resolve member {0}::{1}.",
                                                 member.DeclaringType.FullName, member.Name));
         }
         string memberDecl = xdoc.GetDeclaration(member.Resolve());
         Dictionary <string, ExceptionSources> e;
         if (!db.TryGetValue(memberDecl, out e))
         {
             e = new Dictionary <string, ExceptionSources> ();
             var bodies = GetMethodBodies(member);
             foreach (var body in bodies)
             {
                 if (body == null)
                 {
                     continue;
                 }
                 FillExceptions(body, e);
             }
             db.Add(memberDecl, e);
         }
         return(e.Values);
     }
 }
Esempio n. 8
0
        public ISymbol Resolve(ITypeResolveContext context)
        {
            IParameterizedMember member = memberReference.Resolve(context) as IParameterizedMember;

            if (member != null && index >= 0 && index < member.Parameters.Count)
            {
                return(member.Parameters[index]);
            }
            else
            {
                return(null);
            }
        }
        public IMember Resolve(ITypeResolveContext context)
        {
            IMethod method = accessorReference.Resolve(context) as IMethod;

            if (method != null)
            {
                return(method.AccessorOwner);
            }
            else
            {
                return(null);
            }
        }
Esempio n. 10
0
        public IMember Resolve(ITypeResolveContext context)
        {
            IMember interfaceMember = interfaceMemberReference.Resolve(context);

            if (interfaceMember == null)
            {
                return(null);
            }
            IType type    = typeReference.Resolve(context);
            var   members = type.GetMembers(
                m => m.EntityType == interfaceMember.EntityType && m.IsExplicitInterfaceImplementation,
                GetMemberOptions.IgnoreInheritedMembers);

            return(members.FirstOrDefault(m => m.InterfaceImplementations.Count == 1 && interfaceMember.Equals(m.InterfaceImplementations[0])));
        }
        public IMember Resolve(ITypeResolveContext context)
        {
            IType   declaringType   = typeReference.Resolve(context);
            IMember interfaceMember = interfaceMemberReference.Resolve(context.WithCurrentTypeDefinition(declaringType.GetDefinition()));

            if (interfaceMember == null)
            {
                return(null);
            }
            var members = declaringType.GetMembers(
                m => m.EntityType == interfaceMember.EntityType && m.IsExplicitInterfaceImplementation,
                GetMemberOptions.IgnoreInheritedMembers);

            return(members.FirstOrDefault(m => m.ImplementedInterfaceMembers.Count == 1 && interfaceMember.Equals(m.ImplementedInterfaceMembers[0])));
        }
Esempio n. 12
0
        public IMember Resolve(ITypeResolveContext context)
        {
            var declaringType    = declaringTypeReference.Resolve(context);
            var memberDefinition = memberDefinitionReference.Resolve(context);

            IType[] typeArguments = null;
            if (typeArgumentReferences != null)
            {
                typeArguments = new IType[typeArgumentReferences.Count];
                for (int i = 0; i < typeArguments.Length; i++)
                {
                    typeArguments[i] = typeArgumentReferences[i].Resolve(context);
                }
            }
            return(CreateSpecializedMember(declaringType, memberDefinition, typeArguments));
        }
Esempio n. 13
0
        void HandleCommandLineArgumentsAfterShowList(CommandLineArguments args)
        {
            if (nugetPackagesToLoad.Count > 0)
            {
                LoadAssemblies(nugetPackagesToLoad, commandLineLoadedAssemblies, focusNode: false);
                nugetPackagesToLoad.Clear();
            }
            if (args.NavigateTo != null)
            {
                bool found = false;
                if (args.NavigateTo.StartsWith("N:", StringComparison.Ordinal))
                {
                    string namespaceName = args.NavigateTo.Substring(2);
                    foreach (LoadedAssembly asm in commandLineLoadedAssemblies)
                    {
                        AssemblyTreeNode asmNode = assemblyListTreeNode.FindAssemblyNode(asm);
                        if (asmNode != null)
                        {
                            NamespaceTreeNode nsNode = asmNode.FindNamespaceNode(namespaceName);
                            if (nsNode != null)
                            {
                                found = true;
                                SelectNode(nsNode);
                                break;
                            }
                        }
                    }
                }
                else
                {
                    ITypeReference   typeRef   = null;
                    IMemberReference memberRef = null;
                    if (args.NavigateTo.StartsWith("T:", StringComparison.Ordinal))
                    {
                        typeRef = IdStringProvider.ParseTypeName(args.NavigateTo);
                    }
                    else
                    {
                        memberRef = IdStringProvider.ParseMemberIdString(args.NavigateTo);
                        typeRef   = memberRef.DeclaringTypeReference;
                    }
                    foreach (LoadedAssembly asm in commandLineLoadedAssemblies)
                    {
                        var module = asm.GetPEFileOrNull();
                        if (CanResolveTypeInPEFile(module, typeRef, out var typeHandle))
                        {
                            IEntity      mr          = null;
                            ICompilation compilation = typeHandle.Kind == HandleKind.ExportedType
                                                                ? new DecompilerTypeSystem(module, module.GetAssemblyResolver())
                                                                : new SimpleCompilation(module, MinimalCorlib.Instance);
                            mr = memberRef == null
                                                                ? typeRef.Resolve(new SimpleTypeResolveContext(compilation)) as ITypeDefinition
                                                                : (IEntity)memberRef.Resolve(new SimpleTypeResolveContext(compilation));

                            if (mr != null && mr.ParentModule.PEFile != null)
                            {
                                found = true;
                                // Defer JumpToReference call to allow an assembly that was loaded while
                                // resolving a type-forwarder in FindMemberByKey to appear in the assembly list.
                                Dispatcher.BeginInvoke(new Action(() => JumpToReference(mr)), DispatcherPriority.Loaded);
                                break;
                            }
                        }
                    }
                }
                if (!found)
                {
                    AvalonEditTextOutput output = new AvalonEditTextOutput();
                    output.Write(string.Format("Cannot find '{0}' in command line specified assemblies.", args.NavigateTo));
                    decompilerTextView.ShowText(output);
                }
            }
            else if (commandLineLoadedAssemblies.Count == 1)
            {
                // NavigateTo == null and an assembly was given on the command-line:
                // Select the newly loaded assembly
                JumpToReference(commandLineLoadedAssemblies[0].GetPEFileOrNull());
            }
            if (args.Search != null)
            {
                SearchPane.Instance.SearchTerm = args.Search;
                SearchPane.Instance.Show();
            }
            commandLineLoadedAssemblies.Clear();             // clear references once we don't need them anymore
        }
Esempio n. 14
0
        public ISymbol Resolve(ITypeResolveContext context)
        {
            IParameterizedMember member = (IParameterizedMember)memberReference.Resolve(context);

            return(member.Parameters[index]);
        }
Esempio n. 15
0
 public ISymbol Resolve(ITypeResolveContext context)
 {
     if (memberReference.Resolve(context) is IParameterizedMember member && index >= 0 && index < member.Parameters.Count)
     {
         return(member.Parameters[index]);
     }