本文整理汇总了C#中ConstructorInitializerSyntax.WithArgumentList方法的典型用法代码示例。如果您正苦于以下问题:C# ConstructorInitializerSyntax.WithArgumentList方法的具体用法?C# ConstructorInitializerSyntax.WithArgumentList怎么用?C# ConstructorInitializerSyntax.WithArgumentList使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ConstructorInitializerSyntax
的用法示例。
在下文中一共展示了ConstructorInitializerSyntax.WithArgumentList方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: PropagateConstructorParams
private async Task<Document> PropagateConstructorParams(
Document document,
ConstructorInitializerSyntax constructorInitializerNode,
ImmutableArray<IParameterSymbol> baseConstrParams,
CancellationToken cancellationToken)
{
var semanticModel = await document.GetSemanticModelAsync();
var classDecl = constructorInitializerNode.FirstAncestorOrSelf<ClassDeclarationSyntax>();
var classSymbol = semanticModel.GetDeclaredSymbol(classDecl);
var constructorDecl = constructorInitializerNode.FirstAncestorOrSelf<ConstructorDeclarationSyntax>();
var constructorSymbol = classSymbol.Constructors
.Where(p => p.Parameters.Count() == constructorDecl.ParameterList.Parameters.Count)
.FirstOrDefault();
var invArgList = constructorInitializerNode.ArgumentList;
var declParamList = constructorDecl.ParameterList;
int idx = -1;
foreach(var baseP in baseConstrParams)
{
idx++;
if (constructorSymbol.Parameters.Any(p => p.Type.Name == baseP.Type.Name))
continue;
declParamList = declParamList.AddParameters(
SyntaxFactory.Parameter(
SyntaxFactory.Identifier(baseP.Name))
.WithType(
SyntaxFactory.IdentifierName(baseP.Type.Name)));
invArgList = SyntaxFactory.ArgumentList(invArgList.Arguments.Insert(idx, SyntaxFactory.Argument(SyntaxFactory.IdentifierName(baseP.Name))));
}
var root = await document.GetSyntaxRootAsync();
var newConstructor = constructorDecl.WithParameterList(declParamList)
.WithInitializer(constructorInitializerNode.WithArgumentList(invArgList));
root = root.ReplaceNode(constructorDecl, newConstructor);
return document.WithSyntaxRoot(root);
}
示例2: ExtendConstructorInitialization
/// <summary>
/// the constructor initializer will be extended
/// so that it will accept the mixin as parameter.
/// See rule 3 from above
/// </summary>
/// <param name="oldConstructorInitializer"></param>
/// <returns></returns>
public ConstructorInitializerSyntax ExtendConstructorInitialization(
ConstructorInitializerSyntax oldConstructorInitializer)
{
// don't do anything if initializer points to base
if (oldConstructorInitializer.IsKind(SyntaxKind.BaseConstructorInitializer))
return oldConstructorInitializer;
var parameterName = _mixin.Name.ConvertFieldNameToParameterName();
// arguments that are already used in the constructor initializer
var arguments = oldConstructorInitializer
.ArgumentList
.Arguments
.ToArray();
// the initializer can have default parameters that are not visible in the syntax tree,
// therefore we have to use some additional semantic information here
var initalizerSymbol = _semantic.GetSymbolInfo(oldConstructorInitializer).Symbol as IMethodSymbol;
if (initalizerSymbol != null)
{
var constructorArguments = new List<ConstructorArgument>();
// special case: the initializer does not have any parameters yet
// so we simply add one
if(initalizerSymbol.Parameters.Length == 0)
{
return oldConstructorInitializer
.AddArgumentListArguments(
Argument(IdentifierName(parameterName)));
}
// otherwise, try to map the arguments from the initializer
// with the parameters of the constructor and add the new argument
// at the correct position
for (var i=0; i < initalizerSymbol.Parameters.Length;i++)
{
var parameter = initalizerSymbol.Parameters[i];
// this constructor argument will hold our new mixin
if (parameter.Name == parameterName)
{
constructorArguments.Add(
new ConstructorArgument(
parameter.Name,
expression: IdentifierName(parameterName),
isMixinParameter: true));
}
else
{
// we either have an argument with an explicit name
// or we have an argument at the same position
// or we can ommit this parameter
ArgumentSyntax argument = arguments
.Where(x => x.NameColon != null)
.FirstOrDefault(x => x.NameColon.Name.GetText().ToString() == parameter.Name);
// argument identified by name or by position
if (argument == null)
if (arguments.Length > i)
argument = arguments[i];
if (argument != null)
constructorArguments.Add(new ConstructorArgument(parameter.Name,expression: argument.Expression));
else // no argument found => argument was omitted
constructorArguments.Add(new ConstructorArgument(parameter.Name,canBeOmitted:true));
}
}
// now we have to check again if we must use explicit naming
// this is the case if a previous parameter is omitted but
// the current one is not
ConstructorArgument previous = null;
foreach (var constructorArgument in constructorArguments)
{
constructorArgument.NeedsExplicitNaming =
previous != null &&
previous.CanBeOmitted &&
!constructorArgument.CanBeOmitted;
previous = constructorArgument;
}
// create the new initializer by recreating the complete argument list
var newConstructorInitializer = oldConstructorInitializer
.WithArgumentList(ArgumentList()
.AddArguments(constructorArguments
.Where(x => x.Expression != null)
.Select(x => x.NeedsExplicitNaming ?
Argument(NameColon(x.Name), default(SyntaxToken),x.Expression) :
Argument(x.Expression))
.ToArray()));
return newConstructorInitializer;
}
return oldConstructorInitializer;
}