新增UndefinedIdentifiersAsStrings
This commit is contained in:
@@ -218,11 +218,15 @@ namespace Flee.ExpressionElements.MemberElements
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 允许void返回类型的函数,将其返回值视为0
|
||||||
|
// Void return type functions are allowed and treated as returning 0
|
||||||
|
/*
|
||||||
// Any function reference in an expression must return a value
|
// Any function reference in an expression must return a value
|
||||||
if (object.ReferenceEquals(this.Method.ReturnType, typeof(void)))
|
if (object.ReferenceEquals(this.Method.ReturnType, typeof(void)))
|
||||||
{
|
{
|
||||||
base.ThrowCompileException("FunctionHasNoReturnValue", CompileExceptionReason.FunctionHasNoReturnValue, MyName);
|
base.ThrowCompileException("FunctionHasNoReturnValue", CompileExceptionReason.FunctionHasNoReturnValue, MyName);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Emit(FleeILGenerator ilg, IServiceProvider services)
|
public override void Emit(FleeILGenerator ilg, IServiceProvider services)
|
||||||
@@ -342,7 +346,21 @@ namespace Flee.ExpressionElements.MemberElements
|
|||||||
this.EmitParamArrayArguments(parameters, elements, ilg, services);
|
this.EmitParamArrayArguments(parameters, elements, ilg, services);
|
||||||
}
|
}
|
||||||
|
|
||||||
MemberElement.EmitMethodCall(this.ResultType, nextRequiresAddress, this.Method, ilg);
|
// 检查方法是否返回void
|
||||||
|
bool isVoidMethod = object.ReferenceEquals(this.Method.ReturnType, typeof(void));
|
||||||
|
|
||||||
|
if (isVoidMethod)
|
||||||
|
{
|
||||||
|
// 对于void方法,使用原始的ReturnType调用方法,然后将0压入栈
|
||||||
|
MemberElement.EmitMethodCall(this.Method.ReturnType, nextRequiresAddress, this.Method, ilg);
|
||||||
|
// 将0压入栈作为返回值
|
||||||
|
ilg.Emit(OpCodes.Ldc_I4_0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 对于非void方法,正常调用
|
||||||
|
MemberElement.EmitMethodCall(this.ResultType, nextRequiresAddress, this.Method, ilg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void EmitExtensionFunctionInternal(ParameterInfo[] parameters, ExpressionElement[] elements, FleeILGenerator ilg, IServiceProvider services)
|
private void EmitExtensionFunctionInternal(ParameterInfo[] parameters, ExpressionElement[] elements, FleeILGenerator ilg, IServiceProvider services)
|
||||||
@@ -397,6 +415,12 @@ namespace Flee.ExpressionElements.MemberElements
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// 如果方法返回void,将其视为返回int类型(值为0)
|
||||||
|
// If method returns void, treat it as returning int (value 0)
|
||||||
|
if (object.ReferenceEquals(this.Method.ReturnType, typeof(void)))
|
||||||
|
{
|
||||||
|
return typeof(int);
|
||||||
|
}
|
||||||
return this.Method.ReturnType;
|
return this.Method.ReturnType;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ namespace Flee.ExpressionElements.MemberElements
|
|||||||
private PropertyDescriptor _myPropertyDescriptor;
|
private PropertyDescriptor _myPropertyDescriptor;
|
||||||
private Type _myVariableType;
|
private Type _myVariableType;
|
||||||
private Type _myCalcEngineReferenceType;
|
private Type _myCalcEngineReferenceType;
|
||||||
|
private bool _isStringLiteral;
|
||||||
public IdentifierElement(string name)
|
public IdentifierElement(string name)
|
||||||
{
|
{
|
||||||
this.MyName = name;
|
this.MyName = name;
|
||||||
@@ -60,6 +61,13 @@ namespace Flee.ExpressionElements.MemberElements
|
|||||||
|
|
||||||
if (MyPrevious == null)
|
if (MyPrevious == null)
|
||||||
{
|
{
|
||||||
|
// 检查是否启用了未定义标识符作为字符串的选项
|
||||||
|
if (MyOptions.UndefinedIdentifiersAsStrings)
|
||||||
|
{
|
||||||
|
// 将此标识符标记为字符串字面量
|
||||||
|
_isStringLiteral = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
base.ThrowCompileException("NoIdentifierWithName", CompileExceptionReason.UndefinedName, MyName);
|
base.ThrowCompileException("NoIdentifierWithName", CompileExceptionReason.UndefinedName, MyName);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -140,6 +148,13 @@ namespace Flee.ExpressionElements.MemberElements
|
|||||||
{
|
{
|
||||||
base.Emit(ilg, services);
|
base.Emit(ilg, services);
|
||||||
|
|
||||||
|
// 如果是字符串字面量,直接发出字符串加载指令
|
||||||
|
if (_isStringLiteral)
|
||||||
|
{
|
||||||
|
ilg.Emit(OpCodes.Ldstr, MyName);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this.EmitFirst(ilg);
|
this.EmitFirst(ilg);
|
||||||
|
|
||||||
if ((_myCalcEngineReferenceType != null))
|
if ((_myCalcEngineReferenceType != null))
|
||||||
@@ -354,6 +369,12 @@ namespace Flee.ExpressionElements.MemberElements
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
|
// 如果是字符串字面量,返回 string 类型
|
||||||
|
if (_isStringLiteral)
|
||||||
|
{
|
||||||
|
return typeof(string);
|
||||||
|
}
|
||||||
|
|
||||||
if ((_myCalcEngineReferenceType != null))
|
if ((_myCalcEngineReferenceType != null))
|
||||||
{
|
{
|
||||||
return _myCalcEngineReferenceType;
|
return _myCalcEngineReferenceType;
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ namespace Flee.PublicTypes
|
|||||||
_myProperties.SetToDefault<Type>("ResultType");
|
_myProperties.SetToDefault<Type>("ResultType");
|
||||||
_myProperties.SetToDefault<bool>("IsGeneric");
|
_myProperties.SetToDefault<bool>("IsGeneric");
|
||||||
_myProperties.SetToDefault<bool>("IntegersAsDoubles");
|
_myProperties.SetToDefault<bool>("IntegersAsDoubles");
|
||||||
|
_myProperties.SetToDefault<bool>("UndefinedIdentifiersAsStrings");
|
||||||
_myProperties.SetValue("ParseCulture", CultureInfo.CurrentCulture);
|
_myProperties.SetValue("ParseCulture", CultureInfo.CurrentCulture);
|
||||||
this.SetParseCulture(this.ParseCulture);
|
this.SetParseCulture(this.ParseCulture);
|
||||||
_myProperties.SetValue("RealLiteralDataType", RealLiteralDataType.Double);
|
_myProperties.SetValue("RealLiteralDataType", RealLiteralDataType.Double);
|
||||||
@@ -149,6 +150,15 @@ namespace Flee.PublicTypes
|
|||||||
get { return _myProperties.GetValue<RealLiteralDataType>("RealLiteralDataType"); }
|
get { return _myProperties.GetValue<RealLiteralDataType>("RealLiteralDataType"); }
|
||||||
set { _myProperties.SetValue("RealLiteralDataType", value); }
|
set { _myProperties.SetValue("RealLiteralDataType", value); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 当标识符未定义时,是否自动将其转换为字符串字面量
|
||||||
|
/// </summary>
|
||||||
|
public bool UndefinedIdentifiersAsStrings
|
||||||
|
{
|
||||||
|
get { return _myProperties.GetValue<bool>("UndefinedIdentifiersAsStrings"); }
|
||||||
|
set { _myProperties.SetValue("UndefinedIdentifiersAsStrings", value); }
|
||||||
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region "Properties - Non Public"
|
#region "Properties - Non Public"
|
||||||
|
|||||||
Reference in New Issue
Block a user