OberonCore
https://forum.oberoncore.ru/

Переход к определению
https://forum.oberoncore.ru/viewtopic.php?f=22&t=6343
Страница 2 из 3

Автор:  Sergej Durmanov [ Воскресенье, 03 Февраль, 2019 18:54 ]
Заголовок сообщения:  Re: Переход к определению

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

Автор:  budden [ Воскресенье, 03 Февраль, 2019 19:04 ]
Заголовок сообщения:  Re: Переход к определению

Какая разница между объектным и символьным в данном случае?

Автор:  Sergej Durmanov [ Воскресенье, 03 Февраль, 2019 19:11 ]
Заголовок сообщения:  Re: Переход к определению

budden писал(а):
Какая разница между объектным и символьным в данном случае?

Символьный файл это интерфейс модуля в текстовом формате, а объектный это загружаемый модуль с машинным кодом.

Автор:  budden [ Воскресенье, 03 Февраль, 2019 20:22 ]
Заголовок сообщения:  Re: Переход к определению

Так нормально ли будет загрузить в символьный, а не в объектный, вот в чём вопрос.

Автор:  budden [ Понедельник, 04 Февраль, 2019 11:55 ]
Заголовок сообщения:  Re: Переход к определению

Вчера я частично преуспел в генерации константы (всё классно, только созданный объектный файл не загружается). Она будет жить в объектом файле, а в символьный, как я понял, сама попадёт. В связи с этим вопрос: можно ли открыть объектный файл и прочитать из него константу с заданным именем, не загружая этот файл? Тот же вопрос про символьный файл.

Но мне стала открываться глубина бездны. Чтобы перейти к определению метода, нужно найти все его реализации и показать их. Т.е. нужно индексированное хранилище, которое будет ещё и следить за изменениями в символьных файлах. В лиспе это решено проще - метаинформация берётся прямо из рантайма. Но в обероне всё по-другому и этот вариант не работает.

Автор:  Trurl [ Понедельник, 04 Февраль, 2019 12:24 ]
Заголовок сообщения:  Re: Переход к определению

budden писал(а):
Но мне стала открываться глубина бездны. Чтобы перейти к определению метода, нужно найти все его реализации и показать их.

И даже те, которые еще не написаны.

Автор:  budden [ Понедельник, 04 Февраль, 2019 14:00 ]
Заголовок сообщения:  Re: Переход к определению

Ирония тут неуместна. Нечего сказать - просто держитесь в стороне.

Автор:  budden [ Понедельник, 04 Февраль, 2019 14:42 ]
Заголовок сообщения:  Re: Переход к определению

А как генерируется документация? Там нет ли списка всех методов? Я нашёл в FoxBackend.Mod в конце какую-то команду,
она меня обругала и html файл не создался. Не хватает файла шаблона, файл такой нигде не нашёл.

Автор:  Trurl [ Понедельник, 04 Февраль, 2019 15:58 ]
Заголовок сообщения:  Re: Переход к определению

budden писал(а):
Ирония тут неуместна.

Я просто пытаюсь ускорить осознание того факта, что все реализации метода показать невозможно.

Автор:  budden [ Понедельник, 04 Февраль, 2019 16:45 ]
Заголовок сообщения:  Re: Переход к определению

Смотрите сами что-нибудь не осознайте :wink: Уже написанные показать можно и нужно. Потому что если есть вызов типа
переменнаяКлассаИкс.Метод, то для исчерпывающего анализа происходящего в конкретной программе нужно увидеть
методы для классаИкс и всех его известных потомков классаИкс.

Автор:  Kemet [ Понедельник, 04 Февраль, 2019 16:52 ]
Заголовок сообщения:  Re: Переход к определению

