/// <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)); } } }
/// <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); }