public static MSBuildNavigationResult GetNavigation(
            MSBuildRootDocument doc, int offset, MSBuildResolveResult rr)
        {
            if (rr == null)
            {
                return(null);
            }

            var annotations     = GetAnnotationsAtOffset <NavigationAnnotation> (doc, offset);
            var firstAnnotation = annotations.FirstOrDefault();

            if (firstAnnotation != null)
            {
                return(new MSBuildNavigationResult(
                           annotations.Select(a => a.Path).ToArray(), firstAnnotation.Span.Start, firstAnnotation.Span.Length
                           ));
            }

            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.DeclaredAtOffset
                               ));
                }
            }

            return(null);
        }
Exemple #2
0
        public static MSBuildNavigationResult GetNavigation(
            MSBuildRootDocument doc, int offset, MSBuildResolveResult rr)
        {
            if (rr == null)
            {
                return(null);
            }

            var annotations     = GetAnnotationsAtOffset <NavigationAnnotation> (doc, offset);
            var firstAnnotation = annotations.FirstOrDefault();

            if (firstAnnotation != null)
            {
                var arr = GetAnnotatedPaths().ToArray();
                if (arr.Length == 0)
                {
                    return(null);
                }
                return(new MSBuildNavigationResult(arr, firstAnnotation.Span.Start, firstAnnotation.Span.Length));
            }

            IEnumerable <string> GetAnnotatedPaths()
            {
                foreach (var a in annotations)
                {
                    if (a.IsSdk)
                    {
                        yield return(Path.Combine(a.Path, "Sdk.props"));

                        yield return(Path.Combine(a.Path, "Sdk.targets"));
                    }
                    else
                    {
                        yield return(a.Path);
                    }
                }
            }

            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.DeclaredAtOffset
                               ));
                }
            }

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

            return(null);
        }