NETSquirrel - ошибки компилятора и Intellisence

А нельзя ли что-то минимальное - без dll? А то непонятно, как публиковать баг репорт и как проверять .

Ошибка плавающая. Я не могу выявить закономерности, по которой происходит сбой Intellisence. Сначала он показывал одно при библиотеке (уже на PascalABC.NET) и без нее, потом другое. Возможно, прозвучит странно, но на момент я подумал, что сбой в Intellisence в одном месте влияет на сбой его в другой программе.

Тут возможна другая логика. Он показывает последнюю несбойную версию. Возможно, он не восстанввливается после сбоя.

1 лайк

В любом случае - нет «чёткости», к сожалению. Конечно, хотелось бы, чтобы никаких (!) проблем при просмотре примеров (для библиотеки), в частности, не было. Но, это всего лишь пожелание, которое без действий с моей стороны будет воспринято, на мой взгляд, не очень позитивно. Имелась бы возможность узнать что именно творится в Intellisence, чтобы хотя бы знать актуальную ли версию подсказки он показывает - было бы (для меня) хорошо. Только, мне ничего неизвестно о том как в таких случаях поступают разработчики IDE, чтобы помочь отыскать ошибку.

Я тоже не знаю. Надо смотреть код и дебажить. Я с интеллисенсом никогда не разбирался.

Кстати говоря, сами ошибки я беру отсюда. Если пройтись по примерам, то можно заметить и ошибки, связанные со слабым выводом типов-параметров.

Программа для воспроизведения ошибки (возможно, можно ещё упростить):

function MethodA<T>(self: T): array of T; extensionmethod := nil;

function MethodB<T>(self: IEnumerable<T>; delimiter: string := ''): IEnumerable<T>; extensionmethod := nil;

function MethodB<T, TOutput>(self: IEnumerable<T>; selector: Func<T, TOutput>; delimiter: string := ''): IEnumerable<TOutput>; extensionmethod := nil;

begin
  10.MethodA().MethodB();
end.

А в чем здесь ошибка? Intellisense вроде срабатывает

Хотя, недавно воспроизводилась. Сейчас - после перезагрузки IDE - ошибки нет.

Explicit interface implementation - can't define the same method in derived class

type
  IA = interface
    procedure P();
  end;
  
  A = class(IA)
  public
    procedure IA.P();
    begin
    end;
  end;
  
  B = class(A, IA)
  public
    procedure IA.P(); // another implementation of P [Program1.pas(15) : Повторное объявление]
    begin
    end;
  end;

begin
end.
Подробности
  • Метод обхода проблемы опубликован здесь.
  • Затронуты следующие интерфейсы: NETSquirrel.ICloneable<T>.
  • Исправлено в PascalABC.NET 3.5.1.2281.

А по моему вопрос не так должен стоять.

Интерфейсы это фича .Net, поэтому они должны вести себя как в других .Net языках.

Только, по моему, это не та тема для обсуждения этого.

Та, поскольку баг напрямую был выявлен через NETSquirrel:

В Visual Basic.NET и C# - аналогичный код работает, но:

, ибо хоть интерфейсы - это вещь, связанная с NET (в данном языке), но у нас PascalABC.NET, а не C# или Visual Basic.NET.

Вообще, я поднимал этот вопрос, прежде всего, для того, чтобы выяснить должно ли так быть, или нет, а не менять язык. Решающим будет слово разработчиков. Моя задача лишь - донести до них свой вопрос.

Пример с интерфейсом ICloneable<T>: Prototype.pas (1.4 KB)

1 лайк

Как минимум, надо сначала сесть и изучить, как такое реализовать в том же FPC, если это вообще возможно. Проще выслушать мнение разработчиков.

Наследовать так, как указано, но только от класса, либо только интерфейс - не проблема, все работает. Можно ли наследовать сразу и от класса, поддерживающего интерфейс, и от этого интерфейса, причем метод с теми же параметрами (точнее, без всяких) - тут я не знаю.

P.S. Кстати, вот так не ругается:

type
  IA = interface
    procedure P();
  end;
  
  A = class(IA)
  public
    procedure IA.P();
    begin
    end;
  end;
  
  B = class(A)
  public
    procedure P();
    begin
    end;
  end;

begin
end.

Подозреваю, что если наследуется класс А, наследующий интерфейс, вместе с ним наследуется и интерфейс.

1 лайк

Мне кажется, это Issue. Делайте.

1 лайк

@Sun_Serega, Вы можете делать Issue.

1 лайк

Можно оформить ещё Issue: LMB открывает интерфейс ICloneable, вместо ICloneable<T> (воспроизводил на том примере).

Нужен код без библиотеки. У меня есть дела поинтереснее, чем минимальный код такой мелочи искать.

LMB click works incorrect in generic interface placed in unit case

uses Test;
uses System;

type
  T = class(ICloneable<T>) // LMB click here opens System.ICloneable
  public
    function Clone(): T := nil;
    function ICloneable.Clone(): object := nil;
  end;

begin
end.
unit Test;

type
  ICloneable<T> = interface(System.ICloneable)
    function Clone(): T;
  end;

end.

Обязательно использовать модуль, в случае библиотеки (на PascalABC.NET) - не воспроизводится.

1 лайк

Пофиксили

2 лайка