pascalabcnet/CodeCompletion/FindReferences.cs
2024-01-07 14:43:47 +01:00

1749 lines
63 KiB
C#
Raw Blame History

// 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;
using System.Collections.Generic;
using System.Text;
using PascalABCCompiler.SyntaxTree;
//using ICSharpCode.SharpDevelop.Dom;
using System.Reflection;
using PascalABCCompiler;
using PascalABCCompiler.TreeConverter;
//using PascalABCCompiler.TreeRealization;
using SymbolTable;
using System.IO;
using PascalABCCompiler.Parsers;
namespace CodeCompletion
{
public class ReferenceFinder : AbstractVisitor
{
private IBaseScope founded_scope;
private IBaseScope entry_scope;
private IBaseScope cur_scope;
private List<Position> pos_list;
private IBaseScope ret_tn;
private compilation_unit cu;
private string FileName;
public bool for_refactoring = false;
public ReferenceFinder(IBaseScope founded_scope, IBaseScope entry_scope, compilation_unit cu, string FileName, bool for_refactoring)
{
if (founded_scope is IProcScope && (founded_scope as IProcScope).IsConstructor())
founded_scope = (founded_scope as IProcScope).DeclaringType;
this.founded_scope = founded_scope;
this.entry_scope = entry_scope;
this.cur_scope = entry_scope;
this.pos_list = new List<Position>();
this.cu = cu;
this.FileName = FileName;
this.for_refactoring = for_refactoring;
}
public Position[] FindPositions()
{
try
{
cu.visit(this);
}
catch (Exception e)
{
#if DEBUG
File.AppendAllText("log.txt", e.Message + Environment.NewLine + e.StackTrace + Environment.NewLine);
#endif
}
return pos_list.ToArray();
}
public override void visit(default_operator _default_operator)
{
_default_operator.type_name.visit(this);
}
public override void visit(syntax_tree_node _syntax_tree_node)
{
throw new NotImplementedException();
}
public override void visit(statement_list _statement_list)
{
if (_statement_list == null || _statement_list.source_context == null) return;
IBaseScope tmp = cur_scope;
cur_scope = entry_scope.FindScopeByLocation(_statement_list.source_context.begin_position.line_num, _statement_list.source_context.begin_position.column_num);
if (cur_scope == null)
cur_scope = tmp;
foreach (statement stmt in _statement_list.subnodes)
{
IBaseScope tmp2 = cur_scope;
if (stmt.source_context != null)
cur_scope = cur_scope.FindScopeByLocation(stmt.source_context.begin_position.line_num, stmt.source_context.begin_position.column_num);
if (cur_scope == null)
cur_scope = tmp2;
stmt.visit(this);
cur_scope = tmp2;
}
cur_scope = tmp;
}
public override void visit(expression _expression)
{
throw new NotImplementedException();
}
public override void visit(assign _assign)
{
_assign.to.visit(this);
_assign.from.visit(this);
}
public override void visit(assign_tuple _assign_tuple)
{
_assign_tuple.vars.visit(this);
_assign_tuple.expr.visit(this);
}
public override void visit(addressed_value_list _addressed_value_list)
{
foreach (addressed_value av in _addressed_value_list.variables)
av.visit(this);
}
public override void visit(bin_expr _bin_expr)
{
//throw new NotImplementedException();
if (_bin_expr.left != null)
_bin_expr.left.visit(this);
if (_bin_expr.right != null)
_bin_expr.right.visit(this);
}
public override void visit(un_expr _un_expr)
{
//throw new NotImplementedException();
if (_un_expr.subnode != null)
_un_expr.subnode.visit(this);
}
public override void visit(template_type_name name)
{
throw new NotImplementedException();
}
public override void visit(const_node _const_node)
{
throw new NotImplementedException();
}
public override void visit(bool_const _bool_const)
{
//throw new NotImplementedException();
}
public override void visit(int32_const _int32_const)
{
//throw new NotImplementedException();
}
public override void visit(double_const _double_const)
{
//throw new NotImplementedException();
}
public override void visit(statement _statement)
{
throw new NotImplementedException();
}
public override void visit(subprogram_body _subprogram_body)
{
if (_subprogram_body.subprogram_defs != null)
_subprogram_body.subprogram_defs.visit(this);
if (_subprogram_body.subprogram_code != null)
_subprogram_body.subprogram_code.visit(this);
}
public override void visit(ident _ident)
{
ret_tn = cur_scope.FindNameInAnyOrder(_ident.name);
if (ret_tn == null && cur_scope.TopScope != null)
{
try
{
ret_tn = cur_scope.TopScope.FindNameInAnyOrder(_ident.name);
}
catch (Exception e)
{
}
}
if (ret_tn != null && ret_tn.IsEqual(founded_scope))
pos_list.Add(get_position(_ident));
}
public override void visit(addressed_value _addressed_value)
{
throw new NotImplementedException();
}
public override void visit(type_definition _type_definition)
{
throw new NotImplementedException();
}
private Position get_position(syntax_tree_node stn)
{
Position pos = new Position();
if (stn != null && stn.source_context != null)
{
pos.line = stn.source_context.begin_position.line_num;
pos.column = stn.source_context.begin_position.column_num;
pos.end_line = stn.source_context.end_position.line_num;
pos.end_column = stn.source_context.end_position.column_num;
pos.file_name = FileName;
}
return pos;
}
public override void visit(named_type_reference _named_type_reference)
{
ret_tn = cur_scope;
for (int i = 0; i < _named_type_reference.names.Count; i++)
{
if (i > 0)
ret_tn = ret_tn.FindNameOnlyInType(_named_type_reference.names[i].name);
else ret_tn = ret_tn.FindNameInAnyOrder(_named_type_reference.names[i].name);
if (ret_tn == null) break;
else if (founded_scope.IsEqual(ret_tn) && founded_scope is TypeScope)
pos_list.Add(get_position(_named_type_reference.names[i]));
}
}
public override void visit(variable_definitions _variable_definitions)
{
foreach (var_def_statement vs in _variable_definitions.var_definitions)
vs.visit(this);
}
public override void visit(ident_list _ident_list)
{
throw new NotImplementedException();
}
public override void visit(var_def_statement _var_def_statement)
{
if (for_refactoring && _var_def_statement.vars != null)
foreach (ident s in _var_def_statement.vars.idents)
{
IBaseScope ss = entry_scope.FindScopeByLocation(s.source_context.begin_position.line_num, s.source_context.begin_position.column_num);
if (ss != null && ss.IsEqual(founded_scope))
pos_list.Add(get_position(s));
}
if (_var_def_statement.vars_type != null)
_var_def_statement.vars_type.visit(this);
if (_var_def_statement.inital_value != null)
_var_def_statement.inital_value.visit(this);
}
public override void visit(let_var_expr _let_var_expr)
{
if (for_refactoring)
{
IBaseScope ss = entry_scope.FindScopeByLocation(_let_var_expr.id.source_context.begin_position.line_num, _let_var_expr.id.source_context.begin_position.column_num);
if (ss != null && ss.IsEqual(founded_scope))
pos_list.Add(get_position(_let_var_expr.id));
}
if (_let_var_expr.ex != null)
_let_var_expr.ex.visit(this);
}
public override void visit(declaration _declaration)
{
throw new NotImplementedException();
}
public override void visit(declarations _declarations)
{
foreach (declaration decl in _declarations.defs)
decl.visit(this);
}
public override void visit(program_tree _program_tree)
{
throw new NotImplementedException();
}
public override void visit(program_name _program_name)
{
if (_program_name.prog_name != null)
_program_name.prog_name.visit(this);
}
public override void visit(string_const _string_const)
{
//throw new NotImplementedException();
}
public override void visit(expression_list _expression_list)
{
if (_expression_list != null)
foreach (expression e in _expression_list.expressions)
e.visit(this);
}
public override void visit(dereference _dereference)
{
throw new NotImplementedException();
}
public override void visit(roof_dereference _roof_dereference)
{
_roof_dereference.dereferencing_value.visit(this);
if (ret_tn != null && ret_tn is IElementScope)
{
IPointerScope ts = (ret_tn as IElementScope).Type as IPointerScope;
if (ts != null)
ret_tn = ts.ElementType.MakeElementScope();//new ElementScope(ts.ref_type);
else
ret_tn = null;
}
else ret_tn = null;
}
public override void visit(indexer _indexer)
{
_indexer.dereferencing_value.visit(this);
if (ret_tn != null)
{
if (ret_tn != null)
if (ret_tn is IElementScope && (ret_tn as IElementScope).Type is IProcScope && ((ret_tn as IElementScope).Type as IProcScope).ReturnType != null)
ret_tn = ((ret_tn as IElementScope).Type as IProcScope).ReturnType.GetElementType();
else
ret_tn = ret_tn.GetElementType();
IBaseScope tmp = ret_tn;
_indexer.indexes.visit(this);
ret_tn = tmp;
}
}
public override void visit(for_node _for_node)
{
IBaseScope tmp = cur_scope;
cur_scope = entry_scope.FindScopeByLocation(_for_node.source_context.begin_position.line_num, _for_node.source_context.begin_position.column_num);
if (cur_scope == null)
cur_scope = tmp;
if (_for_node.loop_variable != null)
{
ret_tn = cur_scope.FindNameInAnyOrder(_for_node.loop_variable.name);
if (ret_tn != null && ret_tn.IsEqual(founded_scope))
pos_list.Add(get_position(_for_node.loop_variable));
}
if (_for_node.type_name != null)
_for_node.type_name.visit(this);
if (_for_node.initial_value != null)
_for_node.initial_value.visit(this);
if (_for_node.finish_value != null)
_for_node.finish_value.visit(this);
if (_for_node.increment_value != null)
_for_node.increment_value.visit(this);
if (_for_node.statements != null)
{
_for_node.statements.visit(this);
}
cur_scope = tmp;
}
public override void visit(repeat_node _repeat_node)
{
if (_repeat_node.statements != null)
_repeat_node.statements.visit(this);
if (_repeat_node.expr != null)
_repeat_node.expr.visit(this);
}
public override void visit(while_node _while_node)
{
if (_while_node.expr != null)
_while_node.expr.visit(this);
if (_while_node.statements != null)
_while_node.statements.visit(this);
}
public override void visit(if_node _if_node)
{
//throw new NotImplementedException();
if (_if_node.condition != null)
_if_node.condition.visit(this);
if (_if_node.then_body != null)
_if_node.then_body.visit(this);
if (_if_node.else_body != null)
_if_node.else_body.visit(this);
}
public override void visit(ref_type _ref_type)
{
//throw new NotImplementedException();
if (_ref_type.pointed_to != null)
_ref_type.pointed_to.visit(this);
}
public override void visit(diapason _diapason)
{
//throw new NotImplementedException();
if (_diapason.left != null)
_diapason.left.visit(this);
if (_diapason.right != null)
_diapason.right.visit(this);
}
public override void visit(indexers_types _indexers_types)
{
foreach (type_definition td in _indexers_types.indexers)
if (td != null)
td.visit(this);
}
public override void visit(array_type _array_type)
{
if (_array_type.indexers != null)
_array_type.indexers.visit(this);
if (_array_type.elements_type != null)
_array_type.elements_type.visit(this);
}
public override void visit(label_definitions _label_definitions)
{
//throw new NotImplementedException();
}
public override void visit(procedure_attribute _procedure_attribute)
{
throw new NotImplementedException();
}
public override void visit(typed_parameters _typed_parametres)
{
if (for_refactoring)
foreach (ident s in _typed_parametres.idents.idents)
{
IBaseScope ss = entry_scope.FindScopeByLocation(s.source_context.begin_position.line_num, s.source_context.begin_position.column_num);
if (ss != null && ss.IsEqual(founded_scope) && founded_scope.SymbolInfo.Name == s.name)
pos_list.Add(get_position(s));
}
if (_typed_parametres.vars_type != null)
_typed_parametres.vars_type.visit(this);
}
public override void visit(formal_parameters _formal_parametres)
{
foreach (typed_parameters tp in _formal_parametres.params_list)
tp.visit(this);
}
public override void visit(procedure_attributes_list _procedure_attributes_list)
{
throw new NotImplementedException();
}
public override void visit(procedure_header _procedure_header)
{
if (for_refactoring)
{
IBaseScope sc = null;
if (_procedure_header.name != null)
{
if (_procedure_header.name.meth_name != null)
{
if (with_body)
{
if (cur_scope != null && (cur_scope.IsEqual(founded_scope) || founded_scope is IProcScope && (founded_scope as IProcScope).Realization != null && cur_scope.IsEqual((founded_scope as IProcScope).Realization)))
pos_list.Add(get_position(_procedure_header.name.meth_name));
}
else
{
sc = cur_scope.FindNameOnlyInType(_procedure_header.name.meth_name.name);
if (sc != null && sc.IsEqual(founded_scope))
pos_list.Add(get_position(_procedure_header.name.meth_name));
}
}
if (_procedure_header.name.class_name != null)
{
sc = cur_scope.FindNameInAnyOrder(_procedure_header.name.class_name.name);
if (sc != null && sc.IsEqual(founded_scope))
pos_list.Add(get_position(_procedure_header.name.class_name));
}
}
}
if (_procedure_header.parameters != null)
_procedure_header.parameters.visit(this);
if (_procedure_header.where_defs != null)
_procedure_header.where_defs.visit(this);
}
public override void visit(function_header _function_header)
{
if (for_refactoring)
{
IBaseScope sc = null;
if (_function_header.name != null)
{
if (_function_header.name.meth_name != null)
{
if (with_body)
{
if (cur_scope != null && (cur_scope.IsEqual(founded_scope) || founded_scope is IProcScope && (founded_scope as IProcScope).Realization != null && cur_scope.IsEqual((founded_scope as IProcScope).Realization)))
pos_list.Add(get_position(_function_header.name.meth_name));
}
else
{
sc = cur_scope.FindNameOnlyInType(_function_header.name.meth_name.name);
if (sc != null && sc.IsEqual(founded_scope))
pos_list.Add(get_position(_function_header.name.meth_name));
}
}
if (_function_header.name.class_name != null)
{
sc = cur_scope.FindNameInAnyOrder(_function_header.name.class_name.name);
if (sc != null && sc.IsEqual(founded_scope))
pos_list.Add(get_position(_function_header.name.class_name));
}
}
}
if (_function_header.parameters != null)
_function_header.parameters.visit(this);
if (_function_header.return_type != null)
_function_header.return_type.visit(this);
if (_function_header.where_defs != null)
_function_header.where_defs.visit(this);
}
private bool with_body = false;
public override void visit(procedure_definition _procedure_definition)
{
//throw new NotImplementedException();
IBaseScope tmp = cur_scope;
cur_scope = entry_scope.FindScopeByLocation(_procedure_definition.source_context.begin_position.line_num, _procedure_definition.source_context.begin_position.column_num);
if (cur_scope == null)
cur_scope = tmp;
with_body = true;
_procedure_definition.proc_header.visit(this);
with_body = false;
if (_procedure_definition.proc_body != null)
_procedure_definition.proc_body.visit(this);
cur_scope = tmp;
}
public override void visit(type_declaration _type_declaration)
{
//SymScope ss = entry_scope.FindScopeByLocation(_type_declaration.source_context.begin_position.line_num,_type_declaration.source_context.begin_position.column_num);
IBaseScope ss = entry_scope.FindNameInAnyOrder(_type_declaration.type_name.name);
if (for_refactoring && _type_declaration.type_name is template_type_name)
{
foreach (ident id in (_type_declaration.type_name as template_type_name).template_args.list)
{
var targ_ss = entry_scope.FindScopeByLocation(id.source_context.begin_position.line_num, id.source_context.begin_position.column_num);
if (targ_ss != null && targ_ss.IsEqual(founded_scope))
pos_list.Add(get_position(id));
}
}
if (ss == null && entry_scope is IInterfaceUnitScope && (entry_scope as IInterfaceUnitScope).ImplementationUnitScope != null)
ss = (entry_scope as IInterfaceUnitScope).ImplementationUnitScope.FindNameInAnyOrder(_type_declaration.type_name.name);
if (for_refactoring && ss != null && ss.IsEqual(founded_scope) && string.Compare(ss.SymbolInfo.name, _type_declaration.type_name.name, true) == 0 && !(ss is ITypeSynonimScope && !(founded_scope is ITypeSynonimScope)))
{
pos_list.Add(get_position(_type_declaration.type_name));
}
if (_type_declaration.type_def != null)
_type_declaration.type_def.visit(this);
}
public override void visit(type_declarations _type_declarations)
{
foreach (type_declaration td in _type_declarations.types_decl)
td.visit(this);
}
public override void visit(simple_const_definition _simple_const_definition)
{
if (for_refactoring)
{
IBaseScope ss = entry_scope.FindScopeByLocation(_simple_const_definition.const_name.source_context.begin_position.line_num, _simple_const_definition.const_name.source_context.begin_position.column_num);
if (ss != null && ss.IsEqual(founded_scope))
pos_list.Add(get_position(_simple_const_definition.const_name));
}
if (_simple_const_definition.const_value != null)
_simple_const_definition.const_value.visit(this);
}
public override void visit(typed_const_definition _typed_const_definition)
{
if (for_refactoring)
{
IBaseScope ss = entry_scope.FindScopeByLocation(_typed_const_definition.source_context.begin_position.line_num, _typed_const_definition.source_context.begin_position.column_num);
if (ss != null && ss.IsEqual(founded_scope))
pos_list.Add(get_position(_typed_const_definition.const_name));
}
_typed_const_definition.const_type.visit(this);
if (_typed_const_definition.const_value != null)
_typed_const_definition.const_value.visit(this);
}
public override void visit(const_definition _const_definition)
{
throw new NotImplementedException();
}
public override void visit(consts_definitions_list _consts_definitions_list)
{
foreach (const_definition cnst in _consts_definitions_list.const_defs)
cnst.visit(this);
}
public override void visit(unit_name _unit_name)
{
_unit_name.idunit_name.visit(this);
}
public override void visit(unit_or_namespace _unit_or_namespace)
{
throw new NotImplementedException();
}
public override void visit(uses_unit_in _uses_unit_in)
{
throw new NotImplementedException();
}
public override void visit(uses_list _uses_list)
{
try
{
foreach (unit_or_namespace unit in _uses_list.units)
{
foreach (ident id in unit.name.idents)
{
id.visit(this);
}
}
}
catch
{
}
}
public override void visit(program_body _program_body)
{
throw new NotImplementedException();
}
public override void visit(compilation_unit _compilation_unit)
{
throw new NotImplementedException();
}
public override void visit(unit_module _unit_module)
{
if (_unit_module.unit_name != null)
_unit_module.unit_name.visit(this);
if (_unit_module.interface_part != null)
_unit_module.interface_part.visit(this);
if (_unit_module.implementation_part != null)
_unit_module.implementation_part.visit(this);
if (_unit_module.initialization_part != null)
_unit_module.initialization_part.visit(this);
if (_unit_module.finalization_part != null)
_unit_module.finalization_part.visit(this);
}
public override void visit(program_module _program_module)
{
if (_program_module.program_name != null)
_program_module.program_name.visit(this);
if (_program_module.used_units != null)
_program_module.used_units.visit(this);
if (_program_module.program_block.defs != null)
_program_module.program_block.defs.visit(this);
if (_program_module.program_block.program_code != null)
_program_module.program_block.program_code.visit(this);
}
public override void visit(hex_constant _hex_constant)
{
//throw new NotImplementedException();
}
public override void visit(get_address _get_address)
{
//throw new NotImplementedException();
if (_get_address.address_of != null)
_get_address.address_of.visit(this);
}
public override void visit(case_variant _case_variant)
{
if (_case_variant.conditions != null)
_case_variant.conditions.visit(this);
if (_case_variant.exec_if_true != null)
_case_variant.exec_if_true.visit(this);
}
public override void visit(case_node _case_node)
{
if (_case_node.param != null)
_case_node.param.visit(this);
if (_case_node.conditions != null)
_case_node.conditions.visit(this);
if (_case_node.else_statement != null)
_case_node.else_statement.visit(this);
}
public override void visit(method_name _method_name)
{
throw new NotImplementedException();
}
public override void visit(dot_node _dot_node)
{
_dot_node.left.visit(this);
if (ret_tn != null)
{
IBaseScope left_scope = ret_tn;
if (_dot_node.right is ident)
{
ret_tn = ret_tn.FindNameOnlyInType((_dot_node.right as ident).name);
if (ret_tn == null && left_scope is IElementScope && (left_scope as IElementScope).Type is ITypeScope)
ret_tn = ((left_scope as IElementScope).Type as ITypeScope).FindExtensionMethod((_dot_node.right as ident).name);
}
}
if (ret_tn != null && ret_tn.IsEqual(founded_scope))
pos_list.Add(get_position(_dot_node.right));
}
public override void visit(empty_statement _empty_statement)
{
//throw new NotImplementedException();
}
public override void visit(goto_statement _goto_statement)
{
}
public override void visit(labeled_statement _labeled_statement)
{
//throw new NotImplementedException();
if (_labeled_statement.to_statement != null)
_labeled_statement.to_statement.visit(this);
}
public override void visit(with_statement _with_statement)
{
IBaseScope tmp = cur_scope;
cur_scope = entry_scope.FindScopeByLocation(_with_statement.source_context.begin_position.line_num, _with_statement.source_context.begin_position.column_num);
if (cur_scope == null)
cur_scope = tmp;
if (_with_statement.do_with != null)
_with_statement.do_with.visit(this);
if (_with_statement.what_do != null)
_with_statement.what_do.visit(this);
cur_scope = tmp;
}
public override void visit(method_call _method_call)
{
if (_method_call.dereferencing_value != null)
_method_call.dereferencing_value.visit(this);
//if (ret_tn != null && ret_tn.IsEqual(founded_scope))
// pos_list.Add(get_position(_method_call));
if (_method_call.parameters != null)
_method_call.parameters.visit(this);
}
public override void visit(pascal_set_constant _pascal_set_constant)
{
//throw new NotImplementedException();
if (_pascal_set_constant.values != null)
_pascal_set_constant.values.visit(this);
}
public override void visit(array_const _array_const)
{
if (_array_const.elements != null)
_array_const.elements.visit(this);
}
public override void visit(write_accessor_name _write_accessor_name)
{
if (_write_accessor_name.accessor_name == null)
return;
IBaseScope sc = cur_scope.FindNameOnlyInType(_write_accessor_name.accessor_name.name);
if (sc != null && sc.IsEqual(founded_scope))
pos_list.Add(get_position(_write_accessor_name.accessor_name));
}
public override void visit(read_accessor_name _read_accessor_name)
{
if (_read_accessor_name.accessor_name == null)
return;
IBaseScope sc = cur_scope.FindNameOnlyInType(_read_accessor_name.accessor_name.name);
if (sc != null && sc.IsEqual(founded_scope))
pos_list.Add(get_position(_read_accessor_name.accessor_name));
}
public override void visit(property_accessors _property_accessors)
{
}
public override void visit(simple_property _simple_property)
{
if (for_refactoring)
{
IBaseScope ss = entry_scope.FindScopeByLocation(_simple_property.source_context.begin_position.line_num, _simple_property.source_context.begin_position.column_num);
if (ss != null && (ss.IsEqual(founded_scope) || ss is IProcScope && ss.Name.StartsWith("#getset") && string.Compare(ss.Name.Replace("#getset",""), founded_scope.Name, true) == 0))
pos_list.Add(get_position(_simple_property.property_name));
}
if (_simple_property.parameter_list != null)
_simple_property.parameter_list.visit(this);
if (_simple_property.property_type != null)
_simple_property.property_type.visit(this);
if (_simple_property.accessors != null)
{
if (_simple_property.accessors.read_accessor != null)
_simple_property.accessors.read_accessor.visit(this);
if (_simple_property.accessors.write_accessor != null)
_simple_property.accessors.write_accessor.visit(this);
}
}
public override void visit(index_property _index_property)
{
if (for_refactoring)
{
IBaseScope ss = entry_scope.FindScopeByLocation(_index_property.source_context.begin_position.line_num, _index_property.source_context.begin_position.column_num);
if (ss != null && ss.IsEqual(founded_scope))
pos_list.Add(get_position(_index_property.property_name));
}
if (_index_property.property_type != null)
_index_property.property_type.visit(this);
if (_index_property.parameter_list != null)
_index_property.parameter_list.visit(this);
if (_index_property.index_expression != null)
_index_property.index_expression.visit(this);
}
public override void visit(class_members _class_members)
{
foreach (declaration decl in _class_members.members)
decl.visit(this);
}
public override void visit(access_modifer_node _access_modifer_node)
{
//throw new NotImplementedException();
}
public override void visit(class_body_list _class_body)
{
if (_class_body.class_def_blocks != null)
foreach (class_members cm in _class_body.class_def_blocks)
cm.visit(this);
}
public override void visit(class_definition _class_definition)
{
IBaseScope tmp = cur_scope;
cur_scope = entry_scope.FindScopeByLocation(_class_definition.source_context.begin_position.line_num, _class_definition.source_context.begin_position.column_num);
if (_class_definition.class_parents != null)
_class_definition.class_parents.visit(this);
if (_class_definition.body != null)
_class_definition.body.visit(this);
cur_scope = tmp;
}
public override void visit(default_indexer_property_node _default_indexer_property_node)
{
//throw new NotImplementedException();
}
public override void visit(known_type_definition _known_type_definition)
{
//throw new NotImplementedException();
}
public override void visit(set_type_definition _set_type_definition)
{
//throw new NotImplementedException();
_set_type_definition.of_type.visit(this);
}
public override void visit(record_const_definition _record_const_definition)
{
_record_const_definition.val.visit(this);
}
public override void visit(record_const _record_const)
{
foreach (record_const_definition rcd in _record_const.rec_consts)
rcd.visit(this);
//throw new NotImplementedException();
}
public override void visit(record_type _record_type)
{
//throw new NotImplementedException();
}
public override void visit(enum_type_definition _enum_type_definition)
{
IBaseScope scope = entry_scope.FindScopeByLocation(_enum_type_definition.source_context.begin_position.line_num, _enum_type_definition.source_context.begin_position.column_num);
if (!(scope is IEnumScope))
{
foreach (enumerator en in _enum_type_definition.enumerators.enumerators)
{
en.name.visit(this);
}
}
//throw new NotImplementedException();
}
public override void visit(char_const _char_const)
{
//throw new NotImplementedException();
}
public override void visit(raise_statement _raise_statement)
{
throw new NotImplementedException();
}
public override void visit(sharp_char_const _sharp_char_const)
{
//throw new NotImplementedException();
}
public override void visit(literal_const_line _literal_const_line)
{
//throw new NotImplementedException();
}
public override void visit(string_num_definition _string_num_definition)
{
//throw new NotImplementedException();
}
public override void visit(variant _variant)
{
}
public override void visit(variant_list _variant_list)
{
}
public override void visit(variant_type _variant_type)
{
}
public override void visit(variant_types _variant_types)
{
}
public override void visit(variant_record_type _variant_record_type)
{
}
public override void visit(procedure_call _procedure_call)
{
if (_procedure_call.func_name != null)
_procedure_call.func_name.visit(this);
}
public override void visit(class_predefinition _class_predefinition)
{
//throw new NotImplementedException();
}
public override void visit(nil_const _nil_const)
{
//throw new NotImplementedException();
}
public override void visit(file_type_definition _file_type_definition)
{
if (_file_type_definition.elem_type != null)
_file_type_definition.elem_type.visit(this);
}
public override void visit(constructor _constructor)
{
if (for_refactoring)
{
IBaseScope sc = null;
if (_constructor.name != null)
{
if (_constructor.name.meth_name != null)
{
if (with_body)
{
if (cur_scope != null && cur_scope.IsEqual(founded_scope))
pos_list.Add(get_position(_constructor.name.meth_name));
}
else
{
sc = cur_scope.FindNameOnlyInType(_constructor.name.meth_name.name);
if (sc != null && sc.IsEqual(founded_scope))
pos_list.Add(get_position(_constructor.name.meth_name));
}
}
if (_constructor.name.class_name != null)
{
sc = cur_scope.FindNameInAnyOrder(_constructor.name.class_name.name);
if (sc != null && sc.IsEqual(founded_scope))
pos_list.Add(get_position(_constructor.name.class_name));
}
}
}
if (_constructor.parameters != null)
_constructor.parameters.visit(this);
}
public override void visit(destructor _destructor)
{
if (for_refactoring)
{
IBaseScope sc = null;
if (_destructor.name != null)
{
if (_destructor.name.meth_name != null)
{
if (with_body)
{
if (cur_scope != null && cur_scope.IsEqual(founded_scope))
pos_list.Add(get_position(_destructor.name.meth_name));
}
else
{
sc = cur_scope.FindNameOnlyInType(_destructor.name.meth_name.name);
if (sc != null && sc.IsEqual(founded_scope))
pos_list.Add(get_position(_destructor.name.meth_name));
}
}
if (_destructor.name.class_name != null)
{
sc = cur_scope.FindNameInAnyOrder(_destructor.name.class_name.name);
if (sc != null && sc.IsEqual(founded_scope))
pos_list.Add(get_position(_destructor.name.class_name));
}
}
}
if (_destructor.parameters != null)
_destructor.parameters.visit(this);
}
public override void visit(inherited_method_call _inherited_method_call)
{
_inherited_method_call.method_name.visit(this);
if (_inherited_method_call.exprs != null)
_inherited_method_call.exprs.visit(this);
}
public override void visit(typecast_node _typecast_node)
{
if (_typecast_node.expr != null)
_typecast_node.expr.visit(this);
if (_typecast_node.type_def != null)
_typecast_node.type_def.visit(this);
}
public override void visit(interface_node _interface_node)
{
if (_interface_node.uses_modules != null)
_interface_node.uses_modules.visit(this);
if (_interface_node.interface_definitions != null)
_interface_node.interface_definitions.visit(this);
}
public override void visit(implementation_node _implementation_node)
{
if (_implementation_node.uses_modules != null)
_implementation_node.uses_modules.visit(this);
if (_implementation_node.implementation_definitions != null)
_implementation_node.implementation_definitions.visit(this);
}
public override void visit(diap_expr _diap_expr)
{
if (_diap_expr.left != null)
_diap_expr.left.visit(this);
if (_diap_expr.right != null)
_diap_expr.right.visit(this);
}
public override void visit(block _block)
{
if (_block.defs != null)
_block.defs.visit(this);
if (_block.program_code != null)
_block.program_code.visit(this);
}
public override void visit(proc_block _proc_block)
{
throw new NotImplementedException();
}
public override void visit(array_of_named_type_definition _array_of_named_type_definition)
{
if (_array_of_named_type_definition.type_name != null)
_array_of_named_type_definition.type_name.visit(this);
}
public override void visit(array_of_const_type_definition _array_of_const_type_definition)
{
//throw new NotImplementedException();
}
public override void visit(literal _literal)
{
//throw new NotImplementedException();
}
public override void visit(case_variants _case_variants)
{
//throw new NotImplementedException();
foreach (case_variant cv in _case_variants.variants)
cv.visit(this);
}
public override void visit(diapason_expr _diapason_expr)
{
if (_diapason_expr.left != null)
_diapason_expr.left.visit(this);
if (_diapason_expr.right != null)
_diapason_expr.right.visit(this);
}
public override void visit(var_def_list_for_record _var_def_list)
{
throw new NotImplementedException();
}
public override void visit(record_type_parts _record_type_parts)
{
}
public override void visit(property_array_default _property_array_default)
{
}
public override void visit(property_interface _property_interface)
{
}
public override void visit(property_parameter _property_parameter)
{
if (_property_parameter.type != null)
_property_parameter.type.visit(this);
}
public override void visit(property_parameter_list _property_parameter_list)
{
foreach (property_parameter prm in _property_parameter_list.parameters)
prm.visit(this);
}
public override void visit(inherited_ident _inherited_ident)
{
ret_tn = cur_scope.FindNameInAnyOrder(_inherited_ident.name);
if (ret_tn != null && ret_tn.IsEqual(founded_scope))
pos_list.Add(get_position(_inherited_ident));
}
public override void visit(format_expr _format_expr)
{
_format_expr.expr.visit(this);
if (_format_expr.format1 != null)
_format_expr.format1.visit(this);
if (_format_expr.format2 != null)
_format_expr.format2.visit(this);
}
public override void visit(initfinal_part _initfinal_part)
{
//throw new NotImplementedException();
}
public override void visit(token_info _token_info)
{
//throw new NotImplementedException()
}
public override void visit(raise_stmt _raise_stmt)
{
if (_raise_stmt.address != null)
_raise_stmt.address.visit(this);
if (_raise_stmt.expr != null)
_raise_stmt.expr.visit(this);
}
public override void visit(op_type_node _op_type_node)
{
//throw new NotImplementedException();
}
public override void visit(file_type _file_type)
{
if (_file_type.file_of_type != null)
_file_type.file_of_type.visit(this);
}
public override void visit(known_type_ident _known_type_ident)
{
//throw new NotImplementedException();
}
public override void visit(exception_handler _exception_handler)
{
if (_exception_handler.type_name != null)
_exception_handler.type_name.visit(this);
if (_exception_handler.statements != null)
_exception_handler.statements.visit(this);
}
public override void visit(exception_ident _exception_ident)
{
//throw new NotImplementedException();
}
public override void visit(exception_handler_list _exception_handler_list)
{
foreach (exception_handler eh in _exception_handler_list.handlers)
eh.visit(this);
}
public override void visit(exception_block _exception_block)
{
if (_exception_block.handlers != null)
_exception_block.handlers.visit(this);
if (_exception_block.stmt_list != null)
_exception_block.stmt_list.visit(this);
if (_exception_block.else_stmt_list != null)
_exception_block.else_stmt_list.visit(this);
}
public override void visit(try_handler _try_handler)
{
}
public override void visit(try_handler_finally _try_handler_finally)
{
if (_try_handler_finally.stmt_list != null)
_try_handler_finally.stmt_list.visit(this);
}
public override void visit(try_handler_except _try_handler_except)
{
if (_try_handler_except.except_block != null)
_try_handler_except.except_block.visit(this);
}
public override void visit(try_stmt _try_stmt)
{
if (_try_stmt.stmt_list != null)
_try_stmt.stmt_list.visit(this);
if (_try_stmt.handler != null)
_try_stmt.handler.visit(this);
}
public override void visit(inherited_message _inherited_message)
{
//throw new NotImplementedException();
}
public override void visit(external_directive _external_directive)
{
//throw new NotImplementedException();
}
public override void visit(using_list _using_list)
{
throw new NotImplementedException();
}
public override void visit(jump_stmt _jump_stmt)
{
throw new NotImplementedException();
}
public override void visit(loop_stmt _loop_stmt)
{
if (_loop_stmt.count != null)
_loop_stmt.count.visit(this);
if (_loop_stmt.stmt != null)
_loop_stmt.stmt.visit(this);
}
public override void visit(foreach_stmt _foreach_stmt)
{
ret_tn = cur_scope.FindNameInAnyOrder(_foreach_stmt.identifier.name);
if (ret_tn != null && ret_tn.IsEqual(founded_scope))
pos_list.Add(get_position(_foreach_stmt.identifier));
if (_foreach_stmt.type_name != null)
_foreach_stmt.type_name.visit(this);
if (_foreach_stmt.in_what != null)
_foreach_stmt.in_what.visit(this);
if (_foreach_stmt.stmt != null)
_foreach_stmt.stmt.visit(this);
}
public override void visit(addressed_value_funcname _addressed_value_funcname)
{
//throw new NotImplementedException();
}
public override void visit(named_type_reference_list _named_type_reference_list)
{
foreach (named_type_reference ntr in _named_type_reference_list.types)
ntr.visit(this);
}
public override void visit(template_param_list _template_param_list)
{
//throw new NotImplementedException();
foreach (type_definition td in _template_param_list.params_list)
td.visit(this);
}
public override void visit(template_type_reference _template_type_reference)
{
//throw new NotImplementedException();
if (_template_type_reference.name != null)
_template_type_reference.name.visit(this);
if (_template_type_reference.params_list != null)
_template_type_reference.params_list.visit(this);
}
public override void visit(int64_const _int64_const)
{
//throw new NotImplementedException();
}
public override void visit(uint64_const _uint64_const)
{
//throw new NotImplementedException();
}
public override void visit(new_expr _new_expr)
{
if (_new_expr.type != null)
_new_expr.type.visit(this);
if (ret_tn != null && ret_tn is ITypeScope)
{
IProcScope ps = (ret_tn as ITypeScope).GetConstructor();
while (ps != null)
{
if (ps.IsEqual(founded_scope))
{
pos_list.Add(get_position(_new_expr.type));
break;
}
else ps = ps.NextFunction;
}
}
if (_new_expr.params_list != null)
_new_expr.params_list.visit(this);
}
public override void visit(where_type_specificator_list _type_definition_list)
{
//throw new NotImplementedException();
}
public override void visit(where_definition _where_definition)
{
foreach (ident id in _where_definition.names.list)
id.visit(this);
foreach (type_definition td in _where_definition.types.defs)
td.visit(this);
}
public override void visit(where_definition_list _where_definition_list)
{
foreach (where_definition wd in _where_definition_list.defs)
wd.visit(this);
}
public override void visit(sizeof_operator _sizeof_operator)
{
//throw new NotImplementedException();
if (_sizeof_operator.type_def != null)
_sizeof_operator.type_def.visit(this);
if (_sizeof_operator.expr != null)
_sizeof_operator.expr.visit(this);
}
public override void visit(typeof_operator _typeof_operator)
{
if (_typeof_operator.type_name != null)
_typeof_operator.type_name.visit(this);
}
public override void visit(compiler_directive _compiler_directive)
{
//throw new NotImplementedException();
}
public override void visit(operator_name_ident _operator_name_ident)
{
//throw new NotImplementedException();
}
public override void visit(var_statement _var_statement)
{
if (_var_statement.var_def != null)
_var_statement.var_def.visit(this);
}
public override void visit(question_colon_expression _question_colon_expression)
{
if (_question_colon_expression.condition != null)
_question_colon_expression.condition.visit(this);
if (_question_colon_expression.ret_if_true != null)
_question_colon_expression.ret_if_true.visit(this);
if (_question_colon_expression.ret_if_false != null)
_question_colon_expression.ret_if_false.visit(this);
}
public override void visit(expression_as_statement _expression_as_statement)
{
if (_expression_as_statement.expr != null)
_expression_as_statement.expr.visit(this);
}
public override void visit(c_scalar_type _c_scalar_type)
{
throw new NotImplementedException();
}
public override void visit(c_module _c_module)
{
throw new NotImplementedException();
}
public override void visit(declarations_as_statement _declarations_as_statement)
{
throw new NotImplementedException();
}
public override void visit(array_size _array_size)
{
throw new NotImplementedException();
}
public override void visit(enumerator _enumerator)
{
}
public override void visit(enumerator_list _enumerator_list)
{
//throw new NotImplementedException();
}
public override void visit(c_for_cycle _c_for_cycle)
{
throw new NotImplementedException();
}
public override void visit(switch_stmt _switch_stmt)
{
throw new NotImplementedException();
}
public override void visit(type_definition_attr_list _type_definition_attr_list)
{
throw new NotImplementedException();
}
public override void visit(type_definition_attr _type_definition_attr)
{
throw new NotImplementedException();
}
public override void visit(lock_stmt _lock_stmt)
{
if (_lock_stmt.lock_object != null)
_lock_stmt.lock_object.visit(this);
if (_lock_stmt.stmt != null)
_lock_stmt.stmt.visit(this);
}
public override void visit(compiler_directive_list _compiler_directive_list)
{
}
public override void visit(compiler_directive_if _compiler_directive_if)
{
}
public override void visit(documentation_comment_list _documentation_comment_list)
{
}
public override void visit(documentation_comment_tag _documentation_comment_tag)
{
}
public override void visit(documentation_comment_tag_param _documentation_comment_tag_param)
{
}
public override void visit(documentation_comment_section _documentation_comment_section)
{
}
public override void visit(token_taginfo node)
{
}
public override void visit(declaration_specificator node)
{
}
public override void visit(ident_with_templateparams node)
{
node.name.visit(this);
foreach (type_definition td in node.template_params.params_list)
{
td.visit(this);
}
}
public override void visit(bracket_expr _bracket_expr)
{
_bracket_expr.expr.visit(this);
}
public override void visit(attribute _attribute)
{
}
public override void visit(attribute_list _attribute_list)
{
}
public override void visit(simple_attribute_list _simple_attribute_list)
{
}
public override void visit(function_lambda_definition _function_lambda_definition)
{
IBaseScope tmp = cur_scope;
cur_scope = entry_scope.FindScopeByLocation(_function_lambda_definition.source_context.begin_position.line_num, _function_lambda_definition.source_context.begin_position.column_num);
if (cur_scope == null)
cur_scope = tmp;
foreach (ident id in _function_lambda_definition.ident_list.list)
id.visit(this);
_function_lambda_definition.proc_body.visit(this);
cur_scope = tmp;
}
public override void visit(function_lambda_call _function_lambda_call)
{
//throw new NotImplementedException();
}
public override void visit(semantic_check _semantic_check)
{
}
public override void visit(lambda_inferred_type lit) //lroman//
{
}
public override void visit(same_type_node stn) //SS 22/06/13//
{
}
public override void visit(name_assign_expr _name_assign_expr) // SSM 27.06.13
{
IBaseScope ss = entry_scope.FindScopeByLocation(_name_assign_expr.name.source_context.begin_position.line_num, _name_assign_expr.name.source_context.begin_position.column_num);
if (ss != null && ss.IsEqual(founded_scope))
pos_list.Add(get_position(_name_assign_expr.name));
if (_name_assign_expr.expr == null)
_name_assign_expr.expr = new ident(_name_assign_expr.name.name, _name_assign_expr.name.source_context);
_name_assign_expr.expr.visit(this);
}
public override void visit(name_assign_expr_list _name_assign_expr_list) // SSM 27.06.13
{
foreach (name_assign_expr expr in _name_assign_expr_list.name_expr)
expr.visit(this);
}
public override void visit(unnamed_type_object _unnamed_type_object) // SSM 27.06.13
{
IBaseScope tmp = cur_scope;
cur_scope = entry_scope.FindScopeByLocation(_unnamed_type_object.source_context.begin_position.line_num, _unnamed_type_object.source_context.begin_position.column_num);
if (_unnamed_type_object.ne_list != null)
_unnamed_type_object.ne_list.visit(this);
cur_scope = tmp;
}
public override void visit(semantic_type_node stn) // SSM
{
}
public override void visit(sequence_type _sequence_type)
{
_sequence_type.elements_type.visit(this);
}
public override void visit(yield_node _yield_node)
{
_yield_node.ex.visit(this);
}
public override void visit(slice_expr _slice_expr)
{
_slice_expr.v.visit(this);
if (_slice_expr.from != null)
_slice_expr.from.visit(this);
if (_slice_expr.to != null)
_slice_expr.to.visit(this);
if (_slice_expr.step != null)
_slice_expr.step.visit(this);
}
public override void visit(slice_expr_question _slice_expr_question)
{
_slice_expr_question.v.visit(this);
if (_slice_expr_question.from != null)
_slice_expr_question.from.visit(this);
if (_slice_expr_question.to != null)
_slice_expr_question.to.visit(this);
if (_slice_expr_question.step != null)
_slice_expr_question.step.visit(this);
}
public override void visit(yield_sequence_node _yield_sequence_node)
{
_yield_sequence_node.ex.visit(this);
}
public override void visit(tuple_node _tuple_node)
{
_tuple_node.el.visit(this);
}
public override void visit(assign_var_tuple _assign_var_tuple)
{
for (int i = 0; i < _assign_var_tuple.idents.idents.Count; i++)
{
_assign_var_tuple.idents.idents[i].visit(this);
}
_assign_var_tuple.expr.visit(this);
}
public override void visit(is_pattern_expr _is_pattern_expr)
{
if (_is_pattern_expr.left != null)
_is_pattern_expr.left.visit(this);
if (_is_pattern_expr.right != null)
_is_pattern_expr.right.visit(this);
}
public override void visit(type_pattern _type_pattern)
{
if (_type_pattern.type != null)
_type_pattern.type.visit(this);
if (_type_pattern.identifier != null)
_type_pattern.identifier.visit(this);
}
public override void visit(dot_question_node _dot_question_node)
{
_dot_question_node.left.visit(this);
_dot_question_node.right.visit(this);
}
public override void visit(double_question_node _double_question_node)
{
_double_question_node.left.visit(this);
_double_question_node.right.visit(this);
}
public override void visit(pattern_cases _pattern_cases)
{
foreach (pattern_case pc in _pattern_cases.elements)
pc.visit(this);
}
public override void visit(var_deconstructor_parameter _var_deconstructor_parameter)
{
ident s = _var_deconstructor_parameter.identifier;
IBaseScope ss = entry_scope.FindScopeByLocation(s.source_context.begin_position.line_num, s.source_context.begin_position.column_num);
if (ss != null && ss.IsEqual(founded_scope))
pos_list.Add(get_position(s));
}
public override void visit(pattern_case _pattern_case)
{
if (_pattern_case.condition != null)
_pattern_case.condition.visit(this);
if (_pattern_case.pattern != null)
_pattern_case.pattern.visit(this);
if (_pattern_case.case_action != null)
{
if (!(_pattern_case.case_action is statement_list))
new statement_list(_pattern_case.case_action, _pattern_case.source_context).visit(this);
else
_pattern_case.case_action.visit(this);
}
}
public override void visit(match_with _match_with)
{
if (_match_with.defaultAction != null)
_match_with.defaultAction.visit(this);
if (_match_with.expr != null)
_match_with.expr.visit(this);
if (_match_with.case_list != null)
_match_with.case_list.visit(this);
}
public override void visit(matching_expression _matching_expression)
{
_matching_expression.left.visit(this);
_matching_expression.right.visit(this);
}
public override void visit(deconstructor_pattern _deconstructor_pattern)
{
_deconstructor_pattern.type.visit(this);
foreach (pattern_parameter pdp in _deconstructor_pattern.parameters)
pdp.visit(this);
}
public override void visit(recursive_deconstructor_parameter _recursive_deconstructor_parameter)
{
_recursive_deconstructor_parameter.pattern.visit(this);
}
public override void visit(modern_proc_type _modern_proc_type)
{
if (_modern_proc_type.aloneparam != null)
{
_modern_proc_type.aloneparam.visit(this);
if (_modern_proc_type.res != null)
_modern_proc_type.res.visit(this);
}
else
{
if (_modern_proc_type.el != null)
foreach (enumerator en in _modern_proc_type.el.enumerators)
{
en.name.visit(this); // <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - SSM 15.1.16
}
if (_modern_proc_type.res != null)
_modern_proc_type.res.visit(this);
}
}
}
}