private static StatementRange MapBlockSyntax(TextSpan span, SyntaxNode node) { var block = (BlockSyntax)node; bool start = Math.Abs(block.SpanStart - span.Start) < Math.Abs(block.Span.End - span.Start); Location location = block.GetLocation(); FileLinePositionSpan mapped = location.GetMappedLineSpan(); if (start) { return(new StatementRange { StartLine = mapped.StartLinePosition.Line, StartColumn = mapped.StartLinePosition.Character, EndLine = mapped.StartLinePosition.Line, EndColumn = mapped.StartLinePosition.Character + 1, }); } return(new StatementRange { StartLine = mapped.EndLinePosition.Line, StartColumn = mapped.EndLinePosition.Character - 1, EndLine = mapped.EndLinePosition.Line, EndColumn = mapped.EndLinePosition.Character, }); }
public void GetAdjustedDiagnosticSpan( DocumentId documentId, Location location, out TextSpan sourceSpan, out FileLinePositionSpan originalLineInfo, out FileLinePositionSpan mappedLineInfo) { sourceSpan = location.SourceSpan; originalLineInfo = location.GetLineSpan(); mappedLineInfo = location.GetMappedLineSpan(); // check quick bail out case. if (location == Location.None) { return; } // Update the original source span, if required. if (!TryAdjustSpanIfNeededForVenus(documentId, originalLineInfo, mappedLineInfo, out var originalSpan, out var mappedSpan)) { return; } if (originalSpan.Start != originalLineInfo.StartLinePosition || originalSpan.End != originalLineInfo.EndLinePosition) { originalLineInfo = new FileLinePositionSpan(originalLineInfo.Path, originalSpan.Start, originalSpan.End); var textLines = location.SourceTree.GetText().Lines; var startPos = textLines.GetPosition(originalSpan.Start); var endPos = textLines.GetPosition(originalSpan.End); sourceSpan = TextSpan.FromBounds(startPos, Math.Max(startPos, endPos)); } if (mappedSpan.Start != mappedLineInfo.StartLinePosition || mappedSpan.End != mappedLineInfo.EndLinePosition) { mappedLineInfo = new FileLinePositionSpan(mappedLineInfo.Path, mappedSpan.Start, mappedSpan.End); } }
private static MITextPosition MapBlockSyntax(TextSpan span, SyntaxNode node, string fileName) { var block = (BlockSyntax)node; bool start = Math.Abs(block.SpanStart - span.Start) < Math.Abs(block.Span.End - span.Start); Location location = block.GetLocation(); FileLinePositionSpan mapped = location.GetMappedLineSpan(); if (start) { return(new MITextPosition(fileName, new TEXT_POSITION() { dwLine = (uint)mapped.StartLinePosition.Line, dwColumn = (uint)mapped.StartLinePosition.Character }, new TEXT_POSITION() { dwLine = (uint)mapped.StartLinePosition.Line, dwColumn = (uint)mapped.StartLinePosition.Character + 1 })); } return(new MITextPosition(fileName, new TEXT_POSITION() { dwLine = (uint)mapped.EndLinePosition.Line, dwColumn = (uint)mapped.EndLinePosition.Character - 1 }, new TEXT_POSITION() { dwLine = (uint)mapped.EndLinePosition.Line, dwColumn = (uint)mapped.EndLinePosition.Character })); }
public void GetAdjustedDiagnosticSpan( DocumentId documentId, Location location, out TextSpan sourceSpan, out FileLinePositionSpan originalLineInfo, out FileLinePositionSpan mappedLineInfo) { sourceSpan = location.SourceSpan; originalLineInfo = location.GetLineSpan(); mappedLineInfo = location.GetMappedLineSpan(); // Update the original source span, if required. LinePositionSpan originalSpan; LinePositionSpan mappedSpan; if (!TryAdjustSpanIfNeededForVenus(documentId, originalLineInfo, mappedLineInfo, out originalSpan, out mappedSpan)) { return; } if (originalSpan.Start != originalLineInfo.StartLinePosition || originalSpan.End != originalLineInfo.EndLinePosition) { originalLineInfo = new FileLinePositionSpan(originalLineInfo.Path, originalSpan.Start, originalSpan.End); var textLines = location.SourceTree.GetText().Lines; var startPos = textLines.GetPosition(originalSpan.Start); var endPos = textLines.GetPosition(originalSpan.End); sourceSpan = new TextSpan(startPos, endPos - startPos); } if (mappedSpan.Start != mappedLineInfo.StartLinePosition || mappedSpan.End != mappedLineInfo.EndLinePosition) { mappedLineInfo = new FileLinePositionSpan(mappedLineInfo.Path, mappedSpan.Start, mappedSpan.End); } }
protected void setLocation(Location location) { var line = location.GetMappedLineSpan().StartLinePosition; File = location.FilePath; Line = line.Line + 1; Character = line.Character + 1; }
internal static void GetObjectData(Location location, SerializationInfo info) { var fileSpan = location.GetLineSpan(); var mappedFileSpan = location.GetMappedLineSpan(); info.AddValue("sourceSpan", location.SourceSpan, typeof(TextSpan)); info.AddValue("fileSpan", fileSpan, typeof(FileLinePositionSpan)); info.AddValue("mappedFileSpan", mappedFileSpan, typeof(FileLinePositionSpan)); info.AddValue("kind", (byte)location.Kind); }
internal static MITextPosition GetStatementRange(string fileName, int startLine, int startColumn) { try { logger.Trace("Line: {0} Column: {1} Source: {2}", startLine, startColumn, fileName); if (!File.Exists(fileName)) { return(null); } using (var stream = File.OpenRead(fileName)) { SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(SourceText.From(stream), path: fileName); SourceText text = syntaxTree.GetText(); var root = (CompilationUnitSyntax)syntaxTree.GetRoot(); var span = new TextSpan(text.Lines[startLine - 1].Start + startColumn, 1); SyntaxNode node = root.FindNode(span, false, false); if (node is BlockSyntax) { return(MapBlockSyntax(span, node, fileName)); } while (node is TypeSyntax || node is MemberAccessExpressionSyntax) { node = node.Parent; } Location location = node.GetLocation(); FileLinePositionSpan mapped = location.GetMappedLineSpan(); return(new MITextPosition(fileName, new TEXT_POSITION() { dwLine = (uint)mapped.StartLinePosition.Line, dwColumn = (uint)mapped.StartLinePosition.Character }, new TEXT_POSITION() { dwLine = (uint)mapped.EndLinePosition.Line, dwColumn = (uint)mapped.EndLinePosition.Character })); } } catch (Exception ex) { logger.Trace($"Exception : {ex}"); return(null); } }
internal static StatementRange GetStatementRange(string fileName, int startLine, int startColumn) { try { logger.Trace("Line: {0} Column: {1} Source: {2}", startLine, startColumn, fileName); SyntaxTree syntaxTree = CSharpSyntaxTree.ParseFile(fileName); SourceText text = syntaxTree.GetText(); var root = (CompilationUnitSyntax)syntaxTree.GetRoot(); var span = new TextSpan(text.Lines[startLine - 1].Start + startColumn, 1); SyntaxNode node = root.FindNode(span, false, false); if (node is BlockSyntax) { return(MapBlockSyntax(span, node)); } while (node is TypeSyntax || node is MemberAccessExpressionSyntax) { node = node.Parent; } Location location = node.GetLocation(); FileLinePositionSpan mapped = location.GetMappedLineSpan(); return(new StatementRange { StartLine = mapped.StartLinePosition.Line, StartColumn = mapped.StartLinePosition.Character, EndLine = mapped.EndLinePosition.Line, EndColumn = mapped.EndLinePosition.Character, }); } catch { return(null); } }
internal DiagnosticDescription(Diagnostic d, bool errorCodeOnly, bool showPosition = false) { _code = d.Code; _isWarningAsError = d.IsWarningAsError; _location = d.Location; DiagnosticWithInfo dinfo = null; if (d.Code == 0) { _code = d.Id; _errorCodeType = typeof(string); } else { dinfo = d as DiagnosticWithInfo; if (dinfo == null) { _code = d.Code; _errorCodeType = typeof(int); } else { _errorCodeType = dinfo.Info.MessageProvider.ErrorCodeType; _code = d.Code; } } _ignoreArgumentsWhenComparing = errorCodeOnly; _showPosition = showPosition; if (!_ignoreArgumentsWhenComparing) { if (_location.IsInSource) { // we don't just want to do SyntaxNode.GetText(), because getting the text via the SourceTree validates the public API _squiggledText = _location.SourceTree.GetText().ToString(_location.SourceSpan); } if (dinfo != null) { _arguments = dinfo.Info.Arguments; } else { IReadOnlyList<object> args = d.Arguments; if (args == null || args.Count == 0) { _arguments = null; } else { _arguments = d.Arguments.ToArray(); } } if (_arguments != null && _arguments.Length == 0) { _arguments = null; } } _startPosition = _location.GetMappedLineSpan().StartLinePosition; }
public CodeGeneratorException(Location location, string message) : this(location == null ? -1 : location.GetMappedLineSpan().StartLinePosition.Line, location == null ? -1 : location.GetMappedLineSpan().StartLinePosition.Character, message) { }