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