X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;ds=sidebyside;f=mcs%2Fmcs%2Fcomplete.cs;h=ff45ac65b3dbefd6a50daade3277ab931ec3307a;hb=6b29e29967bb5dffd3768b7eec30dcea8cf1c8bd;hp=81be26ab8f3b8e86036912ae5e04d501788495cd;hpb=632de6a042ca4cad26f108a17e6a39afcd286df6;p=mono.git diff --git a/mcs/mcs/complete.cs b/mcs/mcs/complete.cs index 81be26ab8f3..ff45ac65b3d 100644 --- a/mcs/mcs/complete.cs +++ b/mcs/mcs/complete.cs @@ -13,18 +13,41 @@ // statements even when the expression is incomplete (for example // completing inside a lambda // +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Reflection.Emit; +using System.Text; +using Mono.CSharp.Linq; +using System.Linq; + namespace Mono.CSharp { - using System; - using System.Collections; - using System.Reflection; - using System.Reflection.Emit; - using System.Text; // // A common base class for Completing expressions, it // is just a very simple ExpressionStatement // - public abstract class CompletingExpression : ExpressionStatement { + public abstract class CompletingExpression : ExpressionStatement + { + public static void AppendResults (List results, string prefix, IEnumerable names) + { + foreach (string name in names) { + if (name == null) + continue; + + if (prefix != null && !name.StartsWith (prefix)) + continue; + + if (results.Contains (name)) + continue; + + if (prefix != null) + results.Add (name.Substring (prefix.Length)); + else + results.Add (name); + } + } + public override void EmitStatement (EmitContext ec) { // Do nothing @@ -35,39 +58,30 @@ namespace Mono.CSharp { // Do nothing } - public override Expression CreateExpressionTree (EmitContext ec) + public override Expression CreateExpressionTree (ResolveContext ec) { return null; } } public class CompletionSimpleName : CompletingExpression { - string prefix; + public string Prefix; public CompletionSimpleName (string prefix, Location l) { this.loc = l; - this.prefix = prefix; + this.Prefix = prefix; } - - public override Expression DoResolve (EmitContext ec) + + protected override Expression DoResolve (ResolveContext ec) { - string [] names = Evaluator.GetVarNames (); - - ArrayList results = new ArrayList (); - foreach (string name in names){ - if (!name.StartsWith (prefix)) - continue; + var results = new List (); - if (results.Contains (name)) - continue; - - if (prefix != null) - results.Add (name.Substring (prefix.Length)); - else - results.Add (name); - } - throw new CompletionResult (prefix, (string []) results.ToArray (typeof (string))); + AppendResults (results, Prefix, Evaluator.GetVarNames ()); + AppendResults (results, Prefix, ec.CurrentMemberDefinition.Parent.NamespaceEntry.CompletionGetTypesStartingWith (Prefix)); + AppendResults (results, Prefix, Evaluator.GetUsingList ()); + + throw new CompletionResult (Prefix, results.ToArray ()); } protected override void CloneTo (CloneContext clonectx, Expression t) @@ -80,30 +94,6 @@ namespace Mono.CSharp { Expression expr; string partial_name; TypeArguments targs; - - static MemberFilter CollectingFilter = new MemberFilter (Match); - - static bool Match (MemberInfo m, object filter_criteria) - { - if (m is FieldInfo){ - if (((FieldInfo) m).IsSpecialName) - return false; - - } - if (m is MethodInfo){ - if (((MethodInfo) m).IsSpecialName) - return false; - } - - if (filter_criteria == null) - return true; - - string n = (string) filter_criteria; - if (m.Name.StartsWith (n)) - return true; - - return false; - } public CompletionMemberAccess (Expression e, string partial_name, Location l) { @@ -120,19 +110,17 @@ namespace Mono.CSharp { this.targs = targs; } - public override Expression DoResolve (EmitContext ec) + protected override Expression DoResolve (ResolveContext ec) { - SimpleName original = expr as SimpleName; Expression expr_resolved = expr.Resolve (ec, - ResolveFlags.VariableOrValue | ResolveFlags.Type | - ResolveFlags.Intermediate | ResolveFlags.DisableStructFlowAnalysis); + ResolveFlags.VariableOrValue | ResolveFlags.Type); if (expr_resolved == null) return null; - Type expr_type = expr_resolved.Type; - if (expr_type.IsPointer || expr_type == TypeManager.void_type || expr_type == TypeManager.null_type || expr_type == TypeManager.anonymous_method_type) { - Unary.Error_OperatorCannotBeApplied (loc, ".", expr_type); + TypeSpec expr_type = expr_resolved.Type; + if (expr_type.IsPointer || expr_type == TypeManager.void_type || expr_type == TypeManager.null_type || expr_type == InternalType.AnonymousMethod) { + Unary.Error_OperatorCannotBeApplied (ec, loc, ".", expr_type); return null; } @@ -141,27 +129,33 @@ namespace Mono.CSharp { return null; } - ArrayList results = new ArrayList (); - MemberInfo [] result = expr_type.FindMembers (MemberTypes.All, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public, CollectingFilter, partial_name); - foreach (MemberInfo r in result){ - string name; + var results = new List (); + if (expr_resolved is Namespace){ + Namespace nexpr = expr_resolved as Namespace; + string namespaced_partial; - MethodBase rasb = r as MethodBase; - if (rasb != null && rasb.IsSpecialName) - continue; - if (partial_name == null) - name = r.Name; - else { - name = r.Name.Substring (partial_name.Length); + namespaced_partial = nexpr.Name; + else + namespaced_partial = nexpr.Name + "." + partial_name; + +#if false + Console.WriteLine ("Workign with: namespaced partial {0}", namespaced_partial); + foreach (var x in ec.TypeContainer.NamespaceEntry.CompletionGetTypesStartingWith (ec.TypeContainer, namespaced_partial)){ + Console.WriteLine (" {0}", x); } - - if (results.Contains (name)) - continue; - results.Add (name); +#endif + + CompletionSimpleName.AppendResults ( + results, + partial_name, + ec.CurrentMemberDefinition.Parent.NamespaceEntry.CompletionGetTypesStartingWith (namespaced_partial)); + } else { + var r = MemberCache.GetCompletitionMembers (expr_type, partial_name).Select (l => l.Name); + AppendResults (results, partial_name, r); } - throw new CompletionResult (partial_name == null ? "" : partial_name, (string []) results.ToArray (typeof (string))); + throw new CompletionResult (partial_name == null ? "" : partial_name, results.Distinct ().ToArray ()); } protected override void CloneTo (CloneContext clonectx, Expression t) @@ -174,4 +168,38 @@ namespace Mono.CSharp { target.expr = expr.Clone (clonectx); } } -} \ No newline at end of file + + public class CompletionElementInitializer : CompletingExpression { + string partial_name; + + public CompletionElementInitializer (string partial_name, Location l) + { + this.partial_name = partial_name; + this.loc = l; + } + + protected override Expression DoResolve (ResolveContext ec) + { + var members = MemberCache.GetCompletitionMembers (ec.CurrentInitializerVariable.Type, partial_name); + +// TODO: Does this mean exact match only ? +// if (partial_name != null && results.Count > 0 && result [0] == "") +// throw new CompletionResult ("", new string [] { "=" }); + + var results = members.Where (l => (l.Kind & (MemberKind.Field | MemberKind.Property)) != 0).Select (l => l.Name).ToList (); + if (partial_name != null) { + var temp = new List (); + AppendResults (temp, partial_name, results); + results = temp; + } + + throw new CompletionResult (partial_name == null ? "" : partial_name, results.Distinct ().ToArray ()); + } + + protected override void CloneTo (CloneContext clonectx, Expression t) + { + // Nothing + } + } + +}