本文整理汇总了C#中LNode.WithArgChanged方法的典型用法代码示例。如果您正苦于以下问题:C# LNode.WithArgChanged方法的具体用法?C# LNode.WithArgChanged怎么用?C# LNode.WithArgChanged使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类LNode
的用法示例。
在下文中一共展示了LNode.WithArgChanged方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: ForwardProperty
public static LNode ForwardProperty(LNode prop, IMessageSink sink)
{
LNode name, fwd, body;
if (prop.ArgCount != 3)
return null;
LNode target = GetForwardingTarget(fwd = prop.Args[2], name = prop.Args[1]);
if (target != null)
{
body = F.Braces(new RVList<LNode>(
F.Call(S.get, F.Braces(F.Call(S.Return, target))),
F.Call(S.set, F.Braces(F.Call(S.Assign, target, F.Id(S.value))))));
return prop.WithArgChanged(2, body);
}
else if ((body = fwd).Calls(S.Braces))
{
var body2 = body.WithArgs(stmt => {
if (stmt.Calls(S.get, 1) && (target = GetForwardingTarget(stmt.Args[0], name)) != null)
return stmt.WithArgs(new RVList<LNode>(F.Braces(F.Call(S.Return, target))));
if (stmt.Calls(S.set, 1) && (target = GetForwardingTarget(stmt.Args[0], name)) != null)
return stmt.WithArgs(new RVList<LNode>(F.Braces(F.Call(S.Assign, target, F.Id(S.value)))));
return stmt;
});
if (body2 != body)
return prop.WithArgChanged(2, body2);
}
return null;
}
示例2: ForwardProperty
public static LNode ForwardProperty(LNode prop, IMacroContext context)
{
LNode name, fwd, body;
if (prop.ArgCount != 4)
return null;
LNode target = GetForwardingTarget(name = prop.Args[1], fwd = prop.Args[3]);
if (target != null)
{
body = F.Braces(F.Call(S.get, F.Braces(F.Call(S.Return, target))).SetBaseStyle(NodeStyle.Special));
return prop.WithArgChanged(3, body);
}
else if ((body = fwd).Calls(S.Braces))
{
var body2 = body.WithArgs(stmt => {
if (stmt.Calls(S.get, 1) && (target = GetForwardingTarget(name, stmt.Args[0])) != null)
return stmt.WithArgs(new VList<LNode>(F.Braces(F.Call(S.Return, target))));
if (stmt.Calls(S.set, 1) && (target = GetForwardingTarget(name, stmt.Args[0])) != null)
return stmt.WithArgs(new VList<LNode>(F.Braces(F.Call(S.Assign, target, F.Id(S.value)))));
return stmt;
});
if (body2 != body)
return prop.WithArgChanged(3, body2);
}
return null;
}
示例3: ForwardMethod
public static LNode ForwardMethod(LNode fn, IMessageSink sink)
{
LNode args, fwd, body;
if (fn.ArgCount != 4 || !(fwd = fn.Args[3]).Calls(S.Forward, 1) || !(args = fn.Args[2]).Calls(S.List))
return null;
RVList<LNode> formalArgs = args.Args;
RVList<LNode> argList = RVList<LNode>.Empty;
foreach (var formalArg in formalArgs)
{
if (!formalArg.Calls(S.Var, 2))
return Reject(sink, formalArg, "'==>' expected a variable declaration here");
LNode argName = formalArg.Args[1];
if (argName.Calls(S.Assign, 2))
argName = argName.Args[0];
LNode @ref = formalArg.AttrNamed(S.Ref) ?? formalArg.AttrNamed(S.Out);
if (@ref != null)
argName = argName.PlusAttr(@ref);
argList.Add(argName);
}
LNode target = GetForwardingTarget(fwd, fn.Args[1]);
LNode call = F.Call(target, argList);
bool isVoidFn = fn.Args[0].IsIdNamed(S.Void);
body = F.Braces(isVoidFn ? call : F.Call(S.Return, call));
return fn.WithArgChanged(3, body);
}
示例4: TupleType
public static LNode TupleType(LNode node, IMacroContext context)
{
var stem = node.Args[0, F.Missing];
if (stem.IsId && (stem.Name == S.AltList || stem.Name == S.Tuple)) {
var tupleMakers = MaybeInitTupleMakers(context.ScopedProperties);
var bareType = tupleMakers.TryGet(node.Args.Count - 1, new Pair<LNode, LNode>()).A;
if (bareType == null)
bareType = ((Pair<LNode, LNode>)context.ScopedProperties[DefaultTupleMaker]).A;
if (bareType != null)
return node.WithArgChanged(0, bareType);
}
return null;
}
示例5: ForwardMethod
public static LNode ForwardMethod(LNode fn, IMacroContext context)
{
LNode args, fwd, body;
if (fn.ArgCount != 4 || !(fwd = fn.Args[3]).Calls(S.Forward, 1) || !(args = fn.Args[2]).Calls(S.AltList))
return null;
VList<LNode> argList = GetArgNamesFromFormalArgList(args, formalArg =>
context.Write(Severity.Error, formalArg, "'==>': Expected a variable declaration here"));
LNode target = GetForwardingTarget(fn.Args[1], fwd);
LNode call = F.Call(target, argList);
bool isVoidFn = fn.Args[0].IsIdNamed(S.Void);
body = F.Braces(isVoidFn ? call : F.Call(S.Return, call));
return fn.WithArgChanged(3, body);
}
示例6: ConvertToNormalDot
static LNode ConvertToNormalDot(LNode prefix, LNode suffix)
{
// Essentially, we must increase the precedence of ?. to convert it to a normal dot.
// This often requires multiple stages, as in:
// (a.b) ?. (c().d<x>) ==> (a.b ?. c().d)<x> ==> (a.b ?. c)().d<x> ==> a.b.c().d<x>
// (a.b) ?. #of(c().d, x) ==> #of((a.b) ?. c().d, x) ==> #of((a.b ?. c)().d, x) ==> #of(a.b.c().d, x)
// The cases to be handled are...
// x ?. y <=> x ?. y ==> x.y (1)
// x ?. "foo" <=> x ?. "foo" ==> x."Foo" (1)
// x ?. ++y <=> x ?. @`++`(y) ==> x.(++y) (1)
// x ?. y<a, b> <=> x ?. #of(y, a, b) ==> #of(x.y, a, b) (2)
// x ?. y[a, b] <=> x ?. @`[]`(y, a, b)==> @`[]`(x.y, a, b) (2)
// x ?. y.z <=> x ?. @.(y, z) ==> #.(x?.y, z) (2)
// x ?. y::z <=> x ?. @`::`(y, z) ==> #::(x?.y, z) (2)
// x ?. y:::z <=> x ?. @`:::`(y, z) ==> #:::(x?.y, z) (2)
// x ?. y->z <=> x ?. @`->`(y, z) ==> #->(x?.y, z) (2)
// x ?. y(->z) <=> x ?. #cast(y, z) ==> #cast(x?.y, z) (2)
// x ?. y++ <=> x ?. @`suf++`(y) ==> @`suf++`(x?.y) (2)
// x ?. y ?. z <=> x ?. @`?.`(y, z) ==> @`?.`(x.y, z)
// x ?. y(a, b) <=> x ?. y(a, b) ==> x.y(a, b) (3: default case)
// The following groups are handled essentially the same way:
// 1. Ids, Literals and prefix operators (+ - ++ -- ! ~ new)
// 2. #of, @`[]`, @`.`, @`::`, @`:::`, @`=:`, @`->`, #cast, @`suf++`, @`suf--`
// 3. All other calls
var c = suffix.ArgCount;
var name = suffix.Name;
if (suffix.IsCall) {
if (c == 1 && PrefixOps.Contains(name)) // (1)
return F.Dot(prefix, suffix);
else if (c >= 1 && OtherOps.Contains(name)) { // (2)
var inner = ConvertToNormalDot(prefix, suffix.Args[0]);
return suffix.WithArgChanged(0, inner);
} else { // (3)
var inner = ConvertToNormalDot(prefix, suffix.Target);
return suffix.WithTarget(inner);
}
} else // (1)
return F.Dot(prefix, suffix);
}
示例7: DoneAttaching
protected override LNode DoneAttaching(LNode node, LNode parent, int indexInParent)
{
// Constructors are funky in EC# because EC# generalizes constructors so
// you can write, for example, `this() { F(); base(); G(); }`.
// Plain C# constructors like `this() : base() { G(); }`, `base(x)`
// are actually stored like `this() { base(); G(); }`, where the colon
// is the beginning of the Range of the constructor body and the opening
// brace is the range of the Target of the method body. This makes it
// difficult to get the trivia attached the way we want. For example, this
// constructor:
//
// Foo(int x)
// : base(x)
// {
// Bar();
// }
//
// Gets trivia attached like this:
//
// #cons(@``, Foo, #(int x), [#trivia_newline] ([#trivia_newline] @`'{}`)(
// [#trivia_appendStatement] base(x), Bar()));
//
// This code changes the trivia to something more reasonable:
//
// #cons(@``, Foo, #(int x), [#trivia_newline] { base(x), Bar() });
//
LNode baseCall;
if (node.CallsMin(S.Braces, 1) && parent != null && parent.Calls(S.Constructor)
&& (baseCall = node.Args[0]).Range.StartIndex < node.Target.Range.StartIndex)
{
if (RemoveLeadingNewline(ref node) != null)
node = node.WithArgChanged(0, baseCall.WithoutAttrNamed(S.TriviaAppendStatement));
LNode target = node.Target, newline_trivia;
if ((newline_trivia = RemoveLeadingNewline(ref target)) != null) {
node = node.WithTarget(target).PlusAttrBefore(newline_trivia);
}
}
return node;
}
示例8: of
public static LNode of(LNode node, IMessageSink sink)
{
LNode kind;
if (node.ArgCount == 2 && (kind = node.Args[0]).IsId) {
if (kind.IsIdNamed(_array)) return node.WithArgChanged(0, kind.WithName(S.Array));
if (kind.IsIdNamed(_opt)) return node.WithArgChanged(0, kind.WithName(S.QuestionMark));
if (kind.IsIdNamed(_ptr)) return node.WithArgChanged(0, kind.WithName(S._Pointer));
} else if (node.ArgCount == 3 && (kind = node.Args[0]).IsIdNamed(_array) && node.Args[1].IsLiteral) {
return node.WithArgs(kind.WithName(S.GetArrayKeyword((int)node.Args[1].Value)), node.Args[2]);
}
return null;
}
示例9: priorityTestHi
public static LNode priorityTestHi(LNode node, IMessageSink sink)
{
if (node.ArgCount >= 1 && !node[0].IsIdNamed("hi"))
return node.WithArgChanged(0, LNode.Id("hi"));
return null;
}
示例10: DetectSetOrCreateMember
private static bool DetectSetOrCreateMember(LNode arg, out Symbol relevantAttribute, out Symbol fieldName, out Symbol paramName, out LNode newArg, out LNode propOrFieldDecl)
{
relevantAttribute = null;
fieldName = null;
paramName = null;
newArg = null;
propOrFieldDecl = null;
LNode _, type, name, defaultValue, propArgs;
if (EcsValidators.IsPropertyDefinition(arg, out type, out name, out propArgs, out _, out defaultValue) && propArgs.ArgCount == 0) {
// #property(Type, Name<T>, {...})
relevantAttribute = S.Property;
fieldName = EcsNodePrinter.KeyNameComponentOf(name);
paramName = ChooseArgName(fieldName);
if (defaultValue != null) { // initializer is Args[4]
newArg = LNode.Call(S.Var, LNode.List(type, F.Assign(paramName, defaultValue)), arg);
propOrFieldDecl = arg.WithArgs(arg.Args.First(4));
} else {
newArg = LNode.Call(S.Var, LNode.List(type, F.Id(paramName)), arg);
propOrFieldDecl = arg;
}
DSOCM_DistributeAttributes(arg.Attrs, ref newArg, ref propOrFieldDecl);
return true;
} else if (IsVar(arg, out type, out paramName, out defaultValue)) {
int a_i = 0;
foreach (var attr in arg.Attrs) {
if (attr.IsId) {
var a = attr.Name;
if (a == _set || FieldCreationAttributes.Contains(a))
{
relevantAttribute = a;
fieldName = paramName;
paramName = ChooseArgName(fieldName);
if (a == _set) {
newArg = F.Var(type, paramName, defaultValue).WithAttrs(arg.Attrs.Without(attr));
} else {
// in case of something like "[A] public params T arg = value",
// assume that "= value" represents a default value, not a field
// initializer. Most attributes stay on the argument.
newArg = arg.WithArgChanged(1,
defaultValue != null ? F.Assign(paramName, defaultValue) : F.Id(paramName));
propOrFieldDecl = LNode.Call(S.Var, LNode.List(type, F.Id(fieldName)), arg);
DSOCM_DistributeAttributes(arg.Attrs, ref newArg, ref propOrFieldDecl);
}
break;
}
}
a_i++;
}
return newArg != null;
}
return false;
}
示例11: MaybeCreateTemporaryForLValue
// Creates a temporary for an LValue (left side of `=`, or `ref` parameter)
// e.g. f(x).Foo becomes f(x_N).Foo, and `var x_N = x` is added to `stmtSequence`,
// where N is a unique integer for the temporary variable.
LNode MaybeCreateTemporaryForLValue(LNode expr, ref VList<LNode> stmtSequence)
{
{
LNode _, lhs;
if (expr.Calls(CodeSymbols.Dot, 2) && (lhs = expr.Args[0]) != null || expr.CallsMin(CodeSymbols.Of, 1) && (lhs = expr.Args[0]) != null)
return expr.WithArgChanged(0, MaybeCreateTemporaryForLValue(lhs, ref stmtSequence));
else if ((_ = expr) != null && !_.IsCall)
return expr;
else {
var args = expr.Args.ToWList();
int i = 0;
if (expr.CallsMin(S.IndexBracks, 1) || expr.CallsMin(S.NullIndexBracks, 1)) {
// Consider foo[i]. We cannot always store `foo` in a temporary, as
// this may change the code's behavior in case `foo` is a struct.
i = 1;
}
for (; i < args.Count; i++) {
if (!args[i].IsLiteral && !args[i].Attrs.Contains(_trivia_isTmpVar)) {
LNode tmpVarName;
stmtSequence.Add(TempVarDecl(Context, args[i], out tmpVarName));
args[i] = tmpVarName.PlusAttr(_trivia_isTmpVar);
}
}
return expr.WithArgs(args.ToVList());
}
}
}
示例12: BubbleUpBlocks
// This method's main goal is to move #runSequence from child nodes to outer nodes:
// Foo(a, #runSequence(b(), c())) => #runSequence(var a_10 = a; b(); Foo(a_10, c()));
// It also converts variable declarations, e.g.
// Foo()::foo => #runSequence(var foo = Foo(), foo)
LNode BubbleUpBlocks(LNode expr, bool stmtContext = false)
{
if (!expr.IsCall)
return expr;
LNode result = null;
if (!stmtContext) {
{
LNode tmp_14, value, varName, varType;
VList<LNode> attrs;
if (expr.Calls(CodeSymbols.Braces)) {
Context.Sink.Warning(expr, "A braced block is not supported directly within an expression. Did you mean to use `#runSequence {...}`?");
result = expr;
} else if ((attrs = expr.Attrs).IsEmpty | true && attrs.NodeNamed(S.Out) != null && expr.Calls(CodeSymbols.Var, 2) && (varType = expr.Args[0]) != null && (varName = expr.Args[1]) != null && varName.IsId) {
if (varType.IsIdNamed(S.Missing))
Context.Sink.Error(expr, "#useSequenceExpressions: the data type of this variable declaration cannot be inferred and must be stated explicitly.");
result = LNode.Call(LNode.List(_trivia_pure), (Symbol) "#runSequence", LNode.List(expr.WithoutAttrNamed(S.Out), varName.PlusAttrs(LNode.List(LNode.Id(CodeSymbols.Out)))));
} else if ((attrs = expr.Attrs).IsEmpty | true && expr.Calls(CodeSymbols.Var, 2) && (varType = expr.Args[0]) != null && (tmp_14 = expr.Args[1]) != null && tmp_14.Calls(CodeSymbols.Assign, 2) && (varName = tmp_14.Args[0]) != null && (value = tmp_14.Args[1]) != null)
if (stmtContext)
result = expr; // no-op
else
result = ConvertVarDeclToRunSequence(attrs, varType, varName, value);
}
}
if (result == null) {
{
LNode args, code, value, varName;
VList<LNode> attrs;
if ((attrs = expr.Attrs).IsEmpty | true && expr.Calls(CodeSymbols.ColonColon, 2) && (value = expr.Args[0]) != null && IsQuickBindLhs(value) && (varName = expr.Args[1]) != null && varName.IsId)
result = ConvertVarDeclToRunSequence(attrs, F.Missing, varName, value);
else if ((attrs = expr.Attrs).IsEmpty | true && expr.Calls(CodeSymbols.Lambda, 2) && (args = expr.Args[0]) != null && (code = expr.Args[1]) != null)
result = expr.WithArgChanged(1, EliminateSequenceExpressionsInLambdaExpr(code, F.Missing));
else if (expr.Calls(__numrunSequence))
result = expr;
else
result = BubbleUp_GeneralCall(expr);
}
}
// #runSequences can be nested by the user or produced by BubbleUp_GeneralCall,
// so process the code inside #runSequence too
if (result.Calls(__numrunSequence))
return result.WithArgs(EliminateSequenceExpressions(result.Args, false));
else
return result;
}
示例13: ESEInForLoop
LNode ESEInForLoop(LNode stmt, VList<LNode> attrs, VList<LNode> init, LNode cond, VList<LNode> inc, LNode block)
{
// TODO: handle multi-int and multi-inc
var preInit = VList<LNode>.Empty;
var init_apos = init.SmartSelect(init1 => {
init1 = EliminateSequenceExpressionsInExecStmt(init1);
if (init1.CallsMin(__numrunSequence, 1)) {
preInit.AddRange(init1.Args.WithoutLast(1));
return init1.Args.Last;
}
return init1;
});
var cond_apos = BubbleUpBlocks(cond);
var inc_apos = inc.SmartSelectMany(inc1 => {
inc1 = BubbleUpBlocks(inc1);
return inc1.AsList(__numrunSequence);
});
block = EliminateSequenceExpressionsInChildStmt(block);
if (init_apos != init || cond_apos != cond || inc_apos != inc) {
init = init_apos;
if (inc_apos != inc) {
var blockStmts = block.AsList(S.Braces).AddRange(inc_apos);
block = blockStmts.AsLNode(S.Braces);
inc = LNode.List();
}
if (cond_apos.CallsMin(__numrunSequence, 1)) {
var preCond = cond_apos.Args.WithoutLast(1);
cond = cond_apos.Args.Last;
stmt = LNode.Call(CodeSymbols.For, LNode.List(LNode.Call(CodeSymbols.AltList, LNode.List(init)), LNode.Missing, LNode.Call(CodeSymbols.AltList, LNode.List(inc)), LNode.Call(CodeSymbols.Braces, LNode.List().AddRange(preCond).Add(LNode.Call(CodeSymbols.If, LNode.List(cond, block, LNode.Call(CodeSymbols.Break))))).SetStyle(NodeStyle.Statement)));
} else {
stmt = LNode.Call(LNode.List(attrs), CodeSymbols.For, LNode.List(LNode.Call(CodeSymbols.AltList, LNode.List(init)), cond, LNode.Call(CodeSymbols.AltList, LNode.List(inc)), block));
}
if (preInit.Count != 0) {
stmt = LNode.Call(CodeSymbols.Braces, LNode.List().AddRange(preInit).Add(stmt)).SetStyle(NodeStyle.Statement);
}
return stmt;
} else {
return stmt.WithArgChanged(3, block);
}
}
示例14: EliminateSequenceExpressionsInExecStmt
LNode EliminateSequenceExpressionsInExecStmt(LNode stmt)
{
{
LNode block, collection, cond, init, initValue, loopVar, name, tmp_11, tmp_12, type;
VList<LNode> attrs, incs, inits;
if (stmt.Calls(CodeSymbols.Braces))
return stmt.WithArgs(EliminateSequenceExpressions(stmt.Args, false));
else if (stmt.CallsMin(CodeSymbols.If, 1) || stmt.Calls(CodeSymbols.UsingStmt, 2) || stmt.Calls(CodeSymbols.Lock, 2) || stmt.Calls(CodeSymbols.Switch, 2) && stmt.Args[1].Calls(CodeSymbols.Braces))
return ProcessBlockCallStmt(stmt, 1);
else if ((attrs = stmt.Attrs).IsEmpty | true && stmt.Calls(CodeSymbols.Fixed, 2) && (init = stmt.Args[0]) != null && (block = stmt.Args[1]) != null) {
init = EliminateSequenceExpressionsInExecStmt(init);
block = EliminateSequenceExpressionsInChildStmt(block);
if (init.CallsMin(__numrunSequence, 1)) {
return LNode.Call(LNode.List(attrs), CodeSymbols.Braces, LNode.List().AddRange(init.Args.WithoutLast(1)).Add(LNode.Call(CodeSymbols.Fixed, LNode.List(init.Args.Last, block)))).SetStyle(NodeStyle.Statement);
} else
return stmt.WithArgChanged(1, block);
} else if ((attrs = stmt.Attrs).IsEmpty | true && stmt.Calls(CodeSymbols.While, 2) && (cond = stmt.Args[0]) != null && (block = stmt.Args[1]) != null) {
cond = BubbleUpBlocks(cond);
block = EliminateSequenceExpressionsInChildStmt(block);
if (cond.CallsMin(__numrunSequence, 1)) {
return LNode.Call(LNode.List(attrs), CodeSymbols.For, LNode.List(LNode.Call(CodeSymbols.AltList), LNode.Missing, LNode.Call(CodeSymbols.AltList), LNode.Call(CodeSymbols.Braces, LNode.List().AddRange(cond.Args.WithoutLast(1)).Add(LNode.Call(CodeSymbols.If, LNode.List(cond.Args.Last, block, LNode.Call(CodeSymbols.Break))))).SetStyle(NodeStyle.Statement)));
} else
return stmt.WithArgChanged(1, block);
} else if ((attrs = stmt.Attrs).IsEmpty | true && stmt.Calls(CodeSymbols.DoWhile, 2) && (block = stmt.Args[0]) != null && (cond = stmt.Args[1]) != null) {
block = EliminateSequenceExpressionsInChildStmt(block);
cond = BubbleUpBlocks(cond);
if (cond.CallsMin(__numrunSequence, 1)) {
var continue_N = F.Id(NextTempName(Context, "continue_"));
var bodyStmts = block.AsList(S.Braces);
bodyStmts.AddRange(cond.Args.WithoutLast(1));
bodyStmts.Add(LNode.Call(CodeSymbols.Assign, LNode.List(continue_N, cond.Args.Last)).SetStyle(NodeStyle.Operator));
return LNode.Call(LNode.List(attrs), CodeSymbols.For, LNode.List(LNode.Call(CodeSymbols.AltList, LNode.List(LNode.Call(CodeSymbols.Var, LNode.List(LNode.Id(CodeSymbols.Bool), LNode.Call(CodeSymbols.Assign, LNode.List(continue_N, LNode.Literal(true))))))), continue_N, LNode.Call(CodeSymbols.AltList), LNode.Call(CodeSymbols.Braces, LNode.List(bodyStmts)).SetStyle(NodeStyle.Statement)));
} else
return stmt.WithArgChanged(0, block);
} else if ((attrs = stmt.Attrs).IsEmpty | true && stmt.Calls(CodeSymbols.For, 4) && stmt.Args[0].Calls(CodeSymbols.AltList) && (cond = stmt.Args[1]) != null && stmt.Args[2].Calls(CodeSymbols.AltList) && (block = stmt.Args[3]) != null) {
inits = stmt.Args[0].Args;
incs = stmt.Args[2].Args;
return ESEInForLoop(stmt, attrs, inits, cond, incs, block);
} else if ((attrs = stmt.Attrs).IsEmpty | true && stmt.Calls(CodeSymbols.ForEach, 3) && (tmp_11 = stmt.Args[0]) != null && tmp_11.Calls(CodeSymbols.Var, 2) && (type = tmp_11.Args[0]) != null && (loopVar = tmp_11.Args[1]) != null && (collection = stmt.Args[1]) != null && (block = stmt.Args[2]) != null) {
block = EliminateSequenceExpressionsInChildStmt(block);
collection = BubbleUpBlocks(collection);
if (collection.CallsMin(__numrunSequence, 1)) {
return LNode.Call(LNode.List(attrs), CodeSymbols.Braces, LNode.List().AddRange(collection.Args.WithoutLast(1)).Add(LNode.Call(CodeSymbols.ForEach, LNode.List(LNode.Call(CodeSymbols.Var, LNode.List(type, loopVar)), collection.Args.Last, block)))).SetStyle(NodeStyle.Statement);
} else {
return stmt.WithArgChanged(stmt.Args.Count - 1, block);
}
} else if ((attrs = stmt.Attrs).IsEmpty | true && stmt.Calls(CodeSymbols.Var, 2) && (type = stmt.Args[0]) != null && (tmp_12 = stmt.Args[1]) != null && tmp_12.Calls(CodeSymbols.Assign, 2) && (name = tmp_12.Args[0]) != null && (initValue = tmp_12.Args[1]) != null) {
var initValue_apos = BubbleUpBlocks(initValue);
if (initValue_apos != initValue) {
{
LNode last;
VList<LNode> stmts;
if (initValue_apos.CallsMin((Symbol) "#runSequence", 1) && (last = initValue_apos.Args[initValue_apos.Args.Count - 1]) != null) {
stmts = initValue_apos.Args.WithoutLast(1);
return LNode.Call((Symbol) "#runSequence", LNode.List().AddRange(stmts).Add(LNode.Call(LNode.List(attrs), CodeSymbols.Var, LNode.List(type, LNode.Call(CodeSymbols.Assign, LNode.List(name, last))))));
} else
return LNode.Call(LNode.List(attrs), CodeSymbols.Var, LNode.List(type, LNode.Call(CodeSymbols.Assign, LNode.List(name, initValue_apos))));
}
}
} else if (stmt.CallsMin(S.Try, 2)) {
return ESEInTryStmt(stmt);
} else if (stmt.HasSpecialName && stmt.ArgCount >= 1 && stmt.Args.Last.Calls(S.Braces)) {
return ProcessBlockCallStmt(stmt, stmt.ArgCount - 1);
} else {
// Ordinary expression statement
return BubbleUpBlocks(stmt, stmtContext: true);
}
}
return stmt;
}
示例15: EliminateSequenceExpressions
public LNode EliminateSequenceExpressions(LNode stmt, bool isDeclContext)
{
LNode retType, name, argList, bases, body, initValue;
if (EcsValidators.SpaceDefinitionKind(stmt, out name, out bases, out body) != null) {
// Space definition: class, struct, etc.
return body == null ? stmt : stmt.WithArgChanged(2, EliminateSequenceExpressions(body, true));
} else if (EcsValidators.MethodDefinitionKind(stmt, out retType, out name, out argList, out body, true) != null) {
// Method definition
return body == null ? stmt : stmt.WithArgChanged(3, EliminateSequenceExpressionsInLambdaExpr(body, retType));
} else if (EcsValidators.IsPropertyDefinition(stmt, out retType, out name, out argList, out body, out initValue)) {
// Property definition
stmt = stmt.WithArgChanged(3,
body.WithArgs(part => {
if (part.ArgCount == 1 && part[0].Calls(S.Braces))
part = part.WithArgChanged(0, EliminateSequenceExpressions(part[0], false));
return part;
}));
if (initValue != null) {
var initMethod = EliminateRunSeqFromInitializer(retType, name, ref initValue);
if (initMethod != null) {
stmt = stmt.WithArgChanged(4, initValue);
return LNode.Call((Symbol) "#runSequence", LNode.List(stmt, initMethod));
}
}
return stmt;
} else if (stmt.Calls(CodeSymbols.Braces)) {
return stmt.WithArgs(EliminateSequenceExpressions(stmt.Args, isDeclContext));
} else if (!isDeclContext) {
return EliminateSequenceExpressionsInExecStmt(stmt);
} else if (stmt.CallsMin(S.Var, 2)) {
// Eliminate blocks from field member
var results = new List<LNode> {
stmt
};
var vars = stmt.Args;
var varType = vars[0];
for (int i = 1; i < vars.Count; i++) {
var @var = vars[i];
if (@var.Calls(CodeSymbols.Assign, 2) && (name = @var.Args[0]) != null && (initValue = @var.Args[1]) != null) {
var initMethod = EliminateRunSeqFromInitializer(varType, name, ref initValue);
if (initMethod != null) {
results.Add(initMethod);
vars[i] = vars[i].WithArgChanged(1, initValue);
}
}
}
if (results.Count > 1) {
results[0] = stmt.WithArgs(vars);
return LNode.List(results).AsLNode(__numrunSequence);
}
return stmt;
} else
return stmt;
}