Esempio n. 1
0
 protected override void VisitValueExpression(
     XElement element, XAttribute attribute,
     MSBuildLanguageElement resolvedElement, MSBuildLanguageAttribute resolvedAttribute,
     ValueInfo info, MSBuildValueKind kind, ExpressionNode node)
 {
     foreach (var n in node.WithAllDescendants())
     {
         switch (n)
         {
         case ExpressionFunctionName func:
             if (func.Parent is ExpressionPropertyFunctionInvocation inv)
             {
                 string baseName = StripGetPrefix(func.Name);
                 if (IsMatch(baseName))
                 {
                     //TODO: should we be fuzzy here and accept "unknown"?
                     var resolvedKind = FunctionCompletion.ResolveType(inv);
                     if (resolvedKind == MSBuildValueKind.Unknown)
                     {
                         resolvedKind = MSBuildValueKind.String;
                     }
                     if (resolvedKind == valueKind)
                     {
                         Results.Add((func.Offset, func.Length, ReferenceUsage.Read));
                     }
                 }
             }
             break;
         }
     }
 }
        public static BaseInfo GetResolvedReference(this MSBuildResolveResult rr, MSBuildRootDocument doc)
        {
            switch (rr.ReferenceKind)
            {
            case MSBuildReferenceKind.Item:
                return(doc.GetItem((string)rr.Reference));

            case MSBuildReferenceKind.Metadata:
                var m = rr.ReferenceAsMetadata;
                if (Builtins.Metadata.TryGetValue(m.metaName, out var builtinMeta))
                {
                    return(builtinMeta);
                }
                return(doc.GetMetadata(m.itemName, m.metaName, true));

            case MSBuildReferenceKind.Property:
                var propName = (string)rr.Reference;
                if (Builtins.Properties.TryGetValue(propName, out var builtinProp))
                {
                    return(builtinProp);
                }
                return(doc.GetProperty(propName));

            case MSBuildReferenceKind.Task:
                return(doc.GetTask((string)rr.Reference));

            case MSBuildReferenceKind.Target:
                return(doc.GetTarget((string)rr.Reference));

            case MSBuildReferenceKind.Keyword:
                return((BaseInfo)rr.Reference);

            case MSBuildReferenceKind.KnownValue:
                return((BaseInfo)rr.Reference);

            case MSBuildReferenceKind.TargetFramework:
                return(ResolveFramework((string)rr.Reference));

            case MSBuildReferenceKind.TargetFrameworkIdentifier:
                return(BestGuessResolveFrameworkIdentifier((string)rr.Reference, doc.Frameworks));

            case MSBuildReferenceKind.TargetFrameworkVersion:
                return(BestGuessResolveFrameworkVersion((string)rr.Reference, doc.Frameworks));

            case MSBuildReferenceKind.TargetFrameworkProfile:
                return(BestGuessResolveFrameworkProfile((string)rr.Reference, doc.Frameworks));

            case MSBuildReferenceKind.TaskParameter:
                var p = rr.ReferenceAsTaskParameter;
                return(doc.GetTaskParameter(p.taskName, p.paramName));

            case MSBuildReferenceKind.ItemFunction:
                //FIXME: attempt overload resolution
                return(FunctionCompletion.GetItemFunctionInfo((string)rr.Reference));

            case MSBuildReferenceKind.StaticPropertyFunction:
                //FIXME: attempt overload resolution
                (string className, string name) = ((string, string))rr.Reference;
                return(FunctionCompletion.GetStaticPropertyFunctionInfo(className, name));

            case MSBuildReferenceKind.PropertyFunction:
                //FIXME: attempt overload resolution
                (MSBuildValueKind kind, string funcName) = ((MSBuildValueKind, string))rr.Reference;
                return(FunctionCompletion.GetPropertyFunctionInfo(kind, funcName));

            case MSBuildReferenceKind.ClassName:
                return(FunctionCompletion.GetClassInfo((string)rr.Reference));

            case MSBuildReferenceKind.Enum:
                return(FunctionCompletion.GetEnumInfo((string)rr.Reference));
            }
            return(null);
        }