ObjectToString - убрал подчеркивание

TypeName - убрал артефакты реализации в implementation и тесты, это использующие
This commit is contained in:
Mikhalkovich Stanislav 2024-05-07 12:19:23 +03:00
parent 7681391663
commit 443ed6d3d7
20 changed files with 87 additions and 254 deletions

View file

@ -15,7 +15,7 @@ internal static class RevisionClass
public const string Major = "3";
public const string Minor = "9";
public const string Build = "0";
public const string Revision = "3474";
public const string Revision = "3477";
public const string MainVersion = Major + "." + Minor;
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;

View file

@ -1,4 +1,4 @@
%COREVERSION%=0
%REVISION%=3474
%MINOR%=9
%REVISION%=3477
%COREVERSION%=0
%MAJOR%=3

View file

@ -2,7 +2,7 @@
// This CSharp output file generated by Gardens Point LEX
// Version: 1.1.3.301
// Machine: DESKTOP-G8V08V4
// DateTime: 05.05.2024 20:08:13
// DateTime: 07.05.2024 10:51:36
// UserName: ?????????
// GPLEX input file <ABCPascal.lex>
// GPLEX frame file <embedded resource>
@ -2185,7 +2185,7 @@ if (parserTools.buildTreeForFormatter)
parserTools.ParseDirective(yytext, CurrentLexLocation, out var directiveName, out var directiveParams);
var orgDirectiveName = directiveName;
if (directiveName == null) // сл<EFBFBD>?<3F>?ай п<>?с<>?ой ди<D0B4>?ек<D0B5>?ив<D0B8>?
if (directiveName == null) // ム<EFBFBD>サム?ム?ミーミケ ミソム?ム<>?ミセミケ ミエミクム?ミオミコム?ミクミイム?
break;
parserTools.CheckDirectiveParams(directiveName, directiveParams, CurrentLexLocation);
@ -2283,7 +2283,7 @@ BEGIN(INITIAL);
parserTools.ParseDirective(yytext, CurrentLexLocation, out directiveName, out directiveParams);
orgDirectiveName = directiveName;
if (directiveName == null) // сл<EFBFBD>?<3F>?ай п<>?с<>?ой ди<D0B4>?ек<D0B5>?ив<D0B8>?
if (directiveName == null) // ム<EFBFBD>サム?ム?ミーミケ ミソム?ム<>?ミセミケ ミエミクム?ミオミコム?ミクミイム?
break;
parserTools.CheckDirectiveParams(directiveName, directiveParams, CurrentLexLocation);

View file

@ -2,7 +2,7 @@
// GPPG version 1.3.6
// Machine: DESKTOP-G8V08V4
// DateTime: 05.05.2024 20:08:14
// DateTime: 07.05.2024 10:51:37
// UserName: ?????????
// Input file <D:\PABC_Git\Parsers\PascalABCParserNewSaushkin\ABCPascal.y>

View file

@ -377,5 +377,6 @@ script=

View file

@ -1 +1 @@
3.9.0.3474
3.9.0.3477

View file

@ -1 +1 @@
!define VERSION '3.9.0.3474'
!define VERSION '3.9.0.3477'

View file

@ -1399,7 +1399,7 @@ procedure IOGraphABCSystem.write(obj: object);
end;
begin
var s := _ObjectToString(obj);
var s := ObjectToString(obj);
lock f do
begin
//var fnt := GraphABC.Font.NETFont;

View file

@ -2910,7 +2910,7 @@ type
begin
if TestMode = tmNone then
inherited write(obj);
OutputString += _ObjectToString(obj);
OutputString += ObjectToString(obj);
OutputList += obj;
CreateNewLineBeforeMessage := True;
end;

View file

@ -2486,7 +2486,7 @@ type
sb += '{ ';
end;
if rt<>nil then
sb.Append(_ObjectToString(val)) else
sb.Append(ObjectToString(val)) else
sb += 'nil';
if typeof(T) <> rt then
sb += ' }';
@ -2516,7 +2516,7 @@ type
begin
if d.Target<>nil then
begin
sb += _ObjectToString(d.Target);
sb += ObjectToString(d.Target);
sb += ' => ';
end;
var mi := d.Method;

View file

