Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 3
0
        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);
            }
        }
Ejemplo n.º 5
0
        protected void setLocation(Location location)
        {
            var line = location.GetMappedLineSpan().StartLinePosition;

            File = location.FilePath;
            Line = line.Line + 1;
            Character = line.Character + 1;
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
0
        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);
            }
        }
Ejemplo n.º 8
0
        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;
        }
Ejemplo n.º 10
0
      public CodeGeneratorException(Location location, string message)
         : this(location == null ? -1 : location.GetMappedLineSpan().StartLinePosition.Line, location == null ? -1 : location.GetMappedLineSpan().StartLinePosition.Character, message)
      {

      }