In progress: [Issue 161] package scope resolution.
Fixed. Need to add more tests.
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/PackageIntersectionDescriptions.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/PackageIntersectionDescriptions.java
new file mode 100644
index 0000000..af48d2d
--- /dev/null
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/PackageIntersectionDescriptions.java
@@ -0,0 +1,76 @@
+/*
+ * 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
+ */
+package com.google.eclipse.protobuf.scoping;
+
+import static java.util.Collections.*;
+import static org.eclipse.xtext.resource.EObjectDescription.create;
+import static org.eclipse.xtext.util.SimpleAttributeResolver.newResolver;
+
+import com.google.inject.Inject;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.naming.*;
+import org.eclipse.xtext.resource.*;
+
+import com.google.common.base.Function;
+import com.google.eclipse.protobuf.protobuf.Package;
+
+import java.util.*;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+class PackageIntersectionDescriptions {
+
+ @Inject private final IQualifiedNameConverter converter = new IQualifiedNameConverter.DefaultImpl();
+
+ private final Function<EObject, String> resolver = newResolver(String.class, "name");
+
+ Collection<IEObjectDescription> intersection(Package fromImporter, Package fromImported, EObject e) {
+ if (fromImporter == null || fromImported == null) return emptySet();
+ return intersection(segmentNames(fromImporter), segmentNames(fromImported), e);
+ }
+
+ private List<String> segmentNames(Package aPackage) {
+ return converter.toQualifiedName(aPackage.getName()).getSegments();
+ }
+
+ private Collection<IEObjectDescription> intersection(List<String> packageInImporter, List<String> packageInImported,
+ EObject e) {
+ int n1Count = packageInImporter.size();
+ int n2Count = packageInImported.size();
+ int start = -1;
+ for (int i = 0; (i < n1Count && i < n2Count); i++) {
+ if (!packageInImporter.get(i).equals(packageInImported.get(i))) {
+ start = i;
+ break;
+ }
+ }
+ if (start == 0) return emptySet(); // no intersection found.
+ List<String> intersection = new ArrayList<String>();
+ intersection.add(resolver.apply(e));
+ Set<IEObjectDescription> descriptions = new HashSet<IEObjectDescription>();
+ for (int i = n2Count - 1; i >= 0; i--) {
+ if (i >= start) {
+ intersection.add(0, packageInImported.get(i));
+ continue;
+ }
+ if (i == start - 1) {
+ descriptions.add(create(fqn(intersection), e));
+ }
+ intersection.add(0, packageInImported.get(i));
+ descriptions.add(create(fqn(intersection), e));
+ }
+ return descriptions;
+ }
+
+ private QualifiedName fqn(List<String> segments) {
+ return QualifiedName.create(segments.toArray(new String[segments.size()]));
+ }
+}
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/TypeScopeFinder.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/TypeScopeFinder.java
index e37d3b8..d50390c 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/TypeScopeFinder.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/TypeScopeFinder.java
@@ -27,10 +27,9 @@
*/
class TypeScopeFinder implements ScopeFinder {
- @Inject private IntersectedPackageDescriptions intersectedPackageDescriptions;
+ @Inject private PackageIntersectionDescriptions packageIntersectionDescriptions;
@Inject private ProtoDescriptorProvider descriptorProvider;
@Inject private LocalNamesProvider localNamesProvider;
- @Inject private PackageIntersection packageIntersection;
@Inject private QualifiedNameDescriptions qualifiedNamesDescriptions;
@Override public Collection<IEObjectDescription> imported(Package fromImporter, Package fromImported, Object target,
@@ -39,9 +38,7 @@
Set<IEObjectDescription> descriptions = new HashSet<IEObjectDescription>();
EObject e = (EObject) target;
descriptions.addAll(qualifiedNamesDescriptions.qualifiedNames(e));
- List<String> intersection = packageIntersection.intersection(fromImporter, fromImported);
- IEObjectDescription d = intersectedPackageDescriptions.description(e, intersection);
-// if (d != null) descriptions.add(d);
+ descriptions.addAll(packageIntersectionDescriptions.intersection(fromImporter, fromImported, e));
return descriptions;
}