提交 d40bb861 编写于 作者: C CyrusNajmabadi

Share more code.

上级 e13ee7ab
......@@ -64,36 +64,15 @@ protected override async Task<Document> GetChangedDocumentAsync(CancellationToke
{
var symbolName = _state.SelectedMembers[i].Name;
var parameter = _state.Parameters[i];
var parameterName = parameter.Name;
var shouldAddNullCheck = _addNullChecks && parameter.Type.CanAddNullCheck();
if (shouldAddNullCheck && useThrowExpressions)
{
// Generate 'this.a = a ?? throw...
assignStatements.Add(factory.CreateAssignWithNullCheckStatement(
compilation, parameter,
fieldAccess: factory.MemberAccessExpression(
factory.ThisExpression(),
factory.IdentifierName(symbolName))));
}
else
{
if (shouldAddNullCheck)
{
// generate: if (p == null) throw ...
nullCheckStatements.Add(
factory.CreateIfNullThrowStatement(compilation, parameter));
}
// generate: this.p = p;
assignStatements.Add(
factory.ExpressionStatement(
factory.AssignmentStatement(
factory.MemberAccessExpression(
factory.ThisExpression(),
factory.IdentifierName(symbolName)),
factory.IdentifierName(parameterName))));
}
var fieldAccess = factory.MemberAccessExpression(
factory.ThisExpression(),
factory.IdentifierName(symbolName));
factory.AddAssignmentStatements(
compilation, parameter, fieldAccess,
_addNullChecks, useThrowExpressions,
nullCheckStatements, assignStatements);
}
var syntaxTree = await _document.GetSyntaxTreeAsync(cancellationToken).ConfigureAwait(false);
......
......@@ -233,25 +233,10 @@ private static bool TryGetValue(IDictionary<string, ISymbol> dictionary, string
var fieldAccess = factory.MemberAccessExpression(factory.ThisExpression(), factory.IdentifierName(fieldName))
.WithAdditionalAnnotations(Simplifier.Annotation);
var shouldAddNullCheck = addNullChecks && parameterType.CanAddNullCheck();
if (shouldAddNullCheck && preferThrowExpression)
{
var statement = CreateAssignWithNullCheckStatement(factory, compilation, parameter, fieldAccess);
assignStatements.Add(statement);
}
else
{
if (shouldAddNullCheck)
{
nullCheckStatements.Add(
factory.CreateIfNullThrowStatement(compilation, parameter));
}
var assignExpression = factory.AssignmentStatement(
fieldAccess, factory.IdentifierName(parameterName));
var statement = factory.ExpressionStatement(assignExpression);
assignStatements.Add(statement);
}
factory.AddAssignmentStatements(
compilation, parameter, fieldAccess,
addNullChecks, preferThrowExpression,
nullCheckStatements, assignStatements);
}
}
}
......@@ -259,6 +244,41 @@ private static bool TryGetValue(IDictionary<string, ISymbol> dictionary, string
return nullCheckStatements.ToImmutableAndFree().Concat(assignStatements.ToImmutableAndFree());
}
public static void AddAssignmentStatements(
this SyntaxGenerator factory,
Compilation compilation,
IParameterSymbol parameter,
SyntaxNode fieldAccess,
bool addNullChecks,
bool preferThrowExpression,
ArrayBuilder<SyntaxNode> nullCheckStatements,
ArrayBuilder<SyntaxNode> assignStatements)
{
var shouldAddNullCheck = addNullChecks && parameter.Type.CanAddNullCheck();
if (shouldAddNullCheck && preferThrowExpression)
{
// Generate: this.x = x ?? throw ...
assignStatements.Add(CreateAssignWithNullCheckStatement(
factory, compilation, parameter, fieldAccess));
}
else
{
if (shouldAddNullCheck)
{
// generate: if (x == null) throw ...
nullCheckStatements.Add(
factory.CreateIfNullThrowStatement(compilation, parameter));
}
// generate: this.x = x;
assignStatements.Add(
factory.ExpressionStatement(
factory.AssignmentStatement(
fieldAccess,
factory.IdentifierName(parameter.Name))));
}
}
public static SyntaxNode CreateAssignWithNullCheckStatement(
this SyntaxGenerator factory, Compilation compilation, IParameterSymbol parameter, SyntaxNode fieldAccess)
{
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册