/// <summary>
 /// Return zero or more locations in primary source documents that correspond to one or more of the given derived (non primary) document locations.
 /// </summary>
 /// <param name="locations">Zero or more locations in documents that have been derived from one or more source documents.</param>
 public IEnumerable <IPrimarySourceLocation> GetPrimarySourceLocationsFor(IEnumerable <ILocation> locations)
 {
     foreach (ILocation location in locations)
     {
         IPrimarySourceLocation /*?*/ psloc = location as IPrimarySourceLocation;
         if (psloc != null)
         {
             yield return(psloc);
         }
         IILLocation /*?*/ mbLocation = location as IILLocation;
         if (mbLocation != null)
         {
             psloc = this.MapMethodBodyLocationToSourceLocation(mbLocation, true);
             if (psloc != null)
             {
                 yield return(psloc);
             }
         }
         else
         {
             var mdLocation = location as IMetadataLocation;
             if (mdLocation != null)
             {
                 PdbTokenLine lineInfo;
                 if (!this.tokenToSourceMapping.TryGetValue(mdLocation.Definition.TokenValue, out lineInfo))
                 {
                     yield break;
                 }
                 PdbSourceDocument psDoc = this.GetPrimarySourceDocumentFor(lineInfo.sourceFile);
                 yield return(new PdbSourceLineLocation(psDoc, (int)lineInfo.line, (int)lineInfo.column, (int)lineInfo.endLine, (int)lineInfo.endColumn));
             }
         }
     }
 }
        private IEnumerable <IPrimarySourceLocation> MapMethodBodyLocationToSourceLocations(IILLocation mbLocation)
        {
            PdbFunction pdbFunction = null;
            var         doc         = mbLocation.Document as MethodBodyDocument;

            if (doc == null || !this.pdbFunctionMap.TryGetValue(doc.MethodToken, out pdbFunction))
            {
                yield break;
            }

            if (pdbFunction.lines == null)
            {
                yield break;
            }

            foreach (PdbLines pdbLines in pdbFunction.lines)
            {
                foreach (var pdbLine in pdbLines.lines)
                {
                    PdbSource pdbSourceFile = pdbLines.file;
                    if (pdbSourceFile == null)
                    {
                        continue;
                    }


                    PdbSourceDocument psDoc = this.GetPrimarySourceDocumentFor(pdbSourceFile);
                    yield return(new PdbSourceLineLocation(psDoc, (int)pdbLine.lineBegin, pdbLine.colBegin, (int)pdbLine.lineEnd, pdbLine.colEnd));
                }
            }
        }
Exemple #3
0
 /// <summary>
 /// Allocates a range of source text that corresponds to a source line.
 /// </summary>
 internal PdbSourceLineLocation(PdbSourceDocument primarySourceDocument, int startLine, int startColumn, int endLine, int endColumn)
 {
     this.primarySourceDocument = primarySourceDocument;
     this.startLine             = startLine;
     this.startColumn           = startColumn;
     this.endLine   = endLine;
     this.endColumn = endColumn;
 }
        private IPrimarySourceLocation /*?*/ MapMethodBodyLocationToSourceLocation(IILLocation mbLocation, bool exact)
        {
            PdbFunction pdbFunction;
            var         doc = mbLocation.Document as MethodBodyDocument;

            if (doc == null || !this.pdbFunctionMap.TryGetValue(doc.MethodToken, out pdbFunction))
            {
                return(null);
            }
            if (pdbFunction.lines == null)
            {
                return(null);
            }
            foreach (PdbLines pdbLines in pdbFunction.lines)
            {
                PdbSource pdbSourceFile = pdbLines.file;
                if (pdbSourceFile == null)
                {
                    return(null);
                }

                PdbLine[] array    = pdbLines.lines;
                int       minIndex = 0;
                int       maxIndex = array.Length - 1;

                uint desiredOffset = mbLocation.Offset;

                while (minIndex <= maxIndex)
                {
                    int     midPointIndex = (minIndex + maxIndex) >> 1;
                    PdbLine mid           = array[midPointIndex];
                    if (midPointIndex == maxIndex ||
                        (mid.offset <= desiredOffset && desiredOffset < array[midPointIndex + 1].offset))
                    {
                        if (exact && desiredOffset != mid.offset)
                        {
                            return(null);
                        }
                        PdbLine           line  = mid;
                        PdbSourceDocument psDoc = this.GetPrimarySourceDocumentFor(pdbSourceFile);

                        return(new PdbSourceLineLocation(psDoc, (int)line.lineBegin, line.colBegin, (int)line.lineEnd, line.colEnd));
                    }
                    if (mid.offset < desiredOffset)
                    {
                        minIndex = midPointIndex + 1;
                    }
                    else
                    {
                        maxIndex = midPointIndex - 1;
                    }
                }
            }
            return(null);
        }
        /// <summary>
        /// Returns zero or more locations in primary source documents that correspond to the definition with the given token.
        /// </summary>
        /// <param name="token"></param>
        /// <returns></returns>
        public IEnumerable <IPrimarySourceLocation> GetPrimarySourceLocationsForToken(uint token)
        {
            PdbTokenLine lineInfo;

            if (!this.tokenToSourceMapping.TryGetValue(token, out lineInfo))
            {
                yield break;
            }
            PdbSourceDocument psDoc = this.GetPrimarySourceDocumentFor(lineInfo.sourceFile);

            yield return(new PdbSourceLineLocation(psDoc, (int)lineInfo.line, (int)lineInfo.column, (int)lineInfo.endLine, (int)lineInfo.endColumn));
        }
        private PdbSourceDocument GetPrimarySourceDocumentFor(PdbSource pdbSourceFile)
        {
            PdbSourceDocument /*?*/ result = null;

            if (this.documentCache.TryGetValue(pdbSourceFile, out result))
            {
                return(result);
            }
            IName name = this.host.NameTable.GetNameFor(Path.GetFileName(pdbSourceFile.name));

            if (File.Exists(pdbSourceFile.name))
            {
                var sourceFileReader = new StreamReader(pdbSourceFile.name);
                this.sourceFilesOpenedByReader.Add(sourceFileReader);
                result = new PdbSourceDocument(name, pdbSourceFile, sourceFileReader);
            }
            else
            {
                result = new PdbSourceDocument(name, pdbSourceFile);
            }
            this.documentCache.Add(pdbSourceFile, result);
            return(result);
        }