improvements in intellisense (choose overloaded method)

This commit is contained in:
Бондарев Иван 2015-12-04 20:17:20 +01:00
parent b22d915b61
commit 8f55b16c22
2 changed files with 85 additions and 81 deletions

View file

@ -2163,72 +2163,72 @@ namespace CodeCompletion
_with_statement.what_do.visit(this);
cur_scope = tmp;
}
internal static bool is_good_overload(ProcScope ps, List<SymScope> args)
{
if (ps.parameters == null || ps.parameters.Count == 0)
if (args.Count == 0)
return true;
else
return false;
if (args.Count == 0)
if (ps.parameters.Count == 1 && ps.parameters[0].param_kind == parametr_kind.params_parametr)
return true;
else
return false;
if (args.Count == ps.parameters.Count || ps.IsExtension && args.Count == ps.parameters.Count - 1)
{
if (ps.parameters == null || ps.parameters.Count == 0)
if (args.Count == 0)
return true;
else
return false;
if (args.Count == 0)
if (ps.parameters.Count == 1 && ps.parameters[0].param_kind == parametr_kind.params_parametr)
return true;
else
return false;
if (args.Count == ps.parameters.Count || ps.IsExtension && args.Count == ps.parameters.Count - 1)
{
int off = 0;
if (ps.IsExtension && args.Count == ps.parameters.Count - 1)
off = 1;
for (int i=0; i<args.Count; i++)
{
for (int i = 0; i < args.Count; i++)
{
if (args[i] is UnknownScope)
continue;
if (!(args[i] is TypeScope))
return false;
TypeScope ts = args[i] as TypeScope;
if (!(args[i] is TypeScope))
return false;
TypeScope ts = args[i] as TypeScope;
ElementScope parameter = ps.parameters[i + off];
if (!ts.IsConvertable(parameter.sc as TypeScope))
{
if (parameter.param_kind == parametr_kind.params_parametr)
{
if (!(parameter.sc is TypeScope && (parameter.sc as TypeScope).IsArray && ts.IsConvertable((parameter.sc as TypeScope).elementType)))
return false;
}
else
return false;
}
}
return true;
}
else
{
if (args.Count < ps.parameters.Count)
return false;
int min_arg_cnt = Math.Min(args.Count,ps.parameters.Count);
for (int i=0; i<min_arg_cnt; i++)
{
if (!(args[i] is TypeScope))
return false;
TypeScope ts = args[i] as TypeScope;
if (!ts.IsConvertable(ps.parameters[i].sc as TypeScope))
{
if (ps.parameters[i].param_kind == parametr_kind.params_parametr)
{
if (!(ps.parameters[i].sc is ArrayScope && ts.IsConvertable((ps.parameters[i].sc as ArrayScope).elementType)))
return false;
}
else
return false;
}
else if (i == ps.parameters.Count-1 && ps.parameters[i].param_kind != parametr_kind.params_parametr)
return false;
}
return true;
}
{
if (parameter.param_kind == parametr_kind.params_parametr)
{
if (!(parameter.sc is TypeScope && (parameter.sc as TypeScope).IsArray && ts.IsConvertable((parameter.sc as TypeScope).elementType)))
return false;
}
else
return false;
}
}
return true;
}
else
{
if (args.Count < ps.parameters.Count)
return false;
int min_arg_cnt = Math.Min(args.Count, ps.parameters.Count);
for (int i = 0; i < min_arg_cnt; i++)
{
if (!(args[i] is TypeScope))
return false;
TypeScope ts = args[i] as TypeScope;
if (!ts.IsConvertable(ps.parameters[i].sc as TypeScope))
{
if (ps.parameters[i].param_kind == parametr_kind.params_parametr)
{
if (!(ps.parameters[i].sc is ArrayScope && ts.IsConvertable((ps.parameters[i].sc as ArrayScope).elementType)))
return false;
}
else
return false;
}
else if (i == ps.parameters.Count - 1 && ps.parameters[i].param_kind != parametr_kind.params_parametr)
return false;
}
return true;
}
}
internal static bool is_good_exact_overload(ProcScope ps, List<SymScope> args)

View file

@ -3014,7 +3014,7 @@ namespace CodeCompletion
{
return this.indexes.Length == arrs.indexes.Length;
}
return false;
return true;
/*if (this.indexes == null && arrs.indexes == null) return true;//?????
if (this.indexes != null && arrs.indexes != null)
{
@ -4849,34 +4849,38 @@ namespace CodeCompletion
return this.IsConvertable((ts as TypeSynonim).actType);
else
if (ts is ShortStringScope && ctn == typeof(string))
return true;
else
{
if (ts is UnknownScope)
return true;
else
else if (ts is ProcType)
{
if (ts is UnknownScope)
return true;
else if (ts is ProcType)
ProcType pt = ts as ProcType;
MethodInfo invoke_meth = this.ctn.GetMethod("Invoke");
if (invoke_meth == null)
{
ProcType pt = ts as ProcType;
MethodInfo invoke_meth = this.ctn.GetMethod("Invoke");
if (invoke_meth == null)
return false;
if (pt.target.parameters == null)
if (invoke_meth.GetParameters().Length > 0)
return false;
if (pt.target.parameters != null && pt.target.parameters.Count != invoke_meth.GetParameters().Length)
return false;
ParameterInfo[] parameters = invoke_meth.GetParameters();
for (int i=0; i<parameters.Length; i++)
{
CompiledScope param_cs = TypeTable.get_compiled_type(new SymInfo(null, SymbolKind.Type, null), parameters[i].ParameterType);
if (!(pt.target.parameters[i].sc is TypeScope) || !param_cs.IsConvertable(pt.target.parameters[i].sc as TypeScope))
return false;
}
return true;
}
else
if (this.ctn == typeof(Delegate))
return true;
return false;
}
if (pt.target.parameters == null)
if (invoke_meth.GetParameters().Length > 0)
return false;
if (pt.target.parameters != null && pt.target.parameters.Count != invoke_meth.GetParameters().Length)
return false;
ParameterInfo[] parameters = invoke_meth.GetParameters();
for (int i = 0; i < parameters.Length; i++)
{
CompiledScope param_cs = TypeTable.get_compiled_type(new SymInfo(null, SymbolKind.Type, null), parameters[i].ParameterType);
if (!(pt.target.parameters[i].sc is TypeScope) || !param_cs.IsConvertable(pt.target.parameters[i].sc as TypeScope))
return false;
}
return true;
}
else
return false;
}
if (this.ctn == cs.ctn)
return true;