Странные комментарии к TypeName
LightPT - SetMessagesOn
This commit is contained in:
parent
6612fac1c4
commit
27fc10ab0f
|
|
@ -15,7 +15,7 @@ internal static class RevisionClass
|
||||||
public const string Major = "3";
|
public const string Major = "3";
|
||||||
public const string Minor = "9";
|
public const string Minor = "9";
|
||||||
public const string Build = "0";
|
public const string Build = "0";
|
||||||
public const string Revision = "3467";
|
public const string Revision = "3473";
|
||||||
|
|
||||||
public const string MainVersion = Major + "." + Minor;
|
public const string MainVersion = Major + "." + Minor;
|
||||||
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;
|
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
%MINOR%=9
|
%MINOR%=9
|
||||||
%REVISION%=3467
|
%REVISION%=3473
|
||||||
%COREVERSION%=0
|
%COREVERSION%=0
|
||||||
%MAJOR%=3
|
%MAJOR%=3
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -1,9 +1,9 @@
|
||||||
//
|
//
|
||||||
// This CSharp output file generated by Gardens Point LEX
|
// This CSharp output file generated by Gardens Point LEX
|
||||||
// Version: 1.1.3.301
|
// Version: 1.1.3.301
|
||||||
// Machine: DESKTOP-V3E9T2U
|
// Machine: DESKTOP-G8V08V4
|
||||||
// DateTime: 27.04.2024 19:33:37
|
// DateTime: 05.05.2024 20:08:13
|
||||||
// UserName: alex
|
// UserName: ?????????
|
||||||
// GPLEX input file <ABCPascal.lex>
|
// GPLEX input file <ABCPascal.lex>
|
||||||
// GPLEX frame file <embedded resource>
|
// GPLEX frame file <embedded resource>
|
||||||
//
|
//
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
// (see accompanying GPPGcopyright.rtf)
|
// (see accompanying GPPGcopyright.rtf)
|
||||||
|
|
||||||
// GPPG version 1.3.6
|
// GPPG version 1.3.6
|
||||||
// Machine: DESKTOP-V3E9T2U
|
// Machine: DESKTOP-G8V08V4
|
||||||
// DateTime: 23.04.2024 22:43:23
|
// DateTime: 05.05.2024 20:08:14
|
||||||
// UserName: alex
|
// UserName: ?????????
|
||||||
// Input file <ABCPascal.y>
|
// Input file <D:\PABC_Git\Parsers\PascalABCParserNewSaushkin\ABCPascal.y>
|
||||||
|
|
||||||
// options: no-lines gplex
|
// options: no-lines gplex
|
||||||
|
|
||||||
|
|
@ -60,7 +60,7 @@ public abstract class ScanBase : AbstractScanner<PascalABCSavParser.Union,LexLoc
|
||||||
|
|
||||||
public partial class GPPGParser: ShiftReduceParser<PascalABCSavParser.Union, LexLocation>
|
public partial class GPPGParser: ShiftReduceParser<PascalABCSavParser.Union, LexLocation>
|
||||||
{
|
{
|
||||||
// Verbatim content from ABCPascal.y
|
// Verbatim content from D:\PABC_Git\Parsers\PascalABCParserNewSaushkin\ABCPascal.y
|
||||||
// Э<>?и об<D0BE>?явления добавля<D0BB>?<3F>?ся в класс GPPGParser, п<>?едс<D0B4>?авля<D0BB>?<3F>?ий собой па<D0BF>?се<D181>?, гене<D0BD>?и<>?<3F>?ем<D0B5>?й сис<D0B8>?емой gppg
|
// Э<>?и об<D0BE>?явления добавля<D0BB>?<3F>?ся в класс GPPGParser, п<>?едс<D0B4>?авля<D0BB>?<3F>?ий собой па<D0BF>?се<D181>?, гене<D0BD>?и<>?<3F>?ем<D0B5>?й сис<D0B8>?емой gppg
|
||||||
public syntax_tree_node root; // <20>?о<>?невой <20>?зел син<D0B8>?акси<D181>?еского де<D0B4>?ева
|
public syntax_tree_node root; // <20>?о<>?невой <20>?зел син<D0B8>?акси<D181>?еского де<D0B4>?ева
|
||||||
|
|
||||||
|
|
@ -72,7 +72,7 @@ public partial class GPPGParser: ShiftReduceParser<PascalABCSavParser.Union, Lex
|
||||||
public ParserLambdaHelper lambdaHelper = new ParserLambdaHelper();
|
public ParserLambdaHelper lambdaHelper = new ParserLambdaHelper();
|
||||||
|
|
||||||
public GPPGParser(AbstractScanner<PascalABCSavParser.Union, LexLocation> scanner) : base(scanner) { }
|
public GPPGParser(AbstractScanner<PascalABCSavParser.Union, LexLocation> scanner) : base(scanner) { }
|
||||||
// End verbatim content from ABCPascal.y
|
// End verbatim content from D:\PABC_Git\Parsers\PascalABCParserNewSaushkin\ABCPascal.y
|
||||||
|
|
||||||
#pragma warning disable 649
|
#pragma warning disable 649
|
||||||
private static Dictionary<int, string> aliasses;
|
private static Dictionary<int, string> aliasses;
|
||||||
|
|
|
||||||
|
|
@ -376,5 +376,6 @@ script=
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
3.9.0.3467
|
3.9.0.3473
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
!define VERSION '3.9.0.3467'
|
!define VERSION '3.9.0.3473'
|
||||||
|
|
|
||||||
|
|
@ -571,6 +571,11 @@ var
|
||||||
GenerateTestData: integer -> () := nil;
|
GenerateTestData: integer -> () := nil;
|
||||||
TestMode: TestModeType := tmNone;
|
TestMode: TestModeType := tmNone;
|
||||||
TestNumber: integer;
|
TestNumber: integer;
|
||||||
|
|
||||||
|
/// Включить дополнительные сообщения о записи в удаленную базу данных
|
||||||
|
procedure SetMessagesOn;
|
||||||
|
/// Выключить дополнительные сообщения о записи в удаленную базу данных
|
||||||
|
procedure SetMessageOff;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
|
|
@ -612,6 +617,9 @@ var
|
||||||
TaskNamesMap := new Dictionary<string,string>;
|
TaskNamesMap := new Dictionary<string,string>;
|
||||||
|
|
||||||
ServerAddr := 'https://air.mmcs.sfedu.ru/pascalabc';
|
ServerAddr := 'https://air.mmcs.sfedu.ru/pascalabc';
|
||||||
|
|
||||||
|
// Дополнительные сообщения о записи в удаленную базу данных
|
||||||
|
additionalMessages := False;
|
||||||
|
|
||||||
{=========================================================}
|
{=========================================================}
|
||||||
{ Типы, связанные с сетью }
|
{ Типы, связанные с сетью }
|
||||||
|
|
@ -2807,11 +2815,19 @@ end;
|
||||||
{ Процедуры для записи в базы данных }
|
{ Процедуры для записи в базы данных }
|
||||||
{=========================================================}
|
{=========================================================}
|
||||||
|
|
||||||
|
procedure AdditionalMessage(message: string);
|
||||||
|
begin
|
||||||
|
if additionalMessages then
|
||||||
|
ColoredMessage(message, MsgColorMagenta);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure WriteInfoToRemoteDatabase(auth: string; LessonName, TaskName, TaskPlatform, TaskResult, text, AdditionalInfo: string);
|
procedure WriteInfoToRemoteDatabase(auth: string; LessonName, TaskName, TaskPlatform, TaskResult, text, AdditionalInfo: string);
|
||||||
begin
|
begin
|
||||||
|
AdditionalMessage($'WriteInfoToRemoteDatabase начало. Урок {LessonName}, задание {TaskName}, результат {TaskResult}');
|
||||||
// Считать логин пароль из auth
|
// Считать логин пароль из auth
|
||||||
var data := System.IO.File.ReadAllBytes(auth);
|
var data := System.IO.File.ReadAllBytes(auth);
|
||||||
var arr := Decrypt(data).Split(#10);
|
var arr := Decrypt(data).Split(#10);
|
||||||
|
AdditionalMessage($'Логин и пароль расшифрованы');
|
||||||
var login,pass: string;
|
var login,pass: string;
|
||||||
if arr.Length >= 2 then
|
if arr.Length >= 2 then
|
||||||
begin
|
begin
|
||||||
|
|
@ -2819,8 +2835,10 @@ begin
|
||||||
pass := arr[1];
|
pass := arr[1];
|
||||||
// Теперь как-то записать в БД информацию
|
// Теперь как-то записать в БД информацию
|
||||||
var User := new ServerAccessProvider(ServerAddr);
|
var User := new ServerAccessProvider(ServerAddr);
|
||||||
|
AdditionalMessage($'Непосредственно перед SendPostRequest');
|
||||||
var t2 := User.SendPostRequest(login, pass, LessonName, TaskName, TaskPlatform, TaskResult, text, AdditionalInfo);
|
var t2 := User.SendPostRequest(login, pass, LessonName, TaskName, TaskPlatform, TaskResult, text, AdditionalInfo);
|
||||||
var v := t2.Result;
|
var v := t2.Result;
|
||||||
|
AdditionalMessage($'После SendPostRequest - результат: {v}');
|
||||||
v := v;
|
v := v;
|
||||||
if v <> 'Success' then
|
if v <> 'Success' then
|
||||||
ColoredMessage('Ошибка сервера: '+v, MsgColorGray);
|
ColoredMessage('Ошибка сервера: '+v, MsgColorGray);
|
||||||
|
|
@ -2840,6 +2858,12 @@ begin
|
||||||
try
|
try
|
||||||
var auth := FindAuthDat(); // файл авторизации ищется либо в текущей папке либо в папке на уровень выше
|
var auth := FindAuthDat(); // файл авторизации ищется либо в текущей папке либо в папке на уровень выше
|
||||||
var args := System.Environment.GetCommandLineArgs;
|
var args := System.Environment.GetCommandLineArgs;
|
||||||
|
if auth = '' then
|
||||||
|
AdditionalMessage('Файл auth.dat не найден')
|
||||||
|
else if (args.Length < 3) then
|
||||||
|
AdditionalMessage('args.Length < 3')
|
||||||
|
else if args[2].ToLower <> 'true' then
|
||||||
|
AdditionalMessage('args[2].ToLower <> true');
|
||||||
if (auth <> '') and (args.Length >= 3) and (args[2].ToLower = 'true') then
|
if (auth <> '') and (args.Length >= 3) and (args[2].ToLower = 'true') then
|
||||||
begin
|
begin
|
||||||
var text := '';
|
var text := '';
|
||||||
|
|
@ -2851,6 +2875,7 @@ begin
|
||||||
except
|
except
|
||||||
on e: System.AggregateException do
|
on e: System.AggregateException do
|
||||||
begin
|
begin
|
||||||
|
ColoredMessage('->>',MsgColorGray);
|
||||||
foreach var x in e.InnerExceptions do
|
foreach var x in e.InnerExceptions do
|
||||||
if x is HTTPRequestException then
|
if x is HTTPRequestException then
|
||||||
begin
|
begin
|
||||||
|
|
@ -2861,10 +2886,20 @@ begin
|
||||||
else ColoredMessage('Ошибка сервера: '+x.Message,MsgColorGray);
|
else ColoredMessage('Ошибка сервера: '+x.Message,MsgColorGray);
|
||||||
end;
|
end;
|
||||||
on e: Exception do
|
on e: Exception do
|
||||||
ColoredMessage(e.Message,MsgColorGray);
|
ColoredMessage('Исключение в WriteInfoToDatabases: '+e.Message,MsgColorGray);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure SetMessagesOn;
|
||||||
|
begin
|
||||||
|
additionalMessages := True;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure SetMessageOff;
|
||||||
|
begin
|
||||||
|
additionalMessages := False;
|
||||||
|
end;
|
||||||
|
|
||||||
{===========================================================}
|
{===========================================================}
|
||||||
{ Переопределенные подсистемы ввода и вывода }
|
{ Переопределенные подсистемы ввода и вывода }
|
||||||
{===========================================================}
|
{===========================================================}
|
||||||
|
|
|
||||||
|
|
@ -1506,17 +1506,18 @@ function EnumerateDirectories(path: string): sequence of string;
|
||||||
/// Возвращает последовательность имен каталогов по заданному пути, включая подкаталоги
|
/// Возвращает последовательность имен каталогов по заданному пути, включая подкаталоги
|
||||||
function EnumerateAllDirectories(path: string): sequence of string;
|
function EnumerateAllDirectories(path: string): sequence of string;
|
||||||
|
|
||||||
/// Для типа System.Type возвращает имя типа объекта
|
/// Возвращает имя отражённого типа "t"
|
||||||
function TypeToTypeName(t: System.Type): string;
|
function TypeToTypeName(t: System.Type): string;
|
||||||
/// Для типа System.Type записывает в res имя типа объекта
|
/// Добавляет в res имя отражённого типа "t"
|
||||||
procedure TypeToTypeName(t: System.Type; res: StringBuilder);
|
procedure TypeToTypeName(t: System.Type; res: StringBuilder);
|
||||||
/// Для типа System.Type записывает в res имя типа объекта
|
/// Записывает в res имя отражённого типа "t"
|
||||||
procedure TypeToTypeName(t: System.Type; res: TextWriter);
|
procedure TypeToTypeName(t: System.Type; res: TextWriter);
|
||||||
/// Возвращает имя типа объекта
|
|
||||||
|
/// Возвращает имя типа объекта "o"
|
||||||
function TypeName(o: object): string;
|
function TypeName(o: object): string;
|
||||||
/// Записывает в res имя типа объекта
|
/// Добавляет в res имя типа объекта "o"
|
||||||
procedure TypeName(o: object; res: StringBuilder);
|
procedure TypeName(o: object; res: StringBuilder);
|
||||||
/// Записывает в res имя типа объекта
|
/// Записывает в res имя типа объекта "o"
|
||||||
procedure TypeName(o: object; res: TextWriter);
|
procedure TypeName(o: object; res: TextWriter);
|
||||||
|
|
||||||
///-procedure New<T>(var p: ^T);
|
///-procedure New<T>(var p: ^T);
|
||||||
|
|
@ -2674,11 +2675,11 @@ function RuntimeInitialize(kind: byte; variable: object): object;
|
||||||
///Вычисление размера типа на этапе выполнения
|
///Вычисление размера типа на этапе выполнения
|
||||||
function GetRuntimeSize<T>: integer;
|
function GetRuntimeSize<T>: integer;
|
||||||
|
|
||||||
/// Возвращает строку для вывода в write
|
/// Возвращает строку для вывода подобного Write
|
||||||
function _ObjectToString(o: object): string;
|
function _ObjectToString(o: object): string;
|
||||||
/// Записывает в res строку для вывода в write
|
/// Добавляет в res строку для вывода подобного Write
|
||||||
procedure _ObjectToString(o: object; res: StringBuilder);
|
procedure _ObjectToString(o: object; res: StringBuilder);
|
||||||
/// Записывает в res строку для вывода в write
|
/// Записывает в res строку для вывода подобного Write
|
||||||
procedure _ObjectToString(o: object; res: TextWriter);
|
procedure _ObjectToString(o: object; res: TextWriter);
|
||||||
|
|
||||||
function IsUnix: boolean;
|
function IsUnix: boolean;
|
||||||
|
|
@ -4387,9 +4388,8 @@ type
|
||||||
if a.Length=0 then
|
if a.Length=0 then
|
||||||
begin
|
begin
|
||||||
// Алгоритм ниже не расчитан на пустые массив
|
// Алгоритм ниже не расчитан на пустые массив
|
||||||
// Правда для "new byte[1,0]" таким образом
|
loop a.Rank do res.Write('[');
|
||||||
// выведет "[]" вместо "[[]]"
|
loop a.Rank do res.Write(']');
|
||||||
res.Write('[]');
|
|
||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
@ -4477,7 +4477,7 @@ type
|
||||||
|
|
||||||
if not enmr_has_next then break;
|
if not enmr_has_next then break;
|
||||||
end;
|
end;
|
||||||
res.Write( if is_set then ']' else ']' );
|
res.Write( if is_set then '}' else ']' );
|
||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
@ -4550,15 +4550,15 @@ begin
|
||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
if t.GetInterfaces.Contains(typeof(System.Collections.IEnumerable)) then
|
if t.GetInterfaces.Append(t).Contains(typeof(System.Collections.IEnumerable)) then
|
||||||
begin
|
begin
|
||||||
var typed := t.GetInterfaces.FirstOrDefault(intr->intr.IsGenericType and (intr.GetGenericTypeDefinition=typeof(IEnumerable<>)));
|
var typed := t.GetInterfaces.Append(t).FirstOrDefault(intr->intr.IsGenericType and (intr.GetGenericTypeDefinition=typeof(IEnumerable<>)));
|
||||||
if (typed<>nil) and (
|
if (t=typed) or (typed<>nil) and (
|
||||||
// Выводим как sequence только классы, созданные yield функцией
|
// Выводим как sequence только классы, созданные yield функцией
|
||||||
// "clyield#" это yield класс паскаля
|
// "clyield#" это yield класс паскаля
|
||||||
t.Name.StartsWith('clyield#') or
|
t.Name.StartsWith('clyield#') or
|
||||||
// А все yield классы C# являются вложенными и скрытыми
|
// А все yield классы C# являются вложенными и скрытыми
|
||||||
(t.DeclaringType<>nil) and not t.IsPublic
|
t.IsNestedPrivate
|
||||||
) then
|
) then
|
||||||
begin
|
begin
|
||||||
res.Write('sequence of ');
|
res.Write('sequence of ');
|
||||||
|
|
@ -4567,39 +4567,94 @@ begin
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
var gen_args := t.GetGenericArguments;
|
||||||
|
|
||||||
|
//TODO t.IsClass, чтобы ValueTuple пока что не ловило
|
||||||
|
if t.GetInterfaces.Contains(typeof(System.Runtime.CompilerServices.ITuple)) and t.IsClass then
|
||||||
|
begin
|
||||||
|
res.Write('(');
|
||||||
|
var any_gen_arg := false;
|
||||||
|
foreach var arg in gen_args do
|
||||||
|
begin
|
||||||
|
if any_gen_arg then
|
||||||
|
res.Write(', ') else
|
||||||
|
any_gen_arg := true;
|
||||||
|
TypeToTypeName(arg, res);
|
||||||
|
end;
|
||||||
|
res.Write(')');
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
|
||||||
var name := t.Name;
|
var name := t.Name;
|
||||||
|
|
||||||
if t.IsSubclassOf(typeof(Delegate)) then
|
if t.IsSubclassOf(typeof(Delegate)) then
|
||||||
begin
|
begin
|
||||||
var mi := t.GetMethod('Invoke');
|
var mi := t.GetMethod('Invoke');
|
||||||
if mi=nil then raise new NotImplementedException;
|
// nil for System.MulticastDelegate
|
||||||
ObjectToStringUtils.MethodToString(mi, false, res);
|
if mi<>nil then
|
||||||
exit;
|
begin
|
||||||
|
ObjectToStringUtils.MethodToString(mi, false, res);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
// typeof(t1<T>) или typeof(t1<>)
|
// "Lst(0).GetEnumerator.GetType.DeclaringType" возвращает List<T>, а не List<integer>
|
||||||
// typeof(t1<>) можно проверить отдельно с .IsGenericTypeDefinition
|
// При чём этот T.IsNested возвращает true, хотя это параметр а не вложенный тип
|
||||||
// Но в данном случае это не нужно
|
if t.IsNested and not t.IsGenericParameter then
|
||||||
if t.IsGenericType then
|
|
||||||
begin
|
begin
|
||||||
res.Write( name.Remove(name.IndexOf('`')) );
|
var parent_def := t.DeclaringType;
|
||||||
res.Write('<');
|
var parent := parent_def;
|
||||||
var any_gen_par := false;
|
if parent.IsGenericType then
|
||||||
foreach var gen_par in t.GetGenericArguments do
|
|
||||||
begin
|
begin
|
||||||
if any_gen_par then
|
// Во вложенный тип копирует все типы шаблона из внешнего класса
|
||||||
|
// class Parent<T1> { class Nested<T2> }
|
||||||
|
// На практике вложенный тип будет Parent`1+Nested`1<T1,T2>
|
||||||
|
// Но тут писать в res будем только <T2>
|
||||||
|
|
||||||
|
var t_def_args := t.GetGenericTypeDefinition.GetGenericArguments;
|
||||||
|
var parent_def_args := parent_def.GetGenericArguments;
|
||||||
|
for var i := 0 to parent_def_args.Length-1 do
|
||||||
|
if t_def_args[i].Name <> parent_def_args[i].Name then
|
||||||
|
// Ожидается что <T1> всегда будет перед <T2> в примере выше
|
||||||
|
raise new NotImplementedException;
|
||||||
|
|
||||||
|
var parent_args := new System.Type[parent_def_args.Length];
|
||||||
|
&Array.ConstrainedCopy(gen_args,0, parent_args,0, parent_args.Length);
|
||||||
|
parent := parent_def.MakeGenericType(parent_args);
|
||||||
|
|
||||||
|
var own_args := new System.Type[gen_args.Length-parent_def_args.Length];
|
||||||
|
&Array.ConstrainedCopy(gen_args,parent_args.Length, own_args,0, own_args.Length);
|
||||||
|
gen_args := own_args;
|
||||||
|
|
||||||
|
end;
|
||||||
|
TypeToTypeName(parent, res);
|
||||||
|
res.Write('+');
|
||||||
|
end;
|
||||||
|
|
||||||
|
if gen_args.Count<>0 then
|
||||||
|
begin
|
||||||
|
res.Write(name.Remove(name.LastIndexOf('`')));
|
||||||
|
res.Write('<');
|
||||||
|
var any_gen_arg := false;
|
||||||
|
foreach var arg in gen_args do
|
||||||
|
begin
|
||||||
|
if any_gen_arg then
|
||||||
res.Write(', ') else
|
res.Write(', ') else
|
||||||
any_gen_par := true;
|
any_gen_arg := true;
|
||||||
TypeToTypeName(gen_par, res);
|
TypeToTypeName(arg, res);
|
||||||
end;
|
end;
|
||||||
res.Write('>');
|
res.Write('>');
|
||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
if t.IsGenericParameter then
|
||||||
|
res.Write('[');
|
||||||
res.Write(name);
|
res.Write(name);
|
||||||
|
if t.IsGenericParameter then
|
||||||
|
res.Write(']');
|
||||||
end;
|
end;
|
||||||
procedure TypeToTypeName(t: System.Type; res: StringBuilder) :=
|
procedure TypeToTypeName(t: System.Type; res: StringBuilder) :=
|
||||||
TypeToTypeName(t, new StringWriter(res));
|
TypeToTypeName(t, new StringWriter(res));
|
||||||
|
|
||||||
procedure TypeName(o: object; res: TextWriter);
|
procedure TypeName(o: object; res: TextWriter);
|
||||||
begin
|
begin
|
||||||
|
|
@ -4624,7 +4679,7 @@ begin
|
||||||
TypeToTypeName(t, res);
|
TypeToTypeName(t, res);
|
||||||
end;
|
end;
|
||||||
procedure TypeName(o: object; res: StringBuilder) :=
|
procedure TypeName(o: object; res: StringBuilder) :=
|
||||||
TypeName(o, new StringWriter(res));
|
TypeName(o, new StringWriter(res));
|
||||||
|
|
||||||
function TypeToTypeName(t: System.Type): string;
|
function TypeToTypeName(t: System.Type): string;
|
||||||
begin
|
begin
|
||||||
|
|
@ -4641,9 +4696,9 @@ begin
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure _ObjectToString(o: object; res: TextWriter) :=
|
procedure _ObjectToString(o: object; res: TextWriter) :=
|
||||||
ObjectToStringUtils.Append(o, new Stack<object>, res);
|
ObjectToStringUtils.Append(o, new Stack<object>, res);
|
||||||
procedure _ObjectToString(o: object; res: StringBuilder) :=
|
procedure _ObjectToString(o: object; res: StringBuilder) :=
|
||||||
_ObjectToString(o, new StringWriter(res));
|
_ObjectToString(o, new StringWriter(res));
|
||||||
function _ObjectToString(o: object): string;
|
function _ObjectToString(o: object): string;
|
||||||
begin
|
begin
|
||||||
var res := new StringBuilder;
|
var res := new StringBuilder;
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@ type
|
||||||
|
|
||||||
Panel = Panel;
|
Panel = Panel;
|
||||||
Grid = Grid;
|
Grid = Grid;
|
||||||
Canvas = Canvas;
|
Canvas = System.Windows.Controls.Canvas;
|
||||||
StackPanel = StackPanel;
|
StackPanel = StackPanel;
|
||||||
DockPanel = DockPanel;
|
DockPanel = DockPanel;
|
||||||
WrapPanel = WrapPanel;
|
WrapPanel = WrapPanel;
|
||||||
|
|
@ -45,7 +45,7 @@ type
|
||||||
|
|
||||||
DrawingVisual = DrawingVisual;
|
DrawingVisual = DrawingVisual;
|
||||||
|
|
||||||
Thickness = Thickness;
|
Thickness = System.Windows.Thickness;
|
||||||
TThickness = Thickness;
|
TThickness = Thickness;
|
||||||
FontStyle = FontStyle;
|
FontStyle = FontStyle;
|
||||||
FontStyles = FontStyles;
|
FontStyles = FontStyles;
|
||||||
|
|
@ -212,8 +212,8 @@ begin
|
||||||
Result := Self;
|
Result := Self;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function &With(Self: StackPanel; Background: Brush := nil;
|
function &With<T>(Self: T; Background: Brush := nil;
|
||||||
Color: TColor := Colors.White): StackPanel; extensionmethod;
|
Color: TColor := Colors.White): T; extensionmethod; where T: Panel;
|
||||||
begin
|
begin
|
||||||
if Background <> nil then
|
if Background <> nil then
|
||||||
Self.Background := Background
|
Self.Background := Background
|
||||||
|
|
@ -221,14 +221,14 @@ begin
|
||||||
Result := Self;
|
Result := Self;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function &With(Self: Canvas; Background: Brush := nil;
|
{function &With(Self: Canvas; Background: Brush := nil;
|
||||||
Color: TColor := Colors.White): Canvas; extensionmethod;
|
Color: TColor := Colors.White): Canvas; extensionmethod;
|
||||||
begin
|
begin
|
||||||
if Background <> nil then
|
if Background <> nil then
|
||||||
Self.Background := Background
|
Self.Background := Background
|
||||||
else Self.Background := GBrush(color);
|
else Self.Background := GBrush(color);
|
||||||
Result := Self;
|
Result := Self;
|
||||||
end;
|
end;}
|
||||||
|
|
||||||
function AsMainContent<T>(Self: T): T; extensionmethod; where T: FrameworkElement;
|
function AsMainContent<T>(Self: T): T; extensionmethod; where T: FrameworkElement;
|
||||||
begin
|
begin
|
||||||
|
|
@ -264,28 +264,37 @@ begin
|
||||||
DockPanel.SetDock(c,dock);
|
DockPanel.SetDock(c,dock);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure StackPanel.Add(c: FrameworkElement);
|
{procedure StackPanel.Add(c: FrameworkElement);
|
||||||
begin
|
begin
|
||||||
Self.Children.Add(c);
|
Self.Children.Add(c);
|
||||||
end;
|
end;}
|
||||||
|
|
||||||
procedure StackPanel.AddElements(params aa: array of FrameworkElement);
|
procedure Panel.AddElements(params aa: array of FrameworkElement);
|
||||||
begin
|
begin
|
||||||
foreach var c in aa do
|
foreach var c in aa do
|
||||||
Self.Children.Add(c);
|
Self.Children.Add(c);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function ArrControls(params cc: array of Control) := cc;
|
function ControlsList(params cc: array of Control) := Lst(cc);
|
||||||
|
|
||||||
procedure StackPanel.AddControls(controls: sequence of Control;
|
function ControlsList(cc: sequence of Control) := Lst(cc);
|
||||||
Width: real := real.NaN; Height: real := real.NaN; Padding: Thickness := 0; Margin: Thickness := 0);
|
|
||||||
|
procedure Panel.AddControls(controls: sequence of Control;
|
||||||
|
Width: real := real.NaN; Height: real := real.NaN; Padding: Thickness := -1; Margin: Thickness := -1;
|
||||||
|
FontSize: real := real.NaN);
|
||||||
begin
|
begin
|
||||||
foreach var b in controls do
|
foreach var b in controls do
|
||||||
begin
|
begin
|
||||||
b.Margin := Margin;
|
if Margin <> -1 then
|
||||||
b.Padding := Padding;
|
b.Margin := Margin;
|
||||||
b.Width := Width;
|
if Padding <> -1 then
|
||||||
b.Height := Height;
|
b.Padding := Padding;
|
||||||
|
if not real.IsNaN(Width) then
|
||||||
|
b.Width := Width;
|
||||||
|
if not real.IsNaN(Height) then
|
||||||
|
b.Height := Height;
|
||||||
|
if not real.IsNaN(FontSize) then
|
||||||
|
b.FontSize := FontSize;
|
||||||
Self.Add(b);
|
Self.Add(b);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
@ -305,7 +314,8 @@ function Init(Self: FrameworkElement; Width: real := real.NaN; Height: real := r
|
||||||
Margin: Thickness := 0): FrameworkElement; extensionmethod;
|
Margin: Thickness := 0): FrameworkElement; extensionmethod;
|
||||||
begin
|
begin
|
||||||
Self.Width := Width;
|
Self.Width := Width;
|
||||||
Self.Height := Height;
|
if not real.IsNaN(Height) then
|
||||||
|
Self.Height := Height;
|
||||||
Self.Margin := Margin;
|
Self.Margin := Margin;
|
||||||
Result := Self;
|
Result := Self;
|
||||||
end;
|
end;
|
||||||
|
|
|
||||||
6
TestSuite/GetAvaiter.pas
Normal file
6
TestSuite/GetAvaiter.pas
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
uses System.Threading.Tasks;
|
||||||
|
|
||||||
|
begin
|
||||||
|
var tt := new Task<integer>(()->1);
|
||||||
|
var q := tt.GetAwaiter
|
||||||
|
end.
|
||||||
|
|
@ -571,6 +571,11 @@ var
|
||||||
GenerateTestData: integer -> () := nil;
|
GenerateTestData: integer -> () := nil;
|
||||||
TestMode: TestModeType := tmNone;
|
TestMode: TestModeType := tmNone;
|
||||||
TestNumber: integer;
|
TestNumber: integer;
|
||||||
|
|
||||||
|
/// Включить дополнительные сообщения о записи в удаленную базу данных
|
||||||
|
procedure SetMessagesOn;
|
||||||
|
/// Выключить дополнительные сообщения о записи в удаленную базу данных
|
||||||
|
procedure SetMessageOff;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
|
|
@ -612,6 +617,9 @@ var
|
||||||
TaskNamesMap := new Dictionary<string,string>;
|
TaskNamesMap := new Dictionary<string,string>;
|
||||||
|
|
||||||
ServerAddr := 'https://air.mmcs.sfedu.ru/pascalabc';
|
ServerAddr := 'https://air.mmcs.sfedu.ru/pascalabc';
|
||||||
|
|
||||||
|
// Дополнительные сообщения о записи в удаленную базу данных
|
||||||
|
additionalMessages := False;
|
||||||
|
|
||||||
{=========================================================}
|
{=========================================================}
|
||||||
{ Типы, связанные с сетью }
|
{ Типы, связанные с сетью }
|
||||||
|
|
@ -2807,11 +2815,19 @@ end;
|
||||||
{ Процедуры для записи в базы данных }
|
{ Процедуры для записи в базы данных }
|
||||||
{=========================================================}
|
{=========================================================}
|
||||||
|
|
||||||
|
procedure AdditionalMessage(message: string);
|
||||||
|
begin
|
||||||
|
if additionalMessages then
|
||||||
|
ColoredMessage(message, MsgColorMagenta);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure WriteInfoToRemoteDatabase(auth: string; LessonName, TaskName, TaskPlatform, TaskResult, text, AdditionalInfo: string);
|
procedure WriteInfoToRemoteDatabase(auth: string; LessonName, TaskName, TaskPlatform, TaskResult, text, AdditionalInfo: string);
|
||||||
begin
|
begin
|
||||||
|
AdditionalMessage($'WriteInfoToRemoteDatabase начало. Урок {LessonName}, задание {TaskName}, результат {TaskResult}');
|
||||||
// Считать логин пароль из auth
|
// Считать логин пароль из auth
|
||||||
var data := System.IO.File.ReadAllBytes(auth);
|
var data := System.IO.File.ReadAllBytes(auth);
|
||||||
var arr := Decrypt(data).Split(#10);
|
var arr := Decrypt(data).Split(#10);
|
||||||
|
AdditionalMessage($'Логин и пароль расшифрованы');
|
||||||
var login,pass: string;
|
var login,pass: string;
|
||||||
if arr.Length >= 2 then
|
if arr.Length >= 2 then
|
||||||
begin
|
begin
|
||||||
|
|
@ -2819,8 +2835,10 @@ begin
|
||||||
pass := arr[1];
|
pass := arr[1];
|
||||||
// Теперь как-то записать в БД информацию
|
// Теперь как-то записать в БД информацию
|
||||||
var User := new ServerAccessProvider(ServerAddr);
|
var User := new ServerAccessProvider(ServerAddr);
|
||||||
|
AdditionalMessage($'Непосредственно перед SendPostRequest');
|
||||||
var t2 := User.SendPostRequest(login, pass, LessonName, TaskName, TaskPlatform, TaskResult, text, AdditionalInfo);
|
var t2 := User.SendPostRequest(login, pass, LessonName, TaskName, TaskPlatform, TaskResult, text, AdditionalInfo);
|
||||||
var v := t2.Result;
|
var v := t2.Result;
|
||||||
|
AdditionalMessage($'После SendPostRequest - результат: {v}');
|
||||||
v := v;
|
v := v;
|
||||||
if v <> 'Success' then
|
if v <> 'Success' then
|
||||||
ColoredMessage('Ошибка сервера: '+v, MsgColorGray);
|
ColoredMessage('Ошибка сервера: '+v, MsgColorGray);
|
||||||
|
|
@ -2840,6 +2858,12 @@ begin
|
||||||
try
|
try
|
||||||
var auth := FindAuthDat(); // файл авторизации ищется либо в текущей папке либо в папке на уровень выше
|
var auth := FindAuthDat(); // файл авторизации ищется либо в текущей папке либо в папке на уровень выше
|
||||||
var args := System.Environment.GetCommandLineArgs;
|
var args := System.Environment.GetCommandLineArgs;
|
||||||
|
if auth = '' then
|
||||||
|
AdditionalMessage('Файл auth.dat не найден')
|
||||||
|
else if (args.Length < 3) then
|
||||||
|
AdditionalMessage('args.Length < 3')
|
||||||
|
else if args[2].ToLower <> 'true' then
|
||||||
|
AdditionalMessage('args[2].ToLower <> true');
|
||||||
if (auth <> '') and (args.Length >= 3) and (args[2].ToLower = 'true') then
|
if (auth <> '') and (args.Length >= 3) and (args[2].ToLower = 'true') then
|
||||||
begin
|
begin
|
||||||
var text := '';
|
var text := '';
|
||||||
|
|
@ -2851,6 +2875,7 @@ begin
|
||||||
except
|
except
|
||||||
on e: System.AggregateException do
|
on e: System.AggregateException do
|
||||||
begin
|
begin
|
||||||
|
ColoredMessage('->>',MsgColorGray);
|
||||||
foreach var x in e.InnerExceptions do
|
foreach var x in e.InnerExceptions do
|
||||||
if x is HTTPRequestException then
|
if x is HTTPRequestException then
|
||||||
begin
|
begin
|
||||||
|
|
@ -2861,10 +2886,20 @@ begin
|
||||||
else ColoredMessage('Ошибка сервера: '+x.Message,MsgColorGray);
|
else ColoredMessage('Ошибка сервера: '+x.Message,MsgColorGray);
|
||||||
end;
|
end;
|
||||||
on e: Exception do
|
on e: Exception do
|
||||||
ColoredMessage(e.Message,MsgColorGray);
|
ColoredMessage('Исключение в WriteInfoToDatabases: '+e.Message,MsgColorGray);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure SetMessagesOn;
|
||||||
|
begin
|
||||||
|
additionalMessages := True;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure SetMessageOff;
|
||||||
|
begin
|
||||||
|
additionalMessages := False;
|
||||||
|
end;
|
||||||
|
|
||||||
{===========================================================}
|
{===========================================================}
|
||||||
{ Переопределенные подсистемы ввода и вывода }
|
{ Переопределенные подсистемы ввода и вывода }
|
||||||
{===========================================================}
|
{===========================================================}
|
||||||
|
|
|
||||||
|
|
@ -1141,19 +1141,19 @@
|
||||||
<member name="M:TypedFileRead(PABCSystem.TypedFile)">
|
<member name="M:TypedFileRead(PABCSystem.TypedFile)">
|
||||||
<summary>--</summary>
|
<summary>--</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:FilePos(@file)">
|
<member name="M:FilePos(PABCSystem.BinaryFile)">
|
||||||
<summary>--</summary>
|
<summary>--</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:FileSize(@file)">
|
<member name="M:FileSize(PABCSystem.BinaryFile)">
|
||||||
<summary>--</summary>
|
<summary>--</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:Seek(@file,System.Int64)">
|
<member name="M:Seek(PABCSystem.BinaryFile,System.Int64)">
|
||||||
<summary>--</summary>
|
<summary>--</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:BinaryFileInit(@file@)">
|
<member name="M:BinaryFileInit(PABCSystem.BinaryFile@)">
|
||||||
<summary>--</summary>
|
<summary>--</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:BinaryFileRead(@file@,System.Type)">
|
<member name="M:BinaryFileRead(PABCSystem.BinaryFile@,System.Type)">
|
||||||
<summary>--</summary>
|
<summary>--</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:PascalABCVersion">
|
<member name="M:PascalABCVersion">
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@ type
|
||||||
|
|
||||||
Panel = Panel;
|
Panel = Panel;
|
||||||
Grid = Grid;
|
Grid = Grid;
|
||||||
Canvas = Canvas;
|
Canvas = System.Windows.Controls.Canvas;
|
||||||
StackPanel = StackPanel;
|
StackPanel = StackPanel;
|
||||||
DockPanel = DockPanel;
|
DockPanel = DockPanel;
|
||||||
WrapPanel = WrapPanel;
|
WrapPanel = WrapPanel;
|
||||||
|
|
@ -45,7 +45,7 @@ type
|
||||||
|
|
||||||
DrawingVisual = DrawingVisual;
|
DrawingVisual = DrawingVisual;
|
||||||
|
|
||||||
Thickness = Thickness;
|
Thickness = System.Windows.Thickness;
|
||||||
TThickness = Thickness;
|
TThickness = Thickness;
|
||||||
FontStyle = FontStyle;
|
FontStyle = FontStyle;
|
||||||
FontStyles = FontStyles;
|
FontStyles = FontStyles;
|
||||||
|
|
@ -212,8 +212,8 @@ begin
|
||||||
Result := Self;
|
Result := Self;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function &With(Self: StackPanel; Background: Brush := nil;
|
function &With<T>(Self: T; Background: Brush := nil;
|
||||||
Color: TColor := Colors.White): StackPanel; extensionmethod;
|
Color: TColor := Colors.White): T; extensionmethod; where T: Panel;
|
||||||
begin
|
begin
|
||||||
if Background <> nil then
|
if Background <> nil then
|
||||||
Self.Background := Background
|
Self.Background := Background
|
||||||
|
|
@ -221,14 +221,14 @@ begin
|
||||||
Result := Self;
|
Result := Self;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function &With(Self: Canvas; Background: Brush := nil;
|
{function &With(Self: Canvas; Background: Brush := nil;
|
||||||
Color: TColor := Colors.White): Canvas; extensionmethod;
|
Color: TColor := Colors.White): Canvas; extensionmethod;
|
||||||
begin
|
begin
|
||||||
if Background <> nil then
|
if Background <> nil then
|
||||||
Self.Background := Background
|
Self.Background := Background
|
||||||
else Self.Background := GBrush(color);
|
else Self.Background := GBrush(color);
|
||||||
Result := Self;
|
Result := Self;
|
||||||
end;
|
end;}
|
||||||
|
|
||||||
function AsMainContent<T>(Self: T): T; extensionmethod; where T: FrameworkElement;
|
function AsMainContent<T>(Self: T): T; extensionmethod; where T: FrameworkElement;
|
||||||
begin
|
begin
|
||||||
|
|
@ -264,28 +264,37 @@ begin
|
||||||
DockPanel.SetDock(c,dock);
|
DockPanel.SetDock(c,dock);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure StackPanel.Add(c: FrameworkElement);
|
{procedure StackPanel.Add(c: FrameworkElement);
|
||||||
begin
|
begin
|
||||||
Self.Children.Add(c);
|
Self.Children.Add(c);
|
||||||
end;
|
end;}
|
||||||
|
|
||||||
procedure StackPanel.AddElements(params aa: array of FrameworkElement);
|
procedure Panel.AddElements(params aa: array of FrameworkElement);
|
||||||
begin
|
begin
|
||||||
foreach var c in aa do
|
foreach var c in aa do
|
||||||
Self.Children.Add(c);
|
Self.Children.Add(c);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function ArrControls(params cc: array of Control) := cc;
|
function ControlsList(params cc: array of Control) := Lst(cc);
|
||||||
|
|
||||||
procedure StackPanel.AddControls(controls: sequence of Control;
|
function ControlsList(cc: sequence of Control) := Lst(cc);
|
||||||
Width: real := real.NaN; Height: real := real.NaN; Padding: Thickness := 0; Margin: Thickness := 0);
|
|
||||||
|
procedure Panel.AddControls(controls: sequence of Control;
|
||||||
|
Width: real := real.NaN; Height: real := real.NaN; Padding: Thickness := -1; Margin: Thickness := -1;
|
||||||
|
FontSize: real := real.NaN);
|
||||||
begin
|
begin
|
||||||
foreach var b in controls do
|
foreach var b in controls do
|
||||||
begin
|
begin
|
||||||
b.Margin := Margin;
|
if Margin <> -1 then
|
||||||
b.Padding := Padding;
|
b.Margin := Margin;
|
||||||
b.Width := Width;
|
if Padding <> -1 then
|
||||||
b.Height := Height;
|
b.Padding := Padding;
|
||||||
|
if not real.IsNaN(Width) then
|
||||||
|
b.Width := Width;
|
||||||
|
if not real.IsNaN(Height) then
|
||||||
|
b.Height := Height;
|
||||||
|
if not real.IsNaN(FontSize) then
|
||||||
|
b.FontSize := FontSize;
|
||||||
Self.Add(b);
|
Self.Add(b);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
@ -305,7 +314,8 @@ function Init(Self: FrameworkElement; Width: real := real.NaN; Height: real := r
|
||||||
Margin: Thickness := 0): FrameworkElement; extensionmethod;
|
Margin: Thickness := 0): FrameworkElement; extensionmethod;
|
||||||
begin
|
begin
|
||||||
Self.Width := Width;
|
Self.Width := Width;
|
||||||
Self.Height := Height;
|
if not real.IsNaN(Height) then
|
||||||
|
Self.Height := Height;
|
||||||
Self.Margin := Margin;
|
Self.Margin := Margin;
|
||||||
Result := Self;
|
Result := Self;
|
||||||
end;
|
end;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue