Package lombok.ast.syntaxChecks

Source Code of lombok.ast.syntaxChecks.StatementChecks

/*
* Copyright (C) 2010 The Project Lombok Authors.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package lombok.ast.syntaxChecks;

import static lombok.ast.syntaxChecks.MessageKey.*;
import static lombok.ast.Message.*;

import lombok.ast.Block;
import lombok.ast.Case;
import lombok.ast.Catch;
import lombok.ast.Default;
import lombok.ast.DoWhile;
import lombok.ast.For;
import lombok.ast.ForEach;
import lombok.ast.If;
import lombok.ast.Node;
import lombok.ast.Statement;
import lombok.ast.Switch;
import lombok.ast.Try;
import lombok.ast.TypeDeclaration;
import lombok.ast.VariableDeclaration;
import lombok.ast.While;
import lombok.ast.template.SyntaxCheck;

@SyntaxCheck
public class StatementChecks {
  public void checkNotLoneTry(Try node) {
    if (node.rawCatches().size() == 0 && node.rawFinally() == null) {
      node.addMessage(error(TRY_LONE_TRY, "try statement with no catches and no finally"));
    }
  }
 
  public void checkDeclarationsAsDirectChildWhile(While node) {
    checkDeclarationsAsDirectChild(node, node.rawStatement());
  }
 
  public void checkDeclarationsAsDirectChildDo(DoWhile node) {
    checkDeclarationsAsDirectChild(node, node.rawStatement());
  }
 
  public void checkDeclarationsAsDirectChildForEach(ForEach node) {
    checkDeclarationsAsDirectChild(node, node.rawStatement());
  }
 
  public void checkDeclarationsAsDirectChildIf(If node) {
    checkDeclarationsAsDirectChild(node, node.rawStatement());
    checkDeclarationsAsDirectChild(node, node.rawElseStatement());
  }
 
  public void checkDeclarationsAsDirectChildFor(For node) {
    checkDeclarationsAsDirectChild(node, node.rawStatement());
  }
 
  private void checkDeclarationsAsDirectChild(Node n, Node c) {
    if (c instanceof VariableDeclaration) {
      c.addMessage(error(DECLARATION_NOT_ALLOWED, "Variable declarations only make sense in the context of a block."));
    }
   
    if (c instanceof TypeDeclaration) {
      c.addMessage(error(DECLARATION_NOT_ALLOWED, "Type declarations only make sense in the context of a block or other type."));
    }
  }
 
  public void checkVarDefOfCatch(Catch node) {
    BasicChecks.checkVarDefIsSimple(node, node.rawExceptionDeclaration(), "catch blocks", "exception");
  }
 
  public void checkVarDefOfForEach(ForEach node) {
    BasicChecks.checkVarDefIsSimple(node, node.rawVariable(), "for-each statements", "loop");
  }
 
  public void checkCaseChildOfSwitch(Case node) {
    checkChildOfSwitch(node, "case");
  }
 
  public void checkDefaultChildOfSwitch(Default node) {
    checkChildOfSwitch(node, "default");
  }
 
  private void checkChildOfSwitch(Statement node, String desc) {
    if (node.getParent() == null) return;
   
    Block p = node.upToBlock();
    Switch gp = p == null ? null : p.upToSwitch();
    boolean genError = false;
   
    genError = p == null;
    genError |= gp == null && p.getParent() != null;
   
    if (genError) {
      node.addMessage(error(STATEMENT_ONLY_LEGAL_IN_SWITCH, desc + " statements are only legal directly inside switch statements."));
    }
  }
 
  public void checkSwitchStartsWithDefaultOrCase(Switch node) {
    Block body = node.astBody();
    if (body != null) {
      Statement first = body.astContents().first();
      if (first != null && !(first instanceof Case) && !(first instanceof Default)) {
        node.addMessage(error(SWITCH_DOES_NOT_START_WITH_CASE, "switch statements should start with a default or case statement."));
      }
    }
  }
}
TOP

Related Classes of lombok.ast.syntaxChecks.StatementChecks

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.