This commit is contained in:
Ivan Bondarev 2020-12-27 13:47:42 +01:00
parent 460247ccc6
commit a98e6c570f
9 changed files with 54 additions and 4 deletions

View file

@ -0,0 +1,8 @@
type
T1 = partial class a: integer; end;
T1 = partial static class end;
begin
end.

View file

@ -0,0 +1,8 @@
type
T1 = partial class a: integer; end;
T1 = partial abstract class end;
begin
end.

View file

@ -0,0 +1,8 @@
type
T1 = partial class a: integer; end;
T1 = partial sealed class end;
begin
end.

View file

@ -0,0 +1,8 @@
type
T1 = partial static class static a: integer; end;
T1 = partial class end;
begin
end.

View file

@ -1307,13 +1307,28 @@ namespace PascalABCCompiler.TreeConverter
return cfn;
}
public common_type_node advanced_create_type(string name,location def_loc, bool type_is_interface, bool is_partial=false)
public common_type_node advanced_create_type(string name,location def_loc, bool type_is_interface, bool is_partial=false, SyntaxTree.class_attribute attr = SyntaxTree.class_attribute.None)
{
//check_name_free(name,def_loc);
common_type_node partial_class = null;
common_type_node rez = check_type_name_free_and_predop(name, def_loc, ref partial_class, is_partial);
if (rez != null)
{
if (is_partial)
{
if ((attr & SyntaxTree.class_attribute.Static) == SyntaxTree.class_attribute.Static && !rez.IsStatic)
AddError(def_loc, "PARTIAL_CLASS_ATTRIBUTES_MISMATCH");
if ((attr & SyntaxTree.class_attribute.Static) != SyntaxTree.class_attribute.Static && rez.IsStatic)
AddError(def_loc, "PARTIAL_CLASS_ATTRIBUTES_MISMATCH");
if ((attr & SyntaxTree.class_attribute.Abstract) == SyntaxTree.class_attribute.Abstract && !rez.IsAbstract)
AddError(def_loc, "PARTIAL_CLASS_ATTRIBUTES_MISMATCH");
if ((attr & SyntaxTree.class_attribute.Abstract) != SyntaxTree.class_attribute.Abstract && rez.IsAbstract && !rez.IsStatic)
AddError(def_loc, "PARTIAL_CLASS_ATTRIBUTES_MISMATCH");
if ((attr & SyntaxTree.class_attribute.Sealed) == SyntaxTree.class_attribute.Sealed && !rez.IsSealed)
AddError(def_loc, "PARTIAL_CLASS_ATTRIBUTES_MISMATCH");
if ((attr & SyntaxTree.class_attribute.Sealed) != SyntaxTree.class_attribute.Sealed && rez.IsSealed && !rez.IsStatic)
AddError(def_loc, "PARTIAL_CLASS_ATTRIBUTES_MISMATCH");
}
_ctn = rez;
if (def_loc != null)
_ctn.loc = def_loc;

View file

@ -11160,9 +11160,9 @@ namespace PascalABCCompiler.TreeConverter
AddError(get_location(cl_def), "TYPE_PREDEFINITION_NOT_ALLOWED");
common_type_node ctn = null;
if (td.type_name is template_type_name)
ctn = context.advanced_create_type(td.type_name.name + "`" + (td.type_name as template_type_name).template_args.Count, get_location(td.type_name), (td.type_def as class_definition).keyword == class_keyword.Interface, (cl_def.attribute & SyntaxTree.class_attribute.Partial) == SyntaxTree.class_attribute.Partial);
ctn = context.advanced_create_type(td.type_name.name + "`" + (td.type_name as template_type_name).template_args.Count, get_location(td.type_name), (td.type_def as class_definition).keyword == class_keyword.Interface, (cl_def.attribute & SyntaxTree.class_attribute.Partial) == SyntaxTree.class_attribute.Partial, cl_def.attribute);
else
ctn = context.advanced_create_type(td.type_name.name, get_location(td.type_name), (td.type_def as class_definition).keyword == class_keyword.Interface, (cl_def.attribute & SyntaxTree.class_attribute.Partial) == SyntaxTree.class_attribute.Partial);
ctn = context.advanced_create_type(td.type_name.name, get_location(td.type_name), (td.type_def as class_definition).keyword == class_keyword.Interface, (cl_def.attribute & SyntaxTree.class_attribute.Partial) == SyntaxTree.class_attribute.Partial, cl_def.attribute);
ctn.ForwardDeclarationOnly = true;
if ((td.type_def as class_definition).keyword == class_keyword.Interface)
ctn.IsInterface = true;
@ -11953,7 +11953,7 @@ namespace PascalABCCompiler.TreeConverter
//(ssyy) Флаг показывает, создаём ли мы интерфейс
bool interface_creating = (cl_def.keyword == PascalABCCompiler.SyntaxTree.class_keyword.Interface);
common_type_node ctn = context.advanced_create_type(_type_declaration.type_name.name, get_location(_type_declaration.type_name), interface_creating, (cl_def.attribute & SyntaxTree.class_attribute.Partial) == SyntaxTree.class_attribute.Partial);
common_type_node ctn = context.advanced_create_type(_type_declaration.type_name.name, get_location(_type_declaration.type_name), interface_creating, (cl_def.attribute & SyntaxTree.class_attribute.Partial) == SyntaxTree.class_attribute.Partial, cl_def.attribute);
assign_doc_info(ctn,_type_declaration);
if (_type_declaration.attributes != null)
{

View file

@ -164,6 +164,7 @@ STATIC_CLASS_CAN_NOT_BE_USED_AS_PARENT_SPECIFICATOR=Static classes can not be us
ENUM_MUST_HAVE_SEQUENCED_VALUES=Enum must have sequenced values
EXTERNAL_METHOD_CANNOT_BE_NESTED=Nested functions cannot be external
CANNOT_USE_RESERVED_ACCESSOR_NAMES=Can not declare class members with name reserved for property accessors
PARTIAL_CLASS_ATTRIBUTES_MISMATCH=Mismatch of partial class attributes
%PREFIX%=COMPILATIONERROR_
UNIT_MODULE_EXPECTED_LIBRARY_FOUND=Unit expected, library found
ASSEMBLY_{0}_READING_ERROR=Error by reading assembly '{0}'

View file

@ -159,6 +159,7 @@ STATIC_CLASS_CAN_NOT_BE_USED_AS_PARENT_SPECIFICATOR=Нельзя использ
ENUM_MUST_HAVE_SEQUENCED_VALUES=Нельзя использовать пронумерованные перечисления в качестве индексатора массива
EXTERNAL_METHOD_CANNOT_BE_NESTED=external-подпрограммы не могут вложенными
CANNOT_USE_RESERVED_ACCESSOR_NAMES=Нельзя опеределять член класса с таким именем, так как оно зарезервировано для акцессора свойства
PARTIAL_CLASS_ATTRIBUTES_MISMATCH=Несоответствие атрибутов partial-класса
%PREFIX%=COMPILATIONERROR_
UNIT_MODULE_EXPECTED_LIBRARY_FOUND=Ожидался модуль, а встречена библиотека
ASSEMBLY_{0}_READING_ERROR=Ошибка при чтении сборки '{0}'

View file

@ -156,6 +156,7 @@ STATIC_CLASS_CAN_NOT_BE_USED_AS_PARENT_SPECIFICATOR=Нельзя использ
ENUM_MUST_HAVE_SEQUENCED_VALUES=Нельзя использовать пронумерованные перечисления в качестве индексатора массива
EXTERNAL_METHOD_CANNOT_BE_NESTED=external-подпрограммы не могут вложенными
CANNOT_USE_RESERVED_ACCESSOR_NAMES=Нельзя опеределять член класса с таким именем, так как оно зарезервировано для акцессора свойства
PARTIAL_CLASS_ATTRIBUTES_MISMATCH=Несоответствие атрибутов partial-класса
%PREFIX%=COMPILATIONERROR_
UNIT_MODULE_EXPECTED_LIBRARY_FOUND=Очікувався модуль, а зустріли бібліотеку
ASSEMBLY_{0}_READING_ERROR=Помилка при читанні збірки '{0}'