budden писал(а):
Вчера я частично преуспел в генерации константы (всё классно, только созданный объектный файл не загружается). Она будет жить в объектом файле, а в символьный, как я понял, сама попадёт. В связи с этим вопрос: можно ли открыть объектный файл и прочитать из него константу с заданным именем, не загружая этот файл? Тот же вопрос про символьный файл.
Можно - нужно парсить файл. Компилятор так и поступает с символьными файлами, имена которых находятся в списке импорта. Это, в отличии от разбора всего программного модуля, ускорят компиляцию и снижает нагрузку на память, так как используется только публичный интерфейс. Но этой информации недостаточно для перехода к определению, так как символьный файл не содержит информации о расположении сущностей в программном модуле.
budden писал(а):
Но мне стала открываться глубина бездны. Чтобы перейти к определению метода, нужно найти все его реализации и показать их. Т.е. нужно индексированное хранилище, которое будет ещё и следить за изменениями в символьных файлах. В лиспе это решено проще - метаинформация берётся прямо из рантайма. Но в обероне всё по-другому и этот вариант не работает.

Так модули квалифицированы, нужно лишь пройтись по списку импорта, "отматывая назад" до нахождения реализации.

Автор:  budden [ Понедельник, 04 Февраль, 2019 18:15 ]
Заголовок сообщения:  Re: Переход к определению

Я имею в виду виртуальные методы. Если есть БазовыйКласс.Метод, РасширенныйКласс1.Метод и РасширенныйКласс2.Метод, то единственным внятным ответом на вопрос «покажи мне определение для переменнаяБазовогоКласса.Метод» является вывод списка всех трёх этих методов, поскольку вызваться может любой из них. А чтобы получить список потомков, нужно перерыть все доступные символьные файлы, из них выбрать те, которые импортируют модуль, где определён БазовыйКласс, прямо или косвенно, и поискать в каждом.

> Компилятор так и поступает с символьными файлами, имена которых находятся в списке импорта.
Спасибо. Вопрос в том, возможно ли это сделать без побочных эффектов. Надо посмотреть.

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

Автор:  budden [ Понедельник, 04 Февраль, 2019 18:16 ]
Заголовок сообщения:  Re: Переход к определению

Немного не в тему - меня уже почти совсем выгнали с работы. Дальше, скорее всего, придётся всю эту тему поставить на паузу, хотя очень жаль. Мне очень понравилась A2, хотя, конечно, для юзабилити нужно многое допиливать.

Автор:  budden [ Понедельник, 04 Февраль, 2019 22:21 ]
Заголовок сообщения:  Re: Переход к определению

Похоже, что игра окончена. Вы тут обсуждали какие-то титанические изменения, а я-то понимал, насколько мало ресурсов.
Всё, что я успел - это научиться добавлять константу с именем исходника в модуль, которое работает только при компиляции командой Compiler.Compile, но не при компиляции из PET.

В объектный и символьный файл добавляется вот такая константа:
Код:
__dEfInEdInThEFilE__* = \"C:/ob/A2OS/Source/PET.Mod"\;


Исходник - тут: https://github.com/budden/ch115

Различие - вот:
Код:
 source/FoxParser.Mod | 28 +++++++++++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)

diff --git a/source/FoxParser.Mod b/source/FoxParser.Mod
index b4302bc7c..78c7a1862 100644
--- a/source/FoxParser.Mod
+++ b/source/FoxParser.Mod
@@ -2273,6 +2273,22 @@ TYPE
          IF Trace THEN E( "TypeDeclaration" ) END;
       END TypeDeclaration;
 
+      (** Compiler-generated constant *)
+      PROCEDURE GenerateStringConstantDeclaration*(parentScope: SyntaxTree.Scope
+        ; name: SyntaxTree.Identifier
+        ; position: Position
+        ; value: Scanner.StringType );
+      VAR constant: SyntaxTree.Constant;
+      BEGIN
+      IF Trace THEN S( "GenerateStringConstantDeclaration" ) END;
+      constant := SyntaxTree.NewConstant( position, name );
+      constant.SetAccess(SyntaxTree.Public + SyntaxTree.Protected + SyntaxTree.Internal);
+      constant.SetValue(SyntaxTree.NewStringValue( position, value ));
+      parentScope.AddConstant( constant );
+            
+      IF Trace THEN E( "GenerateStringConstantDeclaration" ) END;
+      END GenerateStringConstantDeclaration;
+
       (** ConstDeclaration = IdentifierDefinition '=' Expression. **)
       PROCEDURE ConstDeclaration(parentScope: SyntaxTree.Scope );
       VAR name: SyntaxTree.Identifier;  position: Position; constant: SyntaxTree.Constant;  expression: SyntaxTree.Expression;  access: SET;
