Skip to content

Commit

Permalink
Add help URLs for MSBuildIntrinsics
Browse files Browse the repository at this point in the history
  • Loading branch information
mhutch committed Apr 17, 2024
1 parent e698f06 commit d657c61
Show file tree
Hide file tree
Showing 6 changed files with 170 additions and 79 deletions.
4 changes: 2 additions & 2 deletions MonoDevelop.MSBuild/Language/MSBuildInferredSchema.cs
Original file line number Diff line number Diff line change
Expand Up @@ -297,7 +297,7 @@ void CollectTaskParameter (string taskName, string parameterName, bool isOutput)
return;
}
}
task.Parameters[parameterName] = new InferredTaskParameter (parameterName, false, isOutput, MSBuildValueKind.Unknown);
task.SetParameter(new InferredTaskParameter (parameterName, false, isOutput, MSBuildValueKind.Unknown));
}

class InferredTaskParameter (string parameterName, bool isRequired, bool isOutput, MSBuildValueKind kind)
Expand Down Expand Up @@ -349,7 +349,7 @@ void CollectTaskParameterDefinition (string taskName, MSBuildParameterElement de
kind = kind.AsList ();
}

task.Parameters.Add (parameterName, new InferredTaskParameter (parameterName, isRequired, isOutput, kind));
task.SetParameter (new InferredTaskParameter (parameterName, isRequired, isOutput, kind));
}

void CollectTaskDefinition (MSBuildUsingTaskElement element, MSBuildParserContext parseContext)
Expand Down
17 changes: 10 additions & 7 deletions MonoDevelop.MSBuild/Language/Typesystem/FunctionInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,27 +7,30 @@

