Skip to content

Commit a7896fd

Browse files
committed
Add customized qualified name for cross references for specifications, e.g., TopicSpec
1 parent de87909 commit a7896fd

File tree

4 files changed

+77
-1
lines changed

4 files changed

+77
-1
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package de.fraunhofer.ipa.ros;
2+
3+
import org.eclipse.xtext.naming.DefaultDeclarativeQualifiedNameProvider
4+
import org.eclipse.emf.ecore.EObject
5+
import ros.TopicSpec
6+
import ros.ServiceSpec
7+
import ros.ActionSpec
8+
9+
class RosQNP extends DefaultDeclarativeQualifiedNameProvider{
10+
11+
override getFullyQualifiedName(EObject obj) {
12+
if (obj instanceof TopicSpec) {
13+
val topic_spec_name = obj.name
14+
val pkg_name = obj.package.name
15+
return getConverter().toQualifiedName(pkg_name + "/msg/" + topic_spec_name);
16+
}
17+
if (obj instanceof ServiceSpec) {
18+
val service_spec_name = obj.name
19+
val pkg_name = obj.package.name
20+
return getConverter().toQualifiedName(pkg_name + "/srv/" + service_spec_name);
21+
}
22+
if (obj instanceof ActionSpec) {
23+
val action_spec_name = obj.name
24+
val pkg_name = obj.package.name
25+
return getConverter().toQualifiedName(pkg_name + "/action/" + action_spec_name);
26+
}
27+
return super.qualifiedName(obj);
28+
}
29+
}

plugins/de.fraunhofer.ipa.ros.xtext/src/de/fraunhofer/ipa/ros/RosRuntimeModule.xtend

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@ package de.fraunhofer.ipa.ros
55

66
import com.google.inject.Binder
77
import de.fraunhofer.ipa.ros.generator.CICustomOutputProvider
8-
import org.eclipse.xtext.conversion.IValueConverterService
98
import org.eclipse.xtext.generator.IOutputConfigurationProvider
9+
import org.eclipse.xtext.scoping.IScopeProvider
10+
import de.fraunhofer.ipa.ros.scoping.RosSP
11+
import org.eclipse.xtext.naming.IQualifiedNameProvider
1012

1113
/**
1214
* Use this class to register components to be used at runtime / without the Equinox extension registry.
@@ -18,4 +20,12 @@ class RosRuntimeModule extends AbstractRosRuntimeModule {
1820
binder.bind(IOutputConfigurationProvider).to(CICustomOutputProvider).asEagerSingleton()
1921
}
2022

23+
override Class<? extends IScopeProvider> bindIScopeProvider() {
24+
return RosSP
25+
}
26+
27+
override Class<? extends IQualifiedNameProvider> bindIQualifiedNameProvider() {
28+
return RosQNP
29+
}
30+
2131
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package de.fraunhofer.ipa.ros.scoping
2+
3+
import org.eclipse.emf.ecore.EObject
4+
import org.eclipse.emf.ecore.EReference
5+
import org.eclipse.xtext.EcoreUtil2
6+
import org.eclipse.xtext.scoping.Scopes
7+
import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider
8+
import ros.RosPackage
9+
import ros.SpecBase
10+
11+
class RosSP extends AbstractDeclarativeScopeProvider {
12+
13+
override getScope(EObject context, EReference reference) {
14+
if (context instanceof SpecBase) {
15+
if (reference == RosPackage.Literals.SPEC_BASE) {
16+
val candidates = EcoreUtil2.getAllContentsOfType(context.package, SpecBase);
17+
return Scopes.scopeFor(candidates)
18+
}
19+
}
20+
return super.getScope(context, reference);
21+
}
22+
23+
}

plugins/de.fraunhofer.ipa.ros2.xtext/src/de/fraunhofer/ipa/ros2/Ros2RuntimeModule.xtend

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,23 @@
33
*/
44
package de.fraunhofer.ipa.ros2
55

6+
import org.eclipse.xtext.scoping.IGlobalScopeProvider
7+
import de.fraunhofer.ipa.ros.RosQNP
8+
import org.eclipse.xtext.naming.IQualifiedNameProvider
9+
import org.eclipse.xtext.scoping.IScopeProvider
10+
import de.fraunhofer.ipa.ros.scoping.RosSP
611

712
/**
813
* Use this class to register components to be used at runtime / without the Equinox extension registry.
914
*/
1015
class Ros2RuntimeModule extends AbstractRos2RuntimeModule {
16+
17+
override Class<? extends IScopeProvider> bindIScopeProvider() {
18+
return RosSP
19+
}
20+
21+
override Class<? extends IQualifiedNameProvider> bindIQualifiedNameProvider() {
22+
return RosQNP
23+
}
24+
1125
}

0 commit comments

Comments
 (0)