2019-07-28 23:53:15 +03:00
// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt)
2015-06-01 22:15:17 +03:00
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
2015-05-14 22:35:07 +03:00
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 ;
2017-11-26 14:38:17 +03:00
using System.IO ;
2015-05-14 22:35:07 +03:00
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 )
{
2019-12-26 14:39:18 +03:00
if ( founded_scope is IProcScope & & ( founded_scope as IProcScope ) . IsConstructor ( ) )
founded_scope = ( founded_scope as IProcScope ) . DeclaringType ;
2015-05-14 22:35:07 +03:00
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 )
{
2017-11-26 14:38:17 +03:00
#if DEBUG
File . AppendAllText ( "log.txt" , e . Message + Environment . NewLine + e . StackTrace + Environment . NewLine ) ;
#endif
2015-05-14 22:35:07 +03:00
}
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 )
2017-10-04 21:48:58 +03:00
{
IBaseScope tmp2 = cur_scope ;
2017-10-12 21:52:33 +03:00
if ( stmt . source_context ! = null )
cur_scope = cur_scope . FindScopeByLocation ( stmt . source_context . begin_position . line_num , stmt . source_context . begin_position . column_num ) ;
2017-10-04 21:48:58 +03:00
if ( cur_scope = = null )
cur_scope = tmp2 ;
2015-05-14 22:35:07 +03:00
stmt . visit ( this ) ;
2017-10-04 21:48:58 +03:00
cur_scope = tmp2 ;
}
2015-05-14 22:35:07 +03:00
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 ) ;
}
2016-07-03 03:11:01 +03:00
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 ) ;
}
2015-05-14 22:35:07 +03:00
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 ;
2022-10-31 12:49:39 +03:00
else if ( founded_scope . IsEqual ( ret_tn ) & & founded_scope is TypeScope )
2018-08-26 20:35:27 +03:00
pos_list . Add ( get_position ( _named_type_reference . names [ i ] ) ) ;
2015-05-14 22:35:07 +03:00
}
}
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 ) ;
}
2024-01-07 16:43:47 +03:00
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 ) ;
}
2015-05-14 22:35:07 +03:00
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 )
{
2022-04-15 16:50:29 +03:00
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 ;
2015-05-14 22:35:07 +03:00
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 )
2022-04-15 16:50:29 +03:00
{
2015-05-14 22:35:07 +03:00
_for_node . statements . visit ( this ) ;
2022-04-15 16:50:29 +03:00
}
cur_scope = tmp ;
2015-05-14 22:35:07 +03:00
}
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 ) ;
2018-05-05 18:49:48 +03:00
if ( ss ! = null & & ss . IsEqual ( founded_scope ) & & founded_scope . SymbolInfo . Name = = s . name )
2015-05-14 22:35:07 +03:00
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 )
{
2018-04-15 15:08:53 +03:00
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 ) ) )
2015-05-14 22:35:07 +03:00
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 ) ;
2018-04-15 15:08:53 +03:00
2015-05-14 22:35:07 +03:00
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 ) ;
2015-12-06 21:25:05 +03:00
if ( _procedure_header . where_defs ! = null )
_procedure_header . where_defs . visit ( this ) ;
2015-05-14 22:35:07 +03:00
}
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 )
{
2018-04-15 15:37:22 +03:00
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 ) ) )
2015-05-14 22:35:07 +03:00
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 ) ;
2015-12-06 21:25:05 +03:00
if ( _function_header . where_defs ! = null )
_function_header . where_defs . visit ( this ) ;
2015-05-14 22:35:07 +03:00
}
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 ) ;
2022-11-01 12:23:10 +03:00
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 ) ) ;
}
}
2018-06-14 22:18:00 +03:00
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 ) ;
2018-08-26 20:35:27 +03:00
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 ) ) )
2015-05-14 22:35:07 +03:00
{
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 )
{
2017-10-08 13:30:43 +03:00
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 ) ;
2015-05-14 22:35:07 +03:00
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 ) ;
2018-08-08 16:54:13 +03:00
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 ) ;
2015-05-14 22:35:07 +03:00
}
}
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 )
{
2019-12-25 15:27:54 +03:00
if ( _write_accessor_name . accessor_name = = null )
return ;
2015-05-14 22:35:07 +03:00
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 )
{
2019-12-25 15:27:54 +03:00
if ( _read_accessor_name . accessor_name = = null )
return ;
2015-05-14 22:35:07 +03:00
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 ) ;
2019-03-10 20:03:23 +03:00
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 ) )
2015-05-14 22:35:07 +03:00
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();
}
2017-06-06 05:24:32 +03:00
public override void visit ( class_body_list _class_body )
2015-05-14 22:35:07 +03:00
{
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 )
{
2017-12-05 22:39:14 +03:00
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 ) ;
}
}
2015-05-14 22:35:07 +03:00
//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 ) ;
}
2015-07-31 01:02:56 +03:00
public override void visit ( var_def_list_for_record _var_def_list )
2015-05-14 22:35:07 +03:00
{
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 )
{
2017-06-08 21:34:16 +03:00
if ( _loop_stmt . count ! = null )
_loop_stmt . count . visit ( this ) ;
if ( _loop_stmt . stmt ! = null )
_loop_stmt . stmt . visit ( this ) ;
2015-05-14 22:35:07 +03:00
}
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 ) ;
}
2015-07-30 14:02:48 +03:00
public override void visit ( where_type_specificator_list _type_definition_list )
2015-05-14 22:35:07 +03:00
{
//throw new NotImplementedException();
}
public override void visit ( where_definition _where_definition )
{
2015-12-06 21:25:05 +03:00
foreach ( ident id in _where_definition . names . list )
id . visit ( this ) ;
foreach ( type_definition td in _where_definition . types . defs )
td . visit ( this ) ;
2015-05-14 22:35:07 +03:00
}
public override void visit ( where_definition_list _where_definition_list )
{
2015-12-06 21:25:05 +03:00
foreach ( where_definition wd in _where_definition_list . defs )
wd . visit ( this ) ;
2015-05-14 22:35:07 +03:00
}
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 )
{
2017-02-28 22:59:35 +03:00
2015-05-14 22:35:07 +03:00
}
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 )
{
2015-07-20 21:37:47 +03:00
node . name . visit ( this ) ;
foreach ( type_definition td in node . template_params . params_list )
{
td . visit ( this ) ;
}
2015-05-14 22:35:07 +03:00
}
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 )
{
2015-12-06 19:18:04 +03:00
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 ;
2015-05-14 22:35:07 +03:00
}
public override void visit ( function_lambda_call _function_lambda_call )
{
//throw new NotImplementedException();
}
public override void visit ( semantic_check _semantic_check )
{
}
2017-02-28 22:59:35 +03:00
public override void visit ( lambda_inferred_type lit ) //lroman//
2015-05-14 22:35:07 +03:00
{
}
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 ) ) ;
2017-12-31 14:55:57 +03:00
if ( _name_assign_expr . expr = = null )
_name_assign_expr . expr = new ident ( _name_assign_expr . name . name , _name_assign_expr . name . source_context ) ;
2015-05-14 22:35:07 +03:00
_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 )
{
2015-07-20 21:37:47 +03:00
_sequence_type . elements_type . visit ( this ) ;
2015-05-14 22:35:07 +03:00
}
2016-07-03 12:48:34 +03:00
public override void visit ( yield_node _yield_node )
{
_yield_node . ex . visit ( this ) ;
}
2018-04-15 15:08:53 +03:00
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 ) ;
}
2018-07-01 12:41:29 +03:00
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 ) ;
}
2018-07-04 22:15:37 +03:00
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 ) ) ;
}
2018-07-01 12:41:29 +03:00
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 )
2018-07-04 22:15:37 +03:00
{
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 ) ;
}
2018-07-01 12:41:29 +03:00
}
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 ) ;
2019-05-24 10:04:17 +03:00
foreach ( pattern_parameter pdp in _deconstructor_pattern . parameters )
2018-07-01 12:41:29 +03:00
pdp . visit ( this ) ;
}
public override void visit ( recursive_deconstructor_parameter _recursive_deconstructor_parameter )
{
_recursive_deconstructor_parameter . pattern . visit ( this ) ;
}
2015-05-25 18:39:51 +03:00
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
{
2017-11-23 23:00:04 +03:00
if ( _modern_proc_type . el ! = null )
2015-05-25 18:39:51 +03:00
foreach ( enumerator en in _modern_proc_type . el . enumerators )
{
2016-01-15 22:06:39 +03:00
en . name . visit ( this ) ; // <20> <> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> - SSM 15.1.16
2015-05-25 18:39:51 +03:00
}
if ( _modern_proc_type . res ! = null )
_modern_proc_type . res . visit ( this ) ;
}
}
2015-05-14 22:35:07 +03:00
}
}