static readonly properties as default parameters
This commit is contained in:
parent
d57df31aec
commit
3ba13285b6
|
|
@ -3470,7 +3470,12 @@ namespace PascalABCCompiler.PCU
|
||||||
{
|
{
|
||||||
return new compiled_static_method_call_as_constant(CreateCompiledStaticMethodCall(), null);
|
return new compiled_static_method_call_as_constant(CreateCompiledStaticMethodCall(), null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private common_static_method_call_as_constant CreateCommonStaticMethodCallNodeAsConstant()
|
||||||
|
{
|
||||||
|
return new common_static_method_call_as_constant(CreateStaticMethodCall(), null);
|
||||||
|
}
|
||||||
|
|
||||||
private common_namespace_function_call_as_constant CreateCommonNamespaceFunctionCallNodeAsConstant()
|
private common_namespace_function_call_as_constant CreateCommonNamespaceFunctionCallNodeAsConstant()
|
||||||
{
|
{
|
||||||
common_namespace_function_call_as_constant cnfcc = new common_namespace_function_call_as_constant((common_namespace_function_call)CreateCommonNamespaceFunctionCall(), null);
|
common_namespace_function_call_as_constant cnfcc = new common_namespace_function_call_as_constant((common_namespace_function_call)CreateCommonNamespaceFunctionCall(), null);
|
||||||
|
|
@ -3510,6 +3515,8 @@ namespace PascalABCCompiler.PCU
|
||||||
return CreateAsNode();
|
return CreateAsNode();
|
||||||
case semantic_node_type.compiled_static_method_call_node_as_constant:
|
case semantic_node_type.compiled_static_method_call_node_as_constant:
|
||||||
return CreateCompiledStaticMethodCallNodeAsConstant();
|
return CreateCompiledStaticMethodCallNodeAsConstant();
|
||||||
|
case semantic_node_type.common_static_method_call_node_as_constant:
|
||||||
|
return CreateCommonStaticMethodCallNodeAsConstant();
|
||||||
case semantic_node_type.common_namespace_function_call_node_as_constant:
|
case semantic_node_type.common_namespace_function_call_node_as_constant:
|
||||||
return CreateCommonNamespaceFunctionCallNodeAsConstant();
|
return CreateCommonNamespaceFunctionCallNodeAsConstant();
|
||||||
case semantic_node_type.compiled_constructor_call_as_constant:
|
case semantic_node_type.compiled_constructor_call_as_constant:
|
||||||
|
|
@ -3734,7 +3741,7 @@ namespace PascalABCCompiler.PCU
|
||||||
return nspr;
|
return nspr;
|
||||||
}
|
}
|
||||||
|
|
||||||
private expression_node CreateStaticMethodCall()
|
private common_static_method_call CreateStaticMethodCall()
|
||||||
{
|
{
|
||||||
common_method_node meth = GetMethodByOffset();
|
common_method_node meth = GetMethodByOffset();
|
||||||
common_static_method_call cmc = new common_static_method_call(meth,null);
|
common_static_method_call cmc = new common_static_method_call(meth,null);
|
||||||
|
|
|
||||||
|
|
@ -3717,7 +3717,12 @@ namespace PascalABCCompiler.PCU
|
||||||
{
|
{
|
||||||
VisitCompiledStaticMethodCall(node.method_call);
|
VisitCompiledStaticMethodCall(node.method_call);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void VisitCommonStaticMethodCallNodeAsConstant(common_static_method_call_as_constant node)
|
||||||
|
{
|
||||||
|
VisitCommonStaticMethodCall(node.method_call);
|
||||||
|
}
|
||||||
|
|
||||||
private void VisitCompiledConstructorCallAsConstant(compiled_constructor_call_as_constant node)
|
private void VisitCompiledConstructorCallAsConstant(compiled_constructor_call_as_constant node)
|
||||||
{
|
{
|
||||||
VisitCompiledConstructorCall(node.method_call);
|
VisitCompiledConstructorCall(node.method_call);
|
||||||
|
|
@ -3752,6 +3757,8 @@ namespace PascalABCCompiler.PCU
|
||||||
VisitAsNode((as_node)en); break;
|
VisitAsNode((as_node)en); break;
|
||||||
case semantic_node_type.compiled_static_method_call_node_as_constant:
|
case semantic_node_type.compiled_static_method_call_node_as_constant:
|
||||||
VisitCompiledStaticMethodCallNodeAsConstant((compiled_static_method_call_as_constant)en); break;
|
VisitCompiledStaticMethodCallNodeAsConstant((compiled_static_method_call_as_constant)en); break;
|
||||||
|
case semantic_node_type.common_static_method_call_node_as_constant:
|
||||||
|
VisitCommonStaticMethodCallNodeAsConstant((common_static_method_call_as_constant)en); break;
|
||||||
case semantic_node_type.common_namespace_function_call_node_as_constant:
|
case semantic_node_type.common_namespace_function_call_node_as_constant:
|
||||||
VisitCommonNamespaceFunctionCallNodeAsConstant((common_namespace_function_call_as_constant)en); break;
|
VisitCommonNamespaceFunctionCallNodeAsConstant((common_namespace_function_call_as_constant)en); break;
|
||||||
case semantic_node_type.compiled_constructor_call_as_constant:
|
case semantic_node_type.compiled_constructor_call_as_constant:
|
||||||
|
|
|
||||||
|
|
@ -11394,6 +11394,12 @@ namespace PascalABCCompiler.NETGenerator
|
||||||
{
|
{
|
||||||
value.MethodCall.visit(this);
|
value.MethodCall.visit(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void visit(ICommonStaticMethodCallNodeAsConstant value)
|
||||||
|
{
|
||||||
|
value.MethodCall.visit(this);
|
||||||
|
}
|
||||||
|
|
||||||
public override void visit(ICompiledConstructorCallAsConstant value)
|
public override void visit(ICompiledConstructorCallAsConstant value)
|
||||||
{
|
{
|
||||||
value.MethodCall.visit(this);
|
value.MethodCall.visit(this);
|
||||||
|
|
|
||||||
|
|
@ -655,6 +655,11 @@ namespace PascalABCCompiler.SemanticTree
|
||||||
public virtual void visit(ITypeOfOperatorAsConstant value)
|
public virtual void visit(ITypeOfOperatorAsConstant value)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void visit(ICommonStaticMethodCallNodeAsConstant value)
|
||||||
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -303,6 +303,8 @@ namespace PascalABCCompiler.SemanticTree
|
||||||
void visit(IDoubleQuestionColonExpressionNode value);
|
void visit(IDoubleQuestionColonExpressionNode value);
|
||||||
|
|
||||||
void visit(ITypeOfOperatorAsConstant value);
|
void visit(ITypeOfOperatorAsConstant value);
|
||||||
|
|
||||||
|
void visit(ICommonStaticMethodCallNodeAsConstant value);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1831,7 +1831,15 @@ namespace PascalABCCompiler.SemanticTree
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface ICompiledStaticMethodCallNodeAsConstant : IConstantNode
|
public interface ICommonStaticMethodCallNodeAsConstant : IConstantNode
|
||||||
|
{
|
||||||
|
ICommonStaticMethodCallNode MethodCall
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface ICompiledStaticMethodCallNodeAsConstant : IConstantNode
|
||||||
{
|
{
|
||||||
ICompiledStaticMethodCallNode MethodCall
|
ICompiledStaticMethodCallNode MethodCall
|
||||||
{
|
{
|
||||||
|
|
|
||||||
20
TestSuite/defaultparams4.pas
Normal file
20
TestSuite/defaultparams4.pas
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
type TClass = class
|
||||||
|
static p: integer = 2;
|
||||||
|
static function getp: integer := p;
|
||||||
|
static property x: integer read p;
|
||||||
|
static property y: integer read getp;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function f(i: integer := TClass.x): integer;
|
||||||
|
begin
|
||||||
|
Result := i;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function f2(i: integer := TClass.y): integer;
|
||||||
|
begin
|
||||||
|
Result := i;
|
||||||
|
end;
|
||||||
|
begin
|
||||||
|
assert(f = 2);
|
||||||
|
assert(f2 = 2);
|
||||||
|
end.
|
||||||
22
TestSuite/units/u_defaultparams4.pas
Normal file
22
TestSuite/units/u_defaultparams4.pas
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
unit u_defaultparams4;
|
||||||
|
|
||||||
|
type TClass = class
|
||||||
|
static p: integer = 2;
|
||||||
|
static function getp: integer := p;
|
||||||
|
static property x: integer read p;
|
||||||
|
static property y: integer read getp;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function f(i: integer := TClass.x): integer;
|
||||||
|
begin
|
||||||
|
Result := i;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function f2(i: integer := TClass.y): integer;
|
||||||
|
begin
|
||||||
|
Result := i;
|
||||||
|
end;
|
||||||
|
begin
|
||||||
|
assert(f = 2);
|
||||||
|
assert(f2 = 2);
|
||||||
|
end.
|
||||||
5
TestSuite/usesunits/use_defaultparams4.pas
Normal file
5
TestSuite/usesunits/use_defaultparams4.pas
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
uses u_defaultparams4;
|
||||||
|
begin
|
||||||
|
assert(f = 2);
|
||||||
|
assert(f2 = 2);
|
||||||
|
end.
|
||||||
|
|
@ -15266,6 +15266,18 @@ namespace PascalABCCompiler.TreeConverter
|
||||||
constant = new default_operator_node_as_constant(expr as default_operator_node, null);
|
constant = new default_operator_node_as_constant(expr as default_operator_node, null);
|
||||||
else if (expr is typeof_operator && !is_const_section)
|
else if (expr is typeof_operator && !is_const_section)
|
||||||
constant = new typeof_operator_as_constant(expr as typeof_operator, null);
|
constant = new typeof_operator_as_constant(expr as typeof_operator, null);
|
||||||
|
else if (expr is common_static_method_call)
|
||||||
|
{
|
||||||
|
var csmc = expr as common_static_method_call;
|
||||||
|
var properties = new List<common_property_node>();
|
||||||
|
foreach (common_property_node cpn in csmc.function_node.cont_type.properties)
|
||||||
|
if (cpn.get_function == csmc.function_node && cpn.set_function == null)
|
||||||
|
{
|
||||||
|
constant = new common_static_method_call_as_constant(csmc, null);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
constant = expr as constant_node;
|
constant = expr as constant_node;
|
||||||
|
|
@ -15405,6 +15417,9 @@ namespace PascalABCCompiler.TreeConverter
|
||||||
case semantic_node_type.compiled_static_method_call:
|
case semantic_node_type.compiled_static_method_call:
|
||||||
constant = new compiled_static_method_call_as_constant(exprc as compiled_static_method_call, loc);
|
constant = new compiled_static_method_call_as_constant(exprc as compiled_static_method_call, loc);
|
||||||
break;
|
break;
|
||||||
|
case semantic_node_type.common_static_method_call:
|
||||||
|
constant = new common_static_method_call_as_constant(exprc as common_static_method_call, loc);
|
||||||
|
break;
|
||||||
case semantic_node_type.basic_function_call:
|
case semantic_node_type.basic_function_call:
|
||||||
constant = new basic_function_call_as_constant(exprc as basic_function_call, loc);
|
constant = new basic_function_call_as_constant(exprc as basic_function_call, loc);
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@ namespace PascalABCCompiler.TreeRealization
|
||||||
pinvoke_node, basic_function_call_node_as_constant, compiled_static_field_reference_as_constant,
|
pinvoke_node, basic_function_call_node_as_constant, compiled_static_field_reference_as_constant,
|
||||||
common_namespace_event, indefinite_definition_node, indefinite_type, indefinite_function_call, indefinite_reference,
|
common_namespace_event, indefinite_definition_node, indefinite_type, indefinite_function_call, indefinite_reference,
|
||||||
wrapped_statement, wrapped_expression, default_operator_node_as_constant, double_question_colon_expression,
|
wrapped_statement, wrapped_expression, default_operator_node_as_constant, double_question_colon_expression,
|
||||||
typeof_operator_as_constant
|
typeof_operator_as_constant, common_static_method_call_node_as_constant
|
||||||
};
|
};
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
||||||
|
|
@ -1019,6 +1019,62 @@ namespace PascalABCCompiler.TreeRealization
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class common_static_method_call_as_constant : constant_node, SemanticTree.ICommonStaticMethodCallNodeAsConstant
|
||||||
|
{
|
||||||
|
private common_static_method_call _method_call;
|
||||||
|
|
||||||
|
public common_static_method_call method_call
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _method_call;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_method_call = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public common_static_method_call_as_constant(common_static_method_call method_call, location loc) :
|
||||||
|
base(method_call.type, loc)
|
||||||
|
{
|
||||||
|
_method_call = method_call;
|
||||||
|
}
|
||||||
|
|
||||||
|
SemanticTree.ICommonStaticMethodCallNode SemanticTree.ICommonStaticMethodCallNodeAsConstant.MethodCall
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _method_call;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override constant_node get_constant_copy(location loc)
|
||||||
|
{
|
||||||
|
return new common_static_method_call_as_constant(this.method_call, loc);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Метод для обхода дерева посетителем.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="visitor">Класс - посетитель дерева.</param>
|
||||||
|
public override void visit(SemanticTree.ISemanticVisitor visitor)
|
||||||
|
{
|
||||||
|
visitor.visit(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Тип узла.
|
||||||
|
/// </summary>
|
||||||
|
public override semantic_node_type semantic_node_type
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return semantic_node_type.common_static_method_call_node_as_constant;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public class common_namespace_function_call_as_constant : constant_node, SemanticTree.ICommonNamespaceFunctionCallNodeAsConstant
|
public class common_namespace_function_call_as_constant : constant_node, SemanticTree.ICommonNamespaceFunctionCallNodeAsConstant
|
||||||
{
|
{
|
||||||
private common_namespace_function_call _method_call;
|
private common_namespace_function_call _method_call;
|
||||||
|
|
|
||||||
|
|
@ -1564,5 +1564,10 @@ namespace VisualPascalABCPlugins
|
||||||
{
|
{
|
||||||
throw new System.NotImplementedException();
|
throw new System.NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void visit(ICommonStaticMethodCallNodeAsConstant value)
|
||||||
|
{
|
||||||
|
throw new System.NotImplementedException();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue