code: protected IRType[] getConstructorParamTypes( IType[] declaredParams, int iTypeParams, IType type )
    {
      List<IRType> params = new ArrayList<IRType>();
  
      //
      // Insert outer 'this'
      //
      if( isNonStaticInnerClass( type ) )
      {
        params.add( getDescriptor( getRuntimeEnclosingType( type ) ) );
      }
  
      //
      // Insert captured symbols
      //
      if( type instanceof IGosuClassInternal && type.isValid() ) //&& ((IGosuClassInternal)type).isAnonymous() )
      {
        Map<String, ICapturedSymbol> capturedSymbols = ((IGosuClassInternal)type).getCapturedSymbols();
        if( capturedSymbols != null )
        {
          for( ICapturedSymbol sym : capturedSymbols.values() )
          {
            params.add( getDescriptor( sym.getType().getArrayType() ) );
          }
        }
      }
  
      // The external symbols are always treated as captured
      if (requiresExternalSymbolCapture( type ) ) {
        params.add( getDescriptor( IExternalSymbolMap.class ) );
      }
  
      //
      // Insert type-parameter types
      //
      if( iTypeParams > 0 ) {
        for( int i = 0; i < iTypeParams; i++ ) {
          params.add( getDescriptor( LazyTypeResolver.class ) );
        }
      }
  
      //
      // Enums have name and ordinal arguments implicitly added to their constructors
      //
      if( type.isEnum() ) {
        params.add( IRTypeConstants.STRING() );
        params.add( IRTypeConstants.pINT() );
      }
  
      //
      // Add declared parameters
      //
      for( IType declaredParam : declaredParams ) {
        params.add( getDescriptor( declaredParam ) );
      }
  
      return params.toArray( new IRType[params.size()] );
    }
docs: Parameters are order like so:
  ctor( [OuterThis,] [This,] [CapturedSymbols,] [TypeParams,] params )