MemberDeclarationSyntax XppCreateMethod(XP.IXPPEntityContext context, SyntaxToken idName, SyntaxList <AttributeListSyntax> attributes,
                                                SyntaxList <SyntaxToken> modifiers, ParameterListSyntax parameters, TypeSyntax returnType)
        {
            var body    = context.Statements.Get <BlockSyntax>();
            var oldbody = body;

            ImplementClipperAndPSZ(context, ref attributes, ref parameters, ref body, ref returnType);
            if (body != oldbody)
            {
                context.Statements.Put(body);
            }
            if (context.Info.IsSync)
            {
                body = MakeBlock(MakeLock(GenerateSelf(), body));
            }
            if (context.Info.IsProperty)
            {
            }
            MemberDeclarationSyntax m = _syntaxFactory.MethodDeclaration(
                attributeLists: attributes,
                modifiers: modifiers,
                returnType: returnType,
                explicitInterfaceSpecifier: null,
                identifier: idName,
                typeParameterList: null,
                parameterList: parameters,
                constraintClauses: null,
                body: body,
                expressionBody: null,   // TODO: (grammar) expressionBody methods
                semicolonToken: SyntaxFactory.MakeToken(SyntaxKind.SemicolonToken));

            return(m);
        }
        private void implementConstructor([NotNull] XP.IXPPEntityContext context)
        {
            var idName    = context.ShortName;
            var classCtor = XSharpString.Compare(idName, XSharpIntrinsicNames.InitClassMethod) == 0;
            // find method in the declarations and find the visibility
            var mods = decodeXppMemberModifiers(context.Info.Visibility, classCtor, classCtor ? null : context.Mods?._Tokens);

            if (mods.Any((int)SyntaxKind.StaticKeyword))
            {
                context.Data.HasClipperCallingConvention = false;
            }
            var ctor = createConstructor(context, mods, context.Atts, context.Parameters, context.Statements, (XSharpParserRuleContext)context);

            if (ctor != null)
            {
                context.Put(ctor);
            }
            else
            {
                context.Statements = null;
            }
        }