static void methodDeclaration( TypeDeclaration outer, Tree.MethodDeclaration that, GenerateJsVisitor gen, boolean verboseStitcher) { final Function m = that.getDeclarationModel(); if (that.getSpecifierExpression() != null) { // method(params) => expr if (outer == null) { // Not in a prototype definition. Null to do here if it's a // member in prototype style. if (gen.opts.isOptimize() && m.isMember()) { return; } gen.comment(that); gen.initDefaultedParameters(that.getParameterLists().get(0), that); if (!(gen.opts.isOptimize() && m.isClassOrInterfaceMember()) && TypeUtils.isNativeExternal(m)) { if (gen.stitchNative(m, that)) { if (verboseStitcher) { gen.spitOut( "Stitching in native method " + m.getQualifiedNameString() + ", ignoring Ceylon declaration"); } if (m.isShared()) { gen.share(m); } return; } } gen.out(m.isToplevel() ? GenerateJsVisitor.function : "var "); } else { // prototype definition gen.comment(that); gen.initDefaultedParameters(that.getParameterLists().get(0), that); if (m.isStatic()) { gen.out(gen.getNames().name(outer), ".$st$."); } else { gen.out(gen.getNames().self(outer), "."); } } gen.out(gen.getNames().name(m)); if (!m.isToplevel()) gen.out("="); if (TypeUtils.isNativeExternal(m)) { if (gen.stitchNative(m, that)) { if (verboseStitcher) { gen.spitOut( "Stitching in native method " + m.getQualifiedNameString() + ", ignoring Ceylon declaration"); } if (m.isShared()) { gen.share(m); } return; } } singleExprFunction( that.getParameterLists(), that.getSpecifierExpression().getExpression(), m, true, !m.isToplevel(), gen); gen.endLine(true); if (outer != null) { if (m.isStatic()) { gen.out(gen.getNames().name(outer), ".$st$."); } else { gen.out(gen.getNames().self(outer), "."); } } gen.out(gen.getNames().name(m), ".$crtmm$="); TypeUtils.encodeMethodForRuntime(that, gen); gen.endLine(true); gen.share(m); } else if (outer == null // don't do the following in a prototype definition && m == that.getScope()) { // Check for refinement of simple param declaration if (m.getContainer() instanceof Class && m.isClassOrInterfaceMember()) { // Declare the method just by pointing to the param function final String name = gen.getNames().name(((Class) m.getContainer()).getParameter(m.getName())); if (name != null) { gen.out( gen.getNames().self((Class) m.getContainer()), ".", gen.getNames().name(m), "=", name); gen.endLine(true); } } else if (m.getContainer() instanceof Function) { // Declare the function just by forcing the name we used in the param list final String name = gen.getNames().name(((Function) m.getContainer()).getParameter(m.getName())); gen.getNames().forceName(m, name); } // Only the first paramlist can have defaults gen.initDefaultedParameters(that.getParameterLists().get(0), that); if (!(gen.opts.isOptimize() && m.isClassOrInterfaceMember()) && TypeUtils.isNativeExternal(m)) { if (gen.stitchNative(m, that)) { if (verboseStitcher) { gen.spitOut( "Stitching in native method " + m.getQualifiedNameString() + ", ignoring Ceylon declaration"); } if (m.isShared()) { gen.share(m); } } } } else if (m == that.getScope() && m.getContainer() instanceof TypeDeclaration && m.isMember() && (m.isFormal() || TypeUtils.isNativeExternal(m))) { gen.out( gen.getNames().self((TypeDeclaration) m.getContainer()), ".", gen.getNames().name(m), "="); if (m.isFormal()) { gen.out("{$fml:1,$crtmm$:"); TypeUtils.encodeForRuntime(that, m, gen); gen.out("};"); } else if (TypeUtils.isNativeExternal(m)) { if (gen.stitchNative(m, that)) { if (verboseStitcher) { gen.spitOut( "Stitching in native method " + m.getQualifiedNameString() + ", ignoring Ceylon declaration"); } if (m.isShared()) { gen.share(m); } } } } }