internal static string ResolveTagHelperTypeName(string returnTypeName, string propertyName, string displayName) { // A BoundAttributeDescriptor does not have a direct reference to its parent TagHelper. // However, when it was constructed the parent TagHelper's type name was embedded into // its DisplayName. In VSCode we can't use the DisplayName verbatim for descriptions // because the DisplayName is typically too long to display properly. Therefore we need // to break it apart and then reconstruct it in a reduced format. // i.e. this is the format the display name comes in: // ReturnTypeName SomeTypeName.SomePropertyName // We must simplify the return type name before using it to determine the type name prefix // because that is how the display name was originally built (a little hacky). if (!TypeNameStringResolver.TryGetSimpleName(returnTypeName, out var simpleReturnType)) { simpleReturnType = returnTypeName; } // "ReturnTypeName " var typeNamePrefixLength = simpleReturnType.Length + 1 /* space */; // ".SomePropertyName" var typeNameSuffixLength = /* . */ 1 + propertyName.Length; // "SomeTypeName" var typeNameLength = displayName.Length - typeNamePrefixLength - typeNameSuffixLength; var tagHelperTypeName = displayName.Substring(typeNamePrefixLength, typeNameLength); return(tagHelperTypeName); }
public void GetSimpleName_SimplifiesPrimitiveTypes_ReturnsTrue(string typeName, string expectedTypeName) { // Arrange // Act var result = TypeNameStringResolver.TryGetSimpleName(typeName, out var resolvedTypeName); // Assert Assert.True(result); Assert.Equal(expectedTypeName, resolvedTypeName); }
public void TryGetSimpleName_NonPrimitiveType_ReturnsFalse() { // Arrange var typeName = "Microsoft.AspNetCore.SomeType"; // Act var result = TypeNameStringResolver.TryGetSimpleName(typeName, out var resolvedTypeName); // Assert Assert.False(result); Assert.Null(resolvedTypeName); }