diff --git a/CodeCompletion/ExpressionVisitor.cs b/CodeCompletion/ExpressionVisitor.cs index a4fcaf437..44fa2fe33 100644 --- a/CodeCompletion/ExpressionVisitor.cs +++ b/CodeCompletion/ExpressionVisitor.cs @@ -81,20 +81,33 @@ namespace CodeCompletion } if (ret_tn != null && ret_tn is ElementScope && (ret_tn as ElementScope).sc is ProcType) { - if (by_dot) if (((ret_tn as ElementScope).sc as ProcType).target.return_type != null) ret_tn = new ElementScope(((ret_tn as ElementScope).sc as ProcType).target.return_type); - else ret_tn = null; + if (by_dot) + if (((ret_tn as ElementScope).sc as ProcType).target.return_type != null) + ret_tn = new ElementScope(((ret_tn as ElementScope).sc as ProcType).target.return_type); + else + ret_tn = null; } else if (ret_tn != null && ret_tn is ElementScope && (ret_tn as ElementScope).sc is ProcScope) { - if (by_dot) if (((ret_tn as ElementScope).sc as ProcScope).return_type != null) ret_tn = new ElementScope(((ret_tn as ElementScope).sc as ProcScope).return_type); - else ret_tn = null; + if (by_dot) + if (((ret_tn as ElementScope).sc as ProcScope).return_type != null) + ret_tn = new ElementScope(((ret_tn as ElementScope).sc as ProcScope).return_type); + else + ret_tn = null; } - else if (ret_tn != null && ret_tn is ProcScope) - if ((ret_tn as ProcScope).return_type == null) - { - if (by_dot) ret_tn = null; - } - else if (by_dot) ret_tn = new ElementScope((ret_tn as ProcScope).return_type); + else if (ret_tn != null && ret_tn is ElementScope && (ret_tn as ElementScope).sc is CompiledScope && ((ret_tn as ElementScope).sc as CompiledScope).CompiledType.BaseType == typeof(MulticastDelegate)) + { + ProcScope invoke_meth = ((ret_tn as ElementScope).sc as CompiledScope).FindNameOnlyInThisType("Invoke") as ProcScope; + if (invoke_meth != null) + ret_tn = new ElementScope(invoke_meth.return_type); + } + else if (ret_tn != null && ret_tn is ProcScope) + if ((ret_tn as ProcScope).return_type == null) + { + if (by_dot) ret_tn = null; + } + else if (by_dot) + ret_tn = new ElementScope((ret_tn as ProcScope).return_type); //else ret_scope = (ret_scope as ElementScope).sc as ProcScope; return ret_tn; @@ -133,6 +146,14 @@ namespace CodeCompletion } else if (ret_names[i] is ProcScope) proces.Add(ret_names[i] as ProcScope); + else if (ret_names[i] is ElementScope && (ret_names[i] as ElementScope).sc is CompiledScope) + { + //ProcType pt = new ProcType(); + CompiledScope cs = (ret_names[i] as ElementScope).sc as CompiledScope; + ProcScope ps = cs.FindNameOnlyInThisType("Invoke") as ProcScope; + if (ps != null) + proces.Add(ps); + } } return proces; } @@ -842,9 +863,9 @@ namespace CodeCompletion ret_names.Clear(); search_all = true; _method_call.dereferencing_value.visit(this); - search_all = false; + search_all = false; SymScope[] names = ret_names.ToArray(); - if (names.Length > 0 && names[0] is ElementScope && (names[0] as ElementScope).sc is ProcType) + if (names.Length > 0 && names[0] is ElementScope && ((names[0] as ElementScope).sc is ProcType || (names[0] as ElementScope).sc is CompiledScope)) { ret_tn = names[0]; return; diff --git a/ParserTools/ParserTools/DefaultLanguageInformation.cs b/ParserTools/ParserTools/DefaultLanguageInformation.cs index 7c70a0ef1..289336b65 100644 --- a/ParserTools/ParserTools/DefaultLanguageInformation.cs +++ b/ParserTools/ParserTools/DefaultLanguageInformation.cs @@ -999,25 +999,48 @@ namespace PascalABCCompiler.Parsers protected virtual string GetSimpleDescriptionForCompiledType(ICompiledTypeScope scope) { - string s = GetFullTypeName(scope.CompiledType); - ITypeScope[] instances = scope.GenericInstances; - if (instances != null && instances.Length > 0) - { - System.Text.StringBuilder sb = new System.Text.StringBuilder(); - int ind = s.IndexOf('<'); - if (ind != -1) sb.Append(s.Substring(0,ind)); - else - sb.Append(s); - sb.Append('<'); - for (int i=0; i'); - s = sb.ToString(); - } - return s; + if (scope.CompiledType.FullName == "System.Func`2") + { + ITypeScope[] instances = scope.GenericInstances; + if (instances != null && instances.Length == 2) + { + return GetSimpleDescriptionWithoutNamespace(instances[0]) + "->" + GetSimpleDescriptionWithoutNamespace(instances[1]); + } + else + return "T->T1"; + } + else if (scope.CompiledType.FullName == "System.Action`1") + { + ITypeScope[] instances = scope.GenericInstances; + if (instances != null && instances.Length == 1) + { + return GetSimpleDescriptionWithoutNamespace(instances[0]) + "->()"; + } + else + return "T->()"; + } + else + { + string s = GetFullTypeName(scope.CompiledType); + ITypeScope[] instances = scope.GenericInstances; + if (instances != null && instances.Length > 0) + { + System.Text.StringBuilder sb = new System.Text.StringBuilder(); + int ind = s.IndexOf('<'); + if (ind != -1) sb.Append(s.Substring(0, ind)); + else + sb.Append(s); + sb.Append('<'); + for (int i = 0; i < instances.Length; i++) + { + sb.Append(GetSimpleDescriptionWithoutNamespace(instances[i])); + if (i < instances.Length - 1) sb.Append(','); + } + sb.Append('>'); + s = sb.ToString(); + } + return s; + } } protected virtual string GetDescriptionForArray(IArrayScope scope) @@ -1441,8 +1464,11 @@ namespace PascalABCCompiler.Parsers sb.Append(GetShortTypeName(scope.CompiledMethod.DeclaringType)); else sb.Append(GetShortTypeName(scope.CompiledMethod.GetParameters()[0].ParameterType)); - sb.Append("."); - sb.Append(scope.Name); + if (scope.Name != "Invoke") + { + sb.Append("."); + sb.Append(scope.Name); + } if (scope.CompiledMethod.GetGenericArguments().Length > 0) { Type[] tt = scope.CompiledMethod.GetGenericArguments(); diff --git a/bin/Rules_CS.txt b/bin/Rules_CS.txt new file mode 100644 index 000000000..31d9098be --- /dev/null +++ b/bin/Rules_CS.txt @@ -0,0 +1,184 @@ +@namespace :: +$namespace *BW name *BlockBegin *BlockBody +${ *BlockBegin *BlockBody *BlockBody + $public *BW $class *BW name *BlockBegin *BlockBody + ${ *BlockBegin + body + *BlockEnd *BlockBody $} + *BlockEnd *BlockBody $} + +@class :: +access_modifier_type *BW $class *BW name *BlockBegin *BlockBody +${ + *BlockBegin + body + *BlockEnd + *BlockBody $} + +@struct :: +access_modifier_type *BW $struct *BW name *BlockBegin *BlockBody +${ + *BlockBegin + body + *BlockEnd + *BlockBody $} + +@function :: +$public *BW $static *BW type *BW name $( parameters $) *BlockBegin *BlockBody +${ + *BlockBegin + body + *BlockEnd + *BlockBody $} + +@return :: +$return *BW expr + +@array_indexing :: +expr $[ expr $] + +@function_call :: +name $( parameters $) + +@comp_method_call :: +expr $. name $( parameters $) + +@comp_stat_method_call :: +name $( parameters $) + +@comm_stat_method_call :: +type $. name $( parameters $) + +@type_of :: +$typeof $( type $) + +@if :: +$if $( parameters $) + body + + @if_else :: +$if $( parameters $) + body *BlockBegin *BlockBody + $else *BlockBegin *BlockBody + body + + +@for :: +$for $( body $) + body + +@while :: +$while $( body $) + body + + +@repeat :: +$do + *BlockBegin *BlockBody +${ + *BlockBegin + body + *BlockEnd + *BlockBody $} + $while $( parameters $) + +@namespace_var :: +$public *BW $static *BW type *BW name + +@var :: +type *BW name + +@var_init :: +type *BW name $= body + +@const :: +$public *BW $const *BW type *BW name + +@statements :: +body + +@statements_nested :: *BlockBegin *BlockBody +${ + *BlockBegin + body + *BlockEnd + *BlockBody $} + +@binop_assign :: +expr *BW $= *BW expr + +@binop_add :: +expr *BW $+ *BW expr + +@binop_subtract :: +expr *BW $- *BW expr + +@binop_mult :: +expr *BW $* *BW expr + +@binop_div :: +expr $/ expr + +@unop_plus :: +$+ expr + +@unop_minus :: +$- expr + +@binop_mod :: +expr $% expr + +@binop_eq :: +expr *BW $== *BW expr + +@binop_gr :: +expr *BW $> *BW expr + +@binop_sm :: +expr *BW $< *BW expr + +@binop_greq :: +expr *BW $>= *BW expr + +@binop_smeq :: +expr *BW $<= *BW expr + +@binop_and :: +expr *BW $&& *BW expr + +@binop_or :: +expr *BW $|| *BW expr + +@binop_xor :: +expr $^ expr + +@unop_inc :: +$++ expr + +@unop_dec :: +$-- expr + +@unop_unmin :: +$- $( expr $) + +@unop_not :: +$! expr + +@binop_shl :: +expr $<< expr + +@binop_shr :: +expr $>> expr + +@constructor_call :: +$new *BW type $( parameters $) + +@var_locblock :: +name + +@variable_reference :: +name + +@locvariable_reference :: +name +