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 }