parent
623138275a
commit
987ab845e8
|
|
@ -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.
|
||||
|
|
@ -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.
|
||||
|
|
@ -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.
|
||||
|
|
@ -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.
|
||||
|
|
@ -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.
|
||||
|
|
@ -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
|
||||
|
|
|
|||
17
TestSuite/errors/err0292.pas
Normal file
17
TestSuite/errors/err0292.pas
Normal 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.
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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}'
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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=У операции преобразования типов допустим только один параметр
|
||||
|
|
|
|||
|
|
@ -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=Деконструктор не может быть статическим
|
||||
|
|
|
|||
|
|
@ -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} уже определена
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue