/*
 * Copyright 2006 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 com.google.gwt.checkstyle;

import com.puppycrawl.tools.checkstyle.api.DetailAST;
import com.puppycrawl.tools.checkstyle.api.TokenTypes;
import com.puppycrawl.tools.checkstyle.checks.naming.MemberNameCheck;

/**
 * Override MemberNameCheck to correctly use match rather than find.
 */
public class FieldCheck extends MemberNameCheck {
  public FieldCheck() {
    // Specifically stopping fields such as fMainWnd from being allowed.
    setFormat("([a-eg-z]|(f[a-z0-9]))[a-zA-Z0-9]*");
  }

  public void visitToken(DetailAST aAST) {
    if (mustCheckName(aAST)) {
      final DetailAST nameAST = aAST.findFirstToken(TokenTypes.IDENT);
      if (!getRegexp().matcher(nameAST.getText()).matches()) {
        log(
            nameAST.getLineNo(),
            nameAST.getText()
                + ": Field names must start with [a-z], may not start with f[A-Z], and should not contain '_''s.");
      }
    }
  }
}
