本文整理汇总了C#中AnalysisUnit.CopyForEval方法的典型用法代码示例。如果您正苦于以下问题:C# AnalysisUnit.CopyForEval方法的具体用法?C# AnalysisUnit.CopyForEval怎么用?C# AnalysisUnit.CopyForEval使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类AnalysisUnit
的用法示例。
在下文中一共展示了AnalysisUnit.CopyForEval方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: GetMember
public override INamespaceSet GetMember(Node node, AnalysisUnit unit, string name)
{
// __getattribute__ takes precedence over everything.
INamespaceSet getattrRes = NamespaceSet.Empty;
var getAttribute = _classInfo.GetMemberNoReferences(node, unit.CopyForEval(), "__getattribute__");
if (getAttribute.Count > 0) {
foreach (var getAttrFunc in getAttribute) {
var func = getAttrFunc as BuiltinMethodInfo;
if (func != null && func.Function.Overloads.Count == 1 && func.Function.DeclaringType == ProjectState.Types.Object) {
continue;
}
// TODO: We should really do a get descriptor / call here
getattrRes = getattrRes.Union(getAttrFunc.Call(node, unit, new[] { SelfSet, ProjectState._stringType.Instance.SelfSet }, ExpressionEvaluator.EmptyNames));
}
if (getattrRes.Count > 0) {
return getattrRes;
}
}
// then check class members
var classMem = _classInfo.GetMemberNoReferences(node, unit, name);
if (classMem.Count > 0) {
var desc = classMem.GetDescriptor(node, this, _classInfo, unit);
if (desc.Count > 0) {
// TODO: Check if it's a data descriptor...
return desc;
}
} else {
// if the class gets a value later we need to be re-analyzed
_classInfo.Scope.CreateEphemeralVariable(node, unit, name, false).AddDependency(unit);
}
// ok, it most be an instance member...
if (_instanceAttrs == null) {
_instanceAttrs = new Dictionary<string, VariableDef>();
}
VariableDef def;
if (!_instanceAttrs.TryGetValue(name, out def)) {
_instanceAttrs[name] = def = new EphemeralVariableDef();
}
def.AddReference(node, unit);
def.AddDependency(unit);
// check and see if it's defined in a base class instance as well...
var res = def.Types;
foreach (var b in _classInfo.Bases) {
foreach (var ns in b) {
if (ns.Push()) {
try {
ClassInfo baseClass = ns as ClassInfo;
if (baseClass != null &&
baseClass.Instance._instanceAttrs != null &&
baseClass.Instance._instanceAttrs.TryGetValue(name, out def)) {
res = res.Union(def.TypesNoCopy);
}
} finally {
ns.Pop();
}
}
}
}
if (res.Count == 0) {
// and if that doesn't exist fall back to __getattr__
var getAttr = _classInfo.GetMemberNoReferences(node, unit, "__getattr__");
if (getAttr.Count > 0) {
foreach (var getAttrFunc in getAttr) {
// TODO: We should really do a get descriptor / call here
//FIXME: new string[0]
getattrRes = getattrRes.Union(getAttrFunc.Call(node, unit, new[] { SelfSet, _classInfo.AnalysisUnit.ProjectState._stringType.Instance.SelfSet }, ExpressionEvaluator.EmptyNames));
}
}
return getattrRes;
}
return res;
}
示例2: GetMember
public override IAnalysisSet GetMember(Node node, AnalysisUnit unit, string name) {
// Must unconditionally call the base implementation of GetMember
var ignored = base.GetMember(node, unit, name);
// __getattribute__ takes precedence over everything.
IAnalysisSet getattrRes = AnalysisSet.Empty;
var getAttribute = _classInfo.GetMemberNoReferences(node, unit.CopyForEval(), "__getattribute__");
if (getAttribute.Count > 0) {
foreach (var getAttrFunc in getAttribute) {
var func = getAttrFunc as BuiltinMethodInfo;
if (func != null && func.Function.DeclaringType.TypeId == BuiltinTypeId.Object) {
continue;
}
// TODO: We should really do a get descriptor / call here
getattrRes = getattrRes.Union(getAttrFunc.Call(node, unit, new[] { SelfSet, ProjectState.ClassInfos[BuiltinTypeId.Str].Instance.SelfSet }, ExpressionEvaluator.EmptyNames));
}
}
// ok, it must be an instance member, or it will become one later
VariableDef def;
if (_instanceAttrs == null) {
_instanceAttrs = new Dictionary<string, VariableDef>();
}
if (!_instanceAttrs.TryGetValue(name, out def)) {
_instanceAttrs[name] = def = new EphemeralVariableDef();
}
def.AddReference(node, unit);
def.AddDependency(unit);
// now check class members
var res = GetTypeMember(node, unit, name);
res = res.Union(def.Types);
// check and see if it's defined in a base class instance as well...
foreach (var b in _classInfo.Bases) {
foreach (var ns in b) {
if (ns.Push()) {
try {
ClassInfo baseClass = ns as ClassInfo;
if (baseClass != null &&
baseClass.Instance._instanceAttrs != null &&
baseClass.Instance._instanceAttrs.TryGetValue(name, out def)) {
res = res.Union(def.TypesNoCopy);
}
} finally {
ns.Pop();
}
}
}
}
if (res.Count == 0) {
// and if that doesn't exist fall back to __getattr__
var getAttr = _classInfo.GetMemberNoReferences(node, unit, "__getattr__");
if (getAttr.Count > 0) {
foreach (var getAttrFunc in getAttr) {
getattrRes = getattrRes.Union(getAttr.Call(node, unit, new[] { SelfSet, _classInfo.AnalysisUnit.ProjectState.ClassInfos[BuiltinTypeId.Str].Instance.SelfSet }, ExpressionEvaluator.EmptyNames));
}
}
return getattrRes;
}
return res;
}
示例3: LoadComponent
IAnalysisSet LoadComponent(Node node, AnalysisUnit unit, IAnalysisSet[] args, NameExpression[] keywordArgNames) {
if (args.Length == 2 && unit.ProjectState.Interpreter is IDotNetPythonInterpreter) {
var self = args[0];
var xaml = args[1];
foreach (var arg in xaml) {
var strConst = arg.GetConstantValueAsString();
if (string.IsNullOrEmpty(strConst)) {
continue;
}
// process xaml file, add attributes to self
string xamlPath = Path.Combine(Path.GetDirectoryName(unit.DeclaringModule.ProjectEntry.FilePath), strConst);
XamlProjectEntry xamlProject;
if (unit.ProjectState._xamlByFilename.TryGetValue(xamlPath, out xamlProject)) {
// TODO: Get existing analysis if it hasn't changed.
var analysis = xamlProject.Analysis;
if (analysis == null) {
xamlProject.Analyze(CancellationToken.None);
analysis = xamlProject.Analysis;
}
xamlProject.AddDependency(unit.ProjectEntry);
var evalUnit = unit.CopyForEval();
// add named objects to instance
foreach (var keyValue in analysis.NamedObjects) {
var type = keyValue.Value;
if (type.Type.UnderlyingType != null) {
var ns = unit.ProjectState.GetAnalysisValueFromObjects(((IDotNetPythonInterpreter)unit.ProjectState.Interpreter).GetBuiltinType(type.Type.UnderlyingType));
var bci = ns as BuiltinClassInfo;
if (bci != null) {
ns = bci.Instance;
}
self.SetMember(node, evalUnit, keyValue.Key, ns.SelfSet);
}
// TODO: Better would be if SetMember took something other than a node, then we'd
// track references w/o this extra effort.
foreach (var inst in self) {
InstanceInfo instInfo = inst as InstanceInfo;
if (instInfo != null && instInfo.InstanceAttributes != null) {
VariableDef def;
if (instInfo.InstanceAttributes.TryGetValue(keyValue.Key, out def)) {
def.AddAssignment(
new EncodedLocation(SourceLocationResolver.Instance, new SourceLocation(1, type.LineNumber, type.LineOffset)),
xamlProject
);
}
}
}
}
// add references to event handlers
foreach (var keyValue in analysis.EventHandlers) {
// add reference to methods...
var member = keyValue.Value;
// TODO: Better would be if SetMember took something other than a node, then we'd
// track references w/o this extra effort.
foreach (var inst in self) {
InstanceInfo instInfo = inst as InstanceInfo;
if (instInfo != null) {
ClassInfo ci = instInfo.ClassInfo;
VariableDef def;
if (ci.Scope.TryGetVariable(keyValue.Key, out def)) {
def.AddReference(
new EncodedLocation(SourceLocationResolver.Instance, new SourceLocation(1, member.LineNumber, member.LineOffset)),
xamlProject
);
}
}
}
}
}
}
// load component returns self
return self;
}
return AnalysisSet.Empty;
}