@@ -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