@ -1506,19 +1506,11 @@ function EnumerateDirectories(path: string): sequence of string;
/// Возвращает последовательность имен каталогов по заданному пути, включая подкаталоги
function EnumerateAllDirectories(path: string): sequence of string;
/// Возвращает имя отражённого типа "t"
/// Возвращает строку с именем данного типа
function TypeToTypeName(t: System.Type): string;
/// Добавляет в res имя отражённого типа "t"
procedure TypeToTypeName(t: System.Type; res: StringBuilder);
/// Записывает в res имя отражённого типа "t"
procedure TypeToTypeName(t: System.Type; res: TextWriter);
/// Возвращает имя типа объекта "o"
function TypeName(o: object): string;
/// Добавляет в res имя типа объекта "o"
procedure TypeName(o: object; res: StringBuilder);
/// Записывает в res имя типа объекта "o"
procedure TypeName(o: object; res: TextWriter);
/// Возвращает строку с именем типа объекта
function TypeName(obj: object): string;
///-procedure New<T>(var p: ^T);
/// Выделяет динамическую память размера sizeof(T) и возвращает в переменной p указатель на нее. Тип T должен быть размерным
@ -2675,12 +2667,8 @@ function RuntimeInitialize(kind: byte; variable: object): object;
///Вычисление размера типа на этапе выполнения
function GetRuntimeSize<T>: integer;
/// Возвращает строку для вывода подобного Write
function _ObjectToString(o: object): string;
/// Добавляет в res строку для вывода подобного Write
procedure _ObjectToString(o: object; res: StringBuilder);
/// Записывает в res строку для вывода подобного Write
procedure _ObjectToString(o: object; res: TextWriter);
/// Преобразует объект в строковое представление
function ObjectToString(obj: object): string;
function IsUnix: boolean;
///--
@ -4175,9 +4163,11 @@ procedure operator+=(var left: StringBuilder; right: string); extensionmethod :=
function operator implicit(s: string): StringBuilder; extensionmethod := new StringBuilder(s);
//------------------------------------------------------------------------------
// _ObjectToString
// ObjectToString
//------------------------------------------------------------------------------
procedure TypeToTypeNameHelper(t: System.Type; res: TextWriter); forward;
type
ObjectToStringUtils = static class
@ -4219,7 +4209,7 @@ type
res.Write( name );
res.Write(': ');
end;
TypeToTypeName(par.ParameterType, res);
TypeToTypeNameHelper(par.ParameterType, res);
end;
res.Write(')');
end;
@ -4227,14 +4217,15 @@ type
if rt<>nil then
begin
res.Write(': ');
TypeToTypeName(rt, res);
TypeToTypeNameHelper(rt, res);
end;
end;
private static empty_obj_arr := new object[0];
public static procedure ContentsToString(o: Object; prev: Stack<object>; res: TextWriter);
const val_sep = '; ';
const val_sep = '; ';
begin
res.Write('(');
var any_vals := false;
@ -4299,10 +4290,10 @@ type
prev.Push(o);
AppendImpl(o, prev, res);
if prev.Pop<>o then raise new InvalidOperationException;
end;
public static procedure AppendImpl(o: Object; prev: Stack<object>; res: TextWriter);
const max_seq_len = 100;
const max_seq_len = 100;
begin
if o = nil then
begin
@ -4484,9 +4475,7 @@ type
{$endregion IEnumerable}
ContentsToString(o, prev, res);
end;
end;
function TryWriteFromTypeCode(t: System.Type; res: TextWriter): boolean;
@ -4522,7 +4511,7 @@ begin
end;
end;
procedure TypeToTypeName(t: System.Type; res: TextWriter);
procedure TypeToTypeNameHelper(t: System.Type; res: TextWriter);
begin
if t=nil then
begin
@ -4546,7 +4535,7 @@ begin
if rank<1 then
raise new NotImplementedException;
res.Write(' of ');
TypeToTypeName(t.GetElementType, res);
TypeToTypeNameHelper(t.GetElementType, res);
exit;
end;
@ -4562,7 +4551,7 @@ begin
) then
begin
res.Write('sequence of ');
TypeToTypeName(typed.GetGenericArguments.Single, res);
TypeToTypeNameHelper(typed.GetGenericArguments.Single, res);
exit;
end;
end;
@ -4579,7 +4568,7 @@ begin
if any_gen_arg then
res.Write(', ') else
any_gen_arg := true;
TypeToTypeName(arg, res);
TypeToTypeNameHelper(arg, res);
end;
res.Write(')');
exit;
@ -4627,7 +4616,7 @@ begin
gen_args := own_args;
end;
TypeToTypeName(parent, res);
TypeToTypeNameHelper(parent, res);
res.Write('+');
end;
@ -4641,7 +4630,7 @@ begin
if any_gen_arg then
res.Write(', ') else
any_gen_arg := true;
TypeToTypeName(arg, res);
TypeToTypeNameHelper(arg, res);
end;
res.Write('>');
exit;
@ -4653,12 +4642,13 @@ begin
if t.IsGenericParameter then
res.Write(']');
end;
procedure TypeToTypeName(t: System.Type; res: StringBuilder) :=
TypeToTypeName(t, new StringWriter(res));
procedure TypeName(o: object; res: TextWriter);
procedure TypeToTypeNameHelper(t: System.Type; res: StringBuilder) :=
TypeToTypeNameHelper(t, new StringWriter(res));
procedure TypeNameHelper(obj: object; res: TextWriter);
begin
var t := o?.GetType;
var t := obj?.GetType;
// Зачем? TypeName(@a) не работает
// Можно сделать TypeName волшебной функцией, вызывая
@ -4672,37 +4662,39 @@ begin
var static_arr_field := t?.GetField('NullBasedArray');
if static_arr_field<>nil then
begin
TypeName(static_arr_field.GetValue(o), res);
TypeNameHelper(static_arr_field.GetValue(obj), res);
exit;
end;
TypeToTypeName(t, res);
TypeToTypeNameHelper(t, res);
end;
procedure TypeNameHelper(obj: object; res: StringBuilder) := TypeNameHelper(obj, new StringWriter(res));
function TypeName(obj: object): string;
begin
var res := new StringBuilder;
TypeNameHelper(obj, res);
Result := res.ToString;
end;
procedure TypeName(o: object; res: StringBuilder) :=
TypeName(o, new StringWriter(res));
function TypeToTypeName(t: System.Type): string;
begin
var res := new StringBuilder;
TypeToTypeName(t, res);
TypeToTypeNameHelper(t, res);
Result := res.ToString;
end;
function TypeName(o: object): string;
begin
var res := new StringBuilder;
TypeName(o, res);
Result := res.ToString;
end;
procedure _ObjectToString(o: object; res: TextWriter) :=
procedure _ObjectToStringHelper(o: object; res: TextWriter) :=
ObjectToStringUtils.Append(o, new Stack<object>, res);
procedure _ObjectToString(o: object; res: StringBuilder) :=
_ObjectToString(o, new StringWriter(res));
function _ObjectToString(o: object): string;
procedure _ObjectToStringHelper(o: object; res: StringBuilder) :=
_ObjectToStringHelper(o, new StringWriter(res));
function ObjectToString(obj: object): string;
begin
var res := new StringBuilder;
_ObjectToString(o, res);
_ObjectToStringHelper(obj, res);
Result := res.ToString;
end;
@ -6283,7 +6275,7 @@ procedure IOStandardSystem.write(obj: object);
begin
if not console_alloc then
AllocConsole;
Console.Write(_ObjectToString(obj));
Console.Write(ObjectToString(obj));
end;
procedure IOStandardSystem.write(p: pointer);
@ -7526,7 +7518,7 @@ begin
if f.sw = nil then
raise new System.IO.IOException(GetTranslation(FILE_NOT_OPENED_FOR_WRITING));
f.sw.Write(_ObjectToString(val));
f.sw.Write(ObjectToString(val));
{if val = nil then
begin
f.sw.Write('nil');
@ -11751,7 +11743,7 @@ begin
for var j := 0 to Self.ColCount - 1 do
begin
if PrintMatrixWithFormat then
Write(_ObjectToString(Self[i, j]).PadLeft(w))
Write(ObjectToString(Self[i, j]).PadLeft(w))
else Print(Self[i, j]);
end;
Writeln;
@ -14526,7 +14518,7 @@ end;
function FormatValue(value: object; NumOfChars: integer): string;
begin
if value <> nil then
Result := _ObjectToString(value)
Result := ObjectToString(value)
else
Result := 'nil';
Result := Result.PadLeft(NumOfChars);

View file

@ -1,106 +0,0 @@
type
r1 = record
public a := 123;
public b := 'abc';
internal c := 'err';
public property p: byte read byte(a);
internal property e: string read 'err';
private function raise_getter: byte;
begin
Result := 0;
raise new Exception('Expected Exception');
end;
public property f: byte read raise_getter;
end;
Base<T1,T2,T3> = class end;
Derived<T> = class(Base<T, array of T, word>) end;
var res := new StringBuilder;
procedure TestO(o: object);
begin
TypeName(o, res);
res.Append('{ ');
_ObjectToString(o, res);
res.Append(' }'#10);
end;
procedure TestT(t: System.Type);
begin
TypeToTypeName(t, res);
res.Append(#10);
end;
begin
TestO(1);
TestO('abc'); // typeof(string).IsPrimitive=false, но Type.GetTypeCode работает
TestO(new System.UIntPtr(123)); // Выводим только UIntPtr, без пространства имён
TestO(System.ConsoleColor.Cyan); // Type.GetTypeCode возвращает integer - это надо явно обходить
TestO(Lst(0).GetEnumerator); // Вложенный тип
// Картежи
TestO(System.Tuple.Create(1,2.3));
TestO(System.ValueTuple.Create(1,2.3)); // Сейчас ValueTuple не обрабатывает
// Последовательности
TestO(new byte[2,1,1,1,1,1,1,1,2]);
TestO(new byte[2,1,1,1,0,1,1,1,2]); // 0 элементов
TestO(|1.2,3|.ToList); // Элементы real, потому что у 1 из них есть вещественная часть
TestO(|1.2,3|.ToHashSet); // Мноежства выводятся в {}
TestO(|1,2,3,4,5|.Skip(1).Take(3)); // C# yield последовательность
TestO(|1,2,3,4,5|.AdjacentGroup); // Паскалевская yield последовательность
TestO(new System.Collections.ArrayList(|6,7,8|)); // Вывод содержимого НЕ типизированной последовательности
// Тип не реализует последовательность - а является ею
TestO(|Seq(0)|);
TestO(|Seq(0) as System.Collections.IEnumerable|);
// Сложная структура со свойствами
TestO(new r1);
// Содержимое ссылок на функции
var d1 := procedure(b: byte)->exit();
var d2: Action<byte> := d1;
var d3 := function: object->d1;
var d4: Func0<object> := d3;
TestO(d1);
TestO(d2); // Преобразование к содержимому типу делегата
TestO(Delegate(d3)); // Захват переменной
TestO(Delegate(d4)); // Два предыдущих вместе
TestO(Arr(d1)); // Внутри массива
TestO(Arr&<System.MulticastDelegate>(d1)); // Тип элементов массива абстрактный, поэтому у него нету .Invoke
// Генерики
TestT(typeof(Dictionary<,>)); // Не подставленные параметры в [], т.е. [TKey]
TestT(typeof(Derived<byte>).BaseType); // Сложная подстановка типов
TestT(typeof(Derived<>).BaseType); // Только часть типов подставлена
TestT(Lst(0).GetType.GetGenericTypeDefinition);
TestT(Lst(0).GetEnumerator.GetType.GetGenericTypeDefinition); // Вложенный тип без подстановки
// Особый генерик, подобный не существует нигде в стандартной библиотеке .Net
begin
{$reference ObjectToStringExt.dll}
var t := typeof(OTS.CS.Parent<>).GetNestedTypes.Single;
TestT(t);
TestT(t.MakeGenericType(typeof(byte), typeof(word)));
TestT(t.MakeGenericType(typeof(byte), t.GetGenericArguments[1]));
TestT(t.MakeGenericType(t.GetGenericArguments[0], typeof(word)));
end;
var otp_fname := 'ObjectToString.txt';
var otp_new_fname := 'ObjectToString[new].txt';
var enc := new System.Text.UTF8Encoding(true);
var dir := GetCurrentDir;
if System.IO.Path.GetFileName(dir)='exe' then
dir := System.IO.Path.GetDirectoryName(dir);
var expected := ReadAllText(dir+'\'+otp_fname, enc).Remove(#13);
var curr := res.ToString.RegexReplace('(?<=Exception:[^\n]*)\r?\n(?:(?!(?<!\()\)).)*', '', RegexOptions.Singleline);
var tr := expected = curr;
if not tr then WriteAllText(dir+'\'+otp_new_fname, curr, enc);
Assert(tr);
end.

View file

@ -1,32 +0,0 @@
integer{ 1 }
string{ abc }
UIntPtr{ 123 }
ConsoleColor{ Cyan }
List<integer>+Enumerator{ (Current=0) }
(integer, real){ (1, 2.3) }
ValueTuple<integer, real>{ (1, 2.3) }
array[,,,,,,,,] of byte{ [[[[[[[[[0,0]]]]]]]],[[[[[[[[0,0]]]]]]]]] }
array[,,,,,,,,] of byte{ [[[[[[[[[]]]]]]]]] }
List<real>{ [1.2,3] }
HashSet<real>{ {1.2,3} }
sequence of integer{ [2,3,4] }
sequence of array of integer{ [[1],[2],[3],[4],[5]] }
ArrayList{ [6,7,8] }
array of sequence of integer{ [[0]] }
array of IEnumerable{ [[0]] }
r1{ (a=123; b=abc; p=123; f=System.Exception: Expected Exception) }
procedure(byte){ procedure lambda(b: byte) }
procedure(byte){ procedure lambda(b: byte) => procedure Invoke(b: byte) }
function: Object{ (d1=procedure lambda(b: byte)) => function lambda: Object }
function: Object{ (d1=procedure lambda(b: byte)) => function lambda: Object => function Invoke: Object }
array of procedure(byte){ [procedure lambda(b: byte)] }
array of MulticastDelegate{ [procedure lambda(b: byte)] }
Dictionary<[TKey], [TValue]>
Base<byte, array of byte, word>
Base<[T], array of [T], word>
List<[T]>
List<[T]>+Enumerator
Parent<[T1]>+Nested<[T2]>
Parent<byte>+Nested<word>
Parent<byte>+Nested<[T2]>
Parent<[T1]>+Nested<word>

View file

@ -1,14 +0,0 @@

namespace OTS.CS {
public class Parent<T1> {
public class Nested<T2> { }
}
}

Binary file not shown.

View file

@ -1399,7 +1399,7 @@ procedure IOGraphABCSystem.write(obj: object);
end;
begin
var s := _ObjectToString(obj);
var s := ObjectToString(obj);
lock f do
begin
//var fnt := GraphABC.Font.NETFont;

View file

@ -2910,7 +2910,7 @@ type
begin
if TestMode = tmNone then
inherited write(obj);
OutputString += _ObjectToString(obj);
OutputString += ObjectToString(obj);
OutputList += obj;
CreateNewLineBeforeMessage := True;
end;

View file

@ -2486,7 +2486,7 @@ type
sb += '{ ';
end;
if rt<>nil then
sb.Append(_ObjectToString(val)) else
sb.Append(ObjectToString(val)) else
sb += 'nil';
if typeof(T) <> rt then
sb += ' }';
@ -2516,7 +2516,7 @@ type
begin
if d.Target<>nil then
begin
sb += _ObjectToString(d.Target);
sb += ObjectToString(d.Target);
sb += ' => ';
end;
var mi := d.Method;

View file

@ -2667,12 +2667,8 @@ function RuntimeInitialize(kind: byte; variable: object): object;
///Вычисление размера типа на этапе выполнения
function GetRuntimeSize<T>: integer;
/// Возвращает строку для вывода подобного Write
function _ObjectToString(o: object): string;
/// Добавляет в res строку для вывода подобного Write
procedure _ObjectToString(o: object; res: StringBuilder);
/// Записывает в res строку для вывода подобного Write
procedure _ObjectToString(o: object; res: TextWriter);
/// Преобразует объект в строковое представление
function ObjectToString(obj: object): string;
function IsUnix: boolean;
///--
@ -4167,7 +4163,7 @@ procedure operator+=(var left: StringBuilder; right: string); extensionmethod :=
function operator implicit(s: string): StringBuilder; extensionmethod := new StringBuilder(s);
//------------------------------------------------------------------------------
// _ObjectToString
// ObjectToString
//------------------------------------------------------------------------------
procedure TypeToTypeNameHelper(t: System.Type; res: TextWriter); forward;
@ -4689,14 +4685,16 @@ begin
Result := res.ToString;
end;
procedure _ObjectToString(o: object; res: TextWriter) :=
procedure _ObjectToStringHelper(o: object; res: TextWriter) :=
ObjectToStringUtils.Append(o, new Stack<object>, res);
procedure _ObjectToString(o: object; res: StringBuilder) :=
_ObjectToString(o, new StringWriter(res));
function _ObjectToString(o: object): string;
procedure _ObjectToStringHelper(o: object; res: StringBuilder) :=
_ObjectToStringHelper(o, new StringWriter(res));
function ObjectToString(obj: object): string;
begin
var res := new StringBuilder;
_ObjectToString(o, res);
_ObjectToStringHelper(obj, res);
Result := res.ToString;
end;
@ -6277,7 +6275,7 @@ procedure IOStandardSystem.write(obj: object);
begin
if not console_alloc then
AllocConsole;
Console.Write(_ObjectToString(obj));
Console.Write(ObjectToString(obj));
end;
procedure IOStandardSystem.write(p: pointer);
@ -7520,7 +7518,7 @@ begin
if f.sw = nil then
raise new System.IO.IOException(GetTranslation(FILE_NOT_OPENED_FOR_WRITING));
f.sw.Write(_ObjectToString(val));
f.sw.Write(ObjectToString(val));
{if val = nil then
begin
f.sw.Write('nil');
@ -11745,7 +11743,7 @@ begin
for var j := 0 to Self.ColCount - 1 do
begin
if PrintMatrixWithFormat then
Write(_ObjectToString(Self[i, j]).PadLeft(w))
Write(ObjectToString(Self[i, j]).PadLeft(w))
else Print(Self[i, j]);
end;
Writeln;
@ -14520,7 +14518,7 @@ end;
function FormatValue(value: object; NumOfChars: integer): string;
begin
if value <> nil then
Result := _ObjectToString(value)
Result := ObjectToString(value)
else
Result := 'nil';
Result := Result.PadLeft(NumOfChars);

View file

@ -1141,19 +1141,19 @@
<member name="M:TypedFileRead(PABCSystem.TypedFile)">
<summary>--</summary>
</member>
<member name="M:FilePos(PABCSystem.BinaryFile)">
<member name="M:FilePos(@file)">
<summary>--</summary>
</member>
<member name="M:FileSize(PABCSystem.BinaryFile)">
<member name="M:FileSize(@file)">
<summary>--</summary>
</member>
<member name="M:Seek(PABCSystem.BinaryFile,System.Int64)">
<member name="M:Seek(@file,System.Int64)">
<summary>--</summary>
</member>
<member name="M:BinaryFileInit(PABCSystem.BinaryFile@)">
<member name="M:BinaryFileInit(@file@)">
<summary>--</summary>
</member>
<member name="M:BinaryFileRead(PABCSystem.BinaryFile@,System.Type)">
<member name="M:BinaryFileRead(@file@,System.Type)">
<summary>--</summary>
</member>
<member name="M:PascalABCVersion">
@ -2626,14 +2626,8 @@
<member name="M:GetRuntimeSize``1">
<summary>Вычисление размера типа на этапе выполнения</summary>
</member>
<member name="M:_ObjectToString(System.Object)">
<summary>Возвращает строку для вывода подобного Write</summary>
</member>
<member name="M:_ObjectToString(System.Object,System.Text.StringBuilder)">
<summary>Добавляет в res строку для вывода подобного Write</summary>
</member>
<member name="M:_ObjectToString(System.Object,System.IO.TextWriter)">
<summary>Записывает в res строку для вывода подобного Write</summary>
<member name="M:ObjectToString(System.Object)">
<summary>Преобразует объект в строковое представление</summary>
</member>
<member name="M:ExecuteAssemlyIsDll">
<summary>--</summary>