This commit is contained in:
Бондарев Иван 2018-05-21 20:36:21 +02:00
parent 9477f6982b
commit ae4e28a43a
2 changed files with 58 additions and 9 deletions

View file

@ -1619,12 +1619,16 @@ namespace CodeCompletion
//throw new Exception("The method or operation is not implemented."); //throw new Exception("The method or operation is not implemented.");
SymScope tmp = cur_scope; SymScope tmp = cur_scope;
cur_loc = get_location(_procedure_definition); cur_loc = get_location(_procedure_definition);
is_proc_realization = true; if (!parse_only_method_body)
_procedure_definition.proc_header.visit(this); {
is_proc_realization = false; is_proc_realization = true;
_procedure_definition.proc_header.visit(this);
is_proc_realization = false;
}
if (_procedure_definition.proc_body != null) if (_procedure_definition.proc_body != null)
{ {
if (_procedure_definition.proc_header is function_header && (_procedure_definition.proc_header as function_header).return_type == null) if (!parse_only_method_body && _procedure_definition.proc_header is function_header && (_procedure_definition.proc_header as function_header).return_type == null)
{ {
var fh = (_procedure_definition.proc_header as function_header); var fh = (_procedure_definition.proc_header as function_header);
if (fh != null && fh.return_type == null && !(returned_scope is ProcScope && (returned_scope as ProcScope).procRealization != null && !(returned_scope as ProcScope).is_extension)) if (fh != null && fh.return_type == null && !(returned_scope is ProcScope && (returned_scope as ProcScope).procRealization != null && !(returned_scope as ProcScope).is_extension))
@ -1654,12 +1658,13 @@ namespace CodeCompletion
} }
} }
} }
cur_scope = returned_scope; if (!parse_only_method_body)
cur_scope = returned_scope;
/*if ((ret_tn as ProcScope).return_type != null) /*if ((ret_tn as ProcScope).return_type != null)
{ {
ret_tn.AddName("Result",new ElementScope(new SymInfo("Result", SymbolKind.Variable,"Result"),(ret_tn as ProcScope).return_type,cur_scope)); ret_tn.AddName("Result",new ElementScope(new SymInfo("Result", SymbolKind.Variable,"Result"),(ret_tn as ProcScope).return_type,cur_scope));
}*/ }*/
if (!parse_only_interface) if (!parse_only_interface && !parse_only_method_header)
{ {
try try
{ {
@ -3079,26 +3084,59 @@ namespace CodeCompletion
} }
private access_modifer cur_access_mod = access_modifer.none; private access_modifer cur_access_mod = access_modifer.none;
private bool parse_only_method_header = false;
private bool parse_only_method_body = false;
public override void visit(class_body_list _class_body) public override void visit(class_body_list _class_body)
{ {
//throw new Exception("The method or operation is not implemented."); //throw new Exception("The method or operation is not implemented.");
parse_only_method_header = true;
Dictionary<declaration, SymScope> scopes = new Dictionary<declaration, SymScope>();
foreach (class_members mems in _class_body.class_def_blocks) foreach (class_members mems in _class_body.class_def_blocks)
{ {
if (mems.access_mod != null) if (mems.access_mod != null)
cur_access_mod = mems.access_mod.access_level; cur_access_mod = mems.access_mod.access_level;
foreach (declaration decl in mems.members)
foreach (declaration decl in mems.members)
{ {
try try
{ {
decl.visit(this); decl.visit(this);
scopes.Add(decl, returned_scope);
} }
catch(Exception e) catch(Exception e)
{ {
} }
} }
cur_access_mod = access_modifer.none; cur_access_mod = access_modifer.none;
} }
parse_only_method_header = false;
parse_only_method_body = true;
foreach (class_members mems in _class_body.class_def_blocks)
{
if (mems.access_mod != null)
cur_access_mod = mems.access_mod.access_level;
foreach (declaration decl in mems.members)
{
try
{
if (decl is procedure_definition)
{
cur_scope = scopes[decl];
decl.visit(this);
}
}
catch (Exception e)
{
}
}
cur_access_mod = access_modifer.none;
}
parse_only_method_body = false;
} }
private bool has_cyclic_inheritance(TypeScope ts) private bool has_cyclic_inheritance(TypeScope ts)

View file

@ -0,0 +1,11 @@
type
t1 = class
procedure p1;
begin
var a{@var a: integer;@} := f1;
end;
function f1 := 0;
end;
begin end.