Разрешил перегруженные деконструкторы
This commit is contained in:
miks1965 2018-10-21 12:29:36 +03:00
parent 623138275a
commit 987ab845e8
14 changed files with 91 additions and 9 deletions

View file

@ -3,6 +3,6 @@
match a with
integer(var c): write(1);
boolean(var s): write(2);
List<integer>(var l) when l.Count > 0 :write(3)
List<integer>(var l) when l.Count > 0 : write(3)
end;
end.

View file

@ -20,5 +20,5 @@
begin
var p := new Person('Петр', 25);
if p is Person(var name, var age) then
Print(name, age);
Println(name, age);
end.

View file

@ -0,0 +1,12 @@
begin
var s: real->real := x -> x * x;
var add: (real,real)->real := (x, y)-> x + y;
// Делегат может хранить процедурную переменную любого типа!
var d: System.Delegate := s;
d := add;
match d with
Func<real, real>(var i): Print(i(2));
Func2<real, real, real>(var i): Print(i(2,3));
end;
end.

View file

@ -0,0 +1,27 @@
type
Person = class
name: string;
age: integer;
constructor(name: string; age: integer);
begin
self.name := name;
self.age := age;
end;
procedure Deconstruct(var name: string; var age: integer);
begin
name := self.name;
age := self.age;
end;
end;
begin
var p := new Person('Петр', 25);
if p is Person(var name, var age) then
Println(name, age);
match p with
Person(name,age): Println(name,age);
end;
end.

View file

@ -0,0 +1,20 @@
// Деконструктор как метод расширения
procedure Deconstruct(Self: integer; var a: integer; var b: integer); extensionmethod;
begin
a := Self div 10;
b := Self mod 10;
end;
begin
var i := 25;
if i is integer(var a, var b) then
Println(a,b);
i := 9;
match i with
integer(a,b) when i>=10: Println(a,b);
integer(a): Println(a); // деконструктор по умолчанию
end;
end.

View file

@ -55,7 +55,7 @@ namespace PascalABCCompiler.SyntaxTreeConverters
DoubleQuestionDesugarVisitor.New.ProcessNode(root);
// Patterns
SingleDeconstructChecker.New.ProcessNode(root);
// SingleDeconstructChecker.New.ProcessNode(root); // SSM 21.10.18 - пока разрешил множественные деконструкторы. Если будут проблемы - запретить
PatternsDesugaringVisitor.New.ProcessNode(root);
// Всё, связанное с yield

View file

@ -0,0 +1,17 @@
type
Person = auto class
name: string;
age: integer;
class procedure Deconstruct(var age: integer);
begin
age := 666;
end;
end;
begin
var p := new Person('Иванов',20);
if p is Person(var age: integer) then
Print(name);
end.

View file