namespace MonoDevelop.MSBuild.Language.Typesystem
{
class FunctionInfo : BaseSymbol, ITypedSymbol
class FunctionInfo : BaseSymbol, ITypedSymbol, IHasHelpUrl
{
readonly FunctionParameterInfo [] arguments;
readonly FunctionParameterInfo [] parameters;

public virtual MSBuildValueKind ReturnType { get; }
public string ReturnTypeString => string.Join (" ", ReturnType.GetTypeDescription ());
public virtual FunctionParameterInfo [] Parameters => arguments;
public virtual FunctionParameterInfo [] Parameters => parameters;
public List<FunctionInfo> Overloads { get; } = new List<FunctionInfo> ();
public virtual bool IsProperty => false;

MSBuildValueKind ITypedSymbol.ValueKind => ReturnType;
CustomTypeInfo? ITypedSymbol.CustomType => null;

protected FunctionInfo (string name, DisplayText description) : base (name, description)
public virtual string? HelpUrl { get; }

protected FunctionInfo (string name, DisplayText description, string helpUrl = null) : base (name, description)
{
HelpUrl = helpUrl;
}

public FunctionInfo (string name, DisplayText description, MSBuildValueKind returnType, params FunctionParameterInfo [] arguments) : base (name, description)
public FunctionInfo (string name, DisplayText description, MSBuildValueKind returnType, FunctionParameterInfo [] parameters, string helpUrl = null) : this (name, description, helpUrl)
{
this.arguments = arguments;
this.ReturnType = returnType;
this.parameters = parameters;
ReturnType = returnType;
}
}

Expand Down
57 changes: 48 additions & 9 deletions MonoDevelop.MSBuild/Language/Typesystem/TaskInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,31 @@

namespace MonoDevelop.MSBuild.Language.Typesystem
{
public class TaskInfo : BaseSymbol, IDeprecatable, ITypedSymbol
public class TaskInfo : BaseSymbol, IDeprecatable, ITypedSymbol, IHasHelpUrl
{
public Dictionary<string, TaskParameterInfo> Parameters { get; }
Dictionary<string, TaskParameterInfo> parameters;

public IReadOnlyDictionary<string, TaskParameterInfo> Parameters => parameters;

/// <summary>
/// Intrinsic task
/// </summary>
internal TaskInfo (string name, DisplayText description, params TaskParameterInfo[] parameters) : this (name, description, TaskDeclarationKind.Intrinsic, null, null, null, null, 0, null)
internal TaskInfo (string name, DisplayText description, TaskParameterInfo[] parameters, string? helpUrl, string? parametersHelpUrl)
: this (name, description, TaskDeclarationKind.Intrinsic, null, null, null, null, 0, null, helpUrl: helpUrl)
{
this.parameters = new Dictionary<string, TaskParameterInfo> ();
foreach (var p in parameters) {
Parameters.Add (p.Name, p);
this.parameters.Add (p.Name, p);
p.SetParent (this);
}
}

/// <summary>
/// All other kinds of task
/// </summary>
public TaskInfo (string name, DisplayText description, TaskDeclarationKind declarationKind, string? typeName, string? assemblyName, string? assemblyFile, string? declaredInFile, int declaredAtOffset, string? deprecationMessage, Dictionary<string, TaskParameterInfo>? parameters = null)
public TaskInfo (string name, DisplayText description, TaskDeclarationKind declarationKind, string? typeName, string? assemblyName, string? assemblyFile, string? declaredInFile, int declaredAtOffset,
string? deprecationMessage, Dictionary<string, TaskParameterInfo>? parameters = null, string? helpUrl = null, string? parametersHelpUrl = null
)
: base (name, description)
{
DeclarationKind = declarationKind;
Expand All @@ -34,7 +40,23 @@ public TaskInfo (string name, DisplayText description, TaskDeclarationKind decla
DeclaredInFile = declaredInFile;
DeclaredAtOffset = declaredAtOffset;
DeprecationMessage = deprecationMessage;
Parameters = parameters ?? new Dictionary<string, TaskParameterInfo> (StringComparer.OrdinalIgnoreCase);
this.parameters = parameters ?? new Dictionary<string, TaskParameterInfo> (StringComparer.OrdinalIgnoreCase);
HelpUrl = helpUrl;
ParametersHelpUrl = parametersHelpUrl;

if (parameters is not null) {
foreach (var p in parameters.Values) {
p.SetParent (this);
}
}
}

// this is ONLY for use in schema inference as it collects parameters over the whole document
// ideally it would use its own collection and later realize it into a readonly TaskInfo
internal void SetParameter (TaskParameterInfo parameterInfo)
{
parameters.Add (parameterInfo.Name, parameterInfo);
parameterInfo.SetParent (this);
}

public TaskDeclarationKind DeclarationKind { get; }
Expand All @@ -43,14 +65,22 @@ public TaskInfo (string name, DisplayText description, TaskDeclarationKind decla
public string? AssemblyFile { get; }

public string? DeclaredInFile { get; }
public int DeclaredAtOffset { get; }
public int DeclaredAtOffset { get; }

public string? DeprecationMessage { get; }

public MSBuildValueKind ValueKind => MSBuildValueKind.Nothing;

public CustomTypeInfo? CustomType => null;

public string? HelpUrl { get; }

/// <summary>
/// If provided, used as a fallback for parameters that don't have an explicit help URL.
/// This is likely a link into the attributes anchor of the task docs page.
/// </summary>
public string? ParametersHelpUrl { get; }

// TODO: check for invalid chars in name and namespace
internal static bool ValidateTaskName (string fullTaskName, out string taskName, out string taskNamespace)
{
Expand Down Expand Up @@ -91,18 +121,27 @@ public enum TaskDeclarationKind
Inferred
}

public class TaskParameterInfo : VariableInfo
public class TaskParameterInfo : VariableInfo, IHasHelpUrl
{
public bool IsOutput { get; }
public bool IsRequired { get; }

public TaskInfo? Task { get; private set; }

string? helpUrl;
public string? HelpUrl => helpUrl ?? Task.ParametersHelpUrl;

public TaskParameterInfo (
string name, DisplayText description, bool isRequired,
bool isOutput, MSBuildValueKind kind, string deprecationMessage = null)
bool isOutput, MSBuildValueKind kind, string deprecationMessage = null, string? helpUrl = null)
: base (name, description, kind, null, null, deprecationMessage)
{
IsOutput = isOutput;
IsRequired = isRequired;
this.helpUrl = helpUrl;
}


internal void SetParent (TaskInfo task) => Task = task;
}
}
6 changes: 6 additions & 0 deletions MonoDevelop.MSBuild/Resources/HelpDescriptions.resx
Original file line number Diff line number Diff line change
Expand Up @@ -339,4 +339,10 @@
<data name="ConditionFunction_HasTrailingSlash_value" xml:space="preserve">
<value>The string to check</value>
</data>
<data name="ReservedProperty_MSBuildFileVersion" xml:space="preserve">
<value>The version of the MSBuild assemblies in use in the form `major.minor.revision.build`.</value>
</data>
<data name="ReservedProperty_MSBuildSemanticVersion" xml:space="preserve">
<value>The full version of the MSBuild assemblies in use in SemVer format.</value>
</data>
</root>
27 changes: 27 additions & 0 deletions MonoDevelop.MSBuild/Resources/HelpUrls.resx
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,12 @@
<data name="Attribute_Item_Include" xml:space="preserve">
<value>https://learn.microsoft.com/visualstudio/msbuild/how-to-select-the-files-to-build</value>
</data>
<data name="CommonProjectProperties" xml:space="preserve">
<value>https://learn.microsoft.com/visualstudio/msbuild/common-msbuild-project-properties</value>
</data>
<data name="ConditionFunctions" xml:space="preserve">
<value>https://learn.microsoft.com/visualstudio/msbuild/msbuild-conditions</value>
</data>
<data name="Element_Choose" xml:space="preserve">
<value>https://learn.microsoft.com/visualstudio/msbuild/choose-element-msbuild</value>
</data>
Expand Down Expand Up @@ -232,4 +238,25 @@
<data name="Element_When" xml:space="preserve">
<value>https://learn.microsoft.com/visualstudio/msbuild/when-element-msbuild</value>
</data>
<data name="Property_DefaultOverrideToolsVersion" xml:space="preserve">
<value>https://learn.microsoft.com/visualstudio/msbuild/overriding-toolsversion-settings#order-of-precedence</value>
</data>
<data name="ReservedAndWellKnownProperties" xml:space="preserve">
<value>https://learn.microsoft.com/visualstudio/msbuild/msbuild-reserved-and-well-known-properties</value>
</data>
<data name="Task_CallTarget" xml:space="preserve">
<value>https://learn.microsoft.com/visualstudio/msbuild/calltarget-task</value>
</data>
<data name="Task_CallTarget_Parameters" xml:space="preserve">
<value>https://learn.microsoft.com/visualstudio/msbuild/calltarget-task#task-parameters</value>
</data>
<data name="Task_MSBuild" xml:space="preserve">
<value>https://learn.microsoft.com/visualstudio/msbuild/msbuild-task</value>
</data>
<data name="Task_MSBuild_Parameters" xml:space="preserve">
<value>https://learn.microsoft.com/visualstudio/msbuild/msbuild-task#parameters</value>
</data>
<data name="WellKnownMetadata" xml:space="preserve">
<value>https://learn.microsoft.com/visualstudio/msbuild/msbuild-well-known-item-metadata</value>
</data>
</root>
Loading

0 comments on commit d657c61

Please sign in to comment.