pascalabcnet/ParserTools/DocumentationConstructor.cs
Mikhalkovich Stanislav e603b1fd6d Mikhalkovich в Copyright
Заготовка для школьного плагина образцов кода
2019-07-28 23:53:15 +03:00

179 lines
6.4 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 System.Collections.Generic;
using System.Text;
using PascalABCCompiler.SyntaxTree;
using System.Collections;
namespace PascalABCCompiler
{
public class DocumentationConstructor : AbstractVisitor
{
Dictionary<int, documentation_comment_section> line_to_section = new Dictionary<int, documentation_comment_section>();
Dictionary<syntax_tree_node, string> documentation;
public Dictionary<syntax_tree_node, string> Construct(syntax_tree_node tree_root, documentation_comment_list sections_list)
{
documentation = new Dictionary<syntax_tree_node, string>();
if (sections_list.sections.Count == 0)
return documentation;
foreach (documentation_comment_section dcs in sections_list.sections)
line_to_section.Add(dcs.source_context.end_position.line_num + 1, dcs);
try
{
visit_node(tree_root);
}
catch
{
}
//visit_node(tree_root);
line_to_section.Clear();
Dictionary<syntax_tree_node, string> dcn = documentation;
documentation = null;
return dcn;
}
void visit_node(syntax_tree_node node)
{
if (node != null)
node.visit(this);
}
void visit_collection(IEnumerable colection)
{
if (colection != null)
foreach (syntax_tree_node node in colection)
node.visit(this);
}
void connect_collection(IEnumerable colection)
{
if (colection != null)
foreach (syntax_tree_node node in colection)
connect(node);
}
void connect(syntax_tree_node node)
{
if (node == null || node.source_context == null || documentation.ContainsKey(node))
return;
if (line_to_section.ContainsKey(node.source_context.begin_position.line_num) )
{
documentation_comment_section dsc = line_to_section[node.source_context.begin_position.line_num];
if (dsc.tags.Count == 0)
if (dsc.text != null)
{
documentation.Add(node, dsc.text);
return;
}
foreach (documentation_comment_tag dt in dsc.tags)
if (dt.name.ToLower() == "summary")
documentation.Add(node, dt.text);
}
}
public override void visit(program_module _program_module)
{
_program_module.program_block.visit(this);
}
public override void visit(unit_module _unit_module)
{
connect(_unit_module.unit_name);
visit_node(_unit_module.interface_part);
visit_node(_unit_module.implementation_part);
}
public override void visit(interface_node _interface_node)
{
visit_node(_interface_node.interface_definitions);
}
public override void visit(implementation_node _implementation_node)
{
visit_node(_implementation_node.implementation_definitions);
}
public override void visit(block _block)
{
visit_node(_block.defs);
}
public override void visit(declarations _declarations)
{
visit_collection(_declarations.defs);
}
public override void visit(procedure_definition _procedure_definition)
{
visit_node(_procedure_definition.proc_header);
if (_procedure_definition.proc_body is block)
visit_node(_procedure_definition.proc_body as block);
}
public override void visit(procedure_header _procedure_header)
{
connect(_procedure_header);
}
public override void visit(function_header _function_header)
{
connect(_function_header);
}
public override void visit(class_definition _class_definition)
{
connect(_class_definition);
visit_node(_class_definition.body);
}
public override void visit(class_body_list _class_body)
{
visit_collection(_class_body.class_def_blocks);
}
public override void visit(class_members _class_members)
{
visit_collection(_class_members.members);
}
public override void visit(var_def_statement _var_def_statement)
{
connect(_var_def_statement);
}
public override void visit(type_declarations _type_declarations)
{
visit_collection(_type_declarations.types_decl);
}
public override void visit(type_declaration _type_declaration)
{
connect(_type_declaration);
visit_node(_type_declaration.type_def);
}
public override void visit(consts_definitions_list _consts_definitions_list)
{
visit_collection(_consts_definitions_list.const_defs);
}
public override void visit(const_definition _const_definition)
{
connect(_const_definition);
}
public override void visit(variable_definitions _variable_definitions)
{
visit_collection(_variable_definitions.var_definitions);
}
public override void visit(simple_const_definition _const_definition)
{
connect(_const_definition);
}
public override void visit(typed_const_definition _const_definition)
{
connect(_const_definition);
}
public override void visit(simple_property _simple_property)
{
connect(_simple_property);
}
public override void visit(constructor _constructor)
{
connect(_constructor);
}
public override void visit(destructor _destructor)
{
connect(_destructor);
}
public override void visit(enum_type_definition _enum_type_definition)
{
visit_collection(_enum_type_definition.enumerators.enumerators);
}
public override void visit(enumerator _enumerator)
{
connect(_enumerator);
}
}
}