Ejemplo n.º 1
0
        private string ProcessPropertyName(
            string lineText,
            int lineNumber,
            int startPositionOnLine,
            string text,
            bool isRootProject,
            bool isUsage)
        {
            var propertyName        = text.Trim();
            var leadingTriviaWidth  = text.IndexOf(propertyName);
            var trailingTriviaWidth = text.Length - propertyName.Length - leadingTriviaWidth;

            if (propertyName.IndexOfAny(complexCharsInProperties) != -1)
            {
                return(Markup.HtmlEscape(text));
            }

            if (propertyName.IndexOfAny(Path.GetInvalidFileNameChars()) != -1)
            {
                Log.Exception(string.Format("Invalid property name {0} in project {1}", propertyName, this.sourceXmlFilePath));
                return(Markup.HtmlEscape(text));
            }

            var href =
                "/" +
                Constants.MSBuildPropertiesAssembly +
                "/" +
                Constants.ReferencesFileName +
                "/" +
                propertyName +
                ".html";

            text = string.Format(
                "{2}<a href=\"{1}\" target=\"n\" class=\"msbuildlink\">{0}</a>{3}",
                propertyName,
                href,
                text.Substring(0, leadingTriviaWidth),
                text.Substring(text.Length - trailingTriviaWidth));

            projectGenerator.AddReference(
                destinationHtmlFilePath,
                lineText,
                startPositionOnLine,
                propertyName.Length,
                lineNumber,
                isRootProject ? this.projectGenerator.AssemblyName : Constants.MSBuildFiles,
                Constants.MSBuildPropertiesAssembly,
                null,
                propertyName,
                isUsage ? ReferenceKind.MSBuildPropertyUsage : ReferenceKind.MSBuildPropertyAssignment);

            return(text);
        }
Ejemplo n.º 2
0
        private string ProcessItemName(
            string lineText,
            int lineNumber,
            int startPositionOnLine,
            string text,
            bool isRootProject,
            bool isUsage)
        {
            var itemName = text.Trim();

            var leadingTriviaWidth  = text.IndexOf(itemName, StringComparison.Ordinal);
            var trailingTriviaWidth = text.Length - itemName.Length - leadingTriviaWidth;

            if (itemName.IndexOfAny(complexCharsInProperties) != -1)
            {
                return(Markup.HtmlEscape(text));
            }

            var href =
                "/" +
                Constants.MSBuildItemsAssembly +
                "/" +
                Constants.ReferencesFileName +
                "/" +
                itemName +
                ".html";

            text = string.Format(
                "{2}<a href=\"{1}\" target=\"n\" class=\"msbuildlink\">{0}</a>{3}",
                itemName,
                href,
                text.Substring(0, leadingTriviaWidth),
                text.Substring(text.Length - trailingTriviaWidth));

            ProjectGenerator.AddReference(
                destinationHtmlFilePath,
                lineText,
                startPositionOnLine,
                itemName.Length,
                lineNumber,
                isRootProject ? ProjectGenerator.AssemblyName : Constants.MSBuildFiles,
                Constants.MSBuildItemsAssembly,
                null,
                itemName,
                isUsage ? ReferenceKind.MSBuildItemUsage : ReferenceKind.MSBuildItemAssignment);

            return(text);
        }
Ejemplo n.º 3
0
        private string ProcessTaskName(
            string lineText,
            int lineNumber,
            int startPositionOnLine,
            string text,
            string taskName,
            bool isRootProject,
            bool isUsage)
        {
            var trimmedText         = text.Trim();
            var leadingTriviaWidth  = text.IndexOf(trimmedText, StringComparison.Ordinal);
            var trailingTriviaWidth = text.Length - trimmedText.Length - leadingTriviaWidth;

            var href =
                "/" +
                Constants.MSBuildTasksAssembly +
                "/" +
                Constants.ReferencesFileName +
                "/" +
                taskName +
                ".html";

            text = string.Format(
                "{2}<a href=\"{1}\" target=\"n\" class=\"msbuildlink\">{0}</a>{3}",
                trimmedText,
                href,
                text.Substring(0, leadingTriviaWidth),
                text.Substring(text.Length - trailingTriviaWidth));

            ProjectGenerator.AddReference(
                destinationHtmlFilePath,
                lineText,
                startPositionOnLine,
                trimmedText.Length,
                lineNumber,
                isRootProject ? ProjectGenerator.AssemblyName : Constants.MSBuildFiles,
                Constants.MSBuildTasksAssembly,
                null,
                taskName,
                isUsage ? ReferenceKind.MSBuildTaskUsage : ReferenceKind.MSBuildTaskDeclaration);

            return(text);
        }
