export function linkSymbols()

in build-scripts/doc-gen/util.ts [555:654]


export function linkSymbols(
    docs: Docs, symbols: SymbolAndUrl[], toplevelNamespace: string,
    docLinkAliases: {[symbolName: string]: string}) {
  // Find all the symbols.
  docs.headings.forEach(heading => {
    heading.subheadings.forEach(subheading => {
      subheading.symbols.forEach(symbol => {
        const namespace =
            (symbol.namespace != null && symbol.namespace != '' ?
                 symbol.namespace + '.' :
                 '');

        if (toplevelNamespace.length > 0) {
          symbol.displayName =
              toplevelNamespace + '.' + namespace + symbol.symbolName;
        } else {
          symbol.displayName = namespace + symbol.symbolName
        }


        const referenceName = namespace + symbol.symbolName;
        symbol.urlHash = (symbol['isClass'] ? 'class:' : '') + referenceName;

        symbols.push({
          referenceName,
          symbolName: symbol.symbolName,
          url: '#' + symbol.urlHash,
          type: symbol['isClass'] != null ? 'class' : 'function',
          toplevelNamespace
        });

        if (symbol['isClass'] != null) {
          const docClass = symbol as DocClass;
          docClass.methods.forEach(method => {
            method.urlHash = docClass.displayName + '.' + method.symbolName;
            symbols.push({
              referenceName: referenceName + '.' + method.symbolName,
              symbolName: method.symbolName,
              url: '#' + method.urlHash,
              type: 'method',
              toplevelNamespace
            });
          });
        }
      });
    });
  });

  // Add new doc link alias symbols.
  Object.keys(docLinkAliases).forEach(docLinkAlias => {
    // Find the symbol so we can find the url hash.
    symbols.forEach(symbol => {
      if (symbol.symbolName === docLinkAliases[docLinkAlias]) {
        symbols.push({
          symbolName: docLinkAlias,
          referenceName: docLinkAlias,
          url: symbol.url,
          type: symbol.type,
          toplevelNamespace: symbol.toplevelNamespace
        });
      }
    });
  });

  // Replace class documentation with links.
  docs.headings.forEach(heading => {
    heading.subheadings.forEach(subheading => {
      subheading.symbols.forEach(symbol => {
        if (symbol['isClass']) {
          symbol.documentation = replaceSymbolsWithLinks(
              symbol.documentation, symbols, true /** isMarkdown */);
          const classSymbol = symbol as DocClass;
          if (classSymbol.inheritsFrom != null) {
            classSymbol.inheritsFrom = replaceSymbolsWithLinks(
                classSymbol.inheritsFrom, symbols, false /** isMarkdown */,
                true /** replaceFromSymbolName */);
          }
        }
      });
    });
  });

  foreachDocFunction(docs.headings, method => {
    method.documentation = replaceSymbolsWithLinks(
        method.documentation, symbols, true /** isMarkdown */);

    // Since automatic types do not have namespaces, we must replace using
    // just the symbol names.
    method.returnType = replaceSymbolsWithLinks(
        method.returnType, symbols, false /** isMarkdown */,
        true /** replaceFromSymbolName */);
    method.parameters.forEach(param => {
      param.documentation = replaceSymbolsWithLinks(
          param.documentation, symbols, true /** isMarkdown */);
      param.type = replaceSymbolsWithLinks(
          param.type, symbols, false /** isMarkdown */,
          true /** replaceFromSymbolName */);
    });
  });
}