code: function getExpression(ast, start, end, fileText) {
          var expn = findSurroundExpression(ast, {start: start, end: end});
          if (!expn) {
               return false;
          }
  
          // Class Expression also includes the trailing semicolon
          // Add special case for it
          if (expn.type === "ClassExpression" && expn.start === start && expn.end - end <= 1) {
              expn.end = end;
              return expn;
          }
          else if (expn.start === start && expn.end === end) {
              return expn;
          }
  
          // Subexpressions are possible only for BinaryExpression, LogicalExpression and SequenceExpression
          if (!(["BinaryExpression", "LogicalExpression", "SequenceExpression"].includes(expn.type))) {
              return false;
          }
  
          // Check subexpression
          var parentExpn = expn;
          var parentExpStr = fileText.substr(parentExpn.start, parentExpn.end - parentExpn.start);
  
          // Check whether the parentExpn forms a valid expression after replacing the sub expression
          var str = parentExpStr.substr(0, start - parentExpn.start) + "placeHolder" + parentExpStr.substr(end - parentExpn.start);
          var node = isStandAloneExpression(str);
          if (node && node.type === parentExpn.type) {
              return parentExpn;
          }
  
          return false;
      }
docs: Gets a expression surrounding start and end (if any)
  @param {!ASTNode} ast - the ast of the complete file
  @param {!number} start - the start offset
  @param {!number} end - the end offset
  @param {!string} fileText - the entire file text
  @return {ASTNode|boolean}