Open Source Repository

Home /beanshell/bsh-2.0b4 | Repository Home



bsh/Modifiers.java
package bsh;

import java.util.Hashtable;

/**
  
  @author Pat Niemeyer ([email protected])
*/
/*
  Note: which of these things should be checked at parse time vs. run time?
*/
public class Modifiers implements java.io.Serializable
{
  public static final int CLASS=0, METHOD=1, FIELD=2;
  Hashtable modifiers;

  /**
    @param context is METHOD or FIELD
  */
  public void addModifierint context, String name 
  {
    if modifiers == null )
      modifiers = new Hashtable();

    Object existing = modifiers.putname, Void.TYPE/*arbitrary flag*/ );
    if existing != null )
      throw new IllegalStateException("Duplicate modifier: "+ name );

    int count = 0;
    if hasModifier("private") ) ++count;
    if hasModifier("protected") ) ++count;
    if hasModifier("public") ) ++count;
    if count > )
      throw new IllegalStateException(
        "public/private/protected cannot be used in combination." );

    switchcontext 
    {
    case CLASS:
      validateForClass();
      break;
    case METHOD:
      validateForMethod();
      break;
    case FIELD:
      validateForField();
      break;
    }
  }

  public boolean hasModifierString name 
  {
    if modifiers == null )
      modifiers = new Hashtable();
    return modifiers.get(name!= null;
  }

  // could refactor these a bit
  private void validateForMethod() 
  
    insureNo("volatile""Method");
    insureNo("transient""Method");
  }
  private void validateForField() 
  
    insureNo("synchronized""Variable");
    insureNo("native""Variable");
    insureNo("abstract""Variable");
  }
  private void validateForClass() 
  
    validateForMethod()// volatile, transient
    insureNo("native""Class");
    insureNo("synchronized""Class");
  }

  private void insureNoString modifier, String context )
  {
    if hasModifiermodifier ) )
      throw new IllegalStateException(
        context + " cannot be declared '"+modifier+"'");
  }

  public String toString()
  {
    return "Modifiers: "+modifiers;
  }

}