Fixed: [ Issue 63 ] Group elements can contain nested groups and enums https://code.google.com/p/protobuf-dt/issues/detail?id=63
diff --git a/com.google.eclipse.protobuf.feature/feature.xml b/com.google.eclipse.protobuf.feature/feature.xml new file mode 100644 index 0000000..7be8049 --- /dev/null +++ b/com.google.eclipse.protobuf.feature/feature.xml
@@ -0,0 +1,73 @@ +<?xml version="1.0" encoding="UTF-8"?> +<feature + id="com.google.eclipse.protobuf" + label="Protocol Buffer Editor" + version="1.0.1.qualifier" + provider-name="Google, Inc."> + + <description url="https://code.google.com/p/protobuf-dt/"> + An Eclipse-based Development Environment for Protocol Buffers + </description> + + <copyright> + Copyright (c) 2011 Google, Inc. + +All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at + +http://www.eclipse.org/legal/epl-v10.html + +Contributors: +Google, Inc. - initial API and implementation + </copyright> + + <license url="http://www.eclipse.org/legal/epl-v10.html"> + Copyright (c) 2011 Google, Inc. + +All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at + +http://www.eclipse.org/legal/epl-v10.html + +Contributors: +Google, Inc. - initial API and implementation + </license> + + <url> + <update label="protobuf-dt" url="http://protobuf-dt.googlecode.com/svn/trunk/update-site"/> + </url> + + <requires> + <import plugin="org.eclipse.xtext"/> + <import plugin="org.eclipse.xtext.util"/> + <import plugin="org.eclipse.emf.ecore"/> + <import plugin="org.eclipse.emf.common"/> + <import plugin="org.antlr.runtime"/> + <import plugin="org.eclipse.core.runtime" version="3.7.0" match="greaterOrEqual"/> + <import plugin="org.apache.log4j"/> + <import plugin="org.apache.commons.logging"/> + <import plugin="org.eclipse.xtext.ui"/> + <import plugin="org.eclipse.ui.editors" version="3.5.0" match="greaterOrEqual"/> + <import plugin="org.eclipse.ui.ide" version="3.5.0" match="greaterOrEqual"/> + <import plugin="org.eclipse.xtext.ui.shared"/> + <import plugin="org.eclipse.ui"/> + <import plugin="org.eclipse.xtext.builder"/> + <import plugin="com.ibm.icu"/> + <import plugin="org.eclipse.emf.databinding"/> + <import plugin="org.eclipse.core.resources"/> + <import plugin="org.eclipse.core.filesystem" version="1.3.100" match="greaterOrEqual"/> + </requires> + + <plugin + id="com.google.eclipse.protobuf" + download-size="0" + install-size="0" + version="0.0.0" + unpack="false"/> + + <plugin + id="com.google.eclipse.protobuf.ui" + download-size="0" + install-size="0" + version="0.0.0" + unpack="false"/> + +</feature>
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/syntaxcoloring/ProtobufSemanticHighlightingCalculator.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/syntaxcoloring/ProtobufSemanticHighlightingCalculator.java index 11b60a4..8993736 100644 --- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/syntaxcoloring/ProtobufSemanticHighlightingCalculator.java +++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/syntaxcoloring/ProtobufSemanticHighlightingCalculator.java
@@ -65,18 +65,25 @@ } if (element instanceof Field) { highlightName(element, acceptor, highlightId); - highLightFieldOptionNames((Field) element, acceptor, highlightId); + highlightFieldOptionNames((Field) element, acceptor, highlightId); } if (element instanceof Group) { - for (Property property : ((Group) element).getElements()) { - highlightName(property, acceptor, highlightId); - highLightFieldOptionNames(property, acceptor, highlightId); - } + highlightElementNames((Group) element, acceptor, highlightId); } } } - private void highLightFieldOptionNames(Field field, IHighlightedPositionAcceptor acceptor, String highlightId) { + private void highlightElementNames(Group group, IHighlightedPositionAcceptor acceptor, String highlightId) { + for (GroupElement e : group.getElements()) { + if (e instanceof Property) { + Field field = (Field) e; + highlightName(field, acceptor, highlightId); + highlightFieldOptionNames(field, acceptor, highlightId); + } + } + } + + private void highlightFieldOptionNames(Field field, IHighlightedPositionAcceptor acceptor, String highlightId) { for (FieldOption option : field.getFieldOptions()) { highlightName(option, acceptor, highlightId); }
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/Protobuf.xtext b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/Protobuf.xtext index d27a97b..3ae2591 100644 --- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/Protobuf.xtext +++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/Protobuf.xtext
@@ -54,9 +54,13 @@ Group: modifier=Modifier 'group' name=Name '=' index=INT ('[' (fieldOptions+=FieldOption (',' fieldOptions+=FieldOption)*) ']')? '{' - elements+=Property* + elements+=GroupElement* '}'(';')?; +GroupElement: + Field | Option | Enum +; + Property: modifier=Modifier type=AbstractTypeReference name=Name '=' index=INT (
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider.java index 9758fe2..0d09afb 100644 --- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider.java +++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider.java
@@ -17,7 +17,7 @@ import org.eclipse.emf.common.util.*; import org.eclipse.emf.ecore.*; -import org.eclipse.emf.ecore.resource.ResourceSet; +import org.eclipse.emf.ecore.resource.*; import org.eclipse.xtext.naming.*; import org.eclipse.xtext.resource.*; import org.eclipse.xtext.scoping.IScope; @@ -105,9 +105,9 @@ Package importRootPackage = finder.packageOf(root); List<IEObjectDescription> descriptions = new ArrayList<IEObjectDescription>(); for (Import anImport : imports) { - XtextResource imported = importedResource(anImport); - EObject importedRoot = imported.getParseResult().getRootASTElement(); - if (arePackagesRelated(importRootPackage, importedRoot)) { + Resource imported = importedResource(anImport); + EObject importedRoot = rootElementOf(imported); + if (importedRoot != null && arePackagesRelated(importRootPackage, importedRoot)) { descriptions.addAll(typesIn(importedRoot)); continue; } @@ -116,18 +116,33 @@ return descriptions; } - private XtextResource importedResource(Import anImport) { + private Resource importedResource(Import anImport) { ResourceSet resourceSet = finder.rootOf(anImport).eResource().getResourceSet(); URI importUri = createURI(uriResolver.apply(anImport)); - return (XtextResource) resourceSet.getResource(importUri, true); + try { + return resourceSet.getResource(importUri, true); + } catch (Throwable t) { + t.printStackTrace(); + return null; + } } + private /* Protobuf */ EObject rootElementOf(Resource resource) { + if (resource instanceof XtextResource) return ((XtextResource) resource).getParseResult().getRootASTElement(); + TreeIterator<Object> contents = getAllContents(resource, true); + if (contents.hasNext()) { + Object next = contents.next(); + if (next instanceof EObject) return (EObject) next; + } + return null; + } + private boolean arePackagesRelated(Package aPackage, EObject root) { Package p = finder.packageOf(root); return packageResolver.areRelated(aPackage, p); } - private <T extends Type> Collection<IEObjectDescription> children(XtextResource resource, Class<T> targetType) { + private <T extends Type> Collection<IEObjectDescription> children(Resource resource, Class<T> targetType) { List<IEObjectDescription> descriptions = new ArrayList<IEObjectDescription>(); TreeIterator<Object> contents = getAllContents(resource, true); while (contents.hasNext()) {