Fixed: [ Issue 24 ] Fix qualified names https://code.google.com/p/protobuf-dt/issues/detail?id=24 Qualified names for imported types fixed.
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/ImportUriFixerAndResolver_apply_Test.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/ImportUriFixerAndResolver_apply_Test.java index d333050..f5e9a1a 100644 --- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/ImportUriFixerAndResolver_apply_Test.java +++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/ImportUriFixerAndResolver_apply_Test.java
@@ -16,8 +16,7 @@ import org.junit.*; import com.google.eclipse.protobuf.junit.core.XtextRule; -import com.google.eclipse.protobuf.protobuf.Import; -import com.google.eclipse.protobuf.protobuf.Protobuf; +import com.google.eclipse.protobuf.protobuf.*; /** * Tests for <code>{@link ImportUriFixerAndResolver#apply(EObject)}</code>. @@ -27,26 +26,26 @@ public class ImportUriFixerAndResolver_apply_Test { @Rule public XtextRule xtext = new XtextRule(); - + private ImportUriFixerAndResolver resolver; - + @Before public void setUp() { resolver = (ImportUriFixerAndResolver) xtext.getInstanceOf(ImportUriResolver.class); } - + @Test public void should_fix_import_URI_if_missing_scheme() { StringBuilder proto = new StringBuilder(); - proto.append("import \"folder1/test.proto\";"); + proto.append("import \"folder1/test.proto\";"); Protobuf root = xtext.parse(proto); Import anImport = root.getImports().get(0); String resolved = resolver.apply(anImport); assertThat(resolved, equalTo("platform:/resource/folder1/test.proto")); } - + @Test public void should_not_fix_import_URI_if_not_missing_scheme() { StringBuilder proto = new StringBuilder(); - proto.append("import \"platform:/resource/folder1/test.proto\";"); + proto.append("import \"platform:/resource/folder1/test.proto\";"); Protobuf root = xtext.parse(proto); Import anImport = root.getImports().get(0); String resolved = resolver.apply(anImport);
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ImportUriFixerAndResolver.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ImportUriFixerAndResolver.java index 2de2ca2..2faf1c5 100644 --- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ImportUriFixerAndResolver.java +++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ImportUriFixerAndResolver.java
@@ -8,6 +8,8 @@ */ package com.google.eclipse.protobuf.scoping; +import java.util.List; + import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.xtext.scoping.impl.ImportUriResolver; @@ -15,14 +17,14 @@ import com.google.eclipse.protobuf.protobuf.Import; /** - * Resolves URIs. This implementation mimics how protoc understands imported file URIs. For example, the URI - * "platform:/resource/proto1.proto" is understood by EMF but not by protoc. The URI in the proto file needs to be - * simply "proto1.proto" for protoc to understand it. + * Resolves URIs. This implementation mimics how protoc understands imported file URIs. For example, the URI + * "platform:/resource/proto1.proto" is understood by EMF but not by protoc. The URI in the proto file needs to be + * simply "proto1.proto" for protoc to understand it. * <p> * This {@link ImportUriResolver} adds "platform:/resource" to any URI if is not specified, so EMF can find the * imported resource. * </p> - * + * * @author alruiz@google.com (Alex Ruiz) */ public class ImportUriFixerAndResolver extends ImportUriResolver { @@ -34,7 +36,7 @@ */ public static final String URI_PREFIX = PREFIX + "/"; - /** + /** * If the given {@code EObject} is a <code>{@link Import}</code>, this method will add "platform:/resource" to the * URI of such import if not specified already. * @param from the given element to resolve. @@ -61,9 +63,22 @@ * We need to have the import URI as "platform:/resource/protobuf-test/folder/proto2.proto" for the editor to see it. */ private void fixUri(Import i) { - URI importUri = URI.createURI(i.getImportURI()); - if (importUri.scheme() != null) return; - URI fixedUri = URI.createURI(PREFIX).appendSegments(importUri.segments()); - i.setImportURI(fixedUri.toString()); + String prefix = uriPrefix(i.eResource().getURI()); + String uri = i.getImportURI(); + if (!uri.startsWith(prefix)) { + if (!uri.startsWith(prefix)) prefix += "/"; + i.setImportURI(prefix + uri); + } + } + + private String uriPrefix(URI containerUri) { + StringBuilder prefix = new StringBuilder(); + prefix.append(PREFIX); + int start = (containerUri.scheme() == null) ? 0 : 1; // ignore the scheme if present (e.g. "platform") + List<String> segments = containerUri.segmentsList(); + int end = segments.size() - 1; // ignore file name (at the end of the URI) + for (int j = start; j < end; j++) + prefix.append("/").append(segments.get(j)); + return prefix.toString(); } }
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 843b5e0..8a0cc00 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
@@ -53,9 +53,7 @@ descriptions.addAll(innerTypes(message.eContainer())); descriptions.addAll(innerTypes(root)); descriptions.addAll(importedTypes(root)); - IScope scope = createScope(descriptions); - System.out.println("scope for property: " + ((Property) typeRef.eContainer()).getName() + ": " + scope); - return scope; + return createScope(descriptions); } private Collection<IEObjectDescription> innerTypes(EObject root) {