Clean up code related to semicolon editor command.
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/commands/SmartSemicolonHandler.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/commands/SmartSemicolonHandler.java
index a4ffaf1..9dedf95 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/commands/SmartSemicolonHandler.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/commands/SmartSemicolonHandler.java
@@ -64,16 +64,10 @@
     int lineAtOffset = styledText.getLineAtOffset(offset);
     int offsetAtLine = styledText.getOffsetAtLine(lineAtOffset);
     String line = styledText.getLine(lineAtOffset);
-    ContentToInsert newContent = ContentToInsert.RETRY;
-    int retryCount = 2;
-    for (int i = 0; i < retryCount; i++) {
-      if (!newContent.equals(ContentToInsert.RETRY)) break;
-      newContent = newContent(editor, styledText, line);
-      if (newContent.equals(ContentToInsert.NONE)) return;
-      if (newContent.equals(ContentToInsert.INSERT_TAG_NUMBER)) {
-        refreshHighlighting(editor);
-        return;
-      }
+    ContentToInsert newContent = newContent(editor, styledText, line);
+    if (newContent.equals(ContentToInsert.TAG_NUMBER_INSERTED)) {
+      refreshHighlighting(editor);
+      return;
     }
     if (newContent.location.equals(Location.END)) {
       offset = offsetAtLine + line.length();
@@ -93,7 +87,7 @@
           ContentAssistContext[] context = contextFactory.create(editor.getInternalSourceViewer(), offset, resource);
           for (ContentAssistContext c : context) {
             if (nodes.belongsToCommentOrString(c.getCurrentNode())) continue;
-            EObject model = c.getCurrentModel();
+            EObject model = modelFrom(c);
             if (model instanceof FieldOption) {
               FieldOption option = (FieldOption) model;
               model = option.eContainer();
@@ -101,7 +95,7 @@
             if (model instanceof Literal) {
               Literal literal = (Literal) model;
               ContentToInsert content = newContent(literal);
-              if (content.equals(ContentToInsert.INSERT_TAG_NUMBER)) {
+              if (content.equals(ContentToInsert.TAG_NUMBER_INSERTED)) {
                 long index = literals.calculateIndexOf(literal);
                 literal.setIndex(index);
                 updateIndexInCommentOfParent(literal, index, document);
@@ -111,7 +105,7 @@
             if (model instanceof MessageField) {
               MessageField field = (MessageField) model;
               ContentToInsert content = newContent(field);
-              if (content.equals(ContentToInsert.INSERT_TAG_NUMBER)) {
+              if (content.equals(ContentToInsert.TAG_NUMBER_INSERTED)) {
                 long index = indexedElements.calculateTagNumberOf(field);
                 field.setIndex(index);
                 updateIndexInCommentOfParent(field, index, document);
@@ -128,9 +122,23 @@
     }
   }
 
+  private EObject modelFrom(ContentAssistContext c) {
+    EObject current = c.getCurrentModel();
+    if (isIndexed(current)) return current;
+    return c.getPreviousModel();
+  }
+
+  private boolean isIndexed(EObject e) {
+    return e instanceof MessageField || e instanceof Literal;
+  }
+  
   private ContentToInsert newContent(Literal literal) {
     INode indexNode = nodes.firstNodeForFeature(literal, LITERAL__INDEX);
-    return newContent(indexNode);
+    ContentToInsert content = newContent(indexNode);
+    if (content.equals(ContentToInsert.TAG_NUMBER_INSERTED)) {
+      literal.setIndex(-1); // reset to make at semicolon work when new index is zero (TODO fix bug.)
+    }
+    return content;
   }
 
   private ContentToInsert newContent(MessageField field) {
@@ -140,7 +148,7 @@
 
   private ContentToInsert newContent(INode indexNode) {
     boolean hasIndex = indexNode != null && !isEmpty(indexNode.getText());
-    return hasIndex ? new ContentToInsert(SEMICOLON, Location.END) : ContentToInsert.INSERT_TAG_NUMBER;
+    return hasIndex ? new ContentToInsert(SEMICOLON, Location.END) : ContentToInsert.TAG_NUMBER_INSERTED;
   }
 
   private void updateIndexInCommentOfParent(EObject o, long index, IXtextDocument document) {
@@ -175,9 +183,7 @@
     final String value;
     final Location location;
 
-    static final ContentToInsert NONE = new ContentToInsert();
-    static final ContentToInsert INSERT_TAG_NUMBER = new ContentToInsert();
-    static final ContentToInsert RETRY = new ContentToInsert();
+    static final ContentToInsert TAG_NUMBER_INSERTED = new ContentToInsert();
 
     ContentToInsert() {
       this("", Location.NONE);