Esempio n. 1
0
        public static MSBuildNavigationResult GetNavigation(
            MSBuildRootDocument doc, DocumentLocation location, MSBuildResolveResult rr)
        {
            if (rr == null)
            {
                return(null);
            }

            //HACK: we should really use the ITextSource directly, but since the XML parser positions are
            //currently line/col, we need a TextDocument to convert to offsets
            var textDocument = doc.Text as IReadonlyTextDocument
                               ?? TextEditorFactory.CreateNewReadonlyDocument(
                doc.Text, doc.Filename, MSBuildTextEditorExtension.MSBuildMimeType
                );

            var annotations     = GetAnnotationsAtLocation <NavigationAnnotation> (doc, location);
            var firstAnnotation = annotations.FirstOrDefault();

            if (firstAnnotation != null)
            {
                var beginOffset = textDocument.LocationToOffset(firstAnnotation.Region.Begin);
                var endOffset   = textDocument.LocationToOffset(firstAnnotation.Region.End);
                return(new MSBuildNavigationResult(
                           annotations.Select(a => a.Path).ToArray(), beginOffset, endOffset - beginOffset + 1
                           ));
            }

            if (rr.ReferenceKind == MSBuildReferenceKind.Target)
            {
                return(new MSBuildNavigationResult(
                           MSBuildReferenceKind.Target, (string)rr.Reference, rr.ReferenceOffset, rr.ReferenceLength
                           ));
            }

            if (rr.ReferenceKind == MSBuildReferenceKind.FileOrFolder)
            {
                return(new MSBuildNavigationResult(
                           (string[])rr.Reference, rr.ReferenceOffset, rr.ReferenceLength
                           ));
            }

            if (rr.ReferenceKind == MSBuildReferenceKind.Task)
            {
                var task = doc.GetTask((string)rr.Reference);
                if (task.DeclaredInFile != null)
                {
                    return(new MSBuildNavigationResult(
                               MSBuildReferenceKind.Task, (string)rr.Reference, rr.ReferenceOffset, rr.ReferenceLength,
                               task.DeclaredInFile, task.DeclaredAtLocation
                               ));
                }
            }

            return(null);
        }