Ejemplo n.º 4
0
        private string ProcessAttributeValue(ClassifiedRange range, string text, bool isRootProject)
        {
            var node            = range.Node;
            var attributeSyntax = node.GetParent(2) as XmlAttributeSyntax;

            if (attributeSyntax != null)
            {
                var parentElement = attributeSyntax.ParentElement;

                if (parentElement?.Name == "Output" &&
                    (attributeSyntax.Name == "ItemName" || attributeSyntax.Name == "PropertyName") &&
                    !text.Contains("%"))
                {
                    if (attributeSyntax.Name == "ItemName")
                    {
                        return(ProcessItemName(
                                   range.LineText,
                                   range.LineNumber + 1,
                                   range.Column,
                                   text,
                                   isRootProject,
                                   isUsage: false));
                    }
                    else
                    {
                        return(ProcessPropertyName(
                                   range.LineText,
                                   range.LineNumber + 1,
                                   range.Column,
                                   text,
                                   isRootProject,
                                   isUsage: false));
                    }
                }

                if (parentElement?.Name == "Target")
                {
                    if (attributeSyntax.Name == "Name")
                    {
                        return(ProcessTargetName(
                                   range.LineText,
                                   range.LineNumber + 1,
                                   range.Column,
                                   text,
                                   isRootProject,
                                   isUsage: false));
                    }

                    if (attributeSyntax.Name == "DependsOnTargets" ||
                        attributeSyntax.Name == "BeforeTargets" ||
                        attributeSyntax.Name == "AfterTargets")
                    {
                        return(ProcessExpressions(range, text, isRootProject, ProcessSemicolonSeparatedList));
                    }
                }

                if (parentElement?.Name == "CallTarget" && attributeSyntax.Name == "Targets")
                {
                    return(ProcessExpressions(range, text, isRootProject, ProcessSemicolonSeparatedList));
                }

                if (parentElement?.Name == "UsingTask" && attributeSyntax.Name == "TaskName")
                {
                    var    taskName = attributeSyntax.Value;
                    var    assemblyFileAttribute = parentElement.Attributes.FirstOrDefault(a => a.Name == "AssemblyFile");
                    var    assemblyNameAttribute = parentElement.Attributes.FirstOrDefault(a => a.Name == "AssemblyName");
                    string assemblyName          = null;
                    if (assemblyFileAttribute != null && !string.IsNullOrWhiteSpace(assemblyFileAttribute.Value))
                    {
                        var assemblyFilePath = assemblyFileAttribute.Value;
                        assemblyFilePath = project.ExpandString(assemblyFilePath);
                        assemblyName     = Path.GetFileNameWithoutExtension(assemblyFilePath);
                    }
                    else if (assemblyNameAttribute != null && !string.IsNullOrWhiteSpace(assemblyNameAttribute.Value))
                    {
                        assemblyName = assemblyNameAttribute.Value;
                        assemblyName = project.ExpandString(assemblyName);
                        int comma = assemblyName.IndexOf(',');
                        if (comma > -1)
                        {
                            assemblyName = assemblyName.Substring(0, comma);
                        }
                    }

                    if (assemblyName != null)
                    {
                        var symbolId = SymbolIdService.GetId("T:" + taskName);
                        ProjectGenerator.AddReference(
                            destinationHtmlFilePath,
                            range.LineText,
                            range.Column,
                            taskName.Length,
                            range.LineNumber,
                            isRootProject ? ProjectGenerator.AssemblyName : Constants.MSBuildFiles,
                            assemblyName,
                            null,
                            symbolId,
                            ReferenceKind.Instantiation);

                        var url    = string.Format("/{0}/A.html#{1}", assemblyName, symbolId);
                        var result = string.Format("<a href=\"{0}\" class=\"msbuildlink\">{1}</a>", url, text);
                        return(result);
                    }
                }
            }

            return(ProcessExpressions(range, text, isRootProject));
        }