private TypeVarToTypeMap mapTypes( TypeVarToTypeMap actualParamByVarName, IType... types )
  {
    for( int i = 0; i < types.length; i++ )
    {
      IType type = types[i];
      if( type instanceof ITypeVariableType )
      {
        actualParamByVarName.put( (ITypeVariableType)types[i], types[i] );
      }
      if( type instanceof ITypeVariableArrayType )
      {
        mapTypes( actualParamByVarName, type.getComponentType() );
      }
      if( type.isParameterizedType() )
      {
        IType[] parameters = type.getTypeParameters();
        mapTypes( actualParamByVarName, parameters );
      }
      if( type instanceof IFunctionType )
      {
        IFunctionType funType = (IFunctionType)type;
        mapTypes( actualParamByVarName, funType.getReturnType() );
        IType[] paramTypes = funType.getParameterTypes();
        for( IType paramType : paramTypes )
        {
          mapTypes( actualParamByVarName, paramType );
        }
      }
    }
    return actualParamByVarName;
  }
private TypeVarToTypeMap mapTypes ( TypeVarToTypeMap actualParamByVarName , IType ... types ) { for ( int i = 0 ; i < types . length ; i ++ ) { IType type = types [ i ] ; if ( type instanceof ITypeVariableType ) { actualParamByVarName . put ( ( ITypeVariableType ) types [ i ] , types [ i ] ) ; } if ( type instanceof ITypeVariableArrayType ) { mapTypes ( actualParamByVarName , type . getComponentType ( ) ) ; } if ( type . isParameterizedType ( ) ) { IType [ ] parameters = type . getTypeParameters ( ) ; mapTypes ( actualParamByVarName , parameters ) ; } if ( type instanceof IFunctionType ) { IFunctionType funType = ( IFunctionType ) type ; mapTypes ( actualParamByVarName , funType . getReturnType ( ) ) ; IType [ ] paramTypes = funType . getParameterTypes ( ) ; for ( IType paramType : paramTypes ) { mapTypes ( actualParamByVarName , paramType ) ; } } } return actualParamByVarName ; }
Move Intrinsic type helper up here