BaseMethodDeclarationSyntax PortMethod(CXCursor cursor) { var objcMethod = new ObjCMethod (cursor); IEnumerable<ParameterSyntax> mParams = FetchParamInfos (cursor); MethodDefinition mDef; MethodDeclarationSyntax mDecl = null; ConstructorDeclarationSyntax ctorDecl = null; var mb = new MethodBuilder (); var isBound = bindingLocator.TryFindMethod (ImplContext.SuperClassName, objcMethod.Selector, out mDef); if (isBound) { if (mDef.IsConstructor) ctorDecl = mb.BuildCtor (mDef, ImplContext.ClassName, mParams); else mDecl = mb.BuildDeclaration (mDef, mParams); } else { if (objcMethod.IsInitializer) ctorDecl = mb.BuildCtor (ImplContext.ClassName, mParams); else mDecl = BuildDefaultDeclaration (objcMethod, mParams); } IEnumerable<CXCursor> children = cursor.GetChildren (); var compoundStmt = children.First (c => c.kind == CXCursorKind.CXCursor_CompoundStmt); if (ctorDecl != null) return AddBody (compoundStmt, ctorDecl); else return AddBody (compoundStmt, mDecl); }
MethodDeclarationSyntax BuildDefaultDeclaration(ObjCMethod objcMethod, IEnumerable<ParameterSyntax> mParams) { TypeSyntax retType = TypePorter.PortType (objcMethod.ReturnType); string methodName = MethodHelper.ConvertToMehtodName (objcMethod.Selector); var mb = new MethodBuilder (); MethodDeclarationSyntax mDecl = mb.BuildDeclaration (retType, methodName, mParams); if (objcMethod.IsStatic) mDecl = mDecl.WithStaticKeyword (); return mDecl; }