cleanup and more tests

This commit is contained in:
samuraiGH 2024-07-01 00:16:43 +03:00
parent 464dc794a8
commit 7d66f26d4f
4 changed files with 98 additions and 12 deletions

View file

@ -0,0 +1,20 @@
//!Невозможно выполнить оператор foreach или yield sequence по выражению типа c1
uses System.Collections, System.Collections.Generic;
type
c1 = class (IEnumerable<integer>, IEnumerable<string>)
public
function IEnumerable<string>.GetEnumerator: IEnumerator<string>;
begin end;
function IEnumerable<integer>.GetEnumerator: IEnumerator<integer>;
begin end;
function IEnumerable.GetEnumerator: IEnumerator;
begin end;
end;
begin
foreach var item in new c1 do ;
end.

View file

@ -0,0 +1,67 @@
uses System.Collections, System.Collections.Generic;
type
c1 = class (IEnumerable<integer>)
public
function IEnumerable<integer>.GetEnumerator: IEnumerator<integer>;
begin
Assert(false);
end;
function GetEnumerator: IEnumerator;
begin
result:= Seq&<object>().GetEnumerator;
end;
end;
c2<T1, T2> = class (IEnumerable<T2>)
public
function GetEnumerator: IEnumerator<T2>;
begin
result:= Seq&<T2>().GetEnumerator;
end;
function IEnumerable.GetEnumerator: IEnumerator;
begin
Assert(false);
end;
end;
c3 = class (IEnumerable<integer>, IEnumerable<string>)
public
function GetEnumerator: IEnumerator<string>;
begin
result:= Seq&<string>().GetEnumerator;
end;
function IEnumerable<integer>.GetEnumerator: IEnumerator<integer>;
begin
Assert(false);
end;
function IEnumerable.GetEnumerator: IEnumerator;
begin
Assert(false);
end;
end;
c4 = class (c2<integer, int64>)
end;
begin
var v1:= new c1;
foreach var item in v1 do ;
var v2:= new c2<byte, string>;
foreach var item in v2 do ;
var v3:= new c3;
foreach var item in v3 do ;
var v4:= new c4;
foreach var item in v4 do ;
end.

View file

@ -18577,7 +18577,7 @@ namespace PascalABCCompiler.TreeConverter
}
}
private bool IsIEnumerableInterface(ITypeNode t)
private bool IsIEnumerableInterface(type_node t)
{
compiled_type_node orig;
@ -18594,7 +18594,7 @@ namespace PascalABCCompiler.TreeConverter
/// <summary>
/// Собирает интерфейсы, реализованные типом и его предками
/// </summary>
private List<ITypeNode> CollectInterfacesFromTypeNode(type_node node)
private List<type_node> CollectInterfacesFromTypeNode(type_node node)
{
var result = new List<ITypeNode>();
result.AddRange(node.ImplementingInterfaces);
@ -18605,7 +18605,7 @@ namespace PascalABCCompiler.TreeConverter
result.AddRange(interfInBase);
}
return result;
return result.Cast<type_node>().ToList();
}
private bool IsIEnumeratorInterface(type_node t)
@ -18629,7 +18629,6 @@ namespace PascalABCCompiler.TreeConverter
var filteredInterfaces = CollectInterfacesFromTypeNode(node)
.Where(item => IsIEnumerableInterface(item))
.Cast<type_node>()
.ToArray();
var genericInterfaceCount = filteredInterfaces.Count(item => item.is_generic_type_instance);