/
RDomParameterFactory.cs
141 lines (122 loc) · 6.77 KB
/
RDomParameterFactory.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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
using System.Collections.Generic;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using RoslynDom.Common;
using System.Linq;
using System;
namespace RoslynDom.CSharp
{
public class RDomParameterMiscFactory
: RDomBaseSyntaxNodeFactory<RDomParameter, ParameterSyntax>
{
private static WhitespaceKindLookup _whitespaceLookup;
public RDomParameterMiscFactory(RDomCorporation corporation)
: base(corporation)
{ }
private WhitespaceKindLookup WhitespaceLookup
{
get
{
if (_whitespaceLookup == null)
{
_whitespaceLookup = new WhitespaceKindLookup();
_whitespaceLookup.Add(LanguageElement.Identifier, SyntaxKind.IdentifierToken);
_whitespaceLookup.Add(LanguageElement.OutParameter, SyntaxKind.OutKeyword);
_whitespaceLookup.Add(LanguageElement.RefParameter, SyntaxKind.RefKeyword);
_whitespaceLookup.Add(LanguageElement.ParamsParameter, SyntaxKind.ParamsKeyword);
_whitespaceLookup.Add(LanguageElement.ParameterDefaultAssignOperator, SyntaxKind.EqualsToken);
_whitespaceLookup.Add(LanguageElement.ParameterSeparator, SyntaxKind.CommaToken);
_whitespaceLookup.AddRange(WhitespaceKindLookup.Eol);
}
return _whitespaceLookup;
}
}
protected override IDom CreateItemFrom(SyntaxNode syntaxNode, IDom parent, SemanticModel model)
{
var syntax = syntaxNode as ParameterSyntax;
var newItem = new RDomParameter(syntaxNode, parent, model);
CreateFromWorker.StandardInitialize(newItem, syntaxNode, parent, model, OutputContext);
newItem.Name = newItem.TypedSymbol.Name;
// TODO: Determine if null types for anonymous methods are a fact of life, or a temporary bug
if (syntax.Type != null)
{
var type = OutputContext.Corporation
.Create(syntax.Type, newItem, model)
.FirstOrDefault()
as IReferencedType;
newItem.Type = type;
}
newItem.IsOut = newItem.TypedSymbol.RefKind == RefKind.Out;
newItem.IsRef = newItem.TypedSymbol.RefKind == RefKind.Ref;
newItem.IsParamArray = newItem.TypedSymbol.IsParams;
newItem.IsOptional = newItem.TypedSymbol.IsOptional;
if (syntax.Default != null)
{
var tuple = CreateFromWorker.GetArgumentValue(newItem, model, syntax.Default.Value);
newItem.DefaultValue = tuple.Item1;
newItem.DefaultConstantIdentifier = tuple.Item2;
newItem.DefaultValueType = tuple.Item3;
}
newItem.Ordinal = newItem.TypedSymbol.Ordinal;
MemberWhitespace(newItem, syntax);
return newItem;
}
public override IEnumerable<SyntaxNode> BuildSyntax(IDom item)
{
var itemAsT = item as IParameter;
Guardian.Assert.IsNotNull(itemAsT, nameof(itemAsT));
var nameSyntax = SyntaxFactory.Identifier(itemAsT.Name);
var syntaxType = (TypeSyntax)(RDom.CSharp.GetSyntaxNode(itemAsT.Type));
syntaxType = BuildSyntaxHelpers.RemoveLeadingSpaces(syntaxType);
var node = SyntaxFactory.Parameter(nameSyntax)
.WithType(syntaxType);
if (itemAsT.DefaultValueType != LiteralKind.Unknown)
{
var defaultValueExpression = BuildSyntaxHelpers.BuildArgValueExpression(
itemAsT.DefaultValue, itemAsT.DefaultConstantIdentifier, itemAsT.DefaultValueType);
var defaultClause = SyntaxFactory.EqualsValueClause(defaultValueExpression);
defaultClause = BuildSyntaxHelpers.AttachWhitespace(defaultClause, item.Whitespace2Set, WhitespaceLookup);
node = node.WithDefault(defaultClause);
}
var attributes = BuildSyntaxWorker.BuildAttributeSyntax(itemAsT.Attributes);
if (attributes.Any()) { node = node.WithAttributeLists(BuildSyntaxHelpers.WrapInAttributeList(attributes)); }
var modifiers = SyntaxFactory.TokenList();
if (itemAsT.IsOut) { modifiers = modifiers.Add(SyntaxFactory.Token(SyntaxKind.OutKeyword)); }
if (itemAsT.IsRef) { modifiers = modifiers.Add(SyntaxFactory.Token(SyntaxKind.RefKeyword)); }
if (itemAsT.IsParamArray) { modifiers = modifiers.Add(SyntaxFactory.Token(SyntaxKind.ParamsKeyword)); }
if (modifiers.Any()) { node = node.WithModifiers(modifiers); }
node = BuildSyntaxHelpers.AttachWhitespace(node, item.Whitespace2Set, WhitespaceLookup);
node = BuildSyntaxHelpers.AttachWhitespaceToFirst(node, item.Whitespace2Set[LanguageElement.ParameterFirstToken]);
node = BuildSyntaxHelpers.AttachWhitespaceToLast(node, item.Whitespace2Set[LanguageElement.ParameterLastToken]);
return node.PrepareForBuildSyntaxOutput(item, OutputContext);
}
private void MemberWhitespace(RDomParameter newItem, ParameterSyntax syntax)
{
CreateFromWorker.StoreWhitespaceForToken(newItem, syntax.GetFirstToken(), LanguagePart.Current, LanguageElement.ParameterFirstToken);
CreateFromWorker.StoreWhitespaceForToken(newItem, syntax.GetLastToken(), LanguagePart.Current, LanguageElement.ParameterLastToken);
CreateFromWorker.StoreWhitespace(newItem, syntax, LanguagePart.Current, WhitespaceLookup);
if (syntax.Default != null)
{
CreateFromWorker.StoreWhitespace(newItem, syntax.Default, LanguagePart.Current, WhitespaceLookup);
//CreateFromWorker.StoreWhitespaceForToken(newItem, syntax.Default.Value.GetLastToken(), LanguagePart.Current, LanguageElement.Identifier);
//CreateFromWorker.StoreWhitespaceForToken(newItem, syntax.Default.EqualsToken, LanguagePart.Current, LanguageElement.ParameterDefaultAssignOperator);
}
CreateFromWorker.StoreListMemberWhitespace(syntax,
WhitespaceLookup.Lookup(LanguageElement.ParameterSeparator),
LanguageElement.ParameterFirstToken, newItem);
//var prevNodeOrToken = syntax.Parent
// .ChildNodesAndTokens()
// .PreviousSiblings(syntax)
// .LastOrDefault();
//var sepKind = WhitespaceLookup.Lookup(LanguageElement.ParameterSeparator);
//if (prevNodeOrToken.CSharpKind() == sepKind)
//{
// var commaToken = prevNodeOrToken.AsToken();
// var whitespace2 = newItem.Whitespace2Set[LanguageElement.ParameterFirstToken];
// if (string.IsNullOrEmpty(whitespace2.LeadingWhitespace))
// { whitespace2.LeadingWhitespace = commaToken.TrailingTrivia.ToString(); }
//}
}
}
}