Package org.aspectj.weaver.patterns

Source Code of org.aspectj.weaver.patterns.Bindings

/* *******************************************************************
* Copyright (c) 2002 Palo Alto Research Center, Incorporated (PARC).
* All rights reserved.
* This program and the accompanying materials are made available
* under the terms of the Eclipse Public License v1.0
* which accompanies this distribution and is available at
* http://www.eclipse.org/legal/epl-v10.html
* Contributors:
*     PARC     initial implementation
* ******************************************************************/

package org.aspectj.weaver.patterns;

import org.aspectj.bridge.IMessage;
import org.aspectj.weaver.BCException;
import org.aspectj.weaver.UnresolvedType;

public class Bindings {
  public static final Bindings NONE = new Bindings(0);

  private BindingPattern[] bindings;

  public Bindings(BindingPattern[] bindings) {
    this.bindings = bindings;
  }

  public Bindings(int count) {
    this(new BindingPattern[count]);
  }

  public void register(BindingPattern binding, IScope scope) {
    int index = binding.getFormalIndex();
    BindingPattern existingBinding = bindings[index];
    if (existingBinding != null) {
      scope.message(IMessage.ERROR, existingBinding, binding, "multiple bindings" + index + ", " + binding);
    }
    bindings[index] = binding;
  }

  public void mergeIn(Bindings other, IScope scope) {
    for (int i = 0, len = other.bindings.length; i < len; i++) {
      if (other.bindings[i] != null) {
        register(other.bindings[i], scope);
      }
    }
  }

  /**
   * signals an error if one has a binding and other doesn't
   */
  public void checkEquals(Bindings other, IScope scope) {
    BindingPattern[] b1 = this.bindings;
    BindingPattern[] b2 = other.bindings;
    int len = b1.length;
    if (len != b2.length) {
      throw new BCException("INSANE");
    }

    for (int i = 0; i < len; i++) {
      if (b1[i] == null && b2[i] != null) {
        scope.message(IMessage.ERROR, b2[i], "inconsistent binding");
        b1[i] = b2[i]; // done just to produce fewer error messages
      } else if (b2[i] == null && b1[i] != null) {
        scope.message(IMessage.ERROR, b1[i], "inconsistent binding");
        b2[i] = b1[i]; // done just to produce fewer error messages
      }
    }
  }

  public String toString() {
    StringBuffer buf = new StringBuffer("Bindings(");
    for (int i = 0, len = bindings.length; i < len; i++) {
      if (i > 0)
        buf.append(", ");
      buf.append(bindings[i]);
    }
    buf.append(")");
    return buf.toString();
  }

  public int[] getUsedFormals() {
    // System.out.println("used: " + this);
    int[] ret = new int[bindings.length];
    int index = 0;
    for (int i = 0, len = bindings.length; i < len; i++) {
      if (bindings[i] != null) {
        ret[index++] = i;
      }
    }
    int[] newRet = new int[index];
    System.arraycopy(ret, 0, newRet, 0, index);
    // System.out.println("ret: " + index);
    return newRet;
  }

  public UnresolvedType[] getUsedFormalTypes() {
    UnresolvedType[] ret = new UnresolvedType[bindings.length];
    int index = 0;
    for (int i = 0, len = bindings.length; i < len; i++) {
      if (bindings[i] != null) {
        ret[index++] = ((BindingTypePattern) bindings[i]).getExactType();
      }
    }
    UnresolvedType[] newRet = new UnresolvedType[index];
    System.arraycopy(ret, 0, newRet, 0, index);
    // System.out.println("ret: " + index);
    return newRet;
  }

  public Bindings copy() {
    // int len = bindings.length;
    // boolean[] a = new boolean[len];
    // System.arraycopy(bindings, 0, a, 0, len);
    return new Bindings((BindingPattern[]) bindings.clone());
  }

  public void checkAllBound(IScope scope) {
    for (int i = 0, len = bindings.length; i < len; i++) {
      if (bindings[i] == null) {
        // ATAJ: avoid warnings for implicit bindings
        if (scope.getFormal(i) instanceof FormalBinding.ImplicitFormalBinding) {
          bindings[i] = new BindingTypePattern(scope.getFormal(i), false);
        } else {
          scope.message(IMessage.ERROR, scope.getFormal(i), "formal unbound in pointcut ");
        }
      }
    }

  }

  public int size() {
    return bindings.length;
  }

}
TOP

Related Classes of org.aspectj.weaver.patterns.Bindings

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.