Skip to content
Prev Previous commit
Next Next commit
Rewrite reading class name and namespace name.
  • Loading branch information
maraf authored and github-actions committed Aug 31, 2022
commit 79692dca403f90e5965980401be4296854133838
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using System.Collections.Immutable;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;

using Microsoft.CodeAnalysis;
Expand Down Expand Up @@ -128,12 +129,7 @@ public static JSSignatureContext Create(
int typesHash = Math.Abs((int)hash);

var fullName = $"{method.ContainingType.ToDisplayString()}.{method.Name}";
string qualifiedName;

var ns = string.Join(".", method.ContainingType.ToDisplayParts().Where(p => p.Kind == SymbolDisplayPartKind.NamespaceName).Select(x => x.ToString()).ToArray());
var cn = string.Join("/", method.ContainingType.ToDisplayParts().Where(p => Array.IndexOf(nameKinds, p.Kind) >= 0).Select(x => x.ToString()).ToArray());
var qclasses = method.ContainingType.ContainingNamespace == null ? ns : ns + "." + cn;
qualifiedName = $"[{env.Compilation.AssemblyName}]{qclasses}:{method.Name}";
string qualifiedName = GetQualifiedName(env, method);

return new JSSignatureContext()
{
Expand All @@ -151,6 +147,54 @@ public static JSSignatureContext Create(
};
}

private static string GetQualifiedName(StubEnvironment env, IMethodSymbol method)
{
bool isFirstTypeName = true;
string? namespaceName = null;
string? className;
StringBuilder nameBuilder = new StringBuilder();
ImmutableArray<SymbolDisplayPart> nameParts = method.ContainingType.ToDisplayParts();
foreach (SymbolDisplayPart namePart in nameParts)
{
if (namePart.Kind == SymbolDisplayPartKind.NamespaceName)
{
if (!isFirstTypeName)
throw new InvalidOperationException($"Found namespace name '{namePart}' after some type names '{nameBuilder}'");

if (nameBuilder.Length != 0)
nameBuilder.Append('.');

nameBuilder.Append(namePart);
}
else if (Array.IndexOf(nameKinds, namePart.Kind) >= 0)
{
if (isFirstTypeName)
{
namespaceName = nameBuilder.ToString();
nameBuilder.Clear();
isFirstTypeName = false;
}

if (nameBuilder.Length != 0)
nameBuilder.Append('/');

nameBuilder.Append(namePart);
}
else
{
throw new InvalidOperationException($"Name kind '{namePart.Kind}' should be reached");
}
}

if (isFirstTypeName)
throw new InvalidOperationException($"Type name not found in '{nameParts}'");
else
className = nameBuilder.ToString();

string qualifiedClassName = namespaceName == null ? className : namespaceName + "." + className;
return $"[{env.Compilation.AssemblyName}]{qualifiedClassName}:{method.Name}";
}

private static (ImmutableArray<TypePositionInfo>, IMarshallingGeneratorFactory) GenerateTypeInformation(IMethodSymbol method, GeneratorDiagnostics diagnostics, StubEnvironment env)
{
var jsMarshallingAttributeParser = new JSMarshallingAttributeInfoParser(env.Compilation, diagnostics, method);
Expand Down