code: function(ast, params) {
  			var node = util.findNodeAtOffset(ast, params.offset);
  			if(node) {
  				if(this.inScriptOrStyle(node, params.offset, ast.source) || this.inClosingTag(node, params.offset, ast.source)) {
  					return [];
  				}
  				if (this.isCompletingCommentClose(node, params.offset)){
  					return this.getComment(node, params.offset, ast.source, false);
  				} else if (this.isCompletingAttributeValue(node, ast.source, params)) {
  					return this.getValuesForAttribute(node, ast.source, params);
  				} else if (this.isCompletingTagAttribute(node, ast.source, params)) {
  					return this.getAttributesForNode(node, ast.source, params);
  				} else if (this.isCompletingTag(node, params)){
  					if (this.isCompletingCommentOpen(node)){
  						return this.getComment(node, params.offset, ast.source, true);
  					}
  					if (this.isCompletingTagWithMatchingClose(node, ast.source)){
  						return [];
  					}
  					return this.getTags(ast.source, params);
  				}
  				return this.getProposalsForTextContent(node, ast.source, params);
  			}
  			
  			// If we have a non-empty source file with no valid tags, still offer tag completions
  			return this.getTags(ast.source, params);
  		}
docs: Computes the completions from the given AST and parameter context
  @param {Object} ast The AST to inspect
  @param {Object} params The paramter context
  @returns {Array.<Object>} The array of proposal objects or an empty array, never null
  @since 10.0