// Copyright 2015 Google Inc. All rights reserved.
//
// 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.

/**
 * A heavily annotated class used for testing.
 */
@Annotations.RuntimeInvisible
@Annotations.RuntimeVisible
final class AnnotatedClass {
  @Annotations.RuntimeInvisible
  @Annotations.RuntimeVisible
  String field;

  @Annotations.RuntimeInvisible
  @Annotations.RuntimeVisible
  private AnnotatedClass() {}

  @Annotations.RuntimeInvisible
  @Annotations.RuntimeVisible
  public static void publicStaticMethod(
      @Annotations.RuntimeInvisible @Annotations.RuntimeVisible String param) {
    @Annotations.RuntimeInvisible
    @Annotations.RuntimeVisible
    String local = "Hello " + param + "!";
    System.out.println(local);
  }
}
