docs: function getEffectiveDecoratorFirstArgumentType(node) {
              // The first argument to a decorator is its `target`.
              if (node.kind === 221 /* ClassDeclaration */) {
                  // For a class decorator, the `target` is the type of the class (e.g. the
                  // "static" or "constructor" side of the class)
                  var classSymbol = getSymbolOfNode(node);
                  return getTypeOfSymbol(classSymbol);
              }
              if (node.kind === 142 /* Parameter */) {
                  // For a parameter decorator, the `target` is the parent type of the
                  // parameter's containing method.
                  node = node.parent;
                  if (node.kind === 148 /* Constructor */) {
                      var classSymbol = getSymbolOfNode(node);
                      return getTypeOfSymbol(classSymbol);
                  }
              }
              if (node.kind === 145 /* PropertyDeclaration */ ||
                  node.kind === 147 /* MethodDeclaration */ ||
                  node.kind === 149 /* GetAccessor */ ||
                  node.kind === 150 /* SetAccessor */) {
                  // For a property or method decorator, the `target` is the
                  // "static"-side type of the parent of the member if the member is
                  // declared "static"; otherwise, it is the "instance"-side type of the
                  // parent of the member.
                  return getParentTypeOfClassElement(node);
              }
              ts.Debug.fail("Unsupported decorator target.");
              return unknownType;
          }