function badFuncNoAnnotation() {
    return 1; // ERROR - no @return annotation.
}

/**
 * @return {number}
 */
function badFuncAnnotatedButNoReturn() // ERROR - no @return annotation.
{
}

/**
 * @return {number}
 */
function badFuncAnnotatedButNoReturnValue() // ERROR - no returned value.
{
    return;
}

/**
 * @return {number}
 */
function goodFunc() // OK - annotated @return.
{
    return 1;
}

/**
 * @returns {number}
 */
function badReturnsShouldBeReturnFunc() // ERROR - @returns, should be @return.
{
    return 1;
}

/**
 * @return number
 */
function badReturnShouldBeTypedFunc() // ERROR - number, not {number}.
{
    return 1;
}

/**
 * @param number foo
 * @param bar
 */
function badParamAnnotationsFunc(foo, bar) // ERROR - @param's should be well-formed
{
    return 1;
}


/**
 * @returns {number}
 */
function badReturnsShouldBeReturnNoValueFunc() // ERROR - @returns, should be @return.
{
    return;
}

/**
 * @returns {number}
 */
function badReturnsShouldBeAbsentFunc() // ERROR - @returns, should be absent.
{
}

/**
 * @constructor
 */
function TypeOne() {
    function callback() // OK - not a method.
    {
        return 1;
    }
}

TypeOne.prototype = {
    badApiMethodNoAnnotation: function() // ERROR - public method.
    {
        return 1;
    },

    _privateMethod: function() // OK - non-public method.
    {
        var obj = {};

        /**
         * @constructor
         * @param {number} val
         */
        obj["a"] = obj["b"] = function(val) { // OK - constructor
            this.foo = val;
        }

        /**
         * @param {number} val
         */
        obj["c"] = obj["d"] = function(val) { // ERROR - no @this
            this.foo = val;
        }

        return 1;
    },

    methodTwo: function()
    {
        function callback() // OK - not a method.
        {
            return 1;
        }
    },

    /**
     * @return {number}
     */
    methodThatThrows: function() // OK - throws and should be overridden in subclasses.
    {
        throw "Not implemented";
    },

    /**
     * @return {number}
     */
    badMethodDoesNotReturnValue: function() // ERROR - does not return value.
    {
        return;
    },

    /**
     * @return {number}
     */
    badMethodDoesNotReturn: function() // ERROR - does not return.
    {
        var foo = 1;
    },

    /**
     * @returns {number}
     */
    badMethodReturnsShouldBeReturn: function() // ERROR - @returns, should be @return
    {
        return 1;
    },

    /**
     * @returns {number}
     */
    badMethodReturnsShouldBeAbsentToo: function() // ERROR - @returns, should be absent
    {
        return;
    },

    /**
     * @returns {number}
     */
    badMethodReturnsShouldBeAbsent: function() // ERROR - @returns, should be absent
    {
        var foo = 1;
    }
}


/**
 * @constructor
 */
TypeTwo = function() {
    function callback() // OK - not a method.
    {
        return 1;
    }
}

TypeTwo.prototype = {
    badApiMethodNoAnnotation: function() // ERROR - public method.
    {
        return 1;
    },

    _privateMethod: function() // OK - non-public method.
    {
        return 1;
    },

    methodTwo: function()
    {
        function callback() // OK - not a method.
        {
            return 1;
        }
    },

    /**
     * @return {number}
     */
    badMethodDoesNotReturnValue: function() // ERROR - does not return value.
    {
        return;
    },

    /**
     * @return {number}
     */
    badMethodDoesNotReturn: function() // ERROR - does not return.
    {
        var foo = 1;
    },

    /**
     * @returns {number}
     */
    badMethodReturnsShouldBeReturn: function() // ERROR - @returns, should be @return
    {
        return 1;
    },

    /**
     * @returns {number}
     */
    badMethodReturnsShouldBeAbsentToo: function() // ERROR - @returns, should be absent
    {
        return;
    },

    /**
     * @returns {number}
     */
    badMethodReturnsShouldBeAbsent: function() // ERROR - @returns, should be absent
    {
        var foo = 1;
    }
}

/**
 * @interface
 */
Interface = function() {}

Interface.prototype = {
    /**
     * @return {number}
     */
    interfaceMethod: function() {}, // OK - interface method.

    /**
     * @returns {number}
     */
    badReturnsInterfaceMethod: function() {} // ERROR - @returns instead of return.
}

/**
 * @return {!Object}
 */
function returnConstructedObject() {

/**
 * @constructor
 */
TypeThree = function() {
    function callback() // OK - not a method.
    {
        return 1;
    }
}

TypeThree.prototype = {
    badApiMethodNoAnnotation: function() // ERROR - public method.
    {
        return 1;
    },

    _privateMethod: function() // OK - non-public method.
    {
        return 1;
    },

    methodTwo: function()
    {
        function callback() // OK - not a method.
        {
            return 1;
        }
    },

    /**
     * @return {number}
     */
    badMethodDoesNotReturnValue: function() // ERROR - does not return value.
    {
        return;
    },

    /**
     * @return {number}
     */
    badMethodDoesNotReturn: function() // ERROR - does not return.
    {
        var foo = 1;
    },

    /**
     * @returns {number}
     */
    badMethodReturnsShouldBeReturn: function() // ERROR - @returns, should be @return
    {
        return 1;
    },

    /**
     * @returns number
     */
    badMethodReturnShouldBeTyped: function() // ERROR - number, not {number}
    {
        return 1;
    },

    /**
     * @returns {number}
     */
    badMethodReturnsShouldBeAbsentToo: function() // ERROR - @returns, should be absent
    {
        return;
    },

    /**
     * @returns {number}
     */
    badMethodReturnsShouldBeAbsent: function() // ERROR - @returns, should be absent
    {
        var foo = 1;
    },

    /**
     * @param number foo
     * @param bar
     */
    badMethodParamAnnotations: function(foo, bar) // ERROR - @param's should be well-formed
    {
        return 1;
    }
}

return new TypeThree();
}


/**
 * @param {string} a
 * @param {string} b
 * @param {string} c
 */
function funcParamsOK1(a, b, c) {}

function funcParamsOK2(a, b, c) {}

/**
 * @param {string} a
 * @param {string} c
 */
function funcParamsMissingTag1(a, b, c) {}

/**
 * @param {string} a
 */
function funcParamsMissingTag2(a, b, c) {}

/**
 * @interface
 */
function FuncInterface()
{
}

FuncInterface.prototype = {
    /**
     * @return {number}
     */
    returnNumber: function() { }
}

/**
 * @param {string} a
 * @param {...number} abc
 */
function funcParamsOK3(a, ...abc) {}
