11using Cecilifier . Core . ApiDriver ;
22using Cecilifier . Core . AST ;
3+ using Cecilifier . Core . Extensions ;
34using Cecilifier . Core . Misc ;
45using Cecilifier . Core . Naming ;
56using Cecilifier . Core . Variables ;
@@ -26,8 +27,6 @@ public IEnumerable<string> Type(
2627 IEnumerable < TypeParameterSyntax > outerTypeParameters ,
2728 params string [ ] properties )
2829 {
29- //TODO: We need to pass the handle of the 1st field/method defined in the module so we need to postpone the type generation after we have visited
30- // all types/members.
3130 yield return Format ( $ """
3231 // Add a type reference for the new type. Types/Member references to the new type uses this.
3332 var { typeVar } = metadata.AddTypeReference(
@@ -37,6 +36,8 @@ public IEnumerable<string> Type(
3736
3837 """ ) ;
3938
39+ // We need to pass the handle of the 1st field/method defined in the module so we need to postpone the type generation after we have visited
40+ // all types/members.
4041 ( ( SystemReflectionMetadataContext ) context ) . DelayedDefinitionsManager . RegisterTypeDefinition ( typeVar , $ "{ typeNamespace } .{ typeName } ", ( ctx , typeRecord ) =>
4142 {
4243 ctx . Generate ( Format ( $ """
@@ -52,9 +53,55 @@ public IEnumerable<string> Type(
5253 } ) ;
5354 }
5455
55- public IEnumerable < string > Method ( IVisitorContext context , string methodVar , string methodName , string methodModifiers , ITypeSymbol returnType , bool refReturn , IList < TypeParameterSyntax > typeParameters )
56+ public IEnumerable < string > Method ( IVisitorContext context , MemberDefinitionContext memberDefinitionContext , string methodName , string methodModifiers , ITypeSymbol returnType , bool refReturn ,
57+ IParameterSymbol [ ] resolvedParameterTypes , IList < TypeParameterSyntax > typeParameters )
5658 {
57- throw new NotImplementedException ( ) ;
59+ var methodSignatureVar = context . Naming . SyntheticVariable ( $ "{ methodName } Signature", ElementKind . LocalVariable ) ;
60+ var methodBlobIndexVar = context . Naming . SyntheticVariable ( $ "{ methodName } BlobIndex", ElementKind . LocalVariable ) ;
61+
62+ yield return Format (
63+ $$ """
64+ var {{ methodSignatureVar }} = new BlobBuilder();
65+ new BlobEncoder({{ methodSignatureVar }} )
66+ .MethodSignature(isInstanceMethod: false)
67+ .Parameters(
68+ {{ resolvedParameterTypes . Length }} ,
69+ returnType => returnType
70+ .Type(isByRef:false)
71+ .Type({{ context . TypeResolver . Resolve ( returnType ) }} , IsValueType: {{ returnType . IsValueType }} ),
72+ parameters =>
73+ {
74+ {{ string . Join ( '\n ' , resolvedParameterTypes . Select ( p => $ """
75+ parameters.AddParameter()
76+ .Type(isByRef: { p . IsByRef ( ) } )
77+ .Type({ context . TypeResolver . Resolve ( p . Type ) } , isValueType: { p . Type . IsValueType } );
78+ """ ) ) }}
79+ });
80+
81+ var {{ methodBlobIndexVar }} = metadata.GetOrAddBlob({{ methodSignatureVar }} );
82+
83+ var {{ context . Naming . SyntheticVariable ( $ "{ methodName } Ref", ElementKind . LocalVariable ) }} = metadata.AddMemberReference(
84+ {{ memberDefinitionContext . ParentDefinitionVariableName }} ,
85+ metadata.GetOrAddString("{{ methodName }} "),
86+ {{ methodBlobIndexVar }} );
87+ """ ) ;
88+
89+ ( ( SystemReflectionMetadataContext ) context ) . DelayedDefinitionsManager . RegisterMethodDefinition ( memberDefinitionContext . ParentDefinitionVariableName , ( ctx , methodRecord ) =>
90+ {
91+ var methodDefVar = ctx . Naming . SyntheticVariable ( methodName , ElementKind . LocalVariable ) ;
92+ ctx . Generate ( $ """
93+ var { methodDefVar } = metadata.AddMethodDefinition(
94+ { methodModifiers } ,
95+ MethodImplAttributes.IL | MethodImplAttributes.Managed,
96+ metadata.GetOrAddString("{ methodName } "),
97+ metadata.GetOrAddBlob({ methodSignatureVar } ),
98+ methodBodyStream.AddMethodBody({ memberDefinitionContext . IlContext . VariableName } ),
99+ parameterList: { methodRecord . FirstParameterHandle } );
100+ """ ) ;
101+
102+ ctx . WriteNewLine ( ) ;
103+ return methodDefVar ;
104+ } ) ;
58105 }
59106
60107 public IEnumerable < string > Method ( IVisitorContext context , string declaringTypeName , string methodVar , string methodNameForParameterVariableRegistration , string methodName , string methodModifiers , IReadOnlyList < ParameterSpec > parameters ,
@@ -95,9 +142,11 @@ public IEnumerable<string> Constructor(IVisitorContext context, MemberDefinition
95142 methodBodyStream.AddMethodBody({ memberDefinitionContext . IlContext . VariableName } ),
96143 parameterList: { methodRecord . FirstParameterHandle } );
97144 """ ) ;
145+
146+ ctx . WriteNewLine ( ) ;
98147 return ctorDefVar ;
99148 } ) ;
100149 }
101150
102- static string Format ( CecilifierInterpolatedStringHandler handler ) => handler . Result ;
151+ static string Format ( CecilifierInterpolatedStringHandler cecilFormattedString ) => cecilFormattedString . Result ;
103152}
0 commit comments