// Copyright (c) Ivan Bondarev, Stanislav Mihalkovich (for details please see \doc\copyright.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; namespace PascalABCCompiler.TreeRealization { /// /// Класс, представляющий определение константы. /// [Serializable] public abstract class constant_definition_node : definition_node, SemanticTree.IConstantDefinitionNode { public override string ToString() => "const " + name + " : " + type; /// /// Имя константы. /// private readonly string _name; /// /// Значение константы. /// private constant_node _cn; /// /// Место, где определена константа. /// private readonly location _loc; /// /// Конструктор узла. /// /// Имя константы. /// Расположение константы. public constant_definition_node(string name, location loc) { _name = name; _loc = loc; } /// /// Конструктор узла. /// /// Имя константы. /// Значение константы. /// Расположение константы. public constant_definition_node(string name, constant_node cn, location loc) { _name = name; _cn = cn; _loc = loc; } /// /// Место, где определена константа. /// Это свойство используется при генерации дерева. /// public location loc { get { return _loc; } } /// /// Место, где определена константа. /// Это свойство используется при обходе дерева посетителем. /// public SemanticTree.ILocation Location { get { return loc; } } /// /// Имя константы. /// public string name { get { return _name; } } /// /// Тип константы. /// public type_node type { get { return _cn.type; } } /// /// Значение константы. /// public constant_node const_value { get { return _cn; } set { _cn = value; } } /// /// Обобщенный тип узла. /// public override general_node_type general_node_type { get { return general_node_type.constant_definition; } } /// /// Метод для обхода дерева посетителем. /// /// Класс - посетитель дерева. public override void visit(SemanticTree.ISemanticVisitor visitor) { visitor.visit(this); } /// /// Тип константы. /// Используется при обходе дерева посетителем. /// SemanticTree.ITypeNode SemanticTree.IConstantDefinitionNode.type { get { return _cn.type; } } /// /// Значение константы. /// Используется при обходе дерева посетителем. /// public SemanticTree.IConstantNode constant_value { get { return _cn; } } } //TODO: Возможно стоит сделать шаблонный тип для всех видов определений констант. /// /// Класс, представляющий определение константы в пространстве имен. /// [Serializable] public class namespace_constant_definition : constant_definition_node, SemanticTree.INamespaceConstantDefinitionNode { /// /// Пространство имен в котором определена константа. /// private readonly common_namespace_node _comprehensive_namespace; public namespace_constant_definition(string name, location loc, common_namespace_node comprehensive_namespace) : base(name, loc) { _comprehensive_namespace = comprehensive_namespace; } /// /// Конструктор класса. /// /// Имя константы. /// Значени константы. /// Расположение определения константы. /// Пространство имен в котором определена константа. public namespace_constant_definition(string name, constant_node cn, location loc, common_namespace_node comprehensive_namespace) : base(name,cn,loc) { _comprehensive_namespace = comprehensive_namespace; } /// /// Пространство имен в котором определена константа. /// public common_namespace_node comprehensive_namespace { get { return _comprehensive_namespace; } } /// /// Метод для обхода дерева посетителем. /// /// Класс - посетитель дерева. public override void visit(SemanticTree.ISemanticVisitor visitor) { visitor.visit(this); } /// /// Тип узла. /// public override semantic_node_type semantic_node_type { get { return semantic_node_type.namespace_constant_definition; } } /// /// Пространство имен в котором определена константа. /// Используется при обходе дерева посетителем. /// SemanticTree.ICommonNamespaceNode SemanticTree.INamespaceConstantDefinitionNode.comprehensive_namespace { get { return _comprehensive_namespace; } } } /// /// Класс, представляющий определение константы в классе. /// [Serializable] public class class_constant_definition : constant_definition_node, SemanticTree.IClassConstantDefinitionNode { /// /// Тип, содержащий определение константы. /// private readonly common_type_node _comprehensive_type; private SemanticTree.field_access_level _fal = SemanticTree.field_access_level.fal_internal; public class_constant_definition(string name, location loc, common_type_node comprehensive_type, SemanticTree.field_access_level field_access_level) : base(name, loc) { _comprehensive_type = comprehensive_type; _fal = field_access_level; } /// /// Конструктор класса. /// /// Имя константы. /// Значение константы. /// Расположение константы. /// Тип, содержащий константу. public class_constant_definition(string name, constant_node cn, location loc, common_type_node comprehensive_type, SemanticTree.field_access_level field_access_level) : base(name,cn,loc) { _comprehensive_type = comprehensive_type; _fal = field_access_level; } /// /// Тип, содержащий константу. /// public common_type_node comperehensive_type { get { return _comprehensive_type; } } /// /// Тип узла. /// public override semantic_node_type semantic_node_type { get { return semantic_node_type.class_constant_definition; } } /// /// Метод для обхода дерева посетителем. /// /// Класс - посетитель дерева. public override void visit(SemanticTree.ISemanticVisitor visitor) { visitor.visit(this); } /// /// Тип, содержащий константу. /// Используется при обходе дерева посетителем. /// SemanticTree.ITypeNode SemanticTree.IClassMemberNode.comperehensive_type { get { return _comprehensive_type; } } public SemanticTree.polymorphic_state polymorphic_state { get { return SemanticTree.polymorphic_state.ps_static; } } public SemanticTree.field_access_level field_access_level { get { return _fal; } } SemanticTree.ITypeNode SemanticTree.IConstantDefinitionNode.type { get { return const_value.type; } } } /// /// Класс, представляющий определение константы в откомпилированном классе. /// [Serializable] public class compiled_class_constant_definition : constant_definition_node, SemanticTree.ICompiledClassConstantDefinitionNode { /// /// Тип, содержащий определение константы. /// private readonly compiled_type_node _comprehensive_type; private System.Reflection.FieldInfo _fi; /// /// Конструктор класса. /// public compiled_class_constant_definition(System.Reflection.FieldInfo fi, constant_node cn) : base(fi.Name, cn, null) { _comprehensive_type = compiled_type_node.get_type_node(fi.DeclaringType); _fi = fi; } public System.Reflection.FieldInfo field { get { return _fi; } } /// /// Тип, содержащий константу. /// SemanticTree.ITypeNode SemanticTree.IClassMemberNode.comperehensive_type { get { return _comprehensive_type; } } /// /// Тип узла. /// public override semantic_node_type semantic_node_type { get { return semantic_node_type.compiled_class_constant_definition; } } /// /// Метод для обхода дерева посетителем. /// /// Класс - посетитель дерева. public override void visit(SemanticTree.ISemanticVisitor visitor) { visitor.visit(this); } /// /// Тип, содержащий константу. /// Используется при обходе дерева посетителем. /// SemanticTree.ICompiledTypeNode SemanticTree.ICompiledClassConstantDefinitionNode.comprehensive_type { get { return _comprehensive_type; } } #region IClassMemberNode Members public SemanticTree.polymorphic_state polymorphic_state { get { return SemanticTree.polymorphic_state.ps_static; } } public SemanticTree.field_access_level field_access_level { get { return NetHelper.NetHelper.GetFieldAccessLevel(_fi); } } #endregion } /// /// Класс, представляющий определение константы в классе. /// [Serializable] public class function_constant_definition : constant_definition_node, SemanticTree.ICommonFunctionConstantDefinitionNode { /// /// Тип, содержащий определение константы. /// private readonly common_function_node _comprehensive_function; public function_constant_definition(string name, location loc, common_function_node comprehensive_function) : base(name, loc) { _comprehensive_function = comprehensive_function; } /// /// Конструктор класса. /// /// Имя константы. /// Значение константы. /// Расположение константы. /// Функция, содержащая константу. public function_constant_definition(string name, constant_node cn, location loc, common_function_node comprehensive_function) : base(name, cn, loc) { _comprehensive_function = comprehensive_function; } /// /// Функция, содержащая константу. /// public common_function_node comprehensive_function { get { return _comprehensive_function; } } /// /// Тип узла. /// public override semantic_node_type semantic_node_type { get { return semantic_node_type.function_constant_definition; } } /// /// Метод для обхода дерева посетителем. /// /// Класс - посетитель дерева. public override void visit(SemanticTree.ISemanticVisitor visitor) { visitor.visit(this); } /// /// Функция, в которой определена константа. /// Используется при обходе дерева посетителем. /// SemanticTree.ICommonFunctionNode SemanticTree.ICommonFunctionConstantDefinitionNode.comprehensive_function { get { return _comprehensive_function; } } } }