コード例 #1
0
        private ResolvedSymbols GetResolvedSymbols()
        {
            lock (myLock)
            {
                if (mySymbols != null)
                {
                    return(mySymbols);
                }

                mySymbols = CreateFileResolvedSymbols();
                return(mySymbols);
            }
        }
コード例 #2
0
        public void Load(string fn)
        {
            using (var stream = File.Open(fn, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                FileSize = stream.Length;

                // Figure out what the footer looks like
                using (var br = new BinaryReader(stream, Encoding.UTF8, /*leaveOpen:*/ true))
                {
                    // Seek to last 8 bytes.
                    stream.Position = stream.Length - 8;

                    // Read position of footer.
                    long footer_pos = br.ReadInt64();

                    // Stash length of compressed data preceding the footer.
                    FooterPosition = footer_pos;

                    stream.Position = footer_pos;

                    // Slurp in the serialized footer.
                    uint magic = br.ReadUInt32();
                    Version = Array.IndexOf(AllMagics, magic);
                    if (Version == -1)
                    {
                        throw new IOException(String.Format("Expected decorated stream magic {0:x8}, got {1:x8}. Old file?", V2Magic, magic));
                    }

                    PlatformName         = br.ReadString();
                    PointerSizeBytes     = br.ReadInt32();
                    EventCount           = br.ReadInt64();
                    WireSizeBytes        = br.ReadInt64();
                    SourceMachine        = br.ReadString();
                    MaxTimeStamp         = br.ReadUInt64();
                    TimerFrequency       = br.ReadUInt64();
                    EncodedDataSizeBytes = br.ReadInt64();

                    {
                        int modcount = br.ReadInt32();
                        Modules = new List <ModuleInfo>(modcount);
                        for (int i = 0; i < modcount; ++i)
                        {
                            var name     = br.ReadString();
                            var baseaddr = br.ReadUInt64();
                            var size     = br.ReadUInt64();
                            Modules.Add(new ModuleInfo {
                                Name = name, BaseAddress = baseaddr, SizeBytes = size
                            });
                        }
                    }

                    {
                        int markcount = br.ReadInt32();
                        m_Marks.Clear();
                        for (int i = 0; i < markcount; ++i)
                        {
                            var name = br.ReadString();
                            var time = br.ReadUInt64();
                            AddMark(new TraceMark {
                                Name = name, TimeStamp = time
                            });
                        }
                    }

                    {
                        int symcount = br.ReadInt32();
                        Symbols = new List <ulong>(symcount);
                        for (int i = 0; i < symcount; ++i)
                        {
                            var addr = br.ReadUInt64();
                            Symbols.Add(addr);
                        }
                    }

                    {
                        ResolvedSymbols.Clear();
                        int rsymcount = br.ReadInt32();
                        for (int i = 0; i < rsymcount; ++i)
                        {
                            var   sym  = new SymbolInfo();
                            ulong addr = br.ReadUInt64();
                            sym.FileName          = br.ReadString();
                            sym.LineNumber        = br.ReadInt32();
                            sym.Symbol            = br.ReadString();
                            ResolvedSymbols[addr] = sym;
                        }
                    }

                    if (Version > 0)
                    {
                        MemTraceInitCommonAddress = br.ReadUInt64();
                    }

                    if (Version > 1)
                    {
                        ExecutableName = br.ReadString();
                        WarningCount   = br.ReadInt32();
                    }

                    if (Version > 3)
                    {
                        int warnTextCount = br.ReadInt32();
                        for (int i = 0; i < warnTextCount; ++i)
                        {
                            Warnings.Add(br.ReadString());
                        }
                    }
                }
            }
        }
コード例 #3
0
        bool Execute(DirectoryAssemblyResolver resolver)
        {
            LogDebugMessage("ResolveAssemblies Task");
            LogDebugMessage("  ReferenceAssembliesDirectory: {0}", ReferenceAssembliesDirectory);
            LogDebugMessage("  I18nAssemblies: {0}", I18nAssemblies);
            LogDebugMessage("  LinkMode: {0}", LinkMode);
            LogDebugTaskItems("  Assemblies:", Assemblies);
            LogDebugMessage("  ProjectAssetFile: {0}", ProjectAssetFile);
            LogDebugMessage("  NuGetPackageRoot: {0}", NuGetPackageRoot);
            LogDebugMessage("  TargetMoniker: {0}", TargetMoniker);

            foreach (var dir in ReferenceAssembliesDirectory.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries))
            {
                resolver.SearchDirectories.Add(dir);
            }

            var assemblies = new HashSet <string> ();

            var topAssemblyReferences = new List <AssemblyDefinition> ();
            var logger = new NuGetLogger((s) => {
                LogDebugMessage("{0}", s);
            });

            LockFile lockFile = null;

            if (!string.IsNullOrEmpty(ProjectAssetFile) && File.Exists(ProjectAssetFile))
            {
                lockFile = LockFileUtilities.GetLockFile(ProjectAssetFile, logger);
            }

            try {
                foreach (var assembly in Assemblies)
                {
                    var assembly_path = Path.GetDirectoryName(assembly.ItemSpec);

                    if (!resolver.SearchDirectories.Contains(assembly_path))
                    {
                        resolver.SearchDirectories.Add(assembly_path);
                    }

                    // Add each user assembly and all referenced assemblies (recursive)
                    var assemblyDef = resolver.Load(assembly.ItemSpec);
                    if (assemblyDef == null)
                    {
                        throw new InvalidOperationException("Failed to load assembly " + assembly.ItemSpec);
                    }
                    if (MonoAndroidHelper.IsReferenceAssembly(assemblyDef))
                    {
                        // Resolve "runtime" library
                        if (lockFile != null)
                        {
                            assemblyDef = ResolveRuntimeAssemblyForReferenceAssembly(lockFile, resolver, assemblyDef.Name);
                        }
                        if (lockFile == null || assemblyDef == null)
                        {
                            LogWarning($"Ignoring {assembly_path} as it is a Reference Assembly");
                            continue;
                        }
                    }
                    topAssemblyReferences.Add(assemblyDef);
                    assemblies.Add(Path.GetFullPath(assemblyDef.MainModule.FullyQualifiedName));
                }
            } catch (Exception ex) {
                LogError("Exception while loading assemblies: {0}", ex);
                return(false);
            }
            try {
                foreach (var assembly in topAssemblyReferences)
                {
                    AddAssemblyReferences(resolver, assemblies, assembly, true);
                }
            } catch (Exception ex) {
                LogError("Exception while loading assemblies: {0}", ex);
                return(false);
            }

            // Add I18N assemblies if needed
            AddI18nAssemblies(resolver, assemblies);

            ResolvedAssemblies = assemblies.Select(a => new TaskItem(a)).ToArray();
            ResolvedSymbols    = assemblies.Select(a => a + ".mdb").Where(a => File.Exists(a)).Select(a => new TaskItem(a)).ToArray();
            ResolvedSymbols    = ResolvedSymbols.Concat(
                assemblies.Select(a => Path.ChangeExtension(a, "pdb"))
                .Where(a => File.Exists(a) && Files.IsPortablePdb(a))
                .Select(a => new TaskItem(a)))
                                 .ToArray();
            ResolvedFrameworkAssemblies    = ResolvedAssemblies.Where(p => MonoAndroidHelper.IsFrameworkAssembly(p.ItemSpec, true)).ToArray();
            ResolvedUserAssemblies         = ResolvedAssemblies.Where(p => !MonoAndroidHelper.IsFrameworkAssembly(p.ItemSpec, true)).ToArray();
            ResolvedDoNotPackageAttributes = do_not_package_atts.ToArray();

            LogDebugTaskItems("  [Output] ResolvedAssemblies:", ResolvedAssemblies);
            LogDebugTaskItems("  [Output] ResolvedUserAssemblies:", ResolvedUserAssemblies);
            LogDebugTaskItems("  [Output] ResolvedFrameworkAssemblies:", ResolvedFrameworkAssemblies);
            LogDebugTaskItems("  [Output] ResolvedDoNotPackageAttributes:", ResolvedDoNotPackageAttributes);

            return(!Log.HasLoggedErrors);
        }
