Ошибки PascalABC.NET

И ещё, то что ?. в глобальных выражениях падает есть на гитхабе, а то что оно не форматируется даже в блоке имеет смысл туда добавлять?

begin
  var a:=new byte[0];
  var b := a?.Max;
end.

Компилируется нормально, но форматирование выдаёт:

System.NotImplementedException: Метод или операция не реализована.
   в CodeFormatters.CodeFormatter.DefaultVisit(syntax_tree_node sn)
   в CodeFormatters.CodeFormatter.visit_node(syntax_tree_node sn)
   в CodeFormatters.CodeFormatter.visit(var_def_statement _var_def_statement)
   в CodeFormatters.CodeFormatter.visit_node(syntax_tree_node sn)
   в CodeFormatters.CodeFormatter.visit_node(syntax_tree_node sn)
   в CodeFormatters.CodeFormatter.visit(statement_list _statement_list)
   в CodeFormatters.CodeFormatter.visit_node(syntax_tree_node sn)
   в CodeFormatters.CodeFormatter.visit_node(syntax_tree_node sn)
   в CodeFormatters.CodeFormatter.visit(program_module _program_module)
   в CodeFormatters.CodeFormatter.visit_node(syntax_tree_node sn)
   в CodeFormatters.CodeFormatter.FormatTree(String Text, compilation_unit cu, Int32 cursor_line, Int32 cursor_col)
   в VisualPascalABC.CodeFormattingAction.Execute(TextArea textArea)
   в System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)
   в System.Windows.Forms.ToolStripButton.OnClick(EventArgs e)
   в System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e)
   в System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)
   в System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea)
   в System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   в System.Windows.Forms.Control.WndProc(Message& m)
   в System.Windows.Forms.ToolStrip.WndProc(Message& m)
   в System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

А что значит

?.

?

a?.Max это a=nil?nil:a.Max

© @admin

Последний раз об этой фиче слышали 22 июня 2017))

Но там разве сказано явно, что писать ИмяОбобщения<шаблоннные_параметры>(выражение) запрещено?

Операторы C# - смотрите тут.

На сколько я понял что TMy<T> воспринимает как TMy< T > (то_из_чего_преобразуется), то есть его раскладывает сначала на сравнение оператором < имени шаблона и имени класса T, а затем получившееся <errortype> (то что возвращает оператор сравнения) сравнивает с тем из чего вы преобразуете (то есть Value в вашем случае). Если поставить & перед < - его воспринимает как начало уточнения шаблона а не как оператор, так работает:

type
  TMy<T> = class(System.ICloneable)
  public
    Value: T;
    
    constructor(value_: T);
    begin
      Value := value_;
    end;
    
    function Clone(): object := new TMy<T>(Value);
    function CloneAs() := TMy&<T>(Clone());
  end;

begin
end.

По крайней мере компилируется :wink:

1 лайк

А, да, мы это оказывается доделали. Когда-то в преобразовании типов можно было только имена

@Admin, почему при таком неверном синтаксически коде IntelliSence мне показывает:Ошибка IntelliSence ? Разве не должен ли там стоять символ &?

Ну да, должен, но именно в этом случае кажись только компиляция не проходит, а анализатор кода в порядке (хотя не понятно как то вышло). Ну и пусть удобно ведь. Это не единственный случай когда анализатор кода продолжает подсказывать в ошибочном коде, к примеру это признано фичей:

image

Анализатор кода написан не по полной грамматике PascalABC.NET, а по упрощённой. В частности, отдельно разбирается выражение до точки. И у нас он не может предусмотреть все фичи языка. Если бы мог, то нуждался бы в существенно более долгом алгоритме - после нажатия точки мы бы ждали секунды три.

3 лайка

Версия 3.2 1427 при форматировании кода:

function Dispose(self: integer); extensionmethod := self + 1;
begin
end.

получается:

function Dispose(self: integer); extensionmethod; extensionmethod :=self + 1;

begin
end.

Для чего писать сообщение об ошибках в версии ГОДИЧНОЙ давности? С тех пор столько уже ошибок выявлено (и, как водится, новые добавлены)… Проверять надо всегда на самой свежей версии. Сейчас актуальна версия 3.3.5, сборка 1650 от 01.04.2018.

Проверял не дома - поэтому проверял на том что стояло. А в последней версии - такой ошибки нет.

Видите, фактически ни о чем написали.

Согласен. То что ее нет в новой версии - радует. :slightly_smiling_face:

Почему при форматировании кода вместо:

namespace TestProjectPascal;

type
  IPair = interface
    property X: real;
    property Y: real;
  end;

type
  TPoint = record(IPair)
  private 
    _x, _y: real;
  
  public 
    property X: real read _x write _x;
    property Y: real read _y write _y;
    
    constructor(x_, y_: real);
    begin
      (X, Y) := (x_, y_);
    end;
    
    function ToString(): string; override := $'TPoint: (X: {X}, Y: {Y})';
  end;
end.

на выходе получается это:

libraryTestProjectPascal

type
  IPair = interface
    property X: real;
    property Y: real;
  end;

type
  TPoint = record(IPair)
  private 
    _x, _y: real;
  
  public 
    property X: real read _x write _x;
    property Y: real read _y write _y;
    
    constructor(x_, y_: real);
    begin
      (X, Y) := (x_, y_);
    end;
    
    function ToString(): string; override := $'TPoint: (X: {X}, Y: {Y})';
  end;
end.

? P.S. Это проявилось при работе с проектом.

И второй вопрос:

Почему когда сам набираешь текст при переименовании все нормально, но когда пытаешься вставить какое то слово в название то получаешь что-то на подобии этого?

Потому что фича (namespace) сырая, пусть сначала анализатор кода сделают, глядишь - и это починится.

Приведите пример как было, что куда вставляли и что вышло, при чём не скриншотом а кодом. Архивом если это только в проектах Windows.Forms наблюдается.

Вот архив: Пример.rar (40,2 КБ). Это изначально что было. Попробуйте переименовать какой нибудь из модулей, например, но не набирая название новое, а вставляя какое-нибудь слово в название.

У меня ZipFile не показывает в System.IO.Compression, у кого то ещё наблюдается такая неполадка?

{$reference System.IO.Compression.FileSystem.dll}

begin
  System.IO.Compression.ZipFile.OpenRead('');//компилируется
  System.IO.Compression.
end.

image

#756

1 лайк

Если назвать файл именем, например, PABCExtensions.pas, а затем написать:

begin
  Writeln('Hello world');
end.

, то не выполняется и не компилируется с неадекватным сообщением об ошибке:

Неизвестное имя 'Writeln'

. Почему бы не выдавать сообщение о том, что это недопустимое имя?