Fixed: [Issue 159] Content assist for default value is broken.
Added support for enum literals in proposed values. Fixed proposals for
enum-based options.
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 e42a177..2c389a4 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
@@ -162,6 +162,19 @@
return context.getCurrentNode().getText().equals(CLOSING_BRACKET.toString());
}
+ private boolean isLastWordFromCaretPositionEqualTo(String word, ContentAssistContext context) {
+ StyledText styledText = context.getViewer().getTextWidget();
+ int valueLength = word.length();
+ int start = styledText.getCaretOffset() - valueLength;
+ if (start < 0) return false;
+ String previousWord = styledText.getTextRange(start, valueLength);
+ return word.equals(previousWord);
+ }
+
+ private boolean isKeyword(EObject object, CommonKeyword keyword) {
+ return object instanceof Keyword && keyword.hasValue(((Keyword) object).getValue());
+ }
+
private void proposeEqualProto2(ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
proposeAndAccept(EQUAL_PROTO2_IN_QUOTES, context, acceptor);
}
@@ -171,10 +184,6 @@
proposeAndAccept(proposalText.toString(), context, acceptor);
}
- private boolean isKeyword(EObject object, CommonKeyword keyword) {
- return object instanceof Keyword && keyword.hasValue(((Keyword) object).getValue());
- }
-
private boolean isBoolProposalValid(ContentAssistContext context) {
Property p = propertyFrom(context);
return p != null && properties.isBool(p);
@@ -218,16 +227,6 @@
return true;
}
- private void createAndAccept(CompoundElement display, int cursorPosition, ContentAssistContext context,
- ICompletionProposalAcceptor acceptor) {
- ICompletionProposal proposal = createCompletionProposal(display, context);
- if (proposal instanceof ConfigurableCompletionProposal) {
- ConfigurableCompletionProposal configurable = (ConfigurableCompletionProposal) proposal;
- configurable.setCursorPosition(cursorPosition);
- }
- acceptor.accept(proposal);
- }
-
private <T> T extractElementFromContext(ContentAssistContext context, Class<T> type) {
EObject model = context.getCurrentModel();
// this is most likely a bug in Xtext:
@@ -334,26 +333,13 @@
private void proposeOption(Property option, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
String displayString = option.getName();
String proposalText = displayString + space() + EQUAL + space();
- proposePropertyValue(option, proposalText, displayString, imageForOption(), context, acceptor);
- }
-
- @Override public void completeDefaultValueFieldOption_Value(EObject model, Assignment assignment,
- ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
- if (!(model instanceof Property)) return;
- Property p = (Property) model;
- proposePropertyValue(p, "", null, defaultImage(), context, acceptor);
- }
-
- private void proposePropertyValue(Property p, String proposalText, String displayString, Image image,
- ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
- Object value = defaultValueOf(p);
- if (value == null) return;
- String text = proposalText + value;
- ICompletionProposal proposal = createCompletionProposal(text, displayString, image, context);
+ Object value = defaultValueOf(option);
+ if (value != null) proposalText = proposalText + value;
+ ICompletionProposal proposal = createCompletionProposal(proposalText, displayString, imageForOption(), context);
if (value == EMPTY_STRING && proposal instanceof ConfigurableCompletionProposal) {
// set cursor between the proposal's quotes
ConfigurableCompletionProposal configurable = (ConfigurableCompletionProposal) proposal;
- configurable.setCursorPosition(text.length() - 1);
+ configurable.setCursorPosition(proposalText.length() - 1);
}
acceptor.accept(proposal);
}
@@ -364,6 +350,14 @@
return null;
}
+ @Override public void completeDefaultValueFieldOption_Value(EObject model, Assignment assignment,
+ ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ if (!(model instanceof Property)) return;
+ Property p = (Property) model;
+ if (!properties.isOptional(p)) return;
+ proposeDefaultValue(p, context, acceptor);
+ }
+
@Override public ICompletionProposal createCompletionProposal(String proposal, String displayString, Image image,
ContentAssistContext contentAssistContext) {
StyledString styled = null;
@@ -376,10 +370,6 @@
ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
if (!(model instanceof NativeFieldOption)) return;
NativeFieldOption option = (NativeFieldOption) model;
- if (fieldOptions.isDefaultValueOption(option)) {
- proposeDefaultValue(option, context, acceptor);
- return;
- }
ProtoDescriptor descriptor = descriptorProvider.primaryDescriptor();
Property property = (Property) fieldOptions.sourceOf(option);
Enum enumType = descriptor.enumTypeOf(property);
@@ -390,17 +380,6 @@
proposePrimitiveValues(property, context, acceptor);
}
- private void proposeDefaultValue(FieldOption option, ContentAssistContext context,
- ICompletionProposalAcceptor acceptor) {
- Property property = (Property) option.eContainer();
- if (!properties.isOptional(property)) return;
- if (proposePrimitiveValues(property, context, acceptor)) return;
- Enum enumType = finder.enumTypeOf(property);
- if (enumType != null) {
- proposeAndAccept(enumType, context, acceptor);
- }
- }
-
private boolean proposePrimitiveValues(Property property, ContentAssistContext context,
ICompletionProposalAcceptor acceptor) {
if (properties.isBool(property)) {
@@ -419,29 +398,24 @@
proposeAndAccept(keywords, context, acceptor);
}
- private void proposeEmptyString(ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
- createAndAccept(EMPTY_STRING, 1, context, acceptor);
- }
-
private void proposeAndAccept(CommonKeyword[] keywords, ContentAssistContext context,
ICompletionProposalAcceptor acceptor) {
for (CommonKeyword keyword : keywords)
proposeAndAccept(keyword.toString(), context, acceptor);
}
- private void proposeAndAccept(Enum enumType, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
- Image image = imageHelper.getImage(images.imageFor(Literal.class));
- for (Literal literal : getAllContentsOfType(enumType, Literal.class))
- proposeAndAccept(literal.getName(), image, context, acceptor);
+ private void proposeEmptyString(ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ createAndAccept(EMPTY_STRING, 1, context, acceptor);
}
- private boolean isLastWordFromCaretPositionEqualTo(String word, ContentAssistContext context) {
- StyledText styledText = context.getViewer().getTextWidget();
- int valueLength = word.length();
- int start = styledText.getCaretOffset() - valueLength;
- if (start < 0) return false;
- String previousWord = styledText.getTextRange(start, valueLength);
- return word.equals(previousWord);
+ private void createAndAccept(CompoundElement display, int cursorPosition, ContentAssistContext context,
+ ICompletionProposalAcceptor acceptor) {
+ ICompletionProposal proposal = createCompletionProposal(display, context);
+ if (proposal instanceof ConfigurableCompletionProposal) {
+ ConfigurableCompletionProposal configurable = (ConfigurableCompletionProposal) proposal;
+ configurable.setCursorPosition(cursorPosition);
+ }
+ acceptor.accept(proposal);
}
@Override public void completeCustomOption_Source(EObject model, Assignment assignment,
@@ -547,7 +521,7 @@
IndexedElement e = options.lastFieldSourceFrom(option);
if (e == null) e = options.sourceOf(option);
if (e instanceof Property) {
- proposeAndAcceptOptionFieldValue((Property) e, context, acceptor);
+ proposeDefaultValue((Property) e, context, acceptor);
}
}
@@ -559,11 +533,11 @@
IndexedElement e = fieldOptions.lastFieldSourceFrom(option);
if (e == null) e = fieldOptions.sourceOf(option);
if (e instanceof Property) {
- proposeAndAcceptOptionFieldValue((Property) e, context, acceptor);
+ proposeDefaultValue((Property) e, context, acceptor);
}
}
- private void proposeAndAcceptOptionFieldValue(Property property, ContentAssistContext context,
+ private void proposeDefaultValue(Property property, ContentAssistContext context,
ICompletionProposalAcceptor acceptor) {
if (property == null) return;
if (proposePrimitiveValues(property, context, acceptor)) return;
@@ -573,6 +547,12 @@
}
}
+ private void proposeAndAccept(Enum enumType, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ Image image = imageHelper.getImage(images.imageFor(Literal.class));
+ for (Literal literal : getAllContentsOfType(enumType, Literal.class))
+ proposeAndAccept(literal.getName(), image, context, acceptor);
+ }
+
private void proposeAndAccept(String proposalText, Image image, ContentAssistContext context,
ICompletionProposalAcceptor acceptor) {
ICompletionProposal proposal = createCompletionProposal(proposalText, proposalText, image, context);