2
// complete.cs: Expression that are used for completion suggestions.
5
// Miguel de Icaza (miguel@ximian.com)
6
// Marek Safar (marek.safar@gmail.com)
8
// Copyright 2001, 2002, 2003 Ximian, Inc.
9
// Copyright 2003-2009 Novell, Inc.
10
// Copyright 2011 Xamarin Inc
12
// Completion* classes derive from ExpressionStatement as this allows
13
// them to pass through the parser in many conditions that require
14
// statements even when the expression is incomplete (for example
15
// completing inside a lambda
17
using System.Collections.Generic;
20
namespace Mono.CSharp {
23
// A common base class for Completing expressions, it
24
// is just a very simple ExpressionStatement
26
public abstract class CompletingExpression : ExpressionStatement
28
public static void AppendResults (List<string> results, string prefix, IEnumerable<string> names)
30
foreach (string name in names) {
34
if (prefix != null && !name.StartsWith (prefix))
37
if (results.Contains (name))
41
results.Add (name.Substring (prefix.Length));
47
public override bool ContainsEmitWithAwait ()
52
public override Expression CreateExpressionTree (ResolveContext ec)
57
public override void EmitStatement (EmitContext ec)
62
public override void Emit (EmitContext ec)
68
public class CompletionSimpleName : CompletingExpression {
71
public CompletionSimpleName (string prefix, Location l)
77
protected override Expression DoResolve (ResolveContext ec)
79
var results = new List<string> ();
81
ec.CurrentMemberDefinition.GetCompletionStartingWith (Prefix, results);
83
throw new CompletionResult (Prefix, results.Distinct ().Select (l => l.Substring (Prefix.Length)).ToArray ());
86
protected override void CloneTo (CloneContext clonectx, Expression t)
92
public class CompletionMemberAccess : CompletingExpression {
97
public CompletionMemberAccess (Expression e, string partial_name, Location l)
101
this.partial_name = partial_name;
104
public CompletionMemberAccess (Expression e, string partial_name, TypeArguments targs, Location l)
108
this.partial_name = partial_name;
112
protected override Expression DoResolve (ResolveContext ec)
114
Expression expr_resolved = expr.Resolve (ec,
115
ResolveFlags.VariableOrValue | ResolveFlags.Type);
117
if (expr_resolved == null)
120
TypeSpec expr_type = expr_resolved.Type;
121
if (expr_type.IsPointer || expr_type.Kind == MemberKind.Void || expr_type == InternalType.NullLiteral || expr_type == InternalType.AnonymousMethod) {
122
expr_resolved.Error_OperatorCannotBeApplied (ec, loc, ".", expr_type);
127
if (!targs.Resolve (ec))
131
var results = new List<string> ();
132
if (expr_resolved is Namespace){
133
Namespace nexpr = expr_resolved as Namespace;
134
string namespaced_partial;
136
if (partial_name == null)
137
namespaced_partial = nexpr.Name;
139
namespaced_partial = nexpr.Name + "." + partial_name;
141
ec.CurrentMemberDefinition.GetCompletionStartingWith (namespaced_partial, results);
142
if (partial_name != null)
143
results = results.Select (l => l.Substring (partial_name.Length)).ToList ();
145
var r = MemberCache.GetCompletitionMembers (ec, expr_type, partial_name).Select (l => l.Name);
146
AppendResults (results, partial_name, r);
149
throw new CompletionResult (partial_name == null ? "" : partial_name, results.Distinct ().ToArray ());
152
protected override void CloneTo (CloneContext clonectx, Expression t)
154
CompletionMemberAccess target = (CompletionMemberAccess) t;
157
target.targs = targs.Clone ();
159
target.expr = expr.Clone (clonectx);
163
public class CompletionElementInitializer : CompletingExpression {
166
public CompletionElementInitializer (string partial_name, Location l)
168
this.partial_name = partial_name;
172
protected override Expression DoResolve (ResolveContext ec)
174
var members = MemberCache.GetCompletitionMembers (ec, ec.CurrentInitializerVariable.Type, partial_name);
176
// TODO: Does this mean exact match only ?
177
// if (partial_name != null && results.Count > 0 && result [0] == "")
178
// throw new CompletionResult ("", new string [] { "=" });
180
var results = members.Where (l => (l.Kind & (MemberKind.Field | MemberKind.Property)) != 0).Select (l => l.Name).ToList ();
181
if (partial_name != null) {
182
var temp = new List<string> ();
183
AppendResults (temp, partial_name, results);
187
throw new CompletionResult (partial_name == null ? "" : partial_name, results.Distinct ().ToArray ());
190
protected override void CloneTo (CloneContext clonectx, Expression t)