code: <S extends StaticSlot, R extends StaticRef> void addSymbolsFrom(
        StaticSymbolTable<S, R> otherSymbolTable) {
      for (S otherSymbol : otherSymbolTable.getAllSymbols()) {
        String name = otherSymbol.getName();
        SymbolScope myScope = createScopeFrom(otherSymbolTable.getScope(otherSymbol));
  
        StaticRef decl = findBestDeclToAdd(otherSymbolTable, otherSymbol);
        Symbol mySymbol = null;
        if (decl != null) {
          Node declNode = decl.getNode();
  
          // If we have a declaration node, we can ensure the symbol is declared.
          mySymbol = isAnySymbolDeclared(name, declNode, myScope);
          if (mySymbol == null) {
            mySymbol = copySymbolTo(otherSymbol, declNode, myScope);
          }
        } else {
          // If we don't have a declaration node, we won't be able to declare
          // a symbol in this symbol table. But we may be able to salvage the
          // references if we already have a symbol.
          mySymbol = myScope.getOwnSlot(name);
        }
  
        if (mySymbol != null) {
          for (R otherRef : otherSymbolTable.getReferences(otherSymbol)) {
            if (isGoodRefToAdd(otherRef)) {
              mySymbol.defineReferenceAt(otherRef.getNode());
            }
          }
        }
      }
    }
docs: Make sure all the symbols and references in {@code otherSymbolTable} are in this symbol table.
  
  <p>Uniqueness of symbols and references is determined by the associated node.
  
  <p>If multiple symbol tables are mixed in, we do not check for consistency between symbol
  tables. The first symbol we see dictates the type information for that symbol.