/**
 * @license
 * Copyright 2017 The Bazel Authors. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 *
 * You may obtain a copy of the License at
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @fileoverview
 * Provides APIs for extending TypeScript command-line compiler.
 * It's roughly analogous to how the Language Service allows plugins.
 */

import * as ts from 'typescript';

export interface PluginCompilerHost extends ts.CompilerHost {
  /**
   * Absolute file paths which should be included in the initial ts.Program.
   * In vanilla tsc, these are the ts.ParsedCommandLine#fileNames
   */
  inputFiles: ReadonlyArray<string>;
}

/**
 * This API is simpler than LanguageService plugins.
 * It's used for plugins that only target the command-line and never run in an
 * editor context.
 *
 * One instance of the TscPlugin will be created for each execution of the compiler, so it is
 * safe for these plugins to hold state that's local to one execution.
 *
 * The methods on the plugin will be called in the order shown below:
 * - wrapHost to intercept CompilerHost methods and contribute inputFiles to the program
 * - setupCompilation to capture the ts.Program
 * - createTransformers once it's time to emit
 */
export interface EmitPlugin {
  /**
   * Allow plugins to add additional files to the program.
   * For example, Angular creates ngsummary and ngfactory files.
   * These files must be in the program since there may be incoming references to the symbols.
   * @param inputFiles the files that were part of the original program
   * @param compilerHost: the original host (likely a ts.CompilerHost) that we can delegate to
   */
  wrapHost?(compilerHost: ts.CompilerHost, inputFiles: string[], options: ts.CompilerOptions): PluginCompilerHost;

  setupCompilation(program: ts.Program, oldProgram?: ts.Program): void;

  getNextProgram?(): ts.Program;
  
  /**
   * Allow plugins to contribute additional TypeScript CustomTransformers.
   * These can modify the TS AST, JS AST, or .d.ts output AST.
   */
  createTransformers(): ts.CustomTransformers;
}

/**
 * The proxy design pattern, allowing us to customize behavior of the delegate
 * object.
 * This creates a property-by-property copy of the object, so it can be mutated
 * without affecting other users of the original object.
 * See https://en.wikipedia.org/wiki/Proxy_pattern
 */
export function createProxy<T>(delegate: T): T {
  const proxy = Object.create(null);
  for (const k of Object.keys(delegate)) {
    proxy[k] = function() {
      return (delegate as any)[k].apply(delegate, arguments);
    };
  }
  return proxy;
}

/**
 * A plugin that contributes additional diagnostics during compilation.
 *
 * This is a more limited API than Plugin, which can overwrite any features of
 * the Program. A DiagnosticPlugin can't affect the output, and can only reject
 * otherwise valid programs.
 *
 * This means that disabling a DiagnosticPlugin is always safe. It will not
 * break any downstream projects, either at build time or in production.
 *
 * It also lets us instrument the plugin to track performance, and tag the
 * diagnostics it emits with the plugin name.
 */
export interface DiagnosticPlugin {
  /**
   * A brief descriptive name for the plugin.
   *
   * Should not include 'ts', 'typescript', or 'plugin'.
   */
  readonly name: string;

  /**
   * Return diagnostics for the given file.
   *
   * Should only include new diagnostics that your plugin is contributing.
   * Should not include diagnostics from program.
   */
  getDiagnostics(sourceFile: ts.SourceFile):
      ReadonlyArray<Readonly<ts.Diagnostic>>;
}
