forked from paulirwin/JavaToCSharp
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathUsingsHelper.cs
More file actions
85 lines (71 loc) · 3 KB
/
Copy pathUsingsHelper.cs
File metadata and controls
85 lines (71 loc) · 3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
using com.github.javaparser.ast;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
namespace JavaToCSharp;
public static class UsingsHelper
{
public static IEnumerable<UsingDirectiveSyntax> GetUsings(ConversionContext context,
IEnumerable<ImportDeclaration> imports,
JavaConversionOptions? options,
NameSyntax? namespaceNameSyntax)
{
var usings = new List<UsingDirectiveSyntax>();
foreach (var import in imports)
{
// The import directive in Java will import a specific class.
string importName = import.getNameAsString();
var lastPartStartIndex = importName.LastIndexOf('.');
var importNameWithoutClassName = lastPartStartIndex == -1 ?
importName :
importName[..lastPartStartIndex];
var nameSpace = TypeHelper.Capitalize(importNameWithoutClassName);
var usingSyntax = SyntaxFactory.UsingDirective(SyntaxFactory.ParseName(nameSpace));
if (context.Options.IncludeComments)
{
usingSyntax = CommentsHelper.AddUsingComments(usingSyntax, import);
}
usings.Add(usingSyntax.NormalizeWhitespace().WithTrailingNewLines());
}
if (options?.IncludeUsings == true)
{
usings.AddRange(options.Usings
.Where(x => !string.IsNullOrWhiteSpace(x))
.Select(ns => SyntaxFactory.UsingDirective(SyntaxFactory.ParseName(ns)).NormalizeWhitespace().WithTrailingNewLines()));
}
if (namespaceNameSyntax != null)
{
foreach (var staticUsing in options?.StaticUsingEnumNames ?? [])
{
var usingSyntax = SyntaxFactory
.UsingDirective(SyntaxFactory.ParseName($"{namespaceNameSyntax}.{staticUsing}"))
.WithStaticKeyword(SyntaxFactory.Token(SyntaxKind.StaticKeyword))
.NormalizeWhitespace()
.WithTrailingNewLines();
usings.Add(usingSyntax);
}
}
usings = usings.Distinct(new UsingDirectiveSyntaxComparer()).ToList();
if (usings.Count > 0)
{
usings[^1] = usings[^1].WithTrailingNewLines(2);
}
return usings;
}
}
public class UsingDirectiveSyntaxComparer : IEqualityComparer<UsingDirectiveSyntax>
{
public bool Equals(UsingDirectiveSyntax? x, UsingDirectiveSyntax? y)
{
if (ReferenceEquals(x, y)) return true;
if (x is null) return false;
if (y is null) return false;
if (x.GetType() != y.GetType()) return false;
return Equals(x.Alias?.ToString(), y.Alias?.ToString()) &&
Equals(x.Name?.ToString(), y.Name?.ToString());
}
public int GetHashCode(UsingDirectiveSyntax obj)
{
return HashCode.Combine(obj.Alias?.ToString() ?? "", obj.Name?.ToString() ?? "");
}
}