1 package jdk.internal.nicl.types;
   2 
   3 import java.util.Arrays;
   4 import java.util.stream.Stream;
   5 
   6 public class Function implements Type {
   7     final Type[] arguments;
   8     final Type returnType;
   9     final boolean isVarArg;
  10 
  11     public Function(Type[] args, Type returnType, boolean isVarArg) {
  12         this.arguments = args;
  13         this.returnType = returnType;
  14         this.isVarArg = isVarArg;
  15     }
  16 
  17     public boolean isVarArg() {
  18         return isVarArg;
  19     }
  20 
  21     public Stream<Type> arguments() {
  22         return Stream.of(arguments);
  23     }
  24 
  25     public int argumentCount() {
  26         return arguments.length;
  27     }
  28 
  29     public Type getArgumentType(int index) {
  30         return arguments[index];
  31     }
  32 
  33     public Type getReturnType() {
  34         return returnType;
  35     }
  36 
  37     @Override
  38     public long getSize() {
  39         throw new UnsupportedOperationException("Function type has no size");
  40     }
  41 
  42     @Override
  43     public int hashCode() {
  44         return (returnType.hashCode() * 31 + Arrays.hashCode(arguments)) << 1 + (isVarArg ? 1 : 0);
  45     }
  46 
  47     @Override
  48     public boolean equals(Object o) {
  49         if (!(o instanceof jdk.internal.nicl.types.Function)) {
  50             return false;
  51         }
  52         jdk.internal.nicl.types.Function other = (jdk.internal.nicl.types.Function) o;
  53         if (!other.returnType.equals(returnType)) {
  54             return false;
  55         }
  56         if (other.isVarArg != isVarArg) {
  57             return false;
  58         }
  59         if (other.arguments.length != arguments.length) {
  60             return false;
  61         }
  62         for (int i = 0; i < arguments.length; i++) {
  63             if (!arguments[i].equals(other.arguments[i])) {
  64                 return false;
  65             }
  66         }
  67         return true;
  68     }
  69 
  70     @Override
  71     public String toString() {
  72         StringBuffer sb = new StringBuffer();
  73         sb.append('(');
  74         for (Type arg : arguments) {
  75             sb.append(arg.toString());
  76         }
  77         if (isVarArg) {
  78             sb.append('*');
  79         }
  80         sb.append(')');
  81         sb.append(returnType.toString());
  82         return sb.toString();
  83     }
  84 }