forked from joao-neves95/CSharpToTypescript
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCSharpToTypescriptConverter.cs
111 lines (89 loc) · 3.54 KB
/
CSharpToTypescriptConverter.cs
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*
* Copyright (c) 2019 João Pedro Martins Neves (shivayl) - All Rights Reserved.
*
* CSharpToTypescript is licensed under the GNU Lesser General Public License (LGPL),
* version 3, located in the root of this project, under the name "LICENSE.md".
*
*/
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using RoslynTypeScript.Translation;
using System;
using System.Linq;
namespace CSharpToTypescript
{
public class CSharpToTypescriptConverter
{
private MetadataReference mscorlib;
private MetadataReference Mscorlib
{
get
{
if (mscorlib == null)
{
mscorlib = MetadataReference.CreateFromFile( typeof( object ).Assembly.Location );
}
return mscorlib;
}
}
public string ConvertException{ get; private set; }
public string ConvertToTypescript(string text, ISettingStore settingStore)
{
ConvertException = string.Empty;
try
{
var tree = (CSharpSyntaxTree)CSharpSyntaxTree.ParseText( text );
// detect to see if it's actually C# sourcode by checking whether it has any error
if (tree.GetDiagnostics().Any( f => f.Severity == DiagnosticSeverity.Error ))
{
return null;
}
var root = tree.GetRoot();
// if it only contains comments, just return the original texts
if (IsEmptyRoot( root )) return null;
if (settingStore.IsConvertToInterface)
{
root = ClassToInterfaceReplacement.ReplaceClass( root );
}
if (settingStore.IsConvertMemberToCamelCase)
{
root = MakeMemberCamelCase.Make( root );
}
if (settingStore.IsConvertListToArray)
{
root = ListToArrayReplacement.ReplaceList( root );
}
if (settingStore.ReplacedTypeNameArray.Length > 0)
{
root = TypeNameReplacement.Replace( settingStore.ReplacedTypeNameArray, root );
}
if (settingStore.AddIPrefixInterfaceDeclaration)
{
root = AddIPrefixInterfaceDeclaration.AddIPrefix( root );
}
if (settingStore.IsInterfaceOptionalProperties)
{
root = OptionalInterfaceProperties.AddOptional( root );
}
tree = (CSharpSyntaxTree)root.SyntaxTree;
var translationNode = TF.Get( root, null );
var compilation = CSharpCompilation.Create( "TemporaryCompilation",
syntaxTrees: new[] { tree }, references: new[] { Mscorlib } );
var model = compilation.GetSemanticModel( tree );
translationNode.Compilation = compilation;
translationNode.SemanticModel = model;
translationNode.ApplyPatch();
return translationNode.Translate();
}
catch (Exception ex)
{
ConvertException = ex.ToString();
}
return null;
}
private bool IsEmptyRoot(SyntaxNode root)
{
return !root.DescendantNodes().Any();
}
}
}