Fixed: [ Issue 72 ] Broken completion when typing in proto editor https://code.google.com/p/protobuf-dt/issues/detail?id=72
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 35c6bf8..aa74640 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
@@ -9,21 +9,20 @@ package com.google.eclipse.protobuf.ui.commands; import static com.google.eclipse.protobuf.grammar.CommonKeyword.SEMICOLON; - -import java.util.regex.Pattern; +import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.*; import org.eclipse.emf.ecore.EObject; import org.eclipse.swt.custom.StyledText; +import org.eclipse.xtext.nodemodel.INode; import org.eclipse.xtext.resource.XtextResource; import org.eclipse.xtext.ui.editor.XtextEditor; import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext; import org.eclipse.xtext.ui.editor.contentassist.antlr.ParserBasedContentAssistContextFactory; import org.eclipse.xtext.util.concurrent.IUnitOfWork; -import com.google.eclipse.protobuf.protobuf.Literal; -import com.google.eclipse.protobuf.protobuf.Property; -import com.google.eclipse.protobuf.ui.util.Fields; -import com.google.eclipse.protobuf.ui.util.Literals; +import com.google.eclipse.protobuf.protobuf.*; +import com.google.eclipse.protobuf.ui.util.*; +import com.google.eclipse.protobuf.util.ModelNodes; import com.google.inject.Inject; /** @@ -35,14 +34,10 @@ */ public class SmartSemicolonHandler extends SmartInsertHandler { - private static final Pattern LITERAL_WITH_INDEX = Pattern.compile("[\\s]+(.*)[\\s]+=[\\s]+[\\d]+(.*)"); - - private static final Pattern PROPERTY_WITH_INDEX = - Pattern.compile("[\\s]+(.*)[\\s]+(.*)[\\s]+(.*)[\\s]+=[\\s]+[\\d]+(.*)"); - @Inject private ParserBasedContentAssistContextFactory contextFactory; @Inject private Fields fields; @Inject private Literals literals; + @Inject private ModelNodes nodes; private final String semicolon = SEMICOLON.toString(); @@ -87,15 +82,15 @@ } private String contentToInsert(String line, Literal literal) { - boolean hasIndexAlready = LITERAL_WITH_INDEX.matcher(line).matches(); - if (hasIndexAlready) return semicolon; + INode indexNode = nodes.firstNodeForFeature(literal, LITERAL__INDEX); + if (indexNode != null) return semicolon; int index = literals.calculateIndexOf(literal); return defaultIndexAndSemicolonToInsert(line, index); } private String contentToInsert(String line, Property property) { - boolean hasIndexAlready = PROPERTY_WITH_INDEX.matcher(line).matches(); - if (hasIndexAlready) return semicolon; + INode indexNode = nodes.firstNodeForFeature(property, FIELD__INDEX); + if (indexNode != null) return semicolon; int index = fields.calculateTagNumberOf(property); return defaultIndexAndSemicolonToInsert(line, index); } @@ -105,11 +100,6 @@ } private String indexAndSemicolonToInsert(String format, String line, int index) { - String content = String.format(format, index, semicolon); - return addSpaceAtBeginning(line, content); - } - - private String addSpaceAtBeginning(String line, String contentToInsert) { - return (line.endsWith(" ")) ? contentToInsert : " " + contentToInsert; + return String.format(format, index, semicolon); } }