本文整理匯總了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;
}