Skip to content
This repository was archived by the owner on Sep 24, 2019. It is now read-only.

Add directive attribute support. #367

Merged
merged 1 commit into from
Jun 5, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions build/dependencies.props
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@
<PropertyGroup Label="Package Versions">
<MicrosoftExtensionsHashCodeCombinerSourcesPackageVersion>3.0.0-preview3.19120.3</MicrosoftExtensionsHashCodeCombinerSourcesPackageVersion>
<InternalAspNetCoreSdkPackageVersion>3.0.0-alpha1-20181108.5</InternalAspNetCoreSdkPackageVersion>
<MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>3.0.0-preview5.19208.5</MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>
<MicrosoftAspNetCoreMvcRazorExtensionsVersion1_XPackageVersion>3.0.0-preview5.19208.5</MicrosoftAspNetCoreMvcRazorExtensionsVersion1_XPackageVersion>
<MicrosoftAspNetCoreMvcRazorExtensionsVersion2_XPackageVersion>3.0.0-preview5.19208.5</MicrosoftAspNetCoreMvcRazorExtensionsVersion2_XPackageVersion>
<MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>3.0.0-preview7.19303.4</MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>
<MicrosoftAspNetCoreMvcRazorExtensionsVersion1_XPackageVersion>3.0.0-preview7.19303.4</MicrosoftAspNetCoreMvcRazorExtensionsVersion1_XPackageVersion>
<MicrosoftAspNetCoreMvcRazorExtensionsVersion2_XPackageVersion>3.0.0-preview7.19303.4</MicrosoftAspNetCoreMvcRazorExtensionsVersion2_XPackageVersion>
<MicrosoftAspNetCoreTestingPackageVersion>3.0.0-alpha1-10643</MicrosoftAspNetCoreTestingPackageVersion>
<MicrosoftBuildPackageVersion>15.9.20</MicrosoftBuildPackageVersion>
<MicrosoftCodeAnalysisCSharpPackageVersion>3.0.0-beta4-final</MicrosoftCodeAnalysisCSharpPackageVersion>
<MicrosoftCodeAnalysisCSharpWorkspacesPackageVersion>3.0.0-beta4-final</MicrosoftCodeAnalysisCSharpWorkspacesPackageVersion>
<MicrosoftCodeAnalysisCSharpFeaturesPackageVersion>3.0.0-beta4-final</MicrosoftCodeAnalysisCSharpFeaturesPackageVersion>
<MicrosoftCodeAnalysisRazorWorkspacesPackageVersion>3.0.0-preview5.19208.5</MicrosoftCodeAnalysisRazorWorkspacesPackageVersion>
<MicrosoftCodeAnalysisRazorWorkspacesPackageVersion>3.0.0-preview7.19303.4</MicrosoftCodeAnalysisRazorWorkspacesPackageVersion>
<MicrosoftCodeAnalysisVisualBasicFeaturesPackageVersion>3.0.0-beta4-final</MicrosoftCodeAnalysisVisualBasicFeaturesPackageVersion>
<MicrosoftCodeAnalysisWorkspacesCommonPackageVersion>3.0.0-beta4-final</MicrosoftCodeAnalysisWorkspacesCommonPackageVersion>
<MicrosoftExtensionsLoggingAbstractionsPackageVersion>3.0.0-preview4.19155.3</MicrosoftExtensionsLoggingAbstractionsPackageVersion>
Expand Down
2 changes: 1 addition & 1 deletion build/sources.props
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<RestoreSources Condition="'$(DotNetBuildOffline)' != 'true' AND '$(AspNetUniverseBuildOffline)' != 'true' ">
$(RestoreSources);
https://dotnet.myget.org/F/dotnet-core/api/v3/index.json;
https://dotnet.myget.org/F/aspnetcore-dev/api/v3/index.json;
https://dotnetfeed.blob.core.windows.net/aspnet-aspnetcore-tooling/index.json;
https://dotnet.myget.org/F/aspnetcore-tools/api/v3/index.json;
https://dotnet.myget.org/F/roslyn/api/v3/index.json;
https://dotnet.myget.org/F/roslyn-tools/api/v3/index.json;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s
writer.WriteEndObject();
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All the changes here are a direct copy from Razor. Sadly our serialization logic is in the VS windows specific binary.

}

