Skip to content
This repository was archived by the owner on Oct 16, 2020. It is now read-only.

Commit 1554b2d

Browse files
committed
Fix creation of dummy file in debugger dot completion.
1 parent 433cde2 commit 1554b2d

1 file changed

Lines changed: 52 additions & 50 deletions

File tree

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

Lines changed: 52 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -60,76 +60,78 @@ static string GeneratePartialClassContextStub(DebuggerCompletionContext context)
6060
var file = SD.ParserService.GetExistingUnresolvedFile(context.FileName);
6161
if (compilation == null || file == null)
6262
return "";
63-
var member = file.GetMember(context.Location);
63+
var unresolvedMember = file.GetMember(context.Location);
64+
if (unresolvedMember == null)
65+
return "";
66+
var member = unresolvedMember.Resolve(new SimpleTypeResolveContext(compilation.MainAssembly));
6467
if (member == null)
6568
return "";
6669
var builder = new TypeSystemAstBuilder();
67-
EntityDeclaration decl = builder.ConvertEntity(member.Resolve(new SimpleTypeResolveContext(compilation.MainAssembly)));
68-
decl.Name = "__DebuggerStub_" + decl.Name;
69-
decl.Modifiers &= (Modifiers.Static);
70-
switch (member.SymbolKind) {
71-
case SymbolKind.Property:
72-
break;
73-
case SymbolKind.Indexer:
74-
break;
75-
case SymbolKind.Event:
76-
break;
77-
case SymbolKind.Method:
78-
GenerateBodyFromContext(builder, context, (MethodDeclaration)decl);
79-
break;
80-
case SymbolKind.Operator:
81-
break;
82-
case SymbolKind.Constructor:
83-
break;
84-
case SymbolKind.Destructor:
85-
break;
86-
case SymbolKind.Accessor:
87-
break;
88-
default:
89-
throw new ArgumentOutOfRangeException();
70+
MethodDeclaration decl;
71+
if (unresolvedMember is IMethod) {
72+
// If it's a method, convert it directly (including parameters + type parameters)
73+
decl = (MethodDeclaration)builder.ConvertEntity(member);
74+
} else {
75+
// Otherwise, create a method anyways, and copy the parameters
76+
decl = new MethodDeclaration();
77+
if (member is IParameterizedMember) {
78+
foreach (var p in ((IParameterizedMember)member).Parameters) {
79+
decl.Parameters.Add(builder.ConvertParameter(p));
80+
}
81+
}
9082
}
91-
return WrapInType(member.DeclaringTypeDefinition, decl.ToString());
83+
decl.Name = "__DebuggerStub__";
84+
decl.ReturnType = builder.ConvertType(member.ReturnType);
85+
decl.Modifiers = unresolvedMember.IsStatic ? Modifiers.Static : Modifiers.None;
86+
// Make the method look like an explicit interface implementation so that it doesn't appear in CC
87+
decl.PrivateImplementationType = new SimpleType("__DummyType__");
88+
decl.Body = GenerateBodyFromContext(builder, context);
89+
return WrapInType(unresolvedMember.DeclaringTypeDefinition, decl).ToString();
9290
}
9391

94-
static void GenerateBodyFromContext(TypeSystemAstBuilder builder, DebuggerCompletionContext context, MethodDeclaration methodDeclaration)
92+
static BlockStatement GenerateBodyFromContext(TypeSystemAstBuilder builder, DebuggerCompletionContext context)
9593
{
96-
methodDeclaration.Body = new BlockStatement();
94+
var body = new BlockStatement();
9795
foreach (var v in context.Variables)
98-
methodDeclaration.Body.Statements.Add(new VariableDeclarationStatement(builder.ConvertType(v.Type), v.Name));
99-
methodDeclaration.Body.Statements.Add(new ExpressionStatement(new IdentifierExpression("$__Caret_Point__$")));
96+
body.Statements.Add(new VariableDeclarationStatement(builder.ConvertType(v.Type), v.Name));
97+
body.Statements.Add(new ExpressionStatement(new IdentifierExpression("$__Caret_Point__$")));
98+
return body;
10099
}
101100

102-
static string WrapInType(IUnresolvedTypeDefinition entity, string code)
101+
static AstNode WrapInType(IUnresolvedTypeDefinition entity, EntityDeclaration decl)
103102
{
104103
if (entity == null)
105-
return code;
106-
code = WrapInType(entity.DeclaringTypeDefinition, GetHeader(entity) + code + "\r\n}");
107-
if (entity.DeclaringTypeDefinition == null) {
108-
return "namespace " + entity.Namespace + " {\r\n" + code + "\r\n}";
109-
}
110-
return code;
104+
return decl;
105+
// Wrap decl in TypeDeclaration
106+
decl = new TypeDeclaration {
107+
ClassType = GetClassType(entity),
108+
Modifiers = Modifiers.Partial,
109+
Name = entity.Name,
110+
Members = { decl }
111+
};
112+
if (entity.DeclaringTypeDefinition != null) {
113+
// Handle nested types
114+
return WrapInType(entity.DeclaringTypeDefinition, decl);
115+
}
116+
if (string.IsNullOrEmpty(entity.Namespace))
117+
return decl;
118+
return new NamespaceDeclaration(entity.Namespace) {
119+
Members = {
120+
decl
121+
}
122+
};
111123
}
112124

113-
static string GetHeader(IUnresolvedTypeDefinition entity)
125+
static ClassType GetClassType(IUnresolvedTypeDefinition entity)
114126
{
115-
StringBuilder builder = new StringBuilder();
116-
builder.Append("partial ");
117127
switch (entity.Kind) {
118-
case TypeKind.Class:
119-
builder.Append("class ");
120-
break;
121128
case TypeKind.Interface:
122-
builder.Append("interface ");
123-
break;
129+
return ClassType.Interface;
124130
case TypeKind.Struct:
125-
builder.Append("struct ");
126-
break;
131+
return ClassType.Struct;
127132
default:
128-
throw new NotSupportedException();
133+
return ClassType.Class;
129134
}
130-
builder.Append(entity.Name);
131-
builder.AppendLine(" {");
132-
return builder.ToString();
133135
}
134136
}
135137

0 commit comments

Comments
 (0)