fix #2112
This commit is contained in:
parent
460247ccc6
commit
a98e6c570f
8
TestSuite/errors/err0385.pas
Normal file
8
TestSuite/errors/err0385.pas
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
type
|
||||
T1 = partial class a: integer; end;
|
||||
|
||||
T1 = partial static class end;
|
||||
|
||||
begin
|
||||
|
||||
end.
|
||||
8
TestSuite/errors/err0386.pas
Normal file
8
TestSuite/errors/err0386.pas
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
type
|
||||
T1 = partial class a: integer; end;
|
||||
|
||||
T1 = partial abstract class end;
|
||||
|
||||
begin
|
||||
|
||||
end.
|
||||
8
TestSuite/errors/err0387.pas
Normal file
8
TestSuite/errors/err0387.pas
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
type
|
||||
T1 = partial class a: integer; end;
|
||||
|
||||
T1 = partial sealed class end;
|
||||
|
||||
begin
|
||||
|
||||
end.
|
||||
8
TestSuite/errors/err0388.pas
Normal file
8
TestSuite/errors/err0388.pas
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
type
|
||||
T1 = partial static class static a: integer; end;
|
||||
|
||||
T1 = partial class end;
|
||||
|
||||
begin
|
||||
|
||||
end.
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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}'
|
||||
|
|
|
|||
|
|
@ -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}'
|
||||
|
|
|
|||
|
|
@ -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}'
|
||||
|
|
|
|||
Loading…
Reference in a new issue