Skip to content

Commit

Permalink
Add hover tooltip for condition attributes.
Browse files Browse the repository at this point in the history
  • Loading branch information
tintoy committed Aug 22, 2017
1 parent eef8262 commit 874e82c
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 15 deletions.
54 changes: 41 additions & 13 deletions src/LanguageServer.Engine/ContentProviders/HoverContentProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public HoverContentProvider(ProjectDocument projectDocument)
/// The <see cref="MSBuildProperty"/>.
/// </param>
/// <returns>
/// The content.
/// The content, or <c>null</c> if no content is provided.
/// </returns>
public MarkedStringContainer Property(MSBuildProperty property)
{
Expand Down Expand Up @@ -95,7 +95,7 @@ public MarkedStringContainer Property(MSBuildProperty property)
/// The <see cref="MSBuildUnusedProperty"/>.
/// </param>
/// <returns>
/// The content.
/// The content, or <c>null</c> if no content is provided.
/// </returns>
public MarkedStringContainer UnusedProperty(MSBuildUnusedProperty undefinedProperty)
{
Expand All @@ -121,7 +121,7 @@ public MarkedStringContainer UnusedProperty(MSBuildUnusedProperty undefinedPrope
/// The <see cref="MSBuildItemGroup"/>.
/// </param>
/// <returns>
/// The content.
/// The content, or <c>null</c> if no content is provided.
/// </returns>
public MarkedStringContainer ItemGroup(MSBuildItemGroup itemGroup)
{
Expand Down Expand Up @@ -174,7 +174,7 @@ public MarkedStringContainer ItemGroup(MSBuildItemGroup itemGroup)
/// The <see cref="MSBuildUnusedItemGroup"/>.
/// </param>
/// <returns>
/// The content.
/// The content, or <c>null</c> if no content is provided.
/// </returns>
public MarkedStringContainer UnusedItemGroup(MSBuildUnusedItemGroup unusedItemGroup)
{
Expand Down Expand Up @@ -224,6 +224,34 @@ public MarkedStringContainer UnusedItemGroup(MSBuildUnusedItemGroup unusedItemGr
);
}

/// <summary>
/// Get hover content for an MSBuild condition.
/// </summary>
/// <param name="elementName">
/// The name of the element that contains the Condition attribute.
/// </param>
/// <param name="condition">
/// The raw (unevaluated) condition.
/// </param>
/// <returns>
/// The content, or <c>null</c> if no content is provided.
/// </returns>
public MarkedStringContainer Condition(string elementName, string condition)
{
if (String.IsNullOrWhiteSpace(elementName))
throw new ArgumentException("Argument cannot be null, empty, or entirely composed of whitespace: 'elementName'.", nameof(elementName));

if (String.IsNullOrWhiteSpace(condition))
return null;

string evaluatedCondition = _projectDocument.MSBuildProject.ExpandString(condition);

return new MarkedStringContainer(
"Condition",
$"Evaluated: `{evaluatedCondition}`"
);
}

/// <summary>
/// Get hover content for metadata of an <see cref="MSBuildItemGroup"/>.
/// </summary>
Expand All @@ -234,7 +262,7 @@ public MarkedStringContainer UnusedItemGroup(MSBuildUnusedItemGroup unusedItemGr
/// The metadata name.
/// </param>
/// <returns>
/// The content.
/// The content, or <c>null</c> if no content is provided.
/// </returns>
public MarkedStringContainer ItemGroupMetadata(MSBuildItemGroup itemGroup, string metadataName)
{
Expand All @@ -248,7 +276,7 @@ public MarkedStringContainer ItemGroupMetadata(MSBuildItemGroup itemGroup, strin
return ItemGroup(itemGroup);

if (metadataName == "Condition")
return null; // TODO: Handle the "Condition" attribute.
return Condition(itemGroup.Name, itemGroup.FirstItem.Xml.Condition);

if (String.Equals(metadataName, "Include"))
metadataName = "Identity";
Expand Down Expand Up @@ -290,7 +318,7 @@ public MarkedStringContainer ItemGroupMetadata(MSBuildItemGroup itemGroup, strin
/// The name of the metadata attribute.
/// </param>
/// <returns>
/// The content.
/// The content, or <c>null</c> if no content is provided.
/// </returns>
public MarkedStringContainer UnusedItemGroupMetadata(MSBuildUnusedItemGroup itemGroup, string metadataName)
{
Expand All @@ -304,7 +332,7 @@ public MarkedStringContainer UnusedItemGroupMetadata(MSBuildUnusedItemGroup item
return UnusedItemGroup(itemGroup);

if (metadataName == "Condition")
return null; // TODO: Handle the "Condition" attribute.
return Condition(itemGroup.Name, itemGroup.FirstItem.Xml.Condition);

if (String.Equals(metadataName, "Include"))
metadataName = "Identity";
Expand Down Expand Up @@ -343,7 +371,7 @@ public MarkedStringContainer UnusedItemGroupMetadata(MSBuildUnusedItemGroup item
/// The <see cref="MSBuildTarget"/>.
/// </param>
/// <returns>
/// The content.
/// The content, or <c>null</c> if no content is provided.
/// </returns>
public MarkedStringContainer Target(MSBuildTarget target)
{
Expand All @@ -360,7 +388,7 @@ public MarkedStringContainer Target(MSBuildTarget target)
/// The <see cref="MSBuildImport"/>.
/// </param>
/// <returns>
/// The content.
/// The content, or <c>null</c> if no content is provided.
/// </returns>
public MarkedStringContainer Import(MSBuildImport import)
{
Expand All @@ -385,7 +413,7 @@ public MarkedStringContainer Import(MSBuildImport import)
/// The <see cref="MSBuildImport"/>.
/// </param>
/// <returns>
/// The content.
/// The content, or <c>null</c> if no content is provided.
/// </returns>
public MarkedStringContainer UnresolvedImport(MSBuildUnresolvedImport unresolvedImport)
{
Expand Down Expand Up @@ -428,7 +456,7 @@ public MarkedStringContainer UnresolvedImport(MSBuildUnresolvedImport unresolved
/// The <see cref="MSBuildSdkImport"/>.
/// </param>
/// <returns>
/// The content.
/// The content, or <c>null</c> if no content is provided.
/// </returns>
public MarkedStringContainer SdkImport(MSBuildSdkImport sdkImport)
{
Expand All @@ -453,7 +481,7 @@ public MarkedStringContainer SdkImport(MSBuildSdkImport sdkImport)
/// The <see cref="MSBuildUnresolvedSdkImport"/>.
/// </param>
/// <returns>
/// The content.
/// The content, or <c>null</c> if no content is provided.
/// </returns>
public MarkedStringContainer UnresolvedSdkImport(MSBuildUnresolvedSdkImport unresolvedSdkImport)
{
Expand Down
4 changes: 2 additions & 2 deletions src/LanguageServer.Engine/Handlers/HoverHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -130,8 +130,6 @@ async Task<Hover> OnHover(TextDocumentPositionParams parameters, CancellationTok

// Match up the MSBuild item / property with its corresponding XML element / attribute.
MSBuildObject msbuildObject = projectDocument.GetMSBuildObjectAtPosition(position);
if (msbuildObject == null)
return null;

Range range = elementOrAttribute.Span.ToNative(projectDocument.XmlPositions);
Hover result = new Hover
Expand Down Expand Up @@ -171,6 +169,8 @@ async Task<Hover> OnHover(TextDocumentPositionParams parameters, CancellationTok
result.Contents = contentProvider.UnresolvedSdkImport(unresolvedSdkImportFromAttribute);
else if (msbuildObject is MSBuildImport importFromAttribute)
result.Contents = contentProvider.Import(importFromAttribute);
else if (attribute.Name == "Condition")
result.Contents = contentProvider.Condition(attribute.ParentElement.Name, attribute.Value);
else
return null;
}
Expand Down

0 comments on commit 874e82c

Please sign in to comment.