Fixed: [ Issue 53 ] Add content-assist for field options https://code.google.com/p/protobuf-dt/issues/detail?id=53 Fixed content assist for groups.
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/contentassist/ProtobufProposalProvider.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/contentassist/ProtobufProposalProvider.java index c6342f0..503b345 100644 --- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/contentassist/ProtobufProposalProvider.java +++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/contentassist/ProtobufProposalProvider.java
@@ -257,11 +257,15 @@ } private Property extractPropertyFrom(ContentAssistContext context) { + return extractElementFromContext(context, Property.class); + } + + private <T> T extractElementFromContext(ContentAssistContext context, Class<T> type) { EObject model = context.getCurrentModel(); // this is most likely a bug in Xtext: - if (!(model instanceof Property)) model = context.getPreviousModel(); - if (!(model instanceof Property)) return null; - return (Property) model; + if (!type.isInstance(model)) model = context.getPreviousModel(); + if (!type.isInstance(model)) return null; + return type.cast(model); } private boolean isStringProperty(Property p) { @@ -334,16 +338,19 @@ @Override public void completeFieldOption_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { - Property property = extractPropertyFrom(context); - proposeCommonFieldOptions(property, context, acceptor); + Field field = extractFieldFrom(context); + proposeCommonFieldOptions(field, context, acceptor); } - private void proposeCommonFieldOptions(Property property, ContentAssistContext context, - ICompletionProposalAcceptor acceptor) { - List<String> options = existingFieldOptionNames(property); + private Field extractFieldFrom(ContentAssistContext context) { + return extractElementFromContext(context, Field.class); + } + + private void proposeCommonFieldOptions(Field field, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { + List<String> options = existingFieldOptionNames(field); for (Property fieldOption : descriptorProvider.get().fieldOptions()) { String optionName = fieldOption.getName(); - if (options.contains(optionName) || ("packed".equals(optionName) && !canBePacked(property))) continue; + if (options.contains(optionName) || ("packed".equals(optionName) && !canBePacked(field))) continue; String proposalText = optionName + SPACE + EQUAL + SPACE; boolean isBooleanOption = properties.isBool(fieldOption); if (isBooleanOption) proposalText = proposalText + TRUE; @@ -352,15 +359,17 @@ } } - private List<String> existingFieldOptionNames(Property property) { - List<FieldOption> options = property.getFieldOptions(); + private List<String> existingFieldOptionNames(Field field) { + List<FieldOption> options = field.getFieldOptions(); if (options.isEmpty()) return emptyList(); List<String> optionNames = new ArrayList<String>(); for (FieldOption option : options) optionNames.add(option.getName()); return optionNames; } - private boolean canBePacked(Property property) { + private boolean canBePacked(Field field) { + if (!(field instanceof Property)) return false; + Property property = (Property) field; return properties.isPrimitive(property) && REPEATED.equals(property.getModifier()); }