コード例 #4
0
        private ResolvedSymbols CreateFileResolvedSymbols()
        {
            var interruptChecker = new SeldomInterruptCheckerWithCheckTime(100);

            // todo: cancellation
            if (!(SourceFile.GetPrimaryPsiFile() is IFSharpFile fsFile))
            {
                return(ResolvedSymbols.Empty);
            }

            var checkResults = CheckerService.ParseAndCheckFile(SourceFile, OpName)?.Value.CheckResults;
            var symbolUses   = checkResults?.GetAllUsesOfAllSymbolsInFile().RunAsTask();

            if (symbolUses == null)
            {
                return(ResolvedSymbols.Empty);
            }

            var document        = SourceFile.Document;
            var lexer           = fsFile.CachingLexer;
            var buffer          = document.Buffer;
            var resolvedSymbols = new ResolvedSymbols(symbolUses.Length);

            foreach (var symbolUse in symbolUses)
            {
                var symbol = symbolUse.Symbol;
                var range  = symbolUse.RangeAlternate;

                var startOffset       = document.GetOffset(range.Start);
                var endOffset         = document.GetOffset(range.End);
                var mfv               = symbol as FSharpMemberOrFunctionOrValue;
                var activePatternCase = symbol as FSharpActivePatternCase;

                if (symbolUse.IsFromDefinition)
                {
                    if (mfv != null)
                    {
                        // workaround for auto-properties, see visualfsharp#3939
                        var mfvLogicalName = mfv.LogicalName;
                        if (mfvLogicalName.EndsWith("@", StringComparison.Ordinal))
                        {
                            continue;
                        }

                        // visualfsharp#3939
                        if (mfvLogicalName == "v" &&
                            resolvedSymbols.Declarations.ContainsKey(startOffset))
                        {
                            continue;
                        }

                        if (mfvLogicalName == StandardMemberNames.ClassConstructor)
                        {
                            continue;
                        }

                        // visualfsharp#3943, visualfsharp#3933
                        if (mfvLogicalName != StandardMemberNames.Constructor &&
                            !(lexer.FindTokenAt(endOffset - 1) && (lexer.TokenType?.IsIdentifier ?? false) || mfv.IsActivePattern))
                        {
                            continue;
                        }

                        if (mfvLogicalName == "Invoke" && (mfv.DeclaringEntity?.Value?.IsDelegate ?? false))
                        {
                            continue;
                        }

                        var len = endOffset - startOffset;
                        if (mfvLogicalName == "op_Multiply" && len == 3)
                        {
                            // The `*` pattern includes parens and is parsed as special token
                            // let (*) (_, _) = ()
                            startOffset++;
                            endOffset--;
                        }
                    }
                    else if (activePatternCase != null)
                    {
                        // Skip active pattern cases bindings as these have incorrect ranges.
                        // Active pattern cases uses inside bindings are currently marked as bindings so check the range.
                        // https://github.com/Microsoft/visualfsharp/issues/4423
                        if (Range.equals(activePatternCase.DeclarationLocation, range))
                        {
                            var activePatternId = fsFile.GetContainingNodeAt <ActivePatternId>(new TreeOffset(endOffset - 1));
                            if (activePatternId == null)
                            {
                                continue;
                            }

                            var cases     = activePatternId.Cases;
                            var caseIndex = activePatternCase.Index;
                            if (caseIndex < 0 || caseIndex >= cases.Count)
                            {
                                continue;
                            }

                            if (!(cases[caseIndex] is IActivePatternNamedCaseDeclaration caseDeclaration))
                            {
                                continue;
                            }

                            var(caseStart, caseEnd) = caseDeclaration.GetTreeTextRange();
                            var caseStartOffset = caseStart.Offset;
                            var caseTextRange   = new TextRange(caseStartOffset, caseEnd.Offset);
                            resolvedSymbols.Declarations[caseStartOffset] = new FSharpResolvedSymbolUse(symbolUse, caseTextRange);
                            continue;
                        }

                        var caseUseInBindingRange = new TextRange(startOffset, endOffset);
                        resolvedSymbols.Uses[startOffset] = new FSharpResolvedSymbolUse(symbolUse, caseUseInBindingRange);
                        continue;
                    }
                    else
                    {
                        // workaround for compiler generated symbols (e.g. fields auto-properties)
                        if (!(lexer.FindTokenAt(endOffset - 1) && (lexer.TokenType?.IsIdentifier ?? false)))
                        {
                            continue;
                        }
                    }

                    var textRange = mfv != null
            ? new TextRange(startOffset, endOffset)
            : FixRange(startOffset, endOffset, null, buffer, lexer);
                    startOffset = textRange.StartOffset;

                    resolvedSymbols.Declarations[startOffset] = new FSharpResolvedSymbolUse(symbolUse, textRange);
                    resolvedSymbols.Uses.Remove(startOffset);
                }
                else
                {
                    // workaround for indexer properties, visualfsharp#3933
                    if (startOffset == endOffset ||
                        mfv != null && mfv.IsProperty && buffer[endOffset - 1] == ']')
                    {
                        continue;
                    }

                    var entity =
                        symbol as FSharpEntity ??
                        (mfv != null && mfv.IsConstructor ? mfv.DeclaringEntity?.Value : null);

                    // we need `foo` in
                    // inherit mod.foo<bar.baz>()
                    if (entity != null && !entity.GenericParameters.IsEmpty())
                    {
                        if (lexer.FindTokenAt(endOffset - 1) && lexer.TokenType == FSharpTokenType.GREATER)
                        {
                            if (new ParenMatcher().FindMatchingBracket(lexer) && lexer.TokenStart >= startOffset)
                            {
                                lexer.Advance(-1);
                                if (lexer.TokenType != null)
                                {
                                    startOffset = lexer.TokenStart;
                                    endOffset   = lexer.TokenEnd;
                                }
                            }
                        }
                    }

                    var nameRange = FixRange(startOffset, endOffset, mfv?.LogicalName, buffer, lexer);
                    startOffset = nameRange.StartOffset;

                    // workaround for implicit type usages (e.g. in members with optional params), visualfsharp#3933
                    if (CanIgnoreSymbol(symbol) &&
                        !(lexer.FindTokenAt(nameRange.EndOffset - 1) && (lexer.TokenType?.IsIdentifier ?? false)))
                    {
                        continue;
                    }

                    if (!resolvedSymbols.Declarations.ContainsKey(startOffset))
                    {
                        resolvedSymbols.Uses[startOffset] = new FSharpResolvedSymbolUse(symbolUse, nameRange);
                    }
                }

                interruptChecker.CheckForInterrupt();
            }

            return(resolvedSymbols);
        }