@@ -2387,8 +2403,11 @@ TYPE
       **)
 
       PROCEDURE Module*(): SyntaxTree.Module;
-      VAR moduleName, context: SyntaxTree.Identifier;  module: SyntaxTree.Module;  position: Position; isCellNet: BOOLEAN;
+      VAR moduleName, context: SyntaxTree.Identifier; 
+        sourceFileNameConstName: SyntaxTree.Identifier;
+         module: SyntaxTree.Module;  position: Position; isCellNet: BOOLEAN;
          scannerDiagnostics: Diagnostics.Diagnostics; modifiers: SyntaxTree.Modifier; (* c: SyntaxTree.Comment; *)
+         
       BEGIN
          IF Trace THEN S( "Module" ) END;
          position := token.position;
@@ -2425,6 +2444,13 @@ TYPE
 
             WHILE Optional(Scanner.Import) DO ImportList(moduleScope) END;
             DeclarationSequence( moduleScope);
+
+            StringPool.GetIndex("__dEfInEdInThEFilE__", sourceFileNameConstName);
+            GenerateStringConstantDeclaration(currentScope
+               , sourceFileNameConstName   
+               , position
+               , scanner.source);
+            
             IF Peek(Scanner.Begin) OR Peek(Scanner.Code) THEN
                moduleScope.SetBodyProcedure(BodyProcedure(moduleScope)); (* insert empty body procedure if necessary *)
             END;


Больше всего меня бесят пока что две вещи - это сложность сборки (вместо подачи одной команды нужно проделать эн манипуляций мышью), её хрупкость (это можно было бы решив, продублировав компилятор) и строки. Это всё можно было бы решить, если бы было на это время. Ну и со шрифтами какой-то ад. Шрифт Оберон мне не нравится, а сделать иной шрифт по умолчанию
мне не удалось - там явно что-то не в порядке с кодом чтения-записи модулей. Я поставил курьер и всё вроде бы работало, но в самый неудачный момент, когда надо было собирать систему, сломался этот вот CompileCommand.Tool . Пришлось вернуться к шрифту Оберон.

По ходу дела переставил конфликтующие Ctrl-Tab и Ctrl-Shift-Tab в PET на Ctrl-7 и Ctrl-Shift-7, на это было потрачено драгоценное время, а зря.

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

От этой константы до решения по поиску определения ещё пахать и пахать, конечно же. Вряд ли у меня есть на это время.

Автор:  Kemet [ Вторник, 05 Февраль, 2019 05:54 ]
Заголовок сообщения:  Re: Переход к определению

budden писал(а):
Больше всего меня бесят пока что две вещи - это сложность сборки (вместо подачи одной команды нужно проделать эн манипуляций мышью), её хрупкость (это можно было бы решив, продублировав компилятор) и строки. Это всё можно было бы решить, если бы было на это время. Ну и со шрифтами какой-то ад. Шрифт Оберон мне не нравится, а сделать иной шрифт по умолчанию
мне не удалось - там явно что-то не в порядке с кодом чтения-записи модулей.Я поставил курьер и всё вроде бы работало, но в самый неудачный момент, когда надо было собирать систему, сломался этот вот CompileCommand.Tool . Пришлось вернуться к шрифту Оберон.
Компилировать можно из командной оболочки Menu->Tools->Shell, или убрав в файле конфигурации загрузку всего, что связано с графикой и рабочим столом, и останешься в текстовом режиме с тем же Shell'ом.
Системный шрифт меняется в конфигурации Menu->System->Confuguration - ищем ветку WindowManager/FontManager/DefaultFont.
Код:
<Section name="DefaultFont">
   <Setting name="Name" value="Vera"/>
   <Setting name="Size" value="14"/>
</Section>

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

Автор:  budden [ Вторник, 05 Февраль, 2019 10:01 ]
Заголовок сообщения:  Re: Переход к определению

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