private void WriteAllowedChildTags(JsonWriter writer, AllowedChildTagDescriptor allowedChildTag, JsonSerializer serializer)
private static void WriteAllowedChildTags(JsonWriter writer, AllowedChildTagDescriptor allowedChildTag, JsonSerializer serializer)
{
writer.WriteStartObject();

Expand All @@ -149,7 +149,7 @@ private void WriteAllowedChildTags(JsonWriter writer, AllowedChildTagDescriptor
writer.WriteEndObject();
}

private void WriteBoundAttribute(JsonWriter writer, BoundAttributeDescriptor boundAttribute, JsonSerializer serializer)
private static void WriteBoundAttribute(JsonWriter writer, BoundAttributeDescriptor boundAttribute, JsonSerializer serializer)
{
writer.WriteStartObject();

Expand Down Expand Up @@ -180,6 +180,42 @@ private void WriteBoundAttribute(JsonWriter writer, BoundAttributeDescriptor bou
writer.WritePropertyName(nameof(BoundAttributeDescriptor.Metadata));
WriteMetadata(writer, boundAttribute.Metadata);

writer.WritePropertyName(nameof(BoundAttributeDescriptor.BoundAttributeParameters));
writer.WriteStartArray();
foreach (var boundAttributeParameter in boundAttribute.BoundAttributeParameters)
{
WriteBoundAttributeParameter(writer, boundAttributeParameter, serializer);
}
writer.WriteEndArray();

writer.WriteEndObject();
}

private static void WriteBoundAttributeParameter(JsonWriter writer, BoundAttributeParameterDescriptor boundAttributeParameter, JsonSerializer serializer)
{
writer.WriteStartObject();

writer.WritePropertyName(nameof(BoundAttributeParameterDescriptor.Kind));
writer.WriteValue(boundAttributeParameter.Kind);

writer.WritePropertyName(nameof(BoundAttributeParameterDescriptor.Name));
writer.WriteValue(boundAttributeParameter.Name);

writer.WritePropertyName(nameof(BoundAttributeParameterDescriptor.TypeName));
writer.WriteValue(boundAttributeParameter.TypeName);

writer.WritePropertyName(nameof(BoundAttributeParameterDescriptor.IsEnum));
writer.WriteValue(boundAttributeParameter.IsEnum);

writer.WritePropertyName(nameof(BoundAttributeParameterDescriptor.Documentation));
writer.WriteValue(boundAttributeParameter.Documentation);

writer.WritePropertyName(nameof(BoundAttributeParameterDescriptor.Diagnostics));
serializer.Serialize(writer, boundAttributeParameter.Diagnostics);

writer.WritePropertyName(nameof(BoundAttributeParameterDescriptor.Metadata));
WriteMetadata(writer, boundAttributeParameter.Metadata);

writer.WriteEndObject();
}

Expand All @@ -194,7 +230,7 @@ private static void WriteMetadata(JsonWriter writer, IReadOnlyDictionary<string,
writer.WriteEndObject();
}

private void WriteTagMatchingRule(JsonWriter writer, TagMatchingRuleDescriptor ruleDescriptor, JsonSerializer serializer)
private static void WriteTagMatchingRule(JsonWriter writer, TagMatchingRuleDescriptor ruleDescriptor, JsonSerializer serializer)
{
writer.WriteStartObject();

Expand All @@ -221,7 +257,7 @@ private void WriteTagMatchingRule(JsonWriter writer, TagMatchingRuleDescriptor r
writer.WriteEndObject();
}

private void WriteRequiredAttribute(JsonWriter writer, RequiredAttributeDescriptor requiredAttribute, JsonSerializer serializer)
private static void WriteRequiredAttribute(JsonWriter writer, RequiredAttributeDescriptor requiredAttribute, JsonSerializer serializer)
{
writer.WriteStartObject();

Expand All @@ -240,10 +276,13 @@ private void WriteRequiredAttribute(JsonWriter writer, RequiredAttributeDescript
writer.WritePropertyName(nameof(RequiredAttributeDescriptor.Diagnostics));
serializer.Serialize(writer, requiredAttribute.Diagnostics);

writer.WritePropertyName(nameof(RequiredAttributeDescriptor.Metadata));
WriteMetadata(writer, requiredAttribute.Metadata);

writer.WriteEndObject();
}

private void ReadTagMatchingRule(TagMatchingRuleDescriptorBuilder builder, JObject rule, JsonSerializer serializer)
private static void ReadTagMatchingRule(TagMatchingRuleDescriptorBuilder builder, JObject rule, JsonSerializer serializer)
{
var tagName = rule[nameof(TagMatchingRuleDescriptor.TagName)].Value<string>();
var attributes = rule[nameof(TagMatchingRuleDescriptor.Attributes)].Value<JArray>();
Expand All @@ -269,13 +308,14 @@ private void ReadTagMatchingRule(TagMatchingRuleDescriptorBuilder builder, JObje
}
}

private void ReadRequiredAttribute(RequiredAttributeDescriptorBuilder builder, JObject attribute, JsonSerializer serializer)
private static void ReadRequiredAttribute(RequiredAttributeDescriptorBuilder builder, JObject attribute, JsonSerializer serializer)
{
var name = attribute[nameof(RequiredAttributeDescriptor.Name)].Value<string>();
var nameComparison = attribute[nameof(RequiredAttributeDescriptor.NameComparison)].Value<int>();
var value = attribute[nameof(RequiredAttributeDescriptor.Value)].Value<string>();
var valueComparison = attribute[nameof(RequiredAttributeDescriptor.ValueComparison)].Value<int>();
var diagnostics = attribute[nameof(RequiredAttributeDescriptor.Diagnostics)].Value<JArray>();
var metadata = attribute[nameof(RequiredAttributeDescriptor.Metadata)].Value<JObject>();

builder.Name = name;
builder.NameComparisonMode = (RequiredAttributeDescriptor.NameComparisonMode)nameComparison;
Expand All @@ -288,9 +328,16 @@ private void ReadRequiredAttribute(RequiredAttributeDescriptorBuilder builder, J
var diagnosticObject = serializer.Deserialize<RazorDiagnostic>(diagnosticReader);
builder.Diagnostics.Add(diagnosticObject);
}

var metadataReader = metadata.CreateReader();
var metadataValue = serializer.Deserialize<Dictionary<string, string>>(metadataReader);
foreach (var item in metadataValue)
{
builder.Metadata[item.Key] = item.Value;
}
}

private void ReadAllowedChildTag(AllowedChildTagDescriptorBuilder builder, JObject childTag, JsonSerializer serializer)
private static void ReadAllowedChildTag(AllowedChildTagDescriptorBuilder builder, JObject childTag, JsonSerializer serializer)
{
var name = childTag[nameof(AllowedChildTagDescriptor.Name)].Value<string>();
var displayName = childTag[nameof(AllowedChildTagDescriptor.DisplayName)].Value<string>();
Expand All @@ -307,7 +354,7 @@ private void ReadAllowedChildTag(AllowedChildTagDescriptorBuilder builder, JObje
}
}

private void ReadBoundAttribute(BoundAttributeDescriptorBuilder builder, JObject attribute, JsonSerializer serializer)
private static void ReadBoundAttribute(BoundAttributeDescriptorBuilder builder, JObject attribute, JsonSerializer serializer)
{
var descriptorKind = attribute[nameof(BoundAttributeDescriptor.Kind)].Value<string>();
var name = attribute[nameof(BoundAttributeDescriptor.Name)].Value<string>();
Expand All @@ -318,6 +365,7 @@ private void ReadBoundAttribute(BoundAttributeDescriptorBuilder builder, JObject
var documentation = attribute[nameof(BoundAttributeDescriptor.Documentation)].Value<string>();
var diagnostics = attribute[nameof(BoundAttributeDescriptor.Diagnostics)].Value<JArray>();
var metadata = attribute[nameof(BoundAttributeDescriptor.Metadata)].Value<JObject>();
var boundAttributeParameters = attribute[nameof(BoundAttributeDescriptor.BoundAttributeParameters)].Value<JArray>();

builder.Name = name;
builder.TypeName = typeName;
Expand Down Expand Up @@ -346,6 +394,46 @@ private void ReadBoundAttribute(BoundAttributeDescriptorBuilder builder, JObject
{
builder.Metadata[item.Key] = item.Value;
}

foreach (var boundAttributeParameter in boundAttributeParameters)
{
var parameter = boundAttributeParameter.Value<JObject>();
builder.BindAttributeParameter(b => ReadBoundAttributeParameter(b, parameter, serializer));
}
}

private static void ReadBoundAttributeParameter(BoundAttributeParameterDescriptorBuilder builder, JObject parameter, JsonSerializer serializer)
{
var descriptorKind = parameter[nameof(BoundAttributeParameterDescriptor.Kind)].Value<string>();
var name = parameter[nameof(BoundAttributeParameterDescriptor.Name)].Value<string>();
var typeName = parameter[nameof(BoundAttributeParameterDescriptor.TypeName)].Value<string>();
var isEnum = parameter[nameof(BoundAttributeParameterDescriptor.IsEnum)].Value<bool>();
var documentation = parameter[nameof(BoundAttributeParameterDescriptor.Documentation)].Value<string>();
var diagnostics = parameter[nameof(BoundAttributeParameterDescriptor.Diagnostics)].Value<JArray>();
var metadata = parameter[nameof(BoundAttributeParameterDescriptor.Metadata)].Value<JObject>();

builder.Name = name;
builder.TypeName = typeName;
builder.Documentation = documentation;

if (isEnum)
{
builder.IsEnum = true;
}

foreach (var diagnostic in diagnostics)
{
var diagnosticReader = diagnostic.CreateReader();
var diagnosticObject = serializer.Deserialize<RazorDiagnostic>(diagnosticReader);
builder.Diagnostics.Add(diagnosticObject);
}

var metadataReader = metadata.CreateReader();
var metadataValue = serializer.Deserialize<Dictionary<string, string>>(metadataReader);
foreach (var item in metadataValue)
{
builder.Metadata[item.Key] = item.Value;
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
using System;
using System.Collections.Generic;

namespace Microsoft.AspNetCore.Razor.LanguageServer
namespace Microsoft.AspNetCore.Razor.LanguageServer.Completion
{
internal class AttributeDescriptionInfo
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
// Copyright (c) .NET Foundation. All rights reserved.
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Git diff failure here. Did not touch all of this.

// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using System;
using Microsoft.CodeAnalysis.Razor.Completion;
using Newtonsoft.Json.Linq;
using OmniSharp.Extensions.LanguageServer.Protocol.Models;

namespace Microsoft.AspNetCore.Razor.LanguageServer.Completion
{
internal static class CompletionItemExtensions
{
private const string TagHelperElementDataKey = "_TagHelperElementData_";
private const string TagHelperAttributeDataKey = "_TagHelperAttributes_";
private const string AttributeCompletionDataKey = "_AttributeCompletion_";
private const string RazorCompletionItemKind = "_CompletionItemKind_";

public static void SetRazorCompletionKind(this CompletionItem completion, RazorCompletionItemKind completionItemKind)
{
if (completion is null)
{
throw new ArgumentNullException(nameof(completion));
}

var data = completion.Data ?? new JObject();
data[RazorCompletionItemKind] = JToken.FromObject(completionItemKind);
completion.Data = data;
}

public static bool TryGetRazorCompletionKind(this CompletionItem completion, out RazorCompletionItemKind completionItemKind)
{
if (completion is null)
{
throw new ArgumentNullException(nameof(completion));
}

if (completion.Data is JObject data && data.ContainsKey(RazorCompletionItemKind))
{
completionItemKind = data[RazorCompletionItemKind].ToObject<RazorCompletionItemKind>();
return true;
}

completionItemKind = default;
return false;
}

public static bool IsTagHelperElementCompletion(this CompletionItem completion)
{
if (completion.Data is JObject data && data.ContainsKey(TagHelperElementDataKey))
{
return true;
}

return false;
}

public static bool IsTagHelperAttributeCompletion(this CompletionItem completion)
{
if (completion.Data is JObject data && data.ContainsKey(TagHelperAttributeDataKey))
{
return true;
}

return false;
}

public static void SetDescriptionInfo(this CompletionItem completion, ElementDescriptionInfo elementDescriptionInfo)
{
var data = completion.Data ?? new JObject();
data[TagHelperElementDataKey] = JObject.FromObject(elementDescriptionInfo);
completion.Data = data;
}

public static void SetDescriptionInfo(this CompletionItem completion, AttributeDescriptionInfo attributeDescriptionInfo)
{
var data = completion.Data ?? new JObject();
data[TagHelperAttributeDataKey] = JObject.FromObject(attributeDescriptionInfo);
completion.Data = data;
}

public static void SetDescriptionInfo(this CompletionItem completion, AttributeCompletionDescription attributeDescriptionInfo)
{
if (completion is null)
{
throw new ArgumentNullException(nameof(completion));
}

if (attributeDescriptionInfo is null)
{
throw new ArgumentNullException(nameof(attributeDescriptionInfo));
}

var data = completion.Data ?? new JObject();
data[AttributeCompletionDataKey] = JObject.FromObject(attributeDescriptionInfo);
completion.Data = data;
}

public static ElementDescriptionInfo GetElementDescriptionInfo(this CompletionItem completion)
{
if (completion.Data is JObject data && data.ContainsKey(TagHelperElementDataKey))
{
var descriptionInfo = data[TagHelperElementDataKey].ToObject<ElementDescriptionInfo>();
return descriptionInfo;
}

return ElementDescriptionInfo.Default;
}

public static AttributeDescriptionInfo GetTagHelperAttributeDescriptionInfo(this CompletionItem completion)
{
if (completion.Data is JObject data && data.ContainsKey(TagHelperAttributeDataKey))
{
var descriptionInfo = data[TagHelperAttributeDataKey].ToObject<AttributeDescriptionInfo>();
return descriptionInfo;
}

return AttributeDescriptionInfo.Default;
}

public static AttributeCompletionDescription GetAttributeDescriptionInfo(this CompletionItem completion)
{
if (completion is null)
{
throw new ArgumentNullException(nameof(completion));
}

if (completion.Data is JObject data && data.ContainsKey(AttributeCompletionDataKey))
{
var descriptionInfo = data[AttributeCompletionDataKey].ToObject<AttributeCompletionDescription>();
return descriptionInfo;
}

return null;
}
}
}
Loading