/*
 * Copyright 2017 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package jsinterop.annotations;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * JsAsync marks a method to be transpiled to an async JavaScript method.
 *
 * <p>Adding this annotation to a method adds an {@code async} keyword to the generated JavaScript
 * function.
 *
 * <p>There are some limitations apply on JsAsync to make the annotation practical:
 * <ul>
 * <li>A @JsAsync method return type should be IThenable or Promise.
 * <li>A @JsAsync method should not return {@code null}.
 * </ul>
 *
 * <p>This is an EXPERIMENTAL annotation and only works in J2CL.
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface JsAsync {
}
