Ошибки PascalABC.NET

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

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'

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

type
  t1 = abstract sealed class end;

begin end.

Program1.pas(2) : Абстрактный класс не может иметь атрибут sealed

Приплыли… С чего это вдруг? Так ведь часто делают, взять только System.Math

2 лайка

Ах вот как, кажется @ibond невнимательно прочитал что я писал в #727 и не подумав исправил то что не надо было… Верните назад и исправьте то что я писал в той issue, пожалуйста))

2 лайка

При нажатии на кнопку “Форматировать код” срезы двоятся.

было a[2:], после форматирования становится a[22:]
было a[1::-1], после форматирования становится a[11::-1-1]
было a[::-1], после форматирования становится a[::-1::-1-1]

Пробовал на разных ОС Windows, везде одинаково.

Да, это была #752. В самом последнем билде исправили, обновитесь. Кстати это можно сделать из IDE:

image

На самом деле нужно просто поменять порядок атрибутов на sealed abstract, и никаких проблем не будет. А вообще, зачем убрали final? Ведь всяко удобнее писать final class, чем sealed abstract, да и код понятнее будет.

Версия ОС не влияет на работу автоформатирования кода.

final на сколько я знаю и не было ключевым словом. Его отображал анализатор кода для стандартных sealed классов.

  1. Вы сначала пробуйте а потом уже говорите. Я вот попробовал когда писал и сейчас на всяк, не работает это.

  2. Это всё равно костыль был бы, даже если бы работал.

Только в идеальном случае. И кроме версии ещё всё зависит от того как и что установлено.

это вы запостили неправильный issue. причем тут объявление переменной и абстрактный класс. и класс Math не абстрактный, а статический. public abstract sealed class в C# не работает, возвращать назад не буду.

Issue была про то что экземпляры abstract sealed классов невозможно создать, поэтому и объявлять переменные с их типом надо запретить. Что из названия и содержания Issue было не понятно?

А вы сами проверьте перед тем как писать:

Ну да, в C# он называется статичным, но в паскале нет такого ключевого слова.

Зато в C# есть static. Сейчас в паскале нету способа создать статичный класс, abstract sealed был единственным. Вы решили переделать, чтоб было как в C#?))) Если так - я, лично, не имею ничего против, такая запись короче, но сначала добавьте static, а потом уже убирайте abstract sealed

Кстати, в #526 вы сами сказали что в паскале это должно компилироваться.

@Admin, почему Value доступно из программы?

Первый модуль:

unit A;
type
  T1 = class
  internal
    class Value: integer;
  end;
end.

Второй модуль:

unit B;
uses A;
 
procedure SetValue(x: integer) := T1.Value := x;
 
end.

Программа:

uses A, B;
begin
  T1.Value := 1;
end.

internal значит что Value доступно из всей сборки. То есть обычно это работает как public, но, к примеру, если Value будет в .dll библиотеке - во всей библиотеке будет к нему доступ, но уже в программе которая подключит эту библиотеку доступа не будет.

1 лайк

abstract sealed в таком виде это безусловно бред, потому что позволяет описывать экземплярные методы. надо вводить static, который бы разрешал только статические. и уже запрещать объявлять переменные статических классов как в C#.

1 лайк

@Admin, почему F виден из программы, если:

library A;

type
  T1 = class
  internal 
    class procedure F();begin end;
  end;
end.

?

Я жду ответа от Вас, разработчики.

да ну глупости, не видит компилятор F.