pascalabcnet/TreeConverter/SymbolTable/symbol_information.cs
Александр Земляк c69daac622
Рефакторинг таблицы символов, чтобы заполнялся только один словарь (#3417)
* Refactor SymbolTable to improve architecture

* Fix PABCSystem function calls in SPython standard modules

* Fix names search in SymbolTable and CollectNamesFromUsedUnits in Compiler

* Add SemanticRulesConstants.SymbolTableCaseSensitive setting in pcu reader

* Fix case sensitive search in DSSymbolTable class

* Add case sensitive search test cases for SPython

* Leave only one dictionary in SymbolsDictionary class

* Refactor Find function in SymbolsDictionary

* Fix math.pys module

* Fix str.pys

* Imrove Find method in SymbolsDictionary

* DefaultIfEmpty was wrong - need to use Any()
2026-04-06 22:41:26 +03:00

480 lines
16 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using PascalABCCompiler.TreeRealization;
using System.Collections.Generic;
using System.Collections;
namespace System.Collections.Generic
{
using PascalABCCompiler.TreeConverter;
public static class SymbolInfoList
{
public static bool HasOnlyExtensionMethods(this List<SymbolInfo> list)
{
for (int i = 0; i < list.Count; ++i)
if (!(list[i].sym_info is function_node && (list[i].sym_info as function_node).is_extension_method))
return false;
return true;
}
}
}
namespace PascalABCCompiler.TreeConverter
{
public enum access_level {al_none, al_private, al_protected, al_public, al_internal};
public enum symbol_kind {sk_none, sk_overload_function, sk_overload_procedure, sk_indefinite};
public abstract class base_scope
{
public abstract List<SymbolInfo> find(string name);
public abstract base_scope top_scope
{
get;
}
}
/*public class BaseScope
{
public virtual SymbolInfo Find(string name)
{
return null;
}
}*/
//Тип записи в таблице символов.
/*public enum name_information_type
{
nit_base_type, //Пока нигде не используется.
nit_common_type, //Помещается в Сашину таблицу символов в тот момент, когда TreeConverter встречает определение типа.
nit_compiled_type, //Информация, об откомпилированном типе. Находится Ваней в сборках.
nit_basic_function, //Информация о базовом методе. Создается Колей при инициализации модуля System.
nit_common_namespace_function, //Функция, определенная в пространстве имен. Помещается Колей в Сашину таблицу символов.
nit_common_in_function_function, //Функция, определенная в другой функции. Помещается Колей в Сашину таблицу символов.
nit_common_method, //Метод класса. Помещается Колей в Сашину таюлицу символов.
nit_compiled_function, //Метод откомпилированного класса. Находится Ванией в сборках.
nit_common_namespace, //Пространство имен. Пока нигде не добавляется в таблицу символов.
nit_unit, //Помещается Колей в Сашину таблицу символов.
nit_local_variable, //Помещается Колей в Сашину таблицу символов.
nit_namespace_variable, //Помещается Колей в Сашину таблицу символов.
nit_class_field, //Помещается Колей в Сашину таблицу символов.
nit_common_parameter, //Помещается Колей в Сашину таблицу символов.
nit_basic_parameter, //Помещается в таблицу символов при инициализации модуля System.
nit_compiled_parameter, //Не связано с таблицей символов. О этих параметрах знают только откомпилированный функции.
nit_constant_defnition, //Помещается Колей в Сашину таблицу символов.
nit_common_property, //Помещается Колей в Сашину таблицу символов.
nit_compiled_property, //Свойство откомпилированного класса. Находится Ванией в сборках.
nit_basic_property, //Пока нигде не используется.
nit_compiled_variable, //Поле откомпилированного класса. Находится Ванией в сборках.
nit_compiled_namespace
};*/
public class PCUSymbolInfo : SymbolInfo
{
private semantic_node_type _semantic_node_type;
private bool _always_restore;
private bool _is_static;
public semantic_node_type semantic_node_type
{
get
{
return _semantic_node_type;
}
set
{
_semantic_node_type = value;
}
}
public bool always_restore
{
get
{
return _always_restore;
}
set
{
_always_restore = value;
}
}
public bool is_static
{
get
{
return _is_static;
}
set
{
_is_static = value;
}
}
}
public class SymbolInfo
{
public override string ToString() => sym_info.ToString();
public string Name { get; set; }
//private readonly name_information_type _name_information_type;
private definition_node _sym_info;
private access_level _access_level;
private symbol_kind _symbol_kind;
public SymbolTable.Scope scope;
public access_level access_level
{
get
{
return _access_level;
}
set
{
_access_level = value;
}
}
public symbol_kind symbol_kind
{
get
{
return _symbol_kind;
}
set
{
_symbol_kind = value;
}
}
/*public name_information_type name_information_type
{
get
{
return _name_information_type;
}
}*/
public definition_node sym_info
{
get
{
return _sym_info;
}
set
{
_sym_info = value;
}
}
public SymbolInfo()
{
}
public SymbolInfo copy()
{
SymbolInfo si = new SymbolInfo();
si.Name = Name;
si._access_level = this.access_level;
si._sym_info = this._sym_info;
si._symbol_kind = this._symbol_kind;
si.scope = this.scope;
return si;
}
private symbol_kind get_function_kind(function_node fn, bool is_overload)
{
symbol_kind sk;
if (is_overload)
{
if (fn.return_value_type == null)
{
sk = symbol_kind.sk_overload_procedure;
}
else
{
sk = symbol_kind.sk_overload_function;
}
}
else
{
sk = symbol_kind.sk_none;
}
return sk;
}
private symbol_kind get_function_kind(function_node fn)
{
common_function_node cfn = fn as common_function_node;
if (cfn != null)
{
return get_function_kind(cfn, cfn.is_overload);
}
basic_function_node bfn = fn as basic_function_node;
if (bfn != null)
{
return get_function_kind(bfn, bfn.is_overload);
}
return symbol_kind.sk_none;
}
private access_level get_class_member_access_level(SemanticTree.IClassMemberNode icmn)
{
access_level al;
switch (icmn.field_access_level)
{
case SemanticTree.field_access_level.fal_public: al = access_level.al_public; break;
case SemanticTree.field_access_level.fal_protected: al = access_level.al_protected; break;
case SemanticTree.field_access_level.fal_private: al = access_level.al_private; break;
case SemanticTree.field_access_level.fal_internal: al = access_level.al_internal; break;
default:
al = access_level.al_private; break;
}
return al;
}
public SymbolInfo(template_class tc)
{
_sym_info = tc;
_access_level = access_level.al_public;
_symbol_kind = symbol_kind.sk_none;
}
public SymbolInfo(label_node lab)
{
_sym_info = lab;
_access_level = access_level.al_public;
_symbol_kind = symbol_kind.sk_none;
}
public SymbolInfo(compiled_event ce)
{
_sym_info = ce;
_access_level = access_level.al_public;
_symbol_kind = symbol_kind.sk_none;
}
public SymbolInfo(compiled_type_node value)
{
//_name_information_type=name_information_type.nit_compiled_type;
_sym_info = value;
_access_level = access_level.al_public;
_symbol_kind = symbol_kind.sk_none;
}
public SymbolInfo(common_event value)
{
_sym_info = value;
_access_level = get_class_member_access_level(value);
_symbol_kind = symbol_kind.sk_none;
}
public SymbolInfo(common_namespace_event value)
{
_sym_info = value;
_access_level = access_level.al_public;
_symbol_kind = symbol_kind.sk_none;
}
public SymbolInfo(function_node value)
{
_sym_info = value;
_access_level = access_level.al_public;
_symbol_kind = symbol_kind.sk_none;
}
public SymbolInfo(compiled_function_node value)
{
//_name_information_type=name_information_type.nit_compiled_function;
_sym_info = value;
_access_level = get_class_member_access_level(value);
_symbol_kind = get_function_kind(value);
}
public SymbolInfo(compiled_constructor_node value)
{
//_name_information_type=name_information_type.nit_compiled_function;
_sym_info = value;
_access_level = get_class_member_access_level(value);
_symbol_kind = get_function_kind(value);
}
public SymbolInfo(compiled_property_node value)
{
//_name_information_type=name_information_type.nit_compiled_property;
_sym_info = value;
_access_level = get_class_member_access_level(value);
_symbol_kind = symbol_kind.sk_none;
}
public SymbolInfo(compiled_variable_definition value)
{
//_name_information_type=name_information_type.nit_compiled_variable;
_sym_info = value;
_access_level = get_class_member_access_level(value);
_symbol_kind = symbol_kind.sk_none;
}
public SymbolInfo(compiled_class_constant_definition value)
{
_sym_info = value;
_access_level = get_class_member_access_level(value);
_symbol_kind = symbol_kind.sk_none;
}
public SymbolInfo(compiled_namespace_node value)
{
//_name_information_type=name_information_type.nit_compiled_namespace;
_sym_info = value;
_access_level = access_level.al_public;
_symbol_kind = symbol_kind.sk_none;
}
public SymbolInfo(common_type_node value)
{
//_name_information_type=name_information_type.nit_common_type;
_sym_info = value;
_access_level = access_level.al_public;
_symbol_kind = symbol_kind.sk_none;
}
public SymbolInfo(basic_function_node value)
{
//_name_information_type=name_information_type.nit_basic_function;
_sym_info = value;
_access_level = access_level.al_public;
_symbol_kind = get_function_kind(value);
}
public SymbolInfo(common_namespace_function_node value)
{
//_name_information_type=name_information_type.nit_common_namespace_function;
_sym_info = value;
_access_level = access_level.al_public;
_symbol_kind = get_function_kind(value);
}
public SymbolInfo(common_in_function_function_node value)
{
//_name_information_type=name_information_type.nit_common_in_function_function;
_sym_info = value;
_access_level = access_level.al_public;
_symbol_kind = get_function_kind(value);
}
public SymbolInfo(common_method_node value)
{
//_name_information_type=name_information_type.nit_common_method;
_sym_info = value;
_access_level = get_class_member_access_level(value);
_symbol_kind = get_function_kind(value);
}
public SymbolInfo(common_namespace_node value)
{
//_name_information_type=name_information_type.nit_common_namespace;
_sym_info = value;
_access_level = access_level.al_public;
_symbol_kind = symbol_kind.sk_none;
}
public SymbolInfo(unit_node value)
{
//_name_information_type=name_information_type.nit_unit;
_sym_info = value;
_access_level = access_level.al_public;
_symbol_kind = symbol_kind.sk_none;
}
public SymbolInfo(local_variable value)
{
//_name_information_type=name_information_type.nit_local_variable;
_sym_info = value;
_access_level = access_level.al_public;
_symbol_kind = symbol_kind.sk_none;
}
public SymbolInfo(local_block_variable value)
{
//_name_information_type=name_information_type.nit_local_variable;
_sym_info = value;
_access_level = access_level.al_public;
_symbol_kind = symbol_kind.sk_none;
}
public SymbolInfo(namespace_variable value)
{
//_name_information_type=name_information_type.nit_namespace_variable;
_sym_info = value;
_access_level = access_level.al_public;
_symbol_kind = symbol_kind.sk_none;
}
public SymbolInfo(class_field value)
{
//_name_information_type=name_information_type.nit_class_field;
_sym_info = value;
_access_level = get_class_member_access_level(value);
_symbol_kind = symbol_kind.sk_none;
}
public SymbolInfo(common_parameter value)
{
//_name_information_type=name_information_type.nit_common_parameter;
_sym_info = value;
_access_level = access_level.al_public;
_symbol_kind = symbol_kind.sk_none;
}
public SymbolInfo(basic_parameter value)
{
//_name_information_type=name_information_type.nit_basic_parameter;
_sym_info = value;
_access_level = access_level.al_public;
_symbol_kind = symbol_kind.sk_none;
}
public SymbolInfo(constant_definition_node value)
{
//_name_information_type=name_information_type.nit_constant_defnition;
_sym_info = value;
_access_level = access_level.al_public;
_symbol_kind = symbol_kind.sk_none;
}
public SymbolInfo(common_property_node value)
{
//_name_information_type=name_information_type.nit_common_property;
_sym_info = value;
_access_level = get_class_member_access_level(value);
_symbol_kind = symbol_kind.sk_none;
}
public SymbolInfo(type_node value)
{
_sym_info = value;
_access_level = access_level.al_public;
_symbol_kind = symbol_kind.sk_none;
}
public SymbolInfo(definition_node value, access_level alevel, symbol_kind skind)
{
_sym_info = value;
_access_level = alevel;
_symbol_kind = skind;
}
}
}