本文整理汇总了C#中Lookup.SetOuterLocalField方法的典型用法代码示例。如果您正苦于以下问题:C# Lookup.SetOuterLocalField方法的具体用法?C# Lookup.SetOuterLocalField怎么用?C# Lookup.SetOuterLocalField使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Lookup
的用法示例。
在下文中一共展示了Lookup.SetOuterLocalField方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: CreateLiteralShortcuts
//.........这里部分代码省略.........
ConstantWrapper modelConstant = literalReference.ConstantWrapperList[0];
// by default we will use the value of the first instance as the generated variable's value
object generatedValue = modelConstant.Value;
// BUT....
// if this is a numeric value, then we need to determine whether we should use a
// positive or negative version of this value to minimize the number of minus operators in the results
if (modelConstant.IsNumericLiteral)
{
// first we need to go through the existing references and count how many negative values there are
var numberOfNegatives = 0;
foreach (ConstantWrapper constantWrapper in literalReference.ConstantWrapperList)
{
// since the model us numeric, we shouldn't have any problems calling the
// ToNumber method on the others (which should all also be numeric)
if (constantWrapper.ToNumber() < 0)
{
++numberOfNegatives;
}
}
// now if more than half of the references are negative, we will want the generated value
// to also be negative! Otherwise we want to force it to Positive.
var absoluteValue = Math.Abs((double)generatedValue);
if (numberOfNegatives > literalReference.ConstantWrapperList.Count / 2)
{
// force it to negative
generatedValue = -absoluteValue;
}
else
{
// force it to positive
generatedValue = absoluteValue;
}
}
// add the generated variable to the function scope
functionScope.FunctionObject.AddGeneratedVar(
specialName,
new ConstantWrapper(
generatedValue,
modelConstant.PrimitiveType,
modelConstant.Context,
Parser),
true);
// walk the list of constant wrappers backwards (because we'll be removing them
// as we go along) and replace each one with a lookup for the generated variable.
// Don't forget to analyze the lookup.
for (int ndx = literalReference.ConstantWrapperList.Count - 1; ndx >= 0; --ndx)
{
ConstantWrapper constantWrapper = literalReference.ConstantWrapperList[ndx];
// create the lookup based on the thisliteral context
Lookup lookup = new Lookup(specialName, constantWrapper.Context, Parser);
// indicate this is generated by our code, not the user
lookup.IsGenerated = true;
// by default, we're just going to replace the constant with the lookup
AstNode replacement = lookup;
// if the constant wrapper is a numeric value that is the NEGATIVE of the
// combined numeric value (which would happen if the literal was subsequently
// combined with a unary minus operator), then we need to change this to a unary-minus
// operator on the lookup, not just the lookup.
if (constantWrapper.IsNumericLiteral)
{
// since the constant wrapper is numeric, we shouldn't have any problems
// calling ToNumber
if ((double)generatedValue == -constantWrapper.ToNumber())
{
// it has been negated! Change the replacement to a unary minus operator
// with the lookup as its operand
replacement = new NumericUnary(
constantWrapper.Context,
Parser,
lookup,
JSToken.Minus);
}
}
// replace the this literal with the appropriate node
constantWrapper.Parent.ReplaceChild(constantWrapper, replacement);
// set up the lookup's outer local field using the scope of the
// original constant wrapper
lookup.SetOuterLocalField(constantWrapper.EnclosingScope);
// and remove it from the list. This is so child scopes don't also try to
// add a shortcut -- the list will be empty.
literalReference.ConstantWrapperList.RemoveAt(ndx);
}
}
}
}
}
}
}
}