Browse Source

Fix creation of dummy file in debugger dot completion.

pull/462/head
Daniel Grunwald 12 years ago
parent
commit
1554b2d0c3
  1. 102
      src/AddIns/Debugger/Debugger.AddIn/Pads/DebuggerDotCompletion.cs

102
src/AddIns/Debugger/Debugger.AddIn/Pads/DebuggerDotCompletion.cs

@ -60,76 +60,78 @@ namespace Debugger.AddIn.Pads.Controls
var file = SD.ParserService.GetExistingUnresolvedFile(context.FileName); var file = SD.ParserService.GetExistingUnresolvedFile(context.FileName);
if (compilation == null || file == null) if (compilation == null || file == null)
return ""; return "";
var member = file.GetMember(context.Location); var unresolvedMember = file.GetMember(context.Location);
if (unresolvedMember == null)
return "";
var member = unresolvedMember.Resolve(new SimpleTypeResolveContext(compilation.MainAssembly));
if (member == null) if (member == null)
return ""; return "";
var builder = new TypeSystemAstBuilder(); var builder = new TypeSystemAstBuilder();
EntityDeclaration decl = builder.ConvertEntity(member.Resolve(new SimpleTypeResolveContext(compilation.MainAssembly))); MethodDeclaration decl;
decl.Name = "__DebuggerStub_" + decl.Name; if (unresolvedMember is IMethod) {
decl.Modifiers &= (Modifiers.Static); // If it's a method, convert it directly (including parameters + type parameters)
switch (member.SymbolKind) { decl = (MethodDeclaration)builder.ConvertEntity(member);
case SymbolKind.Property: } else {
break; // Otherwise, create a method anyways, and copy the parameters
case SymbolKind.Indexer: decl = new MethodDeclaration();
break; if (member is IParameterizedMember) {
case SymbolKind.Event: foreach (var p in ((IParameterizedMember)member).Parameters) {
break; decl.Parameters.Add(builder.ConvertParameter(p));
case SymbolKind.Method: }
GenerateBodyFromContext(builder, context, (MethodDeclaration)decl); }
break;
case SymbolKind.Operator:
break;
case SymbolKind.Constructor:
break;
case SymbolKind.Destructor:
break;
case SymbolKind.Accessor:
break;
default:
throw new ArgumentOutOfRangeException();
} }
return WrapInType(member.DeclaringTypeDefinition, decl.ToString()); decl.Name = "__DebuggerStub__";
decl.ReturnType = builder.ConvertType(member.ReturnType);
decl.Modifiers = unresolvedMember.IsStatic ? Modifiers.Static : Modifiers.None;
// Make the method look like an explicit interface implementation so that it doesn't appear in CC
decl.PrivateImplementationType = new SimpleType("__DummyType__");
decl.Body = GenerateBodyFromContext(builder, context);
return WrapInType(unresolvedMember.DeclaringTypeDefinition, decl).ToString();
} }
static void GenerateBodyFromContext(TypeSystemAstBuilder builder, DebuggerCompletionContext context, MethodDeclaration methodDeclaration) static BlockStatement GenerateBodyFromContext(TypeSystemAstBuilder builder, DebuggerCompletionContext context)
{ {
methodDeclaration.Body = new BlockStatement(); var body = new BlockStatement();
foreach (var v in context.Variables) foreach (var v in context.Variables)
methodDeclaration.Body.Statements.Add(new VariableDeclarationStatement(builder.ConvertType(v.Type), v.Name)); body.Statements.Add(new VariableDeclarationStatement(builder.ConvertType(v.Type), v.Name));
methodDeclaration.Body.Statements.Add(new ExpressionStatement(new IdentifierExpression("$__Caret_Point__$"))); body.Statements.Add(new ExpressionStatement(new IdentifierExpression("$__Caret_Point__$")));
return body;
} }
static string WrapInType(IUnresolvedTypeDefinition entity, string code) static AstNode WrapInType(IUnresolvedTypeDefinition entity, EntityDeclaration decl)
{ {
if (entity == null) if (entity == null)
return code; return decl;
code = WrapInType(entity.DeclaringTypeDefinition, GetHeader(entity) + code + "\r\n}"); // Wrap decl in TypeDeclaration
if (entity.DeclaringTypeDefinition == null) { decl = new TypeDeclaration {
return "namespace " + entity.Namespace + " {\r\n" + code + "\r\n}"; ClassType = GetClassType(entity),
} Modifiers = Modifiers.Partial,
return code; Name = entity.Name,
Members = { decl }
};
if (entity.DeclaringTypeDefinition != null) {
// Handle nested types
return WrapInType(entity.DeclaringTypeDefinition, decl);
}
if (string.IsNullOrEmpty(entity.Namespace))
return decl;
return new NamespaceDeclaration(entity.Namespace) {
Members = {
decl
}
};
} }
static string GetHeader(IUnresolvedTypeDefinition entity) static ClassType GetClassType(IUnresolvedTypeDefinition entity)
{ {
StringBuilder builder = new StringBuilder();
builder.Append("partial ");
switch (entity.Kind) { switch (entity.Kind) {
case TypeKind.Class:
builder.Append("class ");
break;
case TypeKind.Interface: case TypeKind.Interface:
builder.Append("interface "); return ClassType.Interface;
break;
case TypeKind.Struct: case TypeKind.Struct:
builder.Append("struct "); return ClassType.Struct;
break;
default: default:
throw new NotSupportedException(); return ClassType.Class;
} }
builder.Append(entity.Name);
builder.AppendLine(" {");
return builder.ToString();
} }
} }

Loading…
Cancel
Save