本文整理汇总了C#中Analyzer.ResolveMethod方法的典型用法代码示例。如果您正苦于以下问题:C# Analyzer.ResolveMethod方法的具体用法?C# Analyzer.ResolveMethod怎么用?C# Analyzer.ResolveMethod使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Analyzer
的用法示例。
在下文中一共展示了Analyzer.ResolveMethod方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: Analyze
/// <include file='Doc/Nodes.xml' path='doc/method[@name="Expression.Analyze"]/*'/>
internal override Evaluation Analyze(Analyzer/*!*/ analyzer, ExInfoFromParent info)
{
base.Analyze(analyzer, info);
// look for the method:
bool isCallMethod;
method = analyzer.ResolveMethod(
type, methodName, position, analyzer.CurrentType, analyzer.CurrentRoutine,
true, out runtimeVisibilityCheck, out isCallMethod);
if (!method.IsUnknown)
{
// we are sure about the method //
if (method.IsAbstract)
{
analyzer.ErrorSink.Add(Errors.AbstractMethodCalled, analyzer.SourceUnit, position,
method.DeclaringType.FullName, method.FullName);
}
}
// check __callStatic
if (isCallMethod)
{
// TODO: generic args
// create new CallSignature({function name},{args})
var arg1 = new StringLiteral(this.Position, methodName.Value);
var arg2 = this.callSignature.BuildPhpArray();
this.callSignature = new CallSignature(
new List<ActualParam>(2) {
new ActualParam(arg1.Position, arg1, false),
new ActualParam(arg2.Position, arg2, false)
},
new List<TypeRef>());
}
// analyze the method
RoutineSignature signature;
overloadIndex = method.ResolveOverload(analyzer, callSignature, position, out signature);
Debug.Assert(overloadIndex != DRoutine.InvalidOverloadIndex, "Each method should have at least one overload");
// analyze arguments
callSignature.Analyze(analyzer, signature, info, false);
return new Evaluation(this);
}
示例2: AnalyzeMethodCall
/// <summary>
/// Analyze the method call (isMemberOf != null).
/// </summary>
/// <param name="analyzer"></param>
/// <param name="info"></param>
/// <returns></returns>
private Evaluation AnalyzeMethodCall(Analyzer/*!*/ analyzer, ref ExInfoFromParent info)
{
Debug.Assert(isMemberOf != null);
// $this->
DirectVarUse memberDirectVarUse = isMemberOf as DirectVarUse;
if (memberDirectVarUse != null && memberDirectVarUse.IsMemberOf == null && // isMemberOf is single variable
memberDirectVarUse.VarName.IsThisVariableName && // isMemberOf if $this
analyzer.CurrentType != null) // called in class context of known type
{
// $this->{qualifiedName}(callSignature)
bool runtimeVisibilityCheck, isCallMethod;
routine = analyzer.ResolveMethod(
analyzer.CurrentType,//typeof(this)
qualifiedName.Name,//.Namespace?
Position,
analyzer.CurrentType, analyzer.CurrentRoutine, false,
out runtimeVisibilityCheck, out isCallMethod);
Debug.Assert(runtimeVisibilityCheck == false); // can only be set to true if CurrentType or CurrentRoutine are null
if (!routine.IsUnknown)
{
// check __call
if (isCallMethod)
{
// TODO: generic args
var arg1 = new StringLiteral(this.Position, qualifiedName.Name.Value);
var arg2 = this.callSignature.BuildPhpArray();
this.callSignature = new CallSignature(
new List<ActualParam>(2) {
new ActualParam(arg1.Position, arg1, false),
new ActualParam(arg2.Position, arg2, false)
},
new List<TypeRef>());
}
// resolve overload if applicable:
RoutineSignature signature;
overloadIndex = routine.ResolveOverload(analyzer, callSignature, position, out signature);
Debug.Assert(overloadIndex != DRoutine.InvalidOverloadIndex, "A function should have at least one overload");
// analyze parameters:
callSignature.Analyze(analyzer, signature, info, false);
// get properties:
analyzer.AddCurrentRoutineProperty(routine.GetCallerRequirements());
return new Evaluation(this);
}
}
// by default, fall back to dynamic method invocation
routine = null;
callSignature.Analyze(analyzer, UnknownSignature.Default, info, false);
return new Evaluation(this);
}
示例3: AnalyzeMethodCallOnKnownType
private bool AnalyzeMethodCallOnKnownType(Analyzer/*!*/ analyzer, ref ExInfoFromParent info, DType type)
{
if (type == null || type.IsUnknown)
return false;
bool runtimeVisibilityCheck, isCallMethod;
routine = analyzer.ResolveMethod(
type, qualifiedName.Name,
Position,
analyzer.CurrentType, analyzer.CurrentRoutine, false,
out runtimeVisibilityCheck, out isCallMethod);
if (routine.IsUnknown)
return false;
Debug.Assert(runtimeVisibilityCheck == false); // can only be set to true if CurrentType or CurrentRoutine are null
// check __call
if (isCallMethod)
{
// TODO: generic args
var arg1 = new StringLiteral(this.Position, qualifiedName.Name.Value);
var arg2 = this.callSignature.BuildPhpArray();
this.callSignature = new CallSignature(
new List<ActualParam>(2) {
new ActualParam(arg1.Position, arg1, false),
new ActualParam(arg2.Position, arg2, false)
},
new List<TypeRef>());
}
// resolve overload if applicable:
RoutineSignature signature;
overloadIndex = routine.ResolveOverload(analyzer, callSignature, position, out signature);
Debug.Assert(overloadIndex != DRoutine.InvalidOverloadIndex, "A function should have at least one overload");
// analyze parameters:
callSignature.Analyze(analyzer, signature, info, false);
// get properties:
analyzer.AddCurrentRoutineProperty(routine.GetCallerRequirements());
return true;
}