Шрифты я пытался исправить не только в файле конфигурации, см. историю TextUtilities. Но шрифт Оберон оказался прибит большим количеством гвоздей и не успел разобраться со всеми из них. Поскольку в таком виде текст (для меня) очень мелкий, приходилось увеличивать абсолютно каждый открываемый документ. Это - болезнь многих систем из 90-х - зерно современных мониторов намного меньше и без возможности быстро всё увеличить пользоваться такими системами я не могу - здоровье дороже. Масштабирование всего экрана плохо дружит с Alt-Enter, поэтому им тоже пользоваться нельзя. Хотя было бы проще, наверное, починить Alt-Enter. Но умная мысля приходит опосля. Короче, тут явно не хватает настроек в системе, и мне не удалось решить эту проблему, а время я на неё потратил.

Шрифт по умолчанию в PET вроде ставился из файла конфигурации, но при попытке увеличить шрифт в текстовом окне опять сбрасывается на оберон. В итоге приходится постоянно держать на экране инструмент выбора шрифтов и при открытии каждого документа помечать весь текст и применять шрифт курьер 18.

В общем, со шрифтами какой-то крупный непорядок.

Shell в данной системе уступает идеологии «текст как набор команд». Добавить бы в него хранение истории в файле - и он был бы вполне приемлем (я шеллы люблю больше, чем «текст как набор команд»). А так приходится каждый раз после старта системы все команды набирать заново - это неэффективно.

Теперь мне надо думать о поиске работы, и мне некогда заниматься этой игрушкой. Игрушка славная, жаль, что я не знал про неё года 3-4 назад. Но монетизировать её в ближайшем будущем не представляю как. Поэтому пришлось сделать волевое усилие и прекратить.

Автор:  Kemet [ Вторник, 05 Февраль, 2019 11:20 ]
Заголовок сообщения:  Re: Переход к определению

В текстовом окне работают сочетания Ctrl+MouseWheel для масштабирования шрифта текста.

Автор:  Trurl [ Вторник, 05 Февраль, 2019 15:05 ]
Заголовок сообщения:  Re: Переход к определению

budden писал(а):
Уже написанные показать можно и нужно.

Ладно, подожду пока встретите процедурную переменную.

Автор:  budden [ Вторник, 05 Февраль, 2019 18:41 ]
Заголовок сообщения:  Re: Переход к определению

Kemet писал(а):
В текстовом окне работают сочетания Ctrl+MouseWheel для масштабирования шрифта текста.

Я уже сейчас не буду это повторять, но в моём случае я устанавливал шрифт по умолчанию в cour. Дальше открывался PET со шрифтом cour, и при масштабировании превращался в Оберон. Я об этом уже написал в прошлом большом сообщении, хотя, возможно, недостаточно детально:
Цитата:
Шрифт по умолчанию в PET вроде ставился из файла конфигурации, но при попытке увеличить шрифт в текстовом окне опять сбрасывается на оберон. В итоге приходится постоянно держать на экране инструмент выбора шрифтов и при открытии каждого документа помечать весь текст и применять шрифт курьер 18.


Цитата:
Ладно, подожду пока встретите процедурную переменную.

Ждать долго придётся - этот проект заморожен, если кто-то ещё не понял, т.к. я сейчас занят поиском работы. Однако для процедурной переменной можно показать только исходник самой переменной, а не функции, которая в ней "сейчас" записана (показать функцию, которая записана, в версии - это отдельная задача, хотя, возможно, и решаемая) и уж тем более не всех определённых процедур, имеющих такой же процедурный тип. Хотя - почему бы и нет? Тоже имеет смысл. Но это ничего не значит для методов, которые устроены по-другому.

Автор:  Sergej Durmanov [ Вторник, 05 Февраль, 2019 18:50 ]
Заголовок сообщения:  Re: Переход к определению

Да вроде зум шрифта в текстовых полях работат, сейчас тоже проверил ' активировать окно pet и ctrl +wheel работает . Изменяется размер шрифта а не виджетов.

Страница 2 из 3 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/