code: function(node, source, params) {
  			if (node){
  				var startTag;
  				// If text content is a '/' offer to close the tag
  				// If we have an uncompleted tag '</' offer to complete the tag
  				if (node.type === 'tag' && node.openrange && params.offset > node.openrange[1]){
  					startTag = node;
  				} else if (node.type === 'tag' && (params.offset > node.range[1] || params.offset < node.range[0])){
  					startTag = node;
  				}
  				if (startTag){
  					var preceding = source.substring(0, params.offset);
  					var match = preceding.match(/<?\/$/);
  					if (match){
  						var name = '</' + startTag.name + '>'; //$NON-NLS-1$
  						var desc = i18nUtil.formatMessage(Messages['closeTagDescription'], startTag.name);
  						return [this.makeComputedProposal(name, name, desc, null, match[0])];
  					}
  				}
  			}
  			return this.getTags(source, params);	
  		}
docs: Returns any proposals (if any) for when the user is editing text contents based upon
  state of the AST.  Templates are added to this list.
  @param {Object} node The AST node for the attribute we are completing within
  @param {String} source The backing source
  @param {Object} params The parameters
  @returns {Array.<Object>} The array of proposals
  @since 10.0