public DocumentRange Translate(TreeTextRange range) { if (!range.IsValid() || !SourceFile.IsValid()) { return(DocumentRange.InvalidRange); } var sector = FindSectorAtRange(range); if (!sector.IsValid()) { return(DocumentRange.InvalidRange); } // Let the included file handle the request if (sector.Include != null) { return(sector.Include.DocumentRangeTranslator.Translate(range)); } // The range is in the current document // The includes that appear before do not contribute to document offset int extraIncludeOffset = sector.PrecedingIncludeLength; // Neither do the other includes in the tree // (the ones that are included before the current file) int extraRootOffset = FileLikeNode.GetTreeStartOffset().Offset; var start = range.StartOffset - extraIncludeOffset - extraRootOffset; var end = range.EndOffset - extraIncludeOffset - extraRootOffset; var resultingTextRange = new TextRange(start.Offset, end.Offset); resultingTextRange.AssertValid(); return(new DocumentRange(SourceFile.Document, resultingTextRange)); }