@ -225,8 +225,10 @@ namespace PascalABCCompiler.TreeConverter
/// <param name="deconstructor"></param>
private void ExecuteCommonChecks(common_function_node deconstructor)
{
if ((deconstructor as common_method_node).IsStatic)
AddError(deconstructor.loc, "DECONSTRUCTOR_SHOULD_NOT_BE_STATIC");
if (deconstructor.return_value_type != null)
AddError(deconstructor.loc, "DECONSTRUCTOR_SOULD_BE_A_PROCEDURE");
AddError(deconstructor.loc, "DECONSTRUCTOR_SHOULD_BE_A_PROCEDURE");
foreach (var parameter in deconstructor.parameters.Where(x => !IsSelfParameter(x)))
if (parameter.parameter_type != SemanticTree.parameter_type.var && parameter is common_parameter p)

View file

@ -30,7 +30,7 @@ DUPLICATE_FUNCTION_DEFINITION=Duplicate function definition
THIS_EXPRESSION_CAN_NOT_BE_PASSED_BY_ADDRESS=A var or const argument must be an assignable variable
MEMBER_{0}_IS_NOT_DECLARED_IN_TYPE_{1}=The type '{1}' does not contain a definition for '{0}'
MEMBER_{0}_IS_NOT_DECLARED_IN_NAMESPACE_{1}=The namespace '{0}' does not contaion definition for '{1}'
CAN_NOT_CALL_STATIC_MEMBER_{0}_WITH_EXPRESSION=Static member '{0}' cannot be accessed with an instance reference
CAN_NOT_CALL_STATIC_MEMBER_{0}_WITH_EXPRESSION=Static member '{0}' cannot be accessed wia an instance reference
CAN_NOT_CALL_NON_STATIC_MEMBER_{0}_WITH_TYPE_{1}=An object reference is required for the nonstatic field, method, or property '{0}'
CAN_NOT_REFERENCE_TO_STATIC_FIELD_{0}_WITH_EXPRESSION=Static field '{0}' cannot be accessed with an instance reference
CAN_NOT_REFERENCE_TO_NONSTATIC_FIELD_{0}_WITH_TYPE=An object reference is required for the nonstatic field '{0}'

View file

@ -4,7 +4,8 @@ INSTANCE_DECONSTRUCTORS_CANNOT_BE_GENERIC=Instance deconstructors cannot be gene
NO_SUITABLE_DECONSTRUCT_FOUND=Couldn't find suitable deconstructor for given parameters
NO_DECONSTRUCT_FOUND=Couldn't find deconstructor for this type
DECONSTRUCTOR_METHOD_AMBIGUITY=Ambiguity between deconstructor methods
DECONSTRUCTOR_SOULD_BE_A_PROCEDURE=Deconstruct should be a procedure
DECONSTRUCTOR_SHOULD_BE_A_PROCEDURE=Deconstruct should be a procedure
DECONSTRUCTION_PARAMETERS_SHOULD_HAVE_VAR_MODIFIER=Deconstructor's parameters should have 'var' modifier
PATTERN_MATCHING_DOESNT_SUPPORT_POINTERS=Pattern matching doesn't support pointers in current compiler version
EXPRESSION_OF_TYPE_{0}_CANNOT_BE_MATCHED_AGAINST_PATTERN_WITH_TYPE_{1}=Expression of type {0} cannot be matched against pattern with type {1}
DECONSTRUCTOR_SHOULD_NOT_BE_STATIC=Deconstructor should not be static

View file

@ -14,6 +14,7 @@ YIELDS_INSIDE_WITH_ARE_ILLEGAL=with statement cannot contain yields
LAMBDA_EXPRESSIONS_CANNOT_CONTAIN_YIELD=Lambda-expressions cannot contain yields
PATTERN_MATHING_IS_NOT_SUPPORTED_IN_THIS_CONTEXT=Pattern matching is not supported in this context
ONLY_ONE_DECONSTRUCT_ALLOWED=Only one user deconstructor is allowed
Var_{0}_is_already_defined=Variable {0} is already defined

View file

@ -32,7 +32,7 @@ DUPLICATE_FUNCTION_DEFINITION=Повторное объявление подпр
THIS_EXPRESSION_CAN_NOT_BE_PASSED_BY_ADDRESS=Данный объект не может быть передан как var-параметр
MEMBER_{0}_IS_NOT_DECLARED_IN_TYPE_{1}={0} не объявлен в типе {1}
MEMBER_{0}_IS_NOT_DECLARED_IN_NAMESPACE_{1}={0} не объявлен в пространстве имен {1}
CAN_NOT_CALL_STATIC_MEMBER_{0}_WITH_EXPRESSION=Нельзя вызвать статический метод {0} с выражением
CAN_NOT_CALL_STATIC_MEMBER_{0}_WITH_EXPRESSION=Нельзя вызвать статический метод {0} через ссылку на экземпляр
CAN_NOT_CALL_NON_STATIC_MEMBER_{0}_WITH_TYPE_{1}=Mетод {0} не является статическим для типа {1}
CAN_NOT_REFERENCE_TO_STATIC_FIELD_{0}_WITH_EXPRESSION=Нельзя обратиться к статическому полю {0} через объект
CAN_NOT_REFERENCE_TO_NONSTATIC_FIELD_{0}_WITH_TYPE=Нельзя обратиться к экземплярному полю {0} через тип
@ -82,7 +82,7 @@ CASE_DIAPASON_VARIANT_INTERSECTION=Пересечение диапазонов
CAN_NOT_INCREMENT_ORDINAL_TYPE_VALUE=Невозможно увеличить значение перечислимого типа (возможно, происходит выход за верхнюю границу типа)
CAN_NOT_DECREMENT_ORDINAL_TYPE_VALUE=Невозможно уменьшить значение перечислимого типа (возможно, происходит выход за нижнюю границу типа)
EXPECTED_DELEGATE=Ожидалось имя процедуры или функции
EXPECTED_STATIC_METHOD=Ожидался классовый метод
EXPECTED_STATIC_METHOD=Ожидался статический метод
EXPECTED_NON_STATIC_METHOD=Ожидался экземплярный метод
CAN_NOT_EXPLICITLY_CONVERT_TYPE_{0}_TO_TYPE_{1}=Невозможно явно преобразовать тип {0} к типу {1}
ONLY_ONE_PARAMETER_OF_TYPE_CONVERSION_ALLOWED=У операции преобразования типов допустим только один параметр

View file

@ -4,7 +4,8 @@ INSTANCE_DECONSTRUCTORS_CANNOT_BE_GENERIC=Экземплярные деконс
NO_SUITABLE_DECONSTRUCT_FOUND=Не удалось найти подходящий деконструктор
NO_DECONSTRUCT_FOUND=В типе отсутствуют деконструкторы
DECONSTRUCTOR_METHOD_AMBIGUITY=Неоднозначный вызов деконструктора
DECONSTRUCTOR_SOULD_BE_A_PROCEDURE=Деконструктор должен быть процедурой
DECONSTRUCTOR_SHOULD_BE_A_PROCEDURE=Деконструктор должен быть процедурой
DECONSTRUCTION_PARAMETERS_SHOULD_HAVE_VAR_MODIFIER=Параметры деконструктора должны иметь модификатор 'var'
PATTERN_MATCHING_DOESNT_SUPPORT_POINTERS=Сопоставление с образцом не поддерживает указатели в данной версии компилятора
EXPRESSION_OF_TYPE_{0}_CANNOT_BE_MATCHED_AGAINST_PATTERN_WITH_TYPE_{1}= Выражение типа {0} не может быть сопоставлено с образцом типа {1}
DECONSTRUCTOR_SHOULD_NOT_BE_STATIC=Деконструктор не может быть статическим

View file

@ -14,6 +14,7 @@ YIELDS_INSIDE_WITH_ARE_ILLEGAL=Оператор yield запрещен внут
LAMBDA_EXPRESSIONS_CANNOT_CONTAIN_YIELD=Лямбда-выражения не могут содержать yield
PATTERN_MATHING_IS_NOT_SUPPORTED_IN_THIS_CONTEXT=Сопоставление с образцом не поддерживается в данном контексте
ONLY_ONE_DECONSTRUCT_ALLOWED=Можно определить только один пользовательский деконструктор
Var_{0}_is_already_defined=Переменная {0} уже определена