예제 #1
0
        public static IEnumerable <BaseInfo> GetCompletionInfos(
            MSBuildResolveResult rr,
            TriggerState trigger, MSBuildValueKind kind,
            ExpressionNode triggerExpression, int triggerLength,
            MSBuildRootDocument doc)
        {
            switch (trigger)
            {
            case TriggerState.Value:
                return(MSBuildCompletionExtensions.GetValueCompletions(kind, doc, rr));

            case TriggerState.Item:
                return(doc.GetItems());

            case TriggerState.Metadata:
                return(doc.GetMetadata(null, true));

            case TriggerState.Property:
                return(doc.GetProperties(true));

            case TriggerState.MetadataOrItem:
                return(((IEnumerable <BaseInfo>)doc.GetItems()).Concat(doc.GetMetadata(null, true)));

            case TriggerState.DirectorySeparator:
                return(MSBuildCompletionExtensions.GetFilenameCompletions(kind, doc, triggerExpression, triggerLength));;

            case TriggerState.MethodName:
                return(FunctionCompletion.GetMethodNameCompletions(triggerExpression));
            }
            throw new InvalidOperationException();
        }
예제 #2
0
            protected override void VisitValueExpression(
                XElement element, XAttribute attribute,
                MSBuildLanguageElement resolvedElement, MSBuildLanguageAttribute resolvedAttribute,
                ValueInfo info, MSBuildValueKind kind, ExpressionNode node)
            {
                switch (node.Find(offset))
                {
                case ExpressionItemName ei:
                    rr.ReferenceKind   = MSBuildReferenceKind.Item;
                    rr.ReferenceOffset = ei.Offset;
                    rr.ReferenceLength = ei.Name.Length;
                    rr.Reference       = ei.Name;
                    break;

                case ExpressionPropertyName propName:
                    rr.ReferenceKind   = MSBuildReferenceKind.Property;
                    rr.ReferenceOffset = propName.Offset;
                    rr.Reference       = propName.Name;
                    rr.ReferenceLength = propName.Length;
                    break;

                case ExpressionMetadata em:
                    if (em.ItemName == null || offset >= em.MetadataNameOffset)
                    {
                        rr.ReferenceKind   = MSBuildReferenceKind.Metadata;
                        rr.ReferenceOffset = em.MetadataNameOffset;
                        rr.Reference       = (em.GetItemName(), em.MetadataName);
                        rr.ReferenceLength = em.MetadataName.Length;
                    }
                    else
                    {
                        rr.ReferenceKind   = MSBuildReferenceKind.Item;
                        rr.ReferenceOffset = em.ItemNameOffset;
                        rr.Reference       = em.ItemName;
                        rr.ReferenceLength = em.ItemName.Length;
                    }
                    break;

                case ExpressionFunctionName name:
                    rr.ReferenceOffset = name.Offset;
                    rr.ReferenceLength = name.Name.Length;
                    if (name.Parent is ExpressionItemNode item)
                    {
                        rr.ReferenceKind = MSBuildReferenceKind.ItemFunction;
                        rr.Reference     = name.Name;
                    }
                    else if (name.Parent is ExpressionPropertyFunctionInvocation prop)
                    {
                        if (prop.Target is ExpressionClassReference classRef)
                        {
                            rr.ReferenceKind = MSBuildReferenceKind.StaticPropertyFunction;
                            rr.Reference     = (classRef.Name, name.Name);
                        }
                        else
                        {
                            var type = FunctionCompletion.ResolveType(prop.Target);
                            rr.ReferenceKind = MSBuildReferenceKind.PropertyFunction;
                            rr.Reference     = (type, name.Name);
                        }
                    }
                    break;

                case ExpressionClassReference cr:
                    if (!string.IsNullOrEmpty(cr.Name))
                    {
                        if (cr.Parent is ExpressionArgumentList)
                        {
                            rr.ReferenceKind = MSBuildReferenceKind.Enum;
                        }
                        else if (cr.Parent is ExpressionPropertyFunctionInvocation)
                        {
                            rr.ReferenceKind = MSBuildReferenceKind.ClassName;
                        }
                        else
                        {
                            break;
                        }
                        rr.ReferenceOffset = cr.Offset;
                        rr.Reference       = cr.Name;
                        rr.ReferenceLength = cr.Length;
                    }
                    break;

                case ExpressionText lit:
                    kind = kind.GetScalarType();
                    if (lit.IsPure)
                    {
                        VisitPureLiteral(info, kind, lit);
                        if (kind == MSBuildValueKind.TaskOutputParameterName)
                        {
                            rr.ReferenceKind   = MSBuildReferenceKind.TaskParameter;
                            rr.ReferenceOffset = lit.Offset;
                            rr.ReferenceLength = lit.Value.Length;
                            rr.Reference       = (element.ParentElement().Name.Name, lit.Value);
                            break;
                        }
                    }
                    switch (kind)
                    {
                    case MSBuildValueKind.File:
                    case MSBuildValueKind.FileOrFolder:
                    case MSBuildValueKind.ProjectFile:
                    case MSBuildValueKind.TaskAssemblyFile:
                        var pathNode = lit.Parent as Expression ?? (ExpressionNode)lit;
                        var path     = MSBuildNavigation.GetPathFromNode(pathNode, (MSBuildRootDocument)Document);
                        if (path != null)
                        {
                            rr.ReferenceKind   = MSBuildReferenceKind.FileOrFolder;
                            rr.ReferenceOffset = path.Offset;
                            rr.ReferenceLength = path.Length;
                            rr.Reference       = path.Paths;
                        }
                        break;
                    }
                    break;
                }
            }