コード例 #5
0
        bool Execute(DirectoryAssemblyResolver resolver)
        {
            Log.LogDebugMessage("ResolveAssemblies Task");
            Log.LogDebugMessage("  ReferenceAssembliesDirectory: {0}", ReferenceAssembliesDirectory);
            Log.LogDebugMessage("  I18nAssemblies: {0}", I18nAssemblies);
            Log.LogDebugMessage("  LinkMode: {0}", LinkMode);
            Log.LogDebugTaskItems("  Assemblies:", Assemblies);

            foreach (var dir in ReferenceAssembliesDirectory.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries))
            {
                resolver.SearchDirectories.Add(dir);
            }

            var assemblies = new HashSet <string> ();

            var topAssemblyReferences = new List <AssemblyDefinition> ();

            try {
                foreach (var assembly in Assemblies)
                {
                    var assembly_path = Path.GetDirectoryName(assembly.ItemSpec);

                    if (!resolver.SearchDirectories.Contains(assembly_path))
                    {
                        resolver.SearchDirectories.Add(assembly_path);
                    }

                    // Add each user assembly and all referenced assemblies (recursive)
                    var assemblyDef = resolver.Load(assembly.ItemSpec);
                    if (assemblyDef == null)
                    {
                        throw new InvalidOperationException("Failed to load assembly " + assembly.ItemSpec);
                    }
                    topAssemblyReferences.Add(assemblyDef);
                    assemblies.Add(Path.GetFullPath(assemblyDef.MainModule.FullyQualifiedName));
                }
            } catch (Exception ex) {
                Log.LogError("Exception while loading assemblies: {0}", ex);
                return(false);
            }
            try {
                foreach (var assembly in topAssemblyReferences)
                {
                    AddAssemblyReferences(resolver, assemblies, assembly, true);
                }
            } catch (Exception ex) {
                Log.LogError("Exception while loading assemblies: {0}", ex);
                return(false);
            }

            // Add I18N assemblies if needed
            AddI18nAssemblies(resolver, assemblies);

            ResolvedAssemblies = assemblies.Select(a => new TaskItem(a)).ToArray();
            ResolvedSymbols    = assemblies.Select(a => a + ".mdb").Where(a => File.Exists(a)).Select(a => new TaskItem(a)).ToArray();
            ResolvedSymbols    = ResolvedSymbols.Concat(
                assemblies.Select(a => Path.ChangeExtension(a, "pdb"))
                .Where(a => File.Exists(a) && Files.IsPortablePdb(a))
                .Select(a => new TaskItem(a)))
                                 .ToArray();
            ResolvedFrameworkAssemblies    = ResolvedAssemblies.Where(p => MonoAndroidHelper.IsFrameworkAssembly(p.ItemSpec, true)).ToArray();
            ResolvedUserAssemblies         = ResolvedAssemblies.Where(p => !MonoAndroidHelper.IsFrameworkAssembly(p.ItemSpec, true)).ToArray();
            ResolvedDoNotPackageAttributes = do_not_package_atts.ToArray();

            Log.LogDebugTaskItems("  [Output] ResolvedAssemblies:", ResolvedAssemblies);
            Log.LogDebugTaskItems("  [Output] ResolvedUserAssemblies:", ResolvedUserAssemblies);
            Log.LogDebugTaskItems("  [Output] ResolvedFrameworkAssemblies:", ResolvedFrameworkAssemblies);
            Log.LogDebugTaskItems("  [Output] ResolvedDoNotPackageAttributes:", ResolvedDoNotPackageAttributes);

            return(!Log.HasLoggedErrors);
        }