// Copyright © 2020 The CefSharp Authors. All rights reserved.
//
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
using System.Linq;
using System.Reflection;
namespace CefSharp.JavascriptBinding
{
///
/// CamelCaseJavascriptNameConverter converts .Net property/method names
/// to camcel case.
///
public class CamelCaseJavascriptNameConverter : IJavascriptNameConverter
{
string IJavascriptNameConverter.ConvertToJavascript(MemberInfo memberInfo)
{
return ConvertToJavascript(memberInfo);
}
///
/// Get the javascript name for the property/field/method.
/// Typically this would be based on
///
/// property/field/method
/// javascript name
protected virtual string ConvertToJavascript(MemberInfo memberInfo)
{
return ConvertMemberInfoNameToCamelCase(memberInfo);
}
string IJavascriptNameConverter.ConvertReturnedObjectPropertyAndFieldToNameJavascript(MemberInfo memberInfo)
{
return ConvertReturnedObjectPropertyAndFieldToNameJavascript(memberInfo);
}
///
/// This method exists for backwards compatability reasons, historically
/// only the bound methods/fields/properties were converted. Objects returned
/// from a method call were not translated. To preserve this functionality
/// for upgrading users we split this into two methods. Typically thie method
/// would return the same result as
/// Issue #2442
///
/// property/field/method
/// javascript name
protected virtual string ConvertReturnedObjectPropertyAndFieldToNameJavascript(MemberInfo memberInfo)
{
return ConvertMemberInfoNameToCamelCase(memberInfo);
}
///
/// Converts the to CamelCase
///
/// memberInfo
/// camelcased name
protected static string ConvertMemberInfoNameToCamelCase(MemberInfo memberInfo)
{
var name = memberInfo.Name;
// camelCase says that if the string is only one character that it is preserved.
if (name.Length == 1)
{
return name;
}
// camelCase says that if the entire string is uppercase to preserve it.
//TODO: We need to cache these values to avoid the cost of validating this
if (name.All(char.IsUpper))
{
return name;
}
var firstHalf = name.Substring(0, 1);
var remainingHalf = name.Substring(1);
return firstHalf.ToLowerInvariant() + remainingHalf;
}
}
}