* 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()
480 lines
16 KiB
C#
480 lines
16 KiB
C#
// 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;
|
||
}
|
||
|
||
}
|
||
